1
1
extract_idv (eq:: Equation ) = eq. lhs. op. x
2
2
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 ]
6
7
order = lower ? D. order- 1 : D. order
7
- lower_varname (var. name, D. x, order, var. subtype, naming_scheme)
8
+
9
+ sym = x. name
10
+ name = order == 0 ? sym : Symbol (sym, naming_scheme, string (D. x. name)^ order)
11
+
12
+ Variable (name, x. subtype, x. dependents)
8
13
end
9
- function lower_varname (sym:: Symbol , idv, order:: Int , subtype:: Symbol , naming_scheme)
14
+ function lower_varname (var:: Variable , idv, order:: Int , naming_scheme)
15
+ sym = var. name
10
16
name = order == 0 ? sym : Symbol (sym, naming_scheme, string (idv. name)^ order)
11
- return Variable (name, subtype= subtype )
17
+ return Variable (name, var . subtype, var . dependents )
12
18
end
13
19
14
20
function ode_order_lowering (sys:: DiffEqSystem ; kwargs... )
@@ -21,27 +27,30 @@ ode_order_lowering(eqs; naming_scheme = "_") = ode_order_lowering!(deepcopy(eqs)
21
27
function ode_order_lowering! (eqs, naming_scheme)
22
28
idv = extract_idv (eqs[1 ])
23
29
D = Differential (idv, 1 )
24
- sym_order = Dict {Symbol, Int} ()
25
- dv_name = eqs[1 ]. lhs. subtype
30
+ var_order = Dict {Variable,Int} ()
31
+ dv_name = eqs[1 ]. lhs. args[1 ]. subtype
32
+
26
33
for eq in eqs
27
- sym , maxorder = extract_symbol_order (eq)
34
+ var , maxorder = extract_var_order (eq)
28
35
maxorder == 1 && continue # fast pass
29
- if maxorder > get (sym_order, sym , 0 )
30
- sym_order[sym ] = maxorder
36
+ if maxorder > get (var_order, var , 0 )
37
+ var_order[var ] = maxorder
31
38
end
32
- eq = lhs_renaming! (eq, D, naming_scheme)
33
- eq = rhs_renaming! (eq, naming_scheme)
39
+ lhs_renaming! (eq, D, naming_scheme)
40
+ rhs_renaming! (eq, naming_scheme)
34
41
end
35
- for sym in keys (sym_order)
36
- order = sym_order[sym]
42
+
43
+ for var ∈ keys (var_order)
44
+ order = var_order[var]
37
45
for o in (order- 1 ): - 1 : 1
38
- lhs = D (lower_varname (sym , idv, o- 1 , dv_name , naming_scheme))
39
- rhs = lower_varname (sym , idv, o, dv_name , naming_scheme)
46
+ lhs = D (lower_varname (var , idv, o- 1 , naming_scheme))
47
+ rhs = lower_varname (var , idv, o, naming_scheme)
40
48
eq = Equation (lhs, rhs)
41
49
push! (eqs, eq)
42
50
end
43
51
end
44
- eqs
52
+
53
+ return eqs
45
54
end
46
55
47
56
function lhs_renaming! (eq, D, naming_scheme)
51
60
rhs_renaming! (eq, naming_scheme) = _rec_renaming! (eq. rhs, naming_scheme)
52
61
53
62
function _rec_renaming! (rhs, naming_scheme)
54
- rhs isa Variable && rhs. diff != nothing && return lower_varname (rhs, naming_scheme)
63
+ isa ( rhs, Operation) && isa ( rhs. op, Differential) && return lower_varname (rhs, naming_scheme)
55
64
if rhs isa Operation
56
65
args = rhs. args
57
66
for i in eachindex (args)
@@ -61,12 +70,12 @@ function _rec_renaming!(rhs, naming_scheme)
61
70
rhs
62
71
end
63
72
64
- function extract_symbol_order (eq)
73
+ function extract_var_order (eq)
65
74
# We assume that the differential with the highest order is always going to be in the LHS
66
75
dv = eq. lhs
67
- sym = dv. name
68
- order = dv. diff . order
69
- sym , order
76
+ var = dv. args[ 1 ]
77
+ order = dv. op . order
78
+ return (var , order)
70
79
end
71
80
72
81
export ode_order_lowering
0 commit comments