SIR.jl 1.13 KB
Newer Older
1
2
3
4
5

import StaticArrays: SVector, SMatrix, @SMatrix

d=3
k=2
6
7
8
dict_var = Dict("S" => 1, "I" => 2, "R" => 3)
dict_p = Dict("ki" => 1, "kr" => 2)
l_tr = ["R1","R2"]
9
10
p = SVector(0.0012, 0.05)
x0 = SVector(95, 5, 0)
11
t0 = 0.0
12
function f(xn::SVector{3, Int}, tn::Float64, p::SVector{2, Float64})
13
14
15
16
17
    a1 = p[1] * xn[1] * xn[2]
    a2 = p[2] * xn[2]
    l_a = SVector(a1, a2)
    asum = sum(l_a)
    # column-major order
Bentriou Mahmoud's avatar
Bentriou Mahmoud committed
18
19
20
    l_nu = @SMatrix [-1 0;
                     1 -1;
                     0 1]
21
22
23
24
25
26
    
    u1, u2 = rand(), rand()
    tau = - log(u1) / asum
    b_inf = 0.0
    b_sup = a1
    reaction = 0
27
    for i = 1:2 
28
29
30
31
32
33
34
35
36
        if b_inf < asum*u2 < b_sup
            reaction = i
            break
        end
        b_inf += l_a[i]
        b_sup += l_a[i+1]
    end
 
    nu = l_nu[:,reaction]
37
    xnplus1 = SVector(xn[1]+nu[1], xn[2]+nu[2], xn[3]+nu[3])
38
39
40
    tnplus1 = tn + tau
    transition = "R$(reaction)"

41
    return xnplus1, tnplus1, transition
42
end
43
is_absorbing_sir(p::SVector{2, Float64}, xn::SVector{3, Int}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) == 0.0
44
g = SVector("I")
45

46
47
SIR = CTMC(d,k,dict_var,dict_p,l_tr,p,x0,t0,f,is_absorbing_sir; g=g)
export SIR
48