@@ -40,7 +40,6 @@ u = ModelingToolkit.varmap_to_vars(
4040 Dict ([S (k - 1 ) => 1 , I (k - 1 ) => 2 , R (k - 1 ) => 3 ]), unknowns (syss))
4141p = MTKParameters (syss, [c, nsteps, δt, β, γ] .=> collect (1 : 5 ))
4242df. f (du, u, p, 0 )
43- @test_broken getu (syss, [S, I, R])
4443reorderer = getu (syss, [S (k - 1 ), I (k - 1 ), R (k - 1 )])
4544@test reorderer (du) ≈ [0.01831563888873422 , 0.9816849729159067 , 4.999999388195359 ]
4645
@@ -49,16 +48,16 @@ reorderer = getu(syss, [S(k - 1), I(k - 1), R(k - 1)])
4948 [0.01831563888873422 , 0.9816849729159067 , 4.999999388195359 ]
5049
5150# Problem
52- u0 = [S (k - 1 ) => 990.0 , I (k - 1 ) => 10.0 , R (k - 1 ) => 0.0 ]
51+ u0 = [S => 990.0 , I => 10.0 , R => 0.0 ]
5352p = [β => 0.05 , c => 10.0 , γ => 0.25 , δt => 0.1 , nsteps => 400 ]
5453tspan = (0.0 , ModelingToolkit. value (substitute (nsteps, p))) # value function (from Symbolics) is used to convert a Num to Float64
55- prob_map = DiscreteProblem (syss, [u0; p], tspan)
54+ prob_map = DiscreteProblem (syss, [u0; p], tspan; guesses = [ S (k - 1 ) => 1.0 , I (k - 1 ) => 1.0 , R (k - 1 ) => 1.0 ] )
5655@test prob_map. f. sys === syss
5756
5857# Solution
5958using OrdinaryDiffEq
6059sol_map = solve (prob_map, FunctionMap ());
61- @test_broken sol_map[S] isa Vector
60+ @test sol_map[S] isa Vector
6261@test sol_map[S (k - 1 )] isa Vector
6362
6463# Using defaults constructor
@@ -78,16 +77,16 @@ eqs2 = [S ~ S(k - 1) - infection2,
7877 eqs2, t, [S, I, R, R2], [c, nsteps, δt, β, γ])
7978@test ModelingToolkit. defaults (sys) != Dict ()
8079
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+ prob_map2 = DiscreteProblem (sys, [], tspan)
81+ # prob_map2 = DiscreteProblem(sys, [S(k - 1) => S, I(k - 1) => I, R(k - 1) => R], tspan)
8382sol_map2 = solve (prob_map2, FunctionMap ());
8483
8584@test sol_map. u ≈ sol_map2. u
8685for p in parameters (sys)
8786 @test sol_map. prob. ps[p] ≈ sol_map2. prob. ps[p]
8887end
89- @test sol_map2[R2][begin : (end - 1 )] == sol_map2[R (k - 1 )][(begin + 1 ): end ]
90- @test_broken sol_map2[ R2 (k + 1 )][ begin : ( end - 1 )] == sol_map2[R][( begin + 1 ): end ]
88+ @test sol_map2[R2][begin : (end - 1 )] == sol_map2[R (k - 1 )][(begin + 1 ): end ] ==
89+ sol_map2[R][begin : ( end - 1 )]
9190# Direct Implementation
9291
9392function sir_map! (u_diff, u, p, t)
@@ -103,14 +102,12 @@ function sir_map!(u_diff, u, p, t)
103102 end
104103 nothing
105104end ;
106- @test_broken prob_map2[[S, I, R]]
107- u0 = prob_map2[[S (k - 1 ), I (k - 1 ), R (k - 1 )]];
105+ u0 = sol_map2[[S, I, R], 1 ];
108106p = [0.05 , 10.0 , 0.25 , 0.1 ];
109107prob_map = DiscreteProblem (sir_map!, u0, tspan, p);
110108sol_map2 = solve (prob_map, FunctionMap ());
111109
112- @test_broken reduce (hcat, sol_map[[S, I, R]]) ≈ Array (sol_map2)
113- @test reduce (hcat, sol_map[[S (k - 1 ), I (k - 1 ), R (k - 1 )]]) ≈ Array (sol_map2)
110+ @test reduce (hcat, sol_map[[S, I, R]]) ≈ Array (sol_map2)
114111
115112# Delayed difference equation
116113# @variables x(..) y(..) z(t)
@@ -217,7 +214,7 @@ eqs = [u ~ 1
217214prob = DiscreteProblem (de, [x (k - 1 ) => 0.0 ], (0 , 10 ))
218215sol = solve (prob, FunctionMap ())
219216
220- @test reduce (vcat, sol. u) == 1 : 11
217+ @test sol[x] == 1 : 11
221218
222219# Issue#2585
223220getdata (buffer, t) = buffer[mod1 (Int (t), length (buffer))]
@@ -251,77 +248,12 @@ end
251248@test_nowarn @mtkcompile sys = System (; buffer = ones (10 ))
252249
253250@testset " Passing `nothing` to `u0`" begin
254- @test_broken begin
255- @variables x (t) = 1
256- k = ShiftIndex ()
257- @mtkcompile sys = System ([x (k) ~ x (k - 1 ) + 1 ], t)
258- prob = @test_nowarn DiscreteProblem (sys, nothing , (0.0 , 1.0 ))
259- @test_nowarn solve (prob, FunctionMap ())
260- end
261- end
262-
263- @testset " Initialization" begin
264- @test_broken begin
265- # test that default values apply to the entire history
266- @variables x (t) = 1.0
267- @mtkcompile de = System ([x ~ x (k - 1 ) + x (k - 2 )], t)
268- prob = DiscreteProblem (de, [], (0 , 10 ))
269- @test prob[x] == 2.0
270- @test prob[x (k - 1 )] == 1.0
271-
272- # must provide initial conditions for history
273- @test_throws ErrorException DiscreteProblem (de, [x => 2.0 ], (0 , 10 ))
274- @test_throws ErrorException DiscreteProblem (de, [x (k + 1 ) => 2.0 ], (0 , 10 ))
275-
276- # initial values only affect _that timestep_, not the entire history
277- prob = DiscreteProblem (de, [x (k - 1 ) => 2.0 ], (0 , 10 ))
278- @test prob[x] == 3.0
279- @test prob[x (k - 1 )] == 2.0
280- @variables xₜ₋₁ (t)
281- @test prob[xₜ₋₁] == 2.0
282-
283- # Test initial assignment with lowered variable
284- prob = DiscreteProblem (de, [xₜ₋₁ (k - 1 ) => 4.0 ], (0 , 10 ))
285- @test prob[x (k - 1 )] == prob[xₜ₋₁] == 1.0
286- @test prob[x] == 5.0
287-
288- # Test missing initial throws error
289- @variables x (t)
290- @mtkcompile de = System ([x ~ x (k - 1 ) + x (k - 2 ) * x (k - 3 )], t)
291- @test_throws ErrorException prob= DiscreteProblem (de, [x (k - 3 ) => 2.0 ], (0 , 10 ))
292- @test_throws ErrorException prob= DiscreteProblem (
293- de, [x (k - 3 ) => 2.0 , x (k - 1 ) => 3.0 ], (0 , 10 ))
294-
295- # Test non-assigned initials are given default value
296- @variables x (t) = 2.0
297- @mtkcompile de = System ([x ~ x (k - 1 ) + x (k - 2 ) * x (k - 3 )], t)
298- prob = DiscreteProblem (de, [x (k - 3 ) => 12.0 ], (0 , 10 ))
299- @test prob[x] == 26.0
300- @test prob[x (k - 1 )] == 2.0
301- @test prob[x (k - 2 )] == 2.0
302-
303- # Elaborate test
304- @variables xₜ₋₂ (t) zₜ₋₁ (t) z (t)
305- eqs = [x ~ x (k - 1 ) + z (k - 2 ),
306- z ~ x (k - 2 ) * x (k - 3 ) - z (k - 1 )^ 2 ]
307- @mtkcompile de = System (eqs, t)
308- u0 = [x (k - 1 ) => 3 ,
309- xₜ₋₂ (k - 1 ) => 4 ,
310- x (k - 2 ) => 1 ,
311- z (k - 1 ) => 5 ,
312- zₜ₋₁ (k - 1 ) => 12 ]
313- prob = DiscreteProblem (de, u0, (0 , 10 ))
314- @test prob[x] == 15
315- @test prob[z] == - 21
316-
317- import ModelingToolkit: shift2term
318- # unknowns(de) = xₜ₋₁, x, zₜ₋₁, xₜ₋₂, z
319- vars = sort (ModelingToolkit. value .(unknowns (de)); by = string)
320- @test isequal (shift2term (Shift (t, 1 )(vars[2 ])), vars[1 ])
321- @test isequal (shift2term (Shift (t, 1 )(vars[3 ])), vars[2 ])
322- @test isequal (shift2term (Shift (t, - 1 )(vars[4 ])), vars[5 ])
323- @test isequal (shift2term (Shift (t, - 2 )(vars[1 ])), vars[3 ])
324- end
251+ @variables x (t) = 1
252+ k = ShiftIndex ()
253+ @mtkcompile sys = System ([x (k) ~ x (k - 1 ) + 1 ], t)
254+ prob = @test_nowarn DiscreteProblem (sys, nothing , (0.0 , 1.0 ))
255+ sol = solve (prob, FunctionMap ())
256+ @test SciMLBase. successful_retcode (sol)
325257end
326258
327259@testset " Shifted array variables" begin
339271 (0 , 4 ))
340272 @test all (isone, prob. u0)
341273 sol = solve (prob, FunctionMap ())
342- @test_broken sol[[x... , y... ], end ]
343- @test sol[[x (k - 1 )... , y (k - 1 )... ], end ] == 8 ones (4 )
274+ @test sol[[x... , y... ], end ] == 8 ones (4 )
344275end
0 commit comments