26 #include <boost/property_tree/xml_parser.hpp> 36 const boost::property_tree::ptree& pt_config,
37 const boost::property_tree::ptree& pt_disease,
38 const boost::property_tree::ptree& pt_pop,
44 const auto pop = make_shared<Population>();
46 const double seeding_rate = pt_config.get<
double>(
"run.disease.seeding_rate");
47 const double immunity_rate = pt_config.get<
double>(
"run.disease.immunity_rate");
48 const string disease_config_file = pt_config.get<
string>(
"run.disease.config");
53 bool status = (seeding_rate <= 1) && (immunity_rate <= 1) && ((seeding_rate + immunity_rate) <= 1);
55 throw runtime_error(
string(__func__) +
"> Bad input data.");
61 const auto file_name = pt_pop.get<
string>(
"population.people");
63 if (!is_regular_file(file_path)) {
64 throw runtime_error(
string(__func__)
65 +
"> Population (people) file " + file_path.string() +
" not present.");
68 std::ifstream pop_file;
69 pop_file.open(file_path.string());
70 if (!pop_file.is_open()) {
71 throw runtime_error(
string(__func__)
72 +
"> Error opening population file " + file_path.string());
75 const auto distrib_start_infectiousness = getDistribution(pt_disease,
"disease.start_infectiousness");
76 const auto distrib_start_symptomatic = getDistribution(pt_disease,
"disease.start_symptomatic");
77 const auto distrib_time_infectious = getDistribution(pt_disease,
"disease.time_infectious");
78 const auto distrib_time_symptomatic = getDistribution(pt_disease,
"disease.time_symptomatic");
81 getline(pop_file, line);
82 unsigned int person_id = 0U;
83 while (getline(pop_file, line)) {
85 const auto start_infectiousness = sample(rng, distrib_start_infectiousness);
86 const auto start_symptomatic = sample(rng, distrib_start_symptomatic);
87 const auto time_infectious = sample(rng, distrib_time_infectious);
88 const auto time_symptomatic = sample(rng, distrib_time_symptomatic);
90 auto risk_averseness = 0.0;
91 if (values.size() > 6) {
92 risk_averseness = StringUtils::fromString<double>(values[6]);
95 StringUtils::fromString<unsigned int>(values[0]),
96 StringUtils::fromString<unsigned int>(values[1]),
97 StringUtils::fromString<unsigned int>(values[2]),
98 StringUtils::fromString<unsigned int>(values[3]),
99 StringUtils::fromString<unsigned int>(values[4]),
100 StringUtils::fromString<unsigned int>(values[5]),
101 start_infectiousness, start_symptomatic, time_infectious,
102 time_symptomatic, risk_averseness));
112 const unsigned int max_population_index = population.size() - 1;
113 if (max_population_index <= 1U) {
114 throw runtime_error(
string(__func__) +
"> Problem with population size.");
119 const string log_level = pt_config.get<
string>(
"run.log_level",
"None");
120 if (log_level ==
"Contacts") {
121 const unsigned int num_participants = pt_config.get<
double>(
"run.outputs.participants_survey.<xmlattr>.num");
126 unsigned int num_samples = 0;
127 while (num_samples < num_participants) {
140 unsigned int num_immune = floor(static_cast<double>(population.size()) * immunity_rate);
141 while (num_immune > 0) {
152 unsigned int num_infected = floor(static_cast<double> (population.size()) * seeding_rate);
153 while (num_infected > 0) {
166 vector<double> values;
167 boost::property_tree::ptree subtree = pt_root.get_child(xml_tag);
168 for (
const auto& tree : subtree) {
169 values.push_back(tree.second.get<
double>(
""));
176 for (
unsigned int i = 0; i < distribution.size(); i++) {
177 if (random_value <= distribution[i]) {
181 cerr <<
"WARNING: PROBLEM WITH DISEASE DISTRIBUTION [PopulationBuilder]" << endl;
182 return distribution.size();
bool isParticipatingInSurvey() const
Does this person participates in the social contact study?
Interface for install directory queries.
Time Dependent Person DataType.
Conversion from or to string.
static boost::filesystem::path getDataDir()
Utility method: get path to the directory for data files.
Utilities for the project.
static unsigned int sample(util::Random &rng, const std::vector< double > &distribution)
Sample from the distribution.
Forward declaration of class Person.
static std::shared_ptr< Population > build(const boost::property_tree::ptree &pt_config, const boost::property_tree::ptree &pt_disease, const boost::property_tree::ptree &pt_pop, util::Random &rng)
Initializes a Population: add persons, set immunity, seed infection.
Health & getHealth()
Return person's health status.
void participateInSurvey()
Participate in social contact study and log person details.
vector< PersonType > VectorType
static std::vector< double > getDistribution(const boost::property_tree::ptree &pt_root, const std::string &xml_tag)
Get distribution associateed with tag values.
bool isSusceptible() const
Is this person susceptible?
static std::vector< std::string > split(const std::string &str, const std::string &delimiters)
Split a string (in order of occurence) by splitting it on the given delimiters.
void startInfection()
Start the infection.
The random number generator.
void setImmune()
Set immune to true.