Skip to content

Commit ab61554

Browse files
fix: fix hierarchical discrete systems (#2593)
1 parent 7fb1d99 commit ab61554

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

src/systems/discrete_system/discrete_system.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,22 @@ function DiscreteSystem(eqs, iv; kwargs...)
199199
collect(allunknowns), collect(new_ps); kwargs...)
200200
end
201201

202+
function flatten(sys::DiscreteSystem, noeqs = false)
203+
systems = get_systems(sys)
204+
if isempty(systems)
205+
return sys
206+
else
207+
return DiscreteSystem(noeqs ? Equation[] : equations(sys),
208+
get_iv(sys),
209+
unknowns(sys),
210+
parameters(sys),
211+
observed = observed(sys),
212+
defaults = defaults(sys),
213+
name = nameof(sys),
214+
checks = false)
215+
end
216+
end
217+
202218
function generate_function(
203219
sys::DiscreteSystem, dvs = unknowns(sys), ps = full_parameters(sys); kwargs...)
204220
generate_custom_function(sys, [eq.rhs for eq in equations(sys)], dvs, ps; kwargs...)

test/discrete_system.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,34 @@ prob = DiscreteProblem(de, [], (0, 10))
234234
prob = DiscreteProblem(de, [x(k - 1) => 2.0], (0, 10))
235235
@test prob[x] == 3.0
236236
@test prob[x(k - 1)] == 2.0
237+
238+
# Issue#2585
239+
getdata(buffer, t) = buffer[mod1(Int(t), length(buffer))]
240+
@register_symbolic getdata(buffer::Vector, t)
241+
k = ShiftIndex(t)
242+
function SampledData(; name, buffer)
243+
L = length(buffer)
244+
pars = @parameters begin
245+
buffer[1:L] = buffer
246+
end
247+
@variables output(t) time(t)
248+
eqs = [time ~ time(k - 1) + 1
249+
output ~ getdata(buffer, time)]
250+
return DiscreteSystem(eqs, t; name)
251+
end
252+
function System(; name, buffer)
253+
@named y_sys = SampledData(; buffer = buffer)
254+
pars = @parameters begin
255+
α = 0.5, [description = "alpha"]
256+
β = 0.5, [description = "beta"]
257+
end
258+
vars = @variables y(t)=0.0 y_shk(t)=0.0
259+
260+
eqs = [y_shk ~ y_sys.output
261+
# y[t] = 0.5 * y[t - 1] + 0.5 * y[t + 1] + y_shk[t]
262+
y(k - 1) ~ α * y(k - 2) +* y(k) + y_shk(k - 1))]
263+
264+
DiscreteSystem(eqs, t, vars, pars; systems = [y_sys], name = name)
265+
end
266+
267+
@test_nowarn @mtkbuild sys = System(; buffer = ones(10))

0 commit comments

Comments
 (0)