phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
mers.cc
Go to the documentation of this file.
1// MERS: Two-host infection model with spillover and demography. Hosts are culled upon sampling. (C++)
2#include "master.h"
3#include "popul_proc.h"
4#include "generics.h"
5#include "internal.h"
6
7static const int camel = 1;
8static const int human = 2;
9
11typedef struct {
12 int Sc;
13 int Ic;
14 int Sh;
15 int Ih;
17
19typedef struct {
20 double Beta_cc;
21 double Beta_ch;
22 double Beta_hc;
23 double Beta_hh;
24 double gamma_c;
25 double gamma_h;
26 double chi_c;
27 double chi_h;
28 double Bc;
29 double Bh;
30 double Sc0;
31 double Sh0;
32 double Ic0;
33 double Ih0;
34 double Nc;
35 double Nh;
37
40
41template<>
42std::string mers_proc_t::yaml (std::string tab) const {
43 std::string t = tab + " ";
44 std::string p = tab + "parameter:\n"
45 + YAML_PARAM(Beta_cc)
46 + YAML_PARAM(Beta_ch)
47 + YAML_PARAM(Beta_hc)
48 + YAML_PARAM(Beta_hh)
49 + YAML_PARAM(gamma_c)
50 + YAML_PARAM(gamma_h)
51 + YAML_PARAM(chi_c)
52 + YAML_PARAM(chi_h)
53 + YAML_PARAM(Bc)
54 + YAML_PARAM(Bh)
55 + YAML_PARAM(Sc0)
56 + YAML_PARAM(Sh0)
57 + YAML_PARAM(Ic0)
58 + YAML_PARAM(Ih0)
59 + YAML_PARAM(Nc)
60 + YAML_PARAM(Nh);
61 std::string s = tab + "state:\n"
62 + YAML_STATE(Sc)
63 + YAML_STATE(Ic)
64 + YAML_STATE(Sh)
65 + YAML_STATE(Ih);
66 return p+s;
67}
68
69template<>
70void mers_proc_t::update_params (double *p, int n) {
71 int m = 0;
72 PARAM_SET(Beta_cc);
73 PARAM_SET(Beta_ch);
74 PARAM_SET(Beta_hc);
75 PARAM_SET(Beta_hh);
76 PARAM_SET(gamma_c);
77 PARAM_SET(gamma_h);
78 PARAM_SET(chi_c);
79 PARAM_SET(chi_h);
80 PARAM_SET(Bc);
81 PARAM_SET(Bh);
82 if (m != n) err("wrong number of parameters!");
83}
84
85template<>
86void mers_proc_t::update_IVPs (double *p, int n) {
87 int m = 0;
88 PARAM_SET(Sc0);
89 PARAM_SET(Sh0);
90 PARAM_SET(Ic0);
91 PARAM_SET(Ih0);
92 PARAM_SET(Nc);
93 PARAM_SET(Nh);
94 if (m != n) err("wrong number of initial-value parameters!");
95}
96
97template<>
98double mers_proc_t::event_rates (double *rate, int n) const {
99 int m = 0;
100 double total = 0;
101 RATE_CALC(params.Beta_cc * state.Sc * state.Ic / params.Nc);
102 RATE_CALC(params.Beta_hh * state.Sh * state.Ih / params.Nh);
103 RATE_CALC(params.Beta_ch * state.Sc * state.Ih / params.Nh);
104 RATE_CALC(params.Beta_hc * state.Sh * state.Ic / params.Nc);
105 RATE_CALC(params.gamma_c * state.Ic);
106 RATE_CALC(params.gamma_h * state.Ih);
107 RATE_CALC(params.chi_c * state.Ic);
108 RATE_CALC(params.chi_h * state.Ih);
109 RATE_CALC(params.Bc);
110 RATE_CALC(params.Bh);
111 RATE_CALC(params.Bc);
112 RATE_CALC(params.Bh/params.Nh * state.Sh);
113 if (m != n) err("wrong number of events!");
114 return total;
115}
116
117template<>
119 double fc = params.Nc/(params.Sc0+params.Ic0);
120 double fh = params.Nh/(params.Sh0+params.Ih0);
121 state.Sc = nearbyint(fc*params.Sc0);
122 state.Ic = nearbyint(fc*params.Ic0);
123 state.Sh = nearbyint(fh*params.Sh0);
124 state.Ih = nearbyint(fh*params.Ih0);
125 graft(camel,state.Ic);
126 graft(human,state.Ih);
127}
128
129template<>
131 switch (event) {
132 case 0:
133 state.Sc -= 1; state.Ic += 1; birth(camel,camel);
134 break;
135 case 1:
136 state.Sh -= 1; state.Ih += 1; birth(human,human);
137 break;
138 case 2:
139 state.Sc -= 1; state.Ic += 1; birth(human,camel);
140 break;
141 case 3:
142 state.Sh -= 1; state.Ih += 1; birth(camel,human);
143 break;
144 case 4:
145 state.Ic -= 1; death(camel);
146 break;
147 case 5:
148 state.Ih -= 1; death(human);
149 break;
150 case 6:
151 state.Ic -= 1; sample_death(camel);
152 break;
153 case 7:
154 state.Ih -= 1; sample_death(human);
155 break;
156 case 8:
157 state.Sc += 1;
158 break;
159 case 9:
160 state.Sh += 1;
161 break;
162 case 10:
163 if (state.Sc > 0) state.Sc -= 1;
164 break;
165 case 11:
166 if (state.Sh > 0) state.Sh -= 1;
167 break;
168 default: // #nocov
169 assert(0); // #nocov
170 break; // #nocov
171 }
172}
173
Encodes the master process.
Definition master.h:21
void graft(name_t i=1, int m=1)
new root in deme i
Definition master.h:153
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 sample_death(name_t i=1, int n=1)
sample_death in deme i
Definition master.h:169
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 mers.cc:98
#define GENERICS(X, TYPE)
Definition generics.h:133
#define err(...)
Definition internal.h:18
#define n
Definition lbdp_pomp.c:9
static const int human
Definition mers.cc:8
master_t< mers_proc_t, 2 > mers_genealogy_t
Definition mers.cc:39
popul_proc_t< mers_state_t, mers_parameters_t, 12 > mers_proc_t
Definition mers.cc:38
static const int camel
Definition mers.cc:7
#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
MERS process parameters.
Definition mers.cc:19
double chi_c
Definition mers.cc:26
double Beta_hc
Definition mers.cc:22
double Beta_ch
Definition mers.cc:21
double gamma_c
Definition mers.cc:24
double Beta_hh
Definition mers.cc:23
double chi_h
Definition mers.cc:27
double gamma_h
Definition mers.cc:25
double Beta_cc
Definition mers.cc:20
MERS process state.
Definition mers.cc:11