11using JumpProcesses, DiffEqBase
2- using Test, LinearAlgebra
2+ using Test, LinearAlgebra, Statistics
33using StableRNGs
44rng = StableRNG (12345 )
55
6- function regular_rate (out, u, p, t)
7- out[1 ] = (0.1 / 1000.0 ) * u[1 ] * u[2 ]
8- out[2 ] = 0.01 u[2 ]
9- end
6+ Nsims = 8000
107
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)
1714
18- dc = zeros (3 , 2 )
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
1920
20- rj = RegularJump (regular_rate, regular_c, dc; constant_c = true )
21- jumps = JumpSet (rj)
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
2227
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 )
28+ u0 = [999.0 , 10.0 , 0.0 ] # S, I, R
29+ tspan = (0.0 , 250.0 )
2630
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
31+ prob_disc = DiscreteProblem (u0, tspan, p)
32+ rj = RegularJump (regular_rate, regular_c, 3 )
33+ jump_prob = JumpProblem (prob_disc, Direct (), rj)
3234
33- function regular_c (du, u, p, t, counts, mark)
34- mul! (du, dc, counts)
35- end
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)
3637
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 )
42-
43- # Decaying Dimerization Model
44- # Parameters
45- c1 = 1.0 # S1 -> 0
46- c2 = 10.0 # S1 + S1 <- S2
47- c3 = 1000.0 # S1 + S1 -> S2
48- c4 = 0.1 # S2 -> S3
49- p_dim = (c1, c2, c3, c4)
50-
51- regular_rate_dim = (out, u, p, t) -> begin
52- out[1 ] = p[1 ] * u[1 ] # S1 -> 0
53- out[2 ] = p[2 ] * u[2 ] # S1 + S1 <- S2
54- out[3 ] = p[3 ] * u[1 ] * (u[1 ] - 1 ) / 2 # S1 + S1 -> S2
55- out[4 ] = p[4 ] * u[2 ] # S2 -> S3
56- end
38+ sol = solve (EnsembleProblem (jump_prob), ImplicitTauLeaping (), EnsembleSerial (); trajectories = Nsims)
39+ mean_implicit = mean (sol. u[i][1 ,end ] for i in 1 : Nsims)
5740
58- regular_c_dim = (du, u, p, t, counts, mark) -> begin
59- du .= 0.0
60- du[1 ] = - counts[1 ] - 2 * counts[3 ] + 2 * counts[2 ] # S1: -decay - 2*forward + 2*backward
61- du[2 ] = counts[3 ] - counts[2 ] - counts[4 ] # S2: +forward - backward - decay
62- du[3 ] = counts[4 ] # S3: +decay
41+ @test isapprox (mean_simple, mean_implicit, rtol= 0.05 )
6342end
6443
65- u0_dim = [10000.0 , 0.0 , 0.0 ] # S1, S2, S3
66- tspan_dim = (0.0 , 4.0 )
6744
68- prob_disc_dim = DiscreteProblem (u0_dim, tspan_dim, p_dim)
69- rj_dim = RegularJump (regular_rate_dim, regular_c_dim, 4 )
70- jump_prob_dim = JumpProblem (prob_disc_dim, Direct (), rj_dim; rng= rng)
45+ # SEIR model with exposed compartment
46+ let
47+ β = 0.3 / 1000.0
48+ σ = 0.2
49+ ν = 0.01
50+ p = (β, σ, ν)
51+
52+ regular_rate = (out, u, p, t) -> begin
53+ out[1 ] = p[1 ] * u[1 ] * u[3 ] # β*S*I (infection)
54+ out[2 ] = p[2 ] * u[2 ] # σ*E (progression)
55+ out[3 ] = p[3 ] * u[3 ] # ν*I (recovery)
56+ end
57+
58+ regular_c = (dc, u, p, t, counts, mark) -> begin
59+ dc .= 0.0
60+ dc[1 ] = - counts[1 ] # S: -infection
61+ dc[2 ] = counts[1 ] - counts[2 ] # E: +infection - progression
62+ dc[3 ] = counts[2 ] - counts[3 ] # I: +progression - recovery
63+ dc[4 ] = counts[3 ] # R: +recovery
64+ end
7165
72- sol = solve (jump_prob_dim, ImplicitTauLeaping ())
66+ # Initial state
67+ u0 = [999.0 , 0.0 , 10.0 , 0.0 ] # S, E, I, R
68+ tspan = (0.0 , 250.0 )
69+
70+ # Create JumpProblem
71+ prob_disc = DiscreteProblem (u0, tspan, p)
72+ rj = RegularJump (regular_rate, regular_c, 3 )
73+ jump_prob = JumpProblem (prob_disc, Direct (), rj; rng= StableRNG (12345 ))
74+
75+ sol = solve (EnsembleProblem (jump_prob), SimpleTauLeaping (), EnsembleSerial (); trajectories = Nsims, dt = 1.0 )
76+ mean_simple = mean (sol. u[i][end ,end ] for i in 1 : Nsims)
77+
78+ sol = solve (EnsembleProblem (jump_prob), ImplicitTauLeaping (), EnsembleSerial (); trajectories = Nsims)
79+ mean_implicit = mean (sol. u[i][end ,end ] for i in 1 : Nsims)
80+
81+ @test isapprox (mean_simple, mean_implicit, rtol= 0.05 )
82+ end
0 commit comments