Skip to content

Commit 4d7f974

Browse files
refactor: continuous system is always last discrete subsystem
1 parent fc1a4bd commit 4d7f974

File tree

2 files changed

+22
-27
lines changed

2 files changed

+22
-27
lines changed

src/systems/clock_inference.jl

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ function split_system(ci::ClockInference{S}) where {S}
186186
end
187187
tss[id] = ts_i
188188
end
189+
if continuous_id != 0
190+
tss[continuous_id], tss[end] = tss[end], tss[continuous_id]
191+
inputs[continuous_id], inputs[end] = inputs[end], inputs[continuous_id]
192+
id_to_clock[continuous_id], id_to_clock[end] = id_to_clock[end],
193+
id_to_clock[continuous_id]
194+
continuous_id = lastindex(tss)
195+
end
189196
return tss, inputs, continuous_id, id_to_clock
190197
end
191198

@@ -270,25 +277,9 @@ function generate_discrete_affect(
270277
],
271278
[],
272279
let_block) |> toexpr
273-
if use_index_cache
274-
cont_to_disc_idxs = [parameter_index(osys, sym) for sym in input]
275-
disc_range = [parameter_index(osys, sym) for sym in unknowns(sys)]
276-
else
277-
cont_to_disc_idxs = (offset + 1):(offset += ni)
278-
input_offset = offset
279-
disc_range = (offset + 1):(offset += ns)
280-
end
281-
save_vec = Expr(:ref, :Float64)
282-
if use_index_cache
283-
for unk in unknowns(sys)
284-
idx = parameter_index(osys, unk)
285-
push!(save_vec.args, :($(parameter_values)(p, $idx)))
286-
end
287-
else
288-
for i in 1:ns
289-
push!(save_vec.args, :(p[$(input_offset + i)]))
290-
end
291-
end
280+
cont_to_disc_idxs = [parameter_index(osys, sym) for sym in input]
281+
disc_range = [parameter_index(osys, sym) for sym in unknowns(sys)]
282+
save_expr = :($(SciMLBase.save_discretes!)(integrator, $i))
292283
empty_disc = isempty(disc_range)
293284
disc_init = if use_index_cache
294285
:(function (u, p, t)
@@ -351,11 +342,14 @@ function generate_discrete_affect(
351342
# d2c comes last
352343
# @show t
353344
# @show "incoming", p
354-
$(
355-
if use_index_cache
345+
result = c2d_obs(u, p..., t)
346+
for (val, i) in zip(result, $cont_to_disc_idxs)
347+
$(_set_parameter_unchecked!)(p, val, i; update_dependent = false)
348+
end
349+
$(if !empty_disc
356350
quote
357-
result = c2d_obs(integrator.u, p..., t)
358-
for (val, i) in zip(result, $cont_to_disc_idxs)
351+
disc(disc_unknowns, u, p..., t)
352+
for (val, i) in zip(disc_unknowns, $disc_range)
359353
$(_set_parameter_unchecked!)(p, val, i; update_dependent = false)
360354
end
361355
end
@@ -406,7 +400,7 @@ function generate_discrete_affect(
406400
end
407401
)
408402
end)
409-
sv = SavedValues(Float64, Vector{Float64})
403+
410404
push!(affect_funs, affect!)
411405
push!(init_funs, disc_init)
412406
push!(svs, sv)

test/clock.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,11 @@ By inference:
6464

6565
ci, varmap = infer_clocks(sys)
6666
eqmap = ci.eq_domain
67-
tss, inputs = ModelingToolkit.split_system(deepcopy(ci))
68-
sss, = ModelingToolkit._structural_simplify!(deepcopy(tss[1]), (inputs[1], ()))
67+
tss, inputs, continuous_id = ModelingToolkit.split_system(deepcopy(ci))
68+
sss, = ModelingToolkit._structural_simplify!(
69+
deepcopy(tss[continuous_id]), (inputs[continuous_id], ()))
6970
@test equations(sss) == [D(x) ~ u - x]
70-
sss, = ModelingToolkit._structural_simplify!(deepcopy(tss[2]), (inputs[2], ()))
71+
sss, = ModelingToolkit._structural_simplify!(deepcopy(tss[1]), (inputs[1], ()))
7172
@test isempty(equations(sss))
7273
d = Clock(t, dt)
7374
k = ShiftIndex(d)

0 commit comments

Comments
 (0)