|  | 
| 3 | 3 | - https://github.com/epirecipes/sir-julia/blob/master/markdown/function_map/function_map.md | 
| 4 | 4 | - https://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology#Deterministic_versus_stochastic_epidemic_models | 
| 5 | 5 | =# | 
| 6 |  | -using ModelingToolkit, Test | 
|  | 6 | +using ModelingToolkit, SymbolicIndexingInterface, Test | 
| 7 | 7 | using ModelingToolkit: t_nounits as t | 
| 8 | 8 | using ModelingToolkit: get_metadata, MTKParameters | 
| 9 | 9 | 
 | 
| @@ -37,13 +37,15 @@ syss = structural_simplify(sys) | 
| 37 | 37 | df = DiscreteFunction(syss) | 
| 38 | 38 | # iip | 
| 39 | 39 | du = zeros(3) | 
| 40 |  | -u = collect(1:3) | 
|  | 40 | +u = ModelingToolkit.better_varmap_to_vars(Dict([S => 1, I => 2, R => 3]), unknowns(syss)) | 
| 41 | 41 | p = MTKParameters(syss, [c, nsteps, δt, β, γ] .=> collect(1:5)) | 
| 42 | 42 | df.f(du, u, p, 0) | 
| 43 |  | -@test du ≈ [0.01831563888873422, 0.9816849729159067, 4.999999388195359] | 
|  | 43 | +reorderer = getu(syss, [S, I, R]) | 
|  | 44 | +@test reorderer(du) ≈ [0.01831563888873422, 0.9816849729159067, 4.999999388195359] | 
| 44 | 45 | 
 | 
| 45 | 46 | # oop | 
| 46 |  | -@test df.f(u, p, 0) ≈ [0.01831563888873422, 0.9816849729159067, 4.999999388195359] | 
|  | 47 | +@test reorderer(df.f(u, p, 0)) ≈ | 
|  | 48 | +      [0.01831563888873422, 0.9816849729159067, 4.999999388195359] | 
| 47 | 49 | 
 | 
| 48 | 50 | # Problem | 
| 49 | 51 | u0 = [S(k - 1) => 990.0, I(k - 1) => 10.0, R(k - 1) => 0.0] | 
| @@ -98,12 +100,12 @@ function sir_map!(u_diff, u, p, t) | 
| 98 | 100 |     end | 
| 99 | 101 |     nothing | 
| 100 | 102 | end; | 
| 101 |  | -u0 = prob_map2.u0; | 
|  | 103 | +u0 = prob_map2[[S, I, R]]; | 
| 102 | 104 | p = [0.05, 10.0, 0.25, 0.1]; | 
| 103 | 105 | prob_map = DiscreteProblem(sir_map!, u0, tspan, p); | 
| 104 | 106 | sol_map2 = solve(prob_map, FunctionMap()); | 
| 105 | 107 | 
 | 
| 106 |  | -@test Array(sol_map) ≈ Array(sol_map2) | 
|  | 108 | +@test reduce(hcat, sol_map[[S, I, R]]) ≈ Array(sol_map2) | 
| 107 | 109 | 
 | 
| 108 | 110 | # Delayed difference equation | 
| 109 | 111 | # @variables x(..) y(..) z(t) | 
|  | 
| 317 | 319 | 
 | 
| 318 | 320 |     import ModelingToolkit: shift2term | 
| 319 | 321 |     # unknowns(de) = xₜ₋₁, x, zₜ₋₁, xₜ₋₂, z | 
| 320 |  | -    vars = ModelingToolkit.value.(unknowns(de)) | 
| 321 |  | -    @test isequal(shift2term(Shift(t, 1)(vars[1])), vars[2]) | 
| 322 |  | -    @test isequal(shift2term(Shift(t, 1)(vars[4])), vars[1]) | 
| 323 |  | -    @test isequal(shift2term(Shift(t, -1)(vars[5])), vars[3]) | 
| 324 |  | -    @test isequal(shift2term(Shift(t, -2)(vars[2])), vars[4]) | 
|  | 322 | +    vars = sort(ModelingToolkit.value.(unknowns(de)); by = string) | 
|  | 323 | +    @test isequal(shift2term(Shift(t, 1)(vars[2])), vars[1]) | 
|  | 324 | +    @test isequal(shift2term(Shift(t, 1)(vars[3])), vars[2]) | 
|  | 325 | +    @test isequal(shift2term(Shift(t, -1)(vars[4])), vars[5]) | 
|  | 326 | +    @test isequal(shift2term(Shift(t, -2)(vars[1])), vars[3]) | 
| 325 | 327 | end | 
0 commit comments