Skip to content

Commit 7b0d100

Browse files
committed
Fix CI
1 parent 6727824 commit 7b0d100

File tree

2 files changed

+58
-59
lines changed

2 files changed

+58
-59
lines changed

src/systems/clock_inference.jl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,20 @@ function generate_discrete_affect(syss, inputs, continuous_id, id_to_clock;
169169
let_block = Let(assignments, let_body, false)
170170
needed_cont_to_disc_obs = map(v -> arguments(v)[1], input)
171171
# TODO: filter the needed ones
172-
needed_disc_to_cont_obs = map(v -> arguments(v)[1], inputs[continuous_id])
172+
fullvars = Set{Any}(eq.lhs for eq in observed(sys))
173+
for s in states(sys)
174+
push!(fullvars, s)
175+
end
176+
needed_disc_to_cont_obs = []
177+
disc_to_cont_idxs = Int[]
178+
for v in inputs[continuous_id]
179+
vv = arguments(v)[1]
180+
if vv in fullvars
181+
push!(needed_disc_to_cont_obs, vv)
182+
push!(disc_to_cont_idxs, param_to_idx[v])
183+
end
184+
end
173185
append!(appended_parameters, input, states(sys))
174-
disc_to_cont_idxs = map(Base.Fix1(getindex, param_to_idx), inputs[continuous_id])
175186
cont_to_disc_obs = build_explicit_observed_function(syss[continuous_id],
176187
needed_cont_to_disc_obs,
177188
throw = false,
@@ -198,6 +209,7 @@ function generate_discrete_affect(syss, inputs, continuous_id, id_to_clock;
198209
for i in 1:ns
199210
push!(save_vec.args, :(p[$(input_offset + i)]))
200211
end
212+
empty_disc = isempty(disc_range)
201213
affect! = :(function (integrator, saved_values)
202214
@unpack u, p, t = integrator
203215
c2d_obs = $cont_to_disc_obs
@@ -212,7 +224,7 @@ function generate_discrete_affect(syss, inputs, continuous_id, id_to_clock;
212224
copyto!(d2c_view, d2c_obs(disc_state, p, t))
213225
push!(saved_values.t, t)
214226
push!(saved_values.saveval, $save_vec)
215-
disc(disc_state, disc_state, p, t)
227+
$empty_disc || disc(disc_state, disc_state, p, t)
216228
end)
217229
sv = SavedValues(Float64, Vector{Float64})
218230
push!(affect_funs, affect!)

test/clock.jl

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -241,28 +241,26 @@ ci, varmap = infer_clocks(cl)
241241
@test varmap[p.u] == Continuous()
242242
@test varmap[c.r] == Clock(t, 0.5)
243243

244-
245244
## Multiple clock rates
246245
@info "Testing multi-rate hybrid system"
247246
dt = 0.1
248247
dt2 = 0.2
249-
@variables t x(t)=0 y(t)=0 u(t)=0 r(t)=1 yd1(t)=0 ud1(t)=0 yd2(t)=0 ud2(t)=0
250-
@parameters kp=1
248+
@variables t x(t)=0 y(t)=0 u(t)=0 yd1(t)=0 ud1(t)=0 yd2(t)=0 ud2(t)=0
249+
@parameters kp=1 r=1
251250
D = Differential(t)
252251

253252
eqs = [
254-
# controller (time discrete part `dt=0.1`)
255-
yd1 ~ Sample(t, dt)(y)
256-
ud1 ~ kp * (Sample(t, dt)(r) - yd1)
257-
# controller (time discrete part `dt=0.2`)
258-
yd2 ~ Sample(t, dt2)(y)
259-
ud2 ~ kp * (Sample(t, dt2)(r) - yd2)
260-
261-
# plant (time continuous part)
262-
u ~ Hold(ud1) + Hold(ud2)
263-
D(x) ~ -x + u
264-
y ~ x
265-
]
253+
# controller (time discrete part `dt=0.1`)
254+
yd1 ~ Sample(t, dt)(y)
255+
ud1 ~ kp * (r - yd1)
256+
# controller (time discrete part `dt=0.2`)
257+
yd2 ~ Sample(t, dt2)(y)
258+
ud2 ~ kp * (r - yd2)
259+
260+
# plant (time continuous part)
261+
u ~ Hold(ud1) + Hold(ud2)
262+
D(x) ~ -x + u
263+
y ~ x]
266264

267265
@named cl = ODESystem(eqs, t)
268266

@@ -274,53 +272,42 @@ ci, varmap = infer_clocks(cl)
274272
@test varmap[ud1] == d
275273
@test varmap[yd2] == d2
276274
@test varmap[ud2] == d2
277-
@test varmap[r] == Continuous()
278275
@test varmap[x] == Continuous()
279276
@test varmap[y] == Continuous()
280277
@test varmap[u] == Continuous()
281278

282279
ss = structural_simplify(cl)
283280

284-
prob = ODEProblem(ss, [x=>0.0], (0.0, 1.0), [kp => 1.0])
285-
sol = solve(prob, Tsit5(), kwargshandle = KeywordArgSilent)
286-
287-
function foo!(dx, x, p, t)
288-
kp, ud1, ud2 = p
289-
dx[1] = -x[1] + ud1 + ud2
290-
end
291-
292-
function affect1!(integrator, saved_values)
293-
kp = integrator.p[1]
294-
y = integrator.u[1]
295-
r = 1.0
296-
ud1 = kp * (r - y)
297-
push!(saved_values.t, integrator.t)
298-
push!(saved_values.saveval, [integrator.p[4]])
299-
integrator.p[2] = ud1
300-
nothing
301-
end
302-
function affect2!(integrator, saved_values)
303-
kp = integrator.p[1]
304-
y = integrator.u[1]
305-
r = 1.0
306-
ud2 = kp * (r - y)
307-
push!(saved_values.t, integrator.t)
308-
push!(saved_values.saveval, [integrator.p[5]])
309-
integrator.p[3] = ud2
310-
nothing
311-
end
312-
saved_values1 = SavedValues(Float64, Vector{Float64})
313-
saved_values2 = SavedValues(Float64, Vector{Float64})
314-
cb1 = PeriodicCallback(Base.Fix2(affect1!, saved_values1), dt)
315-
cb2 = PeriodicCallback(Base.Fix2(affect2!, saved_values2), dt2)
316-
cb = CallbackSet(cb1, cb2)
317-
prob = ODEProblem(foo!, [0.0], (0.0, 1.0), [1.0, 0.0, 0.0, 0.0, 0.0], callback = cb)
318-
sol2 = solve(prob, Tsit5())
281+
if VERSION >= v"1.7"
282+
prob = ODEProblem(ss, [x => 0.0], (0.0, 1.0), [kp => 1.0])
283+
sol = solve(prob, Tsit5(), kwargshandle = KeywordArgSilent)
319284

285+
function foo!(dx, x, p, t)
286+
kp, ud1, ud2 = p
287+
dx[1] = -x[1] + ud1 + ud2
288+
end
320289

321-
@test sol.u == sol2.u
322-
@test saved_values1.t == sol.prob.kwargs[:disc_saved_values][1].t
323-
@test saved_values1.saveval == sol.prob.kwargs[:disc_saved_values][1].saveval
290+
function affect1!(integrator)
291+
kp = integrator.p[1]
292+
y = integrator.u[1]
293+
r = 1.0
294+
ud1 = kp * (r - y)
295+
integrator.p[2] = ud1
296+
nothing
297+
end
298+
function affect2!(integrator)
299+
kp = integrator.p[1]
300+
y = integrator.u[1]
301+
r = 1.0
302+
ud2 = kp * (r - y)
303+
integrator.p[3] = ud2
304+
nothing
305+
end
306+
cb1 = PeriodicCallback(affect1!, dt)
307+
cb2 = PeriodicCallback(affect2!, dt2)
308+
cb = CallbackSet(cb1, cb2)
309+
prob = ODEProblem(foo!, [0.0], (0.0, 1.0), [1.0, 0.0, 0.0], callback = cb)
310+
sol2 = solve(prob, Tsit5())
324311

325-
@test saved_values2.t == sol.prob.kwargs[:disc_saved_values][2].t
326-
@test saved_values2.saveval == sol.prob.kwargs[:disc_saved_values][2].saveval
312+
@test sol.u sol2.u
313+
end

0 commit comments

Comments
 (0)