Go back to household_stochastic_simulation
This file defines the main program.
<project-file type=“source”/>
<content> #include “networkstructure.h” #include “netprocess.h” #include “parameters.h” #include “eventloggers.h” #include “genrand2.h”
#include <iostream> #include <fstream> #include <time.h>
int main(int argc, const char *argv[]) {
Parameters params;
StringArgument ArgNet(“network”, “network data file name (output of the netgen program)”, Argument::REQUIRED);
StringArgument ArgI0("initial-infections", "the initial infections data file name (a list of node IDs)", Argument::NOT_REQUIRED); LongArgument ArgSeed("seed", "the seed to initialize the random number generator", Argument::NOT_REQUIRED); StringArgument ArgLog("log", "log file name", Argument::REQUIRED); FloatArgument ArgBetaHousehold("household-contact-rate", "the transmission rate", Argument::REQUIRED); FloatArgument ArgBetaExternal("external-contact-rate", "the transmission rate", Argument::REQUIRED); FloatArgument ArgBeta("contact-rate", "the transmission rate", Argument::REQUIRED); DistributionArgument ArgTinf("infectious-period", "the infectious period", Argument::REQUIRED); DistributionArgument ArgTlat("latent-period", "the latent period", Argument::REQUIRED); FloatArgument ArgQuit("quit-time", "the simulation end time", Argument::REQUIRED); BoolArgument ArgSIR("has-immunity", "SIR/SIS model", Argument::REQUIRED); IntArgument ArgRuns("runs", "the number of simulation runs", Argument::NOT_REQUIRED, 1); BoolArgument ArgDumpNet("dump-network", "whether to dump the contact network in the log file", Argument::NOT_REQUIRED, false); BoolArgument ArgCases("count-cases", "if true, count the number of new cases in each time unit, otherwise, count the number of infected individual in each time unit", Argument::NOT_REQUIRED, false);
params.addArgument(ArgNet); params.addArgument(ArgI0); params.addArgument(ArgSeed); params.addArgument(ArgLog); params.addArgument(ArgBetaHousehold); params.addArgument(ArgBetaExternal); params.addArgument(ArgTinf); params.addArgument(ArgTlat); params.addArgument(ArgQuit); params.addArgument(ArgSIR); params.addArgument(ArgRuns); params.addArgument(ArgDumpNet); params.addArgument(ArgCases); if (!params.parse(argc, argv)) { params.usage(argv[0]); return 1; } // initialize the random number generator time_t seed; if (ArgSeed.set()) seed = ArgSeed.value(); else time(&seed); sgenrand2(seed);
NetworkStructure net(ArgNet.value());
// set initial infections std::vector<int> I0; int n = net.nodes(); if (ArgI0.set()) { FILE *fI0 = fopen(ArgI0.value(), "r"); if (fI0 == NULL) { std::cerr<<"Error: initial infections data file not readable!"<<std::endl; return 1; } int a; while (fscanf(fI0, "%d", &a) > 0) I0.push_back(a); fclose(fI0); } else I0.push_back(genrand2i() % n + 1); std::ofstream log(ArgLog.value());
net.infect(I0); if (ArgDumpNet.value()) net.dumpNet(log); net.dumpHouseholdCompartments(log); net.dumpEffectiveDegrees(log);
// SimStreamLogger::registerEventLogger(new SimDieLogger()); // SimProcess::registerEventLogger(new SimContactLogger()); // SimProcess::registerEventLogger(new SimInfectionStateLogger()); Counter *counter = NULL; if (ArgCases.value()) counter = new CaseCounter(); else counter = new Counter(); SimProcess::registerEventLogger(counter); // SimStreamLogger::registerEventLogger(new SimChangeOwnerLogger()); NetProcess proc(log, ArgBetaHousehold.value(), ArgBetaExternal.value(), ArgTlat.value(), ArgTinf.value(), ArgSIR.value(), net);
proc.initialInfections(I0);
// std::cout<<"running ..."<<std::endl; for (int i = 1; i <= ArgRuns.value(); i++) { log << "Run : " << i << std::endl; proc.schedule(new SimQuitEvent(ArgQuit.value())); proc.run(); proc.countAffectedHouseholds(); if (i < ArgRuns.value()) { counter->reset(); proc.reset(); } }
log.close(); return 0;
} </content>