41 enum stage_t {DiseaseFree,Precursor,PreClinical,Clinical,
Death};
44 enum event_t {toPrecursor, toPreClinical, toClinical, toDeath, Count};
47 string stage_names[5] = {
"DiseaseFree",
"Precursor",
"PreClinical",
"Clinical",
"Death"};
58 double Lam1,sigm1,p2,lam2,mu3,tau3;
63 static std::map<std::string, std::vector<double> >
report;
65 static void resetPopulation ();
69 CalibPerson(
double *par,
int i=0) {
80 virtual void handleMessage(
const cMessage* msg);
81 virtual Time age() {
return now(); }
84 void CalibPerson::resetPopulation() {
94 void CalibPerson::init() {
95 if (R::runif(0,1)<p2){
102 double lam1 = exp(R::rnorm(Lam1,sigm1));
103 scheduleAt(R::rexp(lam1), toPrecursor);
104 double x = R::runif(0,1);
105 scheduleAt((65 - 15*log(-log(x))), toDeath);
106 for(
int i=10;i<110;i=i+10){
114 void CalibPerson::handleMessage(
const cMessage* msg) {
116 double ctime[] = {20,40,60,80};
120 if (msg->
kind == toDeath) {
122 clinTime=std::min(clinTime,
now());
124 for(
unsigned int i=0; i<4 ; i++){
125 if(i <
report[
"TimeAtRisk"].size()){
126 report[
"TimeAtRisk"][i] += std::min(ctime[i],clinTime);
129 report[
"TimeAtRisk"].push_back(std::min(ctime[i],clinTime));
132 if(clinTime < ctime[i]){
141 else if (msg->
kind == toPrecursor) {
145 scheduleAt(dwellTime, toPreClinical);
149 else if (msg->
kind == toPreClinical) {
151 simtime_t dwellTime =
now()+ exp(R::rnorm(mu3,tau3*mu3));
152 scheduleAt(dwellTime, toClinical);
155 else if (msg->
kind == toClinical) {
158 string stagestr = stage_names[stage];
161 else if (msg->
kind == Count){
162 cind = min(9,
int(
now()/10 - 1));
163 string stagestr = stage_names[stage];
166 report[stagestr].assign(10,0);
168 report[stagestr][cind]+=1;
176 Rcpp::List parmsl(parms);
177 int nin = Rcpp::as<int>(parmsl[
"n"]);
178 std::vector<double> par = Rcpp::as<std::vector<double> >(parmsl[
"runpar"]);
180 CalibPerson::resetPopulation();
187 for (
int i = 0; i < nin; i++) {
188 person = CalibPerson(&par[0],0);