phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
sir.cc
Go to the documentation of this file.
1// SIR: Classical susceptible-infected-recovered model (C++)
2#include "master.h"
3#include "popul_proc.h"
4#include "generics.h"
5#include "internal.h"
6
7static const int Infected = 1;
8
10typedef struct {
11 int S;
12 int I;
13 int R;
15
17typedef struct {
18 double Beta;
19 double gamma;
20 double psi;
21 double omega;
22 double pop;
23 double S0;
24 double I0;
25 double R0;
27
30
31template<>
32std::string sir_proc_t::yaml (std::string tab) const {
33 std::string t = tab + " ";
34 std::string p = tab + "parameter:\n"
39 + YAML_PARAM(pop)
40 + YAML_PARAM(S0)
41 + YAML_PARAM(I0)
42 + YAML_PARAM(R0);
43 std::string s = tab + "state:\n"
44 + YAML_STATE(S)
45 + YAML_STATE(I)
46 + YAML_STATE(R);
47 return p+s;
48}
49
50template<>
51void sir_proc_t::update_params (double *p, int n) {
52 int m = 0;
57 if (m != n) err("wrong number of parameters!");
58}
59
60template<>
61void sir_proc_t::update_IVPs (double *p, int n) {
62 int m = 0;
63 PARAM_SET(pop);
67 if (m != n) err("wrong number of initial-value parameters!");
68}
69
70template<>
71double sir_proc_t::event_rates (double *rate, int n) const {
72 int m = 0;
73 double total = 0;
74 RATE_CALC(params.Beta * state.S * state.I / params.pop);
75 RATE_CALC(params.gamma * state.I);
76 RATE_CALC(params.psi * state.I);
77 RATE_CALC(params.omega * state.R);
78 if (m != n) err("wrong number of events!");
79 return total;
80}
81
82template<>
84 double f = params.pop/(params.S0+params.I0+params.R0);
85 state.S = nearbyint(f*params.S0);
86 state.I = nearbyint(f*params.I0);
87 state.R = nearbyint(f*params.R0);
89}
90
91template<>
93 switch (event) {
94 case 0:
95 state.S -= 1; state.I += 1; birth();
96 break;
97 case 1:
98 state.I -= 1; state.R += 1; death();
99 break;
100 case 2:
101 sample();
102 break;
103 case 3:
104 state.R -= 1; state.S += 1;
105 break;
106 default: // #nocov
107 assert(0); // #nocov
108 break; // #nocov
109 }
110}
111
Encodes the master process.
Definition master.h:21
void jump(int e)
Definition sir.cc:92
void graft(name_t i=1, int m=1)
new root in deme i
Definition master.h:153
void sample(name_t i=1, int n=1)
sample in deme i
Definition master.h:160
void birth(name_t i=1, name_t j=1, int n=1)
n births into deme j with parent in deme i
Definition master.h:136
void death(name_t i=1)
death in deme i
Definition master.h:147
Population process class.
Definition popul_proc.h:16
double event_rates(double *rate, int n) const
Definition sir.cc:71
#define GENERICS(X, TYPE)
Definition generics.h:133
#define err(...)
Definition internal.h:18
#define n
Definition lbdp_pomp.c:9
#define psi
Definition lbdp_pomp.c:6
#define YAML_PARAM(X)
Definition popul_proc.h:136
#define RATE_CALC(X)
Definition popul_proc.h:135
#define YAML_STATE(X)
Definition popul_proc.h:137
#define PARAM_SET(X)
Definition popul_proc.h:134
#define R0
Definition seirs_pomp.c:35
#define gamma
Definition seirs_pomp.c:29
#define R
Definition seirs_pomp.c:40
#define S0
Definition seirs_pomp.c:32
#define I
Definition seirs_pomp.c:39
#define Beta
Definition seirs_pomp.c:27
#define I0
Definition seirs_pomp.c:34
#define Infected
Definition seirs_pomp.c:5
#define omega
Definition seirs_pomp.c:31
#define S
Definition seirs_pomp.c:37
master_t< sir_proc_t, 1 > sir_genealogy_t
Definition sir.cc:29
popul_proc_t< sir_state_t, sir_parameters_t, 4 > sir_proc_t
Definition sir.cc:28
SIR process parameters.
Definition sir.cc:17
double R0
Definition sir.cc:25
double omega
Definition sir.cc:21
double I0
Definition sir.cc:24
double Beta
Definition sir.cc:18
double gamma
Definition sir.cc:19
double pop
Definition sir.cc:22
double S0
Definition sir.cc:23
double psi
Definition sir.cc:20
SIR process state.
Definition sir.cc:10
int S
Definition sir.cc:11
int R
Definition sir.cc:13
int I
Definition sir.cc:12