@@ -10,60 +10,48 @@ function lower_varname(var::Variable, idv, order::Int)
10
10
return Variable (name, var. subtype, var. dependents)
11
11
end
12
12
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)
16
15
DiffEqSystem (eqs_lowered, sys. iv)
17
16
end
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 )
22
19
var_order = Dict {Variable,Int} ()
23
20
vars = Variable[]
24
- dv_name = eqs[ 1 ] . var . subtype
21
+ new_eqs = similar ( eqs, DiffEq)
25
22
26
- for eq in eqs
23
+ for (i, eq) ∈ enumerate ( eqs)
27
24
var, maxorder = extract_var_order (eq)
28
25
maxorder == 1 && continue # fast pass
29
26
if maxorder > get (var_order, var, 0 )
30
27
var_order[var] = maxorder
31
28
var ∈ vars || push! (vars, var)
32
29
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
35
33
end
36
34
37
35
for var ∈ vars
38
36
order = var_order[var]
39
37
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)
42
40
eq = DiffEq (D, lvar, rhs)
43
- push! (eqs , eq)
41
+ push! (new_eqs , eq)
44
42
end
45
43
end
46
44
47
- return eqs
45
+ return new_eqs
48
46
end
49
47
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))
56
50
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))
67
55
end
68
56
69
57
extract_var_order (eq:: DiffEq ) = (eq. var, eq. D. order)
0 commit comments