@@ -30,43 +30,52 @@ For a sum expression, returns the `get_degrees()` result for term with the highe
30
30
See also `monomial_lt` and `lexlt`.
31
31
"""
32
32
function get_degrees (expr)
33
+ res = _get_degrees (expr)
34
+ if res isa AbstractVector
35
+ return Tuple (res)
36
+ else
37
+ return res
38
+ end
39
+ end
40
+
41
+ function _get_degrees (expr)
33
42
if issym (expr)
34
43
return ((Symbol (expr),) => 1 ,)
35
44
elseif iscall (expr)
36
45
# operation-specific degree handling
37
- return get_degrees (operation (expr), expr)
46
+ return _get_degrees (operation (expr), expr)
38
47
else
39
48
return () # skip numbers and unsupported expressions
40
49
end
41
50
end
42
51
43
52
# fallback for unsupported operation
44
- get_degrees (:: Any , expr) =
53
+ _get_degrees (:: Any , expr) =
45
54
((Symbol (" zzzzzzz" , hash (expr)),) => 1 ,)
46
55
47
56
_getindex_symbol (arr, i) = Symbol (arr[i])
48
57
49
- function get_degrees (:: typeof (getindex), expr)
58
+ function _get_degrees (:: typeof (getindex), expr)
50
59
args = arguments (expr)
51
60
@inbounds return (ntuple (Base. Fix1 (_getindex_symbol, args), length (args)) => 1 ,)
52
61
end
53
62
54
- function get_degrees (:: typeof (* ), expr)
63
+ function _get_degrees (:: typeof (* ), expr)
55
64
args = arguments (expr)
56
65
ds = sizehint! (Vector {Any} (), length (args))
57
66
for arg in args
58
- degs = get_degrees (arg)
67
+ degs = _get_degrees (arg)
59
68
append! (ds, degs)
60
69
end
61
70
return sort! (ds)
62
71
end
63
72
64
- function get_degrees (:: typeof (+ ), expr)
73
+ function _get_degrees (:: typeof (+ ), expr)
65
74
# among the terms find the best in terms of monomial_lt
66
75
sel_degs = ()
67
76
sel_degsum = 0
68
77
for arg in arguments (expr)
69
- degs = get_degrees (arg)
78
+ degs = _get_degrees (arg)
70
79
degsum = sum (last, degs, init= 0 )
71
80
if (sel_degs == ()) || (degsum > sel_degsum) ||
72
81
(degsum == sel_degsum && lexlt (degs, sel_degs))
@@ -76,10 +85,10 @@ function get_degrees(::typeof(+), expr)
76
85
return sel_degs
77
86
end
78
87
79
- function get_degrees (:: typeof (^ ), expr)
88
+ function _get_degrees (:: typeof (^ ), expr)
80
89
base_expr, pow_expr = arguments (expr)
81
90
if pow_expr isa Number
82
- @inbounds degs = map (get_degrees (base_expr)) do (base, pow)
91
+ @inbounds degs = map (_get_degrees (base_expr)) do (base, pow)
83
92
(base => pow * pow_expr)
84
93
end
85
94
if pow_expr < 0 && length (degs) > 1
@@ -90,23 +99,23 @@ function get_degrees(::typeof(^), expr)
90
99
return degs
91
100
else
92
101
# expression in the power argument is not supported
93
- return get_degrees (nothing , expr)
102
+ return _get_degrees (nothing , expr)
94
103
end
95
104
end
96
105
97
- function get_degrees (:: typeof (/ ), expr)
106
+ function _get_degrees (:: typeof (/ ), expr)
98
107
nom_expr, denom_expr = arguments (expr)
99
108
if denom_expr isa Number # constant denominator
100
- return get_degrees (nom_expr)
109
+ return _get_degrees (nom_expr)
101
110
elseif nom_expr isa Number # constant nominator
102
- @inbounds degs = map (get_degrees (denom_expr)) do (base, pow)
111
+ @inbounds degs = map (_get_degrees (denom_expr)) do (base, pow)
103
112
(base => - pow)
104
113
end
105
114
isa (degs, AbstractVector) || (degs = collect (degs))
106
115
return sort! (degs)
107
116
else
108
117
# TODO expressions in both nom and denom are not yet supported
109
- return get_degrees (nothing , expr)
118
+ return _get_degrees (nothing , expr)
110
119
end
111
120
end
112
121
0 commit comments