Skip to content

Commit 6c22015

Browse files
committed
Add utilities to use Difference operator
1 parent b094d5b commit 6c22015

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/systems/discrete_system/discrete_system.jl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,47 @@ function DiffEqBase.DiscreteProblem(sys::DiscreteSystem,u0map,tspan,
120120
f(u,p,t) = f_oop(u,p,t)
121121
DiscreteProblem(f,u0,tspan,p;kwargs...)
122122
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

Comments
 (0)