@@ -40,7 +40,8 @@ u = ModelingToolkit.varmap_to_vars(
40
40
Dict ([S (k - 1 ) => 1 , I (k - 1 ) => 2 , R (k - 1 ) => 3 ]), unknowns (syss))
41
41
p = MTKParameters (syss, [c, nsteps, δt, β, γ] .=> collect (1 : 5 ))
42
42
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 )])
44
45
@test reorderer (du) ≈ [0.01831563888873422 , 0.9816849729159067 , 4.999999388195359 ]
45
46
46
47
# oop
@@ -57,7 +58,8 @@ prob_map = DiscreteProblem(syss, [u0; p], tspan)
57
58
# Solution
58
59
using OrdinaryDiffEq
59
60
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
61
63
62
64
# Using defaults constructor
63
65
@parameters c= 10.0 nsteps= 400 δt= 0.1 β= 0.05 γ= 0.25
@@ -73,17 +75,19 @@ eqs2 = [S ~ S(k - 1) - infection2,
73
75
R2 ~ R]
74
76
75
77
@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, β, γ])
77
79
@test ModelingToolkit. defaults (sys) != Dict ()
78
80
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)
80
83
sol_map2 = solve (prob_map2, FunctionMap ());
81
84
82
85
@test sol_map. u ≈ sol_map2. u
83
86
for p in parameters (sys)
84
87
@test sol_map. prob. ps[p] ≈ sol_map2. prob. ps[p]
85
88
end
86
89
@test_throws Any sol_map2[R2]
90
+ @test sol_map2[R2][begin : (end - 1 )] == sol_map2[R (k - 1 )][(begin + 1 ): end ]
87
91
@test sol_map2[R2 (k + 1 )][begin : (end - 1 )] == sol_map2[R][(begin + 1 ): end ]
88
92
# Direct Implementation
89
93
@@ -100,12 +104,14 @@ function sir_map!(u_diff, u, p, t)
100
104
end
101
105
nothing
102
106
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 )]];
104
109
p = [0.05 , 10.0 , 0.25 , 0.1 ];
105
110
prob_map = DiscreteProblem (sir_map!, u0, tspan, p);
106
111
sol_map2 = solve (prob_map, FunctionMap ());
107
112
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)
109
115
110
116
# Delayed difference equation
111
117
# @variables x(..) y(..) z(t)
@@ -245,79 +251,78 @@ end
245
251
246
252
@test_nowarn @mtkcompile sys = System (; buffer = ones (10 ))
247
253
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
-
253
254
@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
259
262
end
260
263
261
264
@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
321
326
end
322
327
323
328
@testset " Shifted array variables" begin
335
340
(0 , 4 ))
336
341
@test all (isone, prob. u0)
337
342
sol = solve (prob, FunctionMap ())
338
- @test sol[[x... , y... ], end ] == 8 ones (4 )
343
+ @test_broken sol[[x... , y... ], end ]
344
+ @test sol[[x (k - 1 )... , y (k - 1 )... ], end ] == 8 ones (4 )
339
345
end
0 commit comments