|
1 | 1 | using JumpProcesses, DiffEqBase |
2 | | -using Test, LinearAlgebra, Statistics |
3 | | -using StableRNGs |
| 2 | +using Test, LinearAlgebra |
| 3 | +using StableRNGs, Plots |
4 | 4 | rng = StableRNG(12345) |
5 | 5 |
|
6 | | -function regular_rate(out, u, p, t) |
7 | | - out[1] = (0.1 / 1000.0) * u[1] * u[2] |
8 | | - out[2] = 0.01u[2] |
9 | | -end |
| 6 | +Nsims = 8000 |
10 | 7 |
|
11 | | -function regular_c(dc, u, p, t, mark) |
12 | | - dc[1, 1] = -1 |
13 | | - dc[2, 1] = 1 |
14 | | - dc[2, 2] = -1 |
15 | | - dc[3, 2] = 1 |
16 | | -end |
| 8 | +# SIR model with influx |
| 9 | +let |
| 10 | + β = 0.1 / 1000.0 |
| 11 | + ν = 0.01 |
| 12 | + influx_rate = 1.0 |
| 13 | + p = (β, ν, influx_rate) |
| 14 | + |
| 15 | + regular_rate = (out, u, p, t) -> begin |
| 16 | + out[1] = p[1] * u[1] * u[2] # β*S*I (infection) |
| 17 | + out[2] = p[2] * u[2] # ν*I (recovery) |
| 18 | + out[3] = p[3] # influx_rate |
| 19 | + end |
| 20 | + |
| 21 | + regular_c = (dc, u, p, t, counts, mark) -> begin |
| 22 | + dc .= 0.0 |
| 23 | + dc[1] = -counts[1] + counts[3] # S: -infection + influx |
| 24 | + dc[2] = counts[1] - counts[2] # I: +infection - recovery |
| 25 | + dc[3] = counts[2] # R: +recovery |
| 26 | + end |
17 | 27 |
|
18 | | -dc = zeros(3, 2) |
| 28 | + u0 = [999.0, 10.0, 0.0] # S, I, R |
| 29 | + tspan = (0.0, 250.0) |
19 | 30 |
|
20 | | -rj = RegularJump(regular_rate, regular_c, dc; constant_c = true) |
21 | | -jumps = JumpSet(rj) |
| 31 | + prob_disc = DiscreteProblem(u0, tspan, p) |
| 32 | + rj = RegularJump(regular_rate, regular_c, 3) |
| 33 | + jump_prob = JumpProblem(prob_disc, Direct(), rj) |
22 | 34 |
|
23 | | -prob = DiscreteProblem([999.0, 1.0, 0.0], (0.0, 250.0)) |
24 | | -jump_prob = JumpProblem(prob, Direct(), rj; rng = rng) |
25 | | -sol = solve(jump_prob, SimpleTauLeaping(); dt = 1.0) |
| 35 | + sol = solve(EnsembleProblem(jump_prob), SimpleTauLeaping(), EnsembleSerial(); trajectories = Nsims, dt = 1.0) |
| 36 | + mean_simple = mean(sol.u[i][1,end] for i in 1:Nsims) |
26 | 37 |
|
27 | | -const _dc = zeros(3, 2) |
28 | | -dc[1, 1] = -1 |
29 | | -dc[2, 1] = 1 |
30 | | -dc[2, 2] = -1 |
31 | | -dc[3, 2] = 1 |
| 38 | + sol = solve(EnsembleProblem(jump_prob), SimpleImplicitTauLeaping(), EnsembleSerial(); trajectories = Nsims) |
| 39 | + mean_implicit = mean(sol.u[i][1,end] for i in 1:Nsims) |
32 | 40 |
|
33 | | -function regular_c(du, u, p, t, counts, mark) |
34 | | - mul!(du, dc, counts) |
| 41 | + sol = solve(EnsembleProblem(jump_prob), SimpleAdaptiveTauLeaping(), EnsembleSerial(); trajectories = Nsims) |
| 42 | + mean_adaptive = mean(sol.u[i][1,end] for i in 1:Nsims) |
| 43 | + |
| 44 | + @test isapprox(mean_simple, mean_implicit, rtol=0.05) |
| 45 | + @test isapprox(mean_simple, mean_adaptive, rtol=0.05) |
35 | 46 | end |
36 | 47 |
|
37 | | -rj = RegularJump(regular_rate, regular_c, 2) |
38 | | -jumps = JumpSet(rj) |
39 | | -prob = DiscreteProblem([999, 1, 0], (0.0, 250.0)) |
40 | | -jump_prob = JumpProblem(prob, Direct(), rj; rng = rng) |
41 | | -sol = solve(jump_prob, SimpleTauLeaping(); dt = 1.0) |
| 48 | + |
| 49 | +# SEIR model with exposed compartment |
| 50 | +let |
| 51 | + β = 0.3 / 1000.0 |
| 52 | + σ = 0.2 |
| 53 | + ν = 0.01 |
| 54 | + p = (β, σ, ν) |
| 55 | + |
| 56 | + regular_rate = (out, u, p, t) -> begin |
| 57 | + out[1] = p[1] * u[1] * u[3] # β*S*I (infection) |
| 58 | + out[2] = p[2] * u[2] # σ*E (progression) |
| 59 | + out[3] = p[3] * u[3] # ν*I (recovery) |
| 60 | + end |
| 61 | + |
| 62 | + regular_c = (dc, u, p, t, counts, mark) -> begin |
| 63 | + dc .= 0.0 |
| 64 | + dc[1] = -counts[1] # S: -infection |
| 65 | + dc[2] = counts[1] - counts[2] # E: +infection - progression |
| 66 | + dc[3] = counts[2] - counts[3] # I: +progression - recovery |
| 67 | + dc[4] = counts[3] # R: +recovery |
| 68 | + end |
| 69 | + |
| 70 | + # Initial state |
| 71 | + u0 = [999.0, 0.0, 10.0, 0.0] # S, E, I, R |
| 72 | + tspan = (0.0, 250.0) |
| 73 | + |
| 74 | + # Create JumpProblem |
| 75 | + prob_disc = DiscreteProblem(u0, tspan, p) |
| 76 | + rj = RegularJump(regular_rate, regular_c, 3) |
| 77 | + jump_prob = JumpProblem(prob_disc, Direct(), rj; rng=StableRNG(12345)) |
| 78 | + |
| 79 | + sol = solve(EnsembleProblem(jump_prob), SimpleTauLeaping(), EnsembleSerial(); trajectories = Nsims, dt = 1.0) |
| 80 | + mean_simple = mean(sol.u[i][end,end] for i in 1:Nsims) |
| 81 | + |
| 82 | + sol = solve(EnsembleProblem(jump_prob), SimpleImplicitTauLeaping(), EnsembleSerial(); trajectories = Nsims) |
| 83 | + mean_implicit = mean(sol.u[i][end,end] for i in 1:Nsims) |
| 84 | + |
| 85 | + sol = solve(EnsembleProblem(jump_prob), SimpleAdaptiveTauLeaping(), EnsembleSerial(); trajectories = Nsims) |
| 86 | + mean_adaptive = mean(sol.u[i][end,end] for i in 1:Nsims) |
| 87 | + |
| 88 | + @test isapprox(mean_simple, mean_implicit, rtol=0.05) |
| 89 | + @test isapprox(mean_simple, mean_adaptive, rtol=0.05) |
| 90 | +end |
0 commit comments