Skip to content

Commit a1efafd

Browse files
test: mark appropriate discrete system tests as broken
1 parent 3ca1c63 commit a1efafd

File tree

1 file changed

+82
-76
lines changed

1 file changed

+82
-76
lines changed

test/discrete_system.jl

Lines changed: 82 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ u = ModelingToolkit.varmap_to_vars(
4040
Dict([S(k - 1) => 1, I(k - 1) => 2, R(k - 1) => 3]), unknowns(syss))
4141
p = MTKParameters(syss, [c, nsteps, δt, β, γ] .=> collect(1:5))
4242
df.f(du, u, p, 0)
43-
reorderer = getu(syss, [S, I, R])
43+
@test_broken getu(syss, [S, I, R])
44+
reorderer = getu(syss, [S(k - 1), I(k - 1), R(k - 1)])
4445
@test reorderer(du) [0.01831563888873422, 0.9816849729159067, 4.999999388195359]
4546

4647
# oop
@@ -57,7 +58,8 @@ prob_map = DiscreteProblem(syss, [u0; p], tspan)
5758
# Solution
5859
using OrdinaryDiffEq
5960
sol_map = solve(prob_map, FunctionMap());
60-
@test sol_map[S] isa Vector
61+
@test_broken sol_map[S] isa Vector
62+
@test sol_map[S(k - 1)] isa Vector
6163

6264
# Using defaults constructor
6365
@parameters c=10.0 nsteps=400 δt=0.1 β=0.05 γ=0.25
@@ -73,17 +75,19 @@ eqs2 = [S ~ S(k - 1) - infection2,
7375
R2 ~ R]
7476

7577
@mtkcompile sys = System(
76-
eqs2, t, [S, I, R, R2], [c, nsteps, δt, β, γ]; controls = [β, γ], tspan)
78+
eqs2, t, [S, I, R, R2], [c, nsteps, δt, β, γ])
7779
@test ModelingToolkit.defaults(sys) != Dict()
7880

79-
prob_map2 = DiscreteProblem(sys)
81+
@test_broken DiscreteProblem(sys, [], tspan)
82+
prob_map2 = DiscreteProblem(sys, [S(k - 1) => S, I(k - 1) => I, R(k - 1) => R], tspan)
8083
sol_map2 = solve(prob_map2, FunctionMap());
8184

8285
@test sol_map.u sol_map2.u
8386
for p in parameters(sys)
8487
@test sol_map.prob.ps[p] sol_map2.prob.ps[p]
8588
end
8689
@test_throws Any sol_map2[R2]
90+
@test sol_map2[R2][begin:(end - 1)] == sol_map2[R(k - 1)][(begin + 1):end]
8791
@test sol_map2[R2(k + 1)][begin:(end - 1)] == sol_map2[R][(begin + 1):end]
8892
# Direct Implementation
8993

@@ -100,12 +104,14 @@ function sir_map!(u_diff, u, p, t)
100104
end
101105
nothing
102106
end;
103-
u0 = prob_map2[[S, I, R]];
107+
@test_broken prob_map2[[S, I, R]]
108+
u0 = prob_map2[[S(k - 1), I(k - 1), R(k - 1)]];
104109
p = [0.05, 10.0, 0.25, 0.1];
105110
prob_map = DiscreteProblem(sir_map!, u0, tspan, p);
106111
sol_map2 = solve(prob_map, FunctionMap());
107112

108-
@test reduce(hcat, sol_map[[S, I, R]]) Array(sol_map2)
113+
@test_broken reduce(hcat, sol_map[[S, I, R]]) Array(sol_map2)
114+
@test reduce(hcat, sol_map[[S(k - 1), I(k - 1), R(k - 1)]]) Array(sol_map2)
109115

110116
# Delayed difference equation
111117
# @variables x(..) y(..) z(t)
@@ -245,79 +251,78 @@ end
245251

246252
@test_nowarn @mtkcompile sys = System(; buffer = ones(10))
247253

248-
# Ensure discrete systems with algebraic equations throw
249-
@variables x(t) y(t)
250-
k = ShiftIndex(t)
251-
@named sys = System([x ~ x^2 + y^2, y ~ x(k - 1) + y(k - 1)], t)
252-
253254
@testset "Passing `nothing` to `u0`" begin
254-
@variables x(t) = 1
255-
k = ShiftIndex()
256-
@mtkcompile sys = System([x(k) ~ x(k - 1) + 1], t)
257-
prob = @test_nowarn DiscreteProblem(sys, nothing, (0.0, 1.0))
258-
@test_nowarn solve(prob, FunctionMap())
255+
@test_broken begin
256+
@variables x(t) = 1
257+
k = ShiftIndex()
258+
@mtkcompile sys = System([x(k) ~ x(k - 1) + 1], t)
259+
prob = @test_nowarn DiscreteProblem(sys, nothing, (0.0, 1.0))
260+
@test_nowarn solve(prob, FunctionMap())
261+
end
259262
end
260263

261264
@testset "Initialization" begin
262-
# test that default values apply to the entire history
263-
@variables x(t) = 1.0
264-
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2)], t)
265-
prob = DiscreteProblem(de, [], (0, 10))
266-
@test prob[x] == 2.0
267-
@test prob[x(k - 1)] == 1.0
268-
269-
# must provide initial conditions for history
270-
@test_throws ErrorException DiscreteProblem(de, [x => 2.0], (0, 10))
271-
@test_throws ErrorException DiscreteProblem(de, [x(k + 1) => 2.0], (0, 10))
272-
273-
# initial values only affect _that timestep_, not the entire history
274-
prob = DiscreteProblem(de, [x(k - 1) => 2.0], (0, 10))
275-
@test prob[x] == 3.0
276-
@test prob[x(k - 1)] == 2.0
277-
@variables xₜ₋₁(t)
278-
@test prob[xₜ₋₁] == 2.0
279-
280-
# Test initial assignment with lowered variable
281-
prob = DiscreteProblem(de, [xₜ₋₁(k - 1) => 4.0], (0, 10))
282-
@test prob[x(k - 1)] == prob[xₜ₋₁] == 1.0
283-
@test prob[x] == 5.0
284-
285-
# Test missing initial throws error
286-
@variables x(t)
287-
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2) * x(k - 3)], t)
288-
@test_throws ErrorException prob=DiscreteProblem(de, [x(k - 3) => 2.0], (0, 10))
289-
@test_throws ErrorException prob=DiscreteProblem(
290-
de, [x(k - 3) => 2.0, x(k - 1) => 3.0], (0, 10))
291-
292-
# Test non-assigned initials are given default value
293-
@variables x(t) = 2.0
294-
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2) * x(k - 3)], t)
295-
prob = DiscreteProblem(de, [x(k - 3) => 12.0], (0, 10))
296-
@test prob[x] == 26.0
297-
@test prob[x(k - 1)] == 2.0
298-
@test prob[x(k - 2)] == 2.0
299-
300-
# Elaborate test
301-
@variables xₜ₋₂(t) zₜ₋₁(t) z(t)
302-
eqs = [x ~ x(k - 1) + z(k - 2),
303-
z ~ x(k - 2) * x(k - 3) - z(k - 1)^2]
304-
@mtkcompile de = System(eqs, t)
305-
u0 = [x(k - 1) => 3,
306-
xₜ₋₂(k - 1) => 4,
307-
x(k - 2) => 1,
308-
z(k - 1) => 5,
309-
zₜ₋₁(k - 1) => 12]
310-
prob = DiscreteProblem(de, u0, (0, 10))
311-
@test prob[x] == 15
312-
@test prob[z] == -21
313-
314-
import ModelingToolkit: shift2term
315-
# unknowns(de) = xₜ₋₁, x, zₜ₋₁, xₜ₋₂, z
316-
vars = sort(ModelingToolkit.value.(unknowns(de)); by = string)
317-
@test isequal(shift2term(Shift(t, 1)(vars[2])), vars[1])
318-
@test isequal(shift2term(Shift(t, 1)(vars[3])), vars[2])
319-
@test isequal(shift2term(Shift(t, -1)(vars[4])), vars[5])
320-
@test isequal(shift2term(Shift(t, -2)(vars[1])), vars[3])
265+
@test_broken begin
266+
# test that default values apply to the entire history
267+
@variables x(t) = 1.0
268+
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2)], t)
269+
prob = DiscreteProblem(de, [], (0, 10))
270+
@test prob[x] == 2.0
271+
@test prob[x(k - 1)] == 1.0
272+
273+
# must provide initial conditions for history
274+
@test_throws ErrorException DiscreteProblem(de, [x => 2.0], (0, 10))
275+
@test_throws ErrorException DiscreteProblem(de, [x(k + 1) => 2.0], (0, 10))
276+
277+
# initial values only affect _that timestep_, not the entire history
278+
prob = DiscreteProblem(de, [x(k - 1) => 2.0], (0, 10))
279+
@test prob[x] == 3.0
280+
@test prob[x(k - 1)] == 2.0
281+
@variables xₜ₋₁(t)
282+
@test prob[xₜ₋₁] == 2.0
283+
284+
# Test initial assignment with lowered variable
285+
prob = DiscreteProblem(de, [xₜ₋₁(k - 1) => 4.0], (0, 10))
286+
@test prob[x(k - 1)] == prob[xₜ₋₁] == 1.0
287+
@test prob[x] == 5.0
288+
289+
# Test missing initial throws error
290+
@variables x(t)
291+
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2) * x(k - 3)], t)
292+
@test_throws ErrorException prob=DiscreteProblem(de, [x(k - 3) => 2.0], (0, 10))
293+
@test_throws ErrorException prob=DiscreteProblem(
294+
de, [x(k - 3) => 2.0, x(k - 1) => 3.0], (0, 10))
295+
296+
# Test non-assigned initials are given default value
297+
@variables x(t) = 2.0
298+
@mtkcompile de = System([x ~ x(k - 1) + x(k - 2) * x(k - 3)], t)
299+
prob = DiscreteProblem(de, [x(k - 3) => 12.0], (0, 10))
300+
@test prob[x] == 26.0
301+
@test prob[x(k - 1)] == 2.0
302+
@test prob[x(k - 2)] == 2.0
303+
304+
# Elaborate test
305+
@variables xₜ₋₂(t) zₜ₋₁(t) z(t)
306+
eqs = [x ~ x(k - 1) + z(k - 2),
307+
z ~ x(k - 2) * x(k - 3) - z(k - 1)^2]
308+
@mtkcompile de = System(eqs, t)
309+
u0 = [x(k - 1) => 3,
310+
xₜ₋₂(k - 1) => 4,
311+
x(k - 2) => 1,
312+
z(k - 1) => 5,
313+
zₜ₋₁(k - 1) => 12]
314+
prob = DiscreteProblem(de, u0, (0, 10))
315+
@test prob[x] == 15
316+
@test prob[z] == -21
317+
318+
import ModelingToolkit: shift2term
319+
# unknowns(de) = xₜ₋₁, x, zₜ₋₁, xₜ₋₂, z
320+
vars = sort(ModelingToolkit.value.(unknowns(de)); by = string)
321+
@test isequal(shift2term(Shift(t, 1)(vars[2])), vars[1])
322+
@test isequal(shift2term(Shift(t, 1)(vars[3])), vars[2])
323+
@test isequal(shift2term(Shift(t, -1)(vars[4])), vars[5])
324+
@test isequal(shift2term(Shift(t, -2)(vars[1])), vars[3])
325+
end
321326
end
322327

323328
@testset "Shifted array variables" begin
@@ -335,5 +340,6 @@ end
335340
(0, 4))
336341
@test all(isone, prob.u0)
337342
sol = solve(prob, FunctionMap())
338-
@test sol[[x..., y...], end] == 8ones(4)
343+
@test_broken sol[[x..., y...], end]
344+
@test sol[[x(k - 1)..., y(k - 1)...], end] == 8ones(4)
339345
end

0 commit comments

Comments
 (0)