@@ -55,13 +55,24 @@ function get_α_x(αx)
55
55
end
56
56
end
57
57
58
- function is_sub_candidate (rhs, conservative)
58
+ function is_univariate_expr (ex, iv)
59
+ count = 0
60
+ for var in vars (ex)
61
+ if ! isequal (iv, var) && ! isparameter (var)
62
+ count += 1
63
+ count > 1 && return false
64
+ end
65
+ end
66
+ return count <= 1
67
+ end
68
+
69
+ function is_sub_candidate (ex, iv, conservative)
59
70
conservative || return true
60
- isvar (rhs ) || rhs isa Number
71
+ isvar (ex ) || ex isa Number || is_univariate_expr (ex, iv)
61
72
end
62
73
63
- function maybe_alias (lhs, rhs, diff_vars, conservative)
64
- is_sub_candidate (rhs, conservative) || return false , nothing
74
+ function maybe_alias (lhs, rhs, diff_vars, iv, conservative)
75
+ is_sub_candidate (rhs, iv, conservative) || return false , nothing
65
76
66
77
res_left = get_α_x (lhs)
67
78
if res_left != = nothing && ! (res_left[2 ] in diff_vars)
@@ -74,6 +85,7 @@ function maybe_alias(lhs, rhs, diff_vars, conservative)
74
85
end
75
86
76
87
function alias_elimination (sys:: ODESystem ; conservative= true )
88
+ iv = independent_variable (sys)
77
89
eqs = vcat (equations (sys), observed (sys))
78
90
diff_vars = filter (! isnothing, map (eqs) do eq
79
91
if isdiffeq (eq)
@@ -95,10 +107,10 @@ function alias_elimination(sys::ODESystem; conservative=true)
95
107
end
96
108
97
109
# `α x = rhs` => `x = rhs / α`
98
- ma, sub = maybe_alias (eq. lhs, eq. rhs, diff_vars, conservative)
110
+ ma, sub = maybe_alias (eq. lhs, eq. rhs, diff_vars, iv, conservative)
99
111
if ! ma
100
112
# `lhs = β y` => `y = lhs / β`
101
- ma, sub = maybe_alias (eq. rhs, eq. lhs, diff_vars, conservative)
113
+ ma, sub = maybe_alias (eq. rhs, eq. lhs, diff_vars, iv, conservative)
102
114
end
103
115
104
116
isalias = false
0 commit comments