@@ -120,3 +120,47 @@ function DiffEqBase.DiscreteProblem(sys::DiscreteSystem,u0map,tspan,
120
120
f (u,p,t) = f_oop (u,p,t)
121
121
DiscreteProblem (f,u0,tspan,p;kwargs... )
122
122
end
123
+
124
+ isdifference (expr) = istree (expr) && operation (expr) isa Difference
125
+ isdifferenceeq (eq) = isdifference (eq. lhs)
126
+
127
+ difference_vars (x:: Sym ) = Set ([x])
128
+ difference_vars (exprs:: Symbolic ) = difference_vars ([exprs])
129
+ difference_vars (exprs) = foldl (difference_vars!, exprs; init = Set ())
130
+ difference_vars! (difference_vars, eq:: Equation ) = (difference_vars! (difference_vars, eq. lhs); difference_vars! (difference_vars, eq. rhs); difference_vars)
131
+ function difference_vars! (difference_vars, O)
132
+ if isa (O, Sym)
133
+ return push! (difference_vars, O)
134
+ end
135
+ ! istree (O) && return difference_vars
136
+
137
+ operation (O) isa Difference && return push! (difference_vars, O)
138
+
139
+ if operation (O) === (getindex) &&
140
+ first (arguments (O)) isa Symbolic
141
+
142
+ return push! (difference_vars, O)
143
+ end
144
+
145
+ symtype (operation (O)) <: FnType && push! (difference_vars, O)
146
+ for arg in arguments (O)
147
+ difference_vars! (difference_vars, arg)
148
+ end
149
+
150
+ return difference_vars
151
+ end
152
+
153
+ function collect_difference_variables (sys:: DiscreteSystem )
154
+ eqs = equations (sys)
155
+ vars = Set ()
156
+ difference_vars = Set ()
157
+ for eq in eqs
158
+ difference_vars! (vars, eq)
159
+ for v in vars
160
+ isdifference (v) || continue
161
+ push! (difference_vars, arguments (v)[1 ])
162
+ end
163
+ empty! (vars)
164
+ end
165
+ return difference_vars
166
+ end
0 commit comments