Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 40 additions & 36 deletions src/IO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ InferenceConfig ReadInferenceConfig(const std::string& configDir, Utilities::log
inferenceConfig.toleranceLimit[ii] = ReadNumberFromFile<double>(KeyName.str(), "Tolerance settings", ParamsPath);
}

inferenceConfig.observations = ReadInferenceObservations(configDir, log);
inferenceConfig.observations = ReadInferenceObservations(configDir, log, inferenceConfig.herd_id);

return inferenceConfig;
}
Expand Down Expand Up @@ -195,10 +195,8 @@ PredictionConfig ReadPredictionConfig(const std::string& configDir, int index, U
return predictionConfig;
}

ObservationsForInference ReadInferenceObservations(const std::string& configDir, Utilities::logging_stream::Sptr log)
{
ObservationsForInference observations;

HealthBoardData ReadInferenceObservations(const std::string& configDir, Utilities::logging_stream::Sptr log, int herd_id)
{
(*log) << "Observations For Inference Config:" << std::endl;

const std::string scot_data_file = configDir + "/scot_data.csv";
Expand All @@ -209,39 +207,41 @@ ObservationsForInference ReadInferenceObservations(const std::string& configDir,
//rows from 1 are indivudual health board
//last row is for all of scotland
(*log) << "\t- " << scot_data_file << std::endl;
observations.cases = Utilities::read_csv<int>(scot_data_file, ',');
std::vector<std::vector<int>> cases_in = Utilities::read_csv<int>(scot_data_file, ',');

//Uploading observed death data
//Note: first vector is the vector of time. value of -1 indicate number of pigs in the herd
//rows from 1 are indivudual health board
//last row is for all of scotland
(*log) << "\t- " << scot_deaths_file << std::endl;
observations.deaths = Utilities::read_csv<int>(scot_deaths_file, ',');

std::vector<std::vector<int>> deaths_in = Utilities::read_csv<int>(scot_deaths_file, ',');
const std::string settings_file = configDir + "/parameters.ini";

ValidationParameters validationParams = ImportValidationParameters(configDir);
int nHealthBoards = validationParams.nHealthBoards;
int nCasesDays = validationParams.nCasesDays;

unsigned int cases_rows = observations.cases.size();
unsigned int cases_cols = observations.cases[0].size();
unsigned int cases_rows = cases_in.size();
unsigned int cases_cols = cases_in[0].size();

ImportConsistencyCheck(scot_data_file, cases_rows, (nHealthBoards + 1), "rows");
ImportConsistencyCheck(scot_data_file, cases_cols, nCasesDays, "columns");

unsigned int deaths_rows = observations.deaths.size();
unsigned int deaths_cols = observations.deaths[0].size();
unsigned int deaths_rows = deaths_in.size();
unsigned int deaths_cols = deaths_in[0].size();

ImportConsistencyCheck(scot_deaths_file, deaths_rows, (nHealthBoards + 1), "rows");
ImportConsistencyCheck(scot_deaths_file, deaths_cols, nCasesDays, "columns");

HealthBoardData observations(herd_id, cases_in, deaths_in);

return observations;
}

ObservationsForModels ReadModelObservations(const std::string& configDir, Utilities::logging_stream::Sptr log)
HealthBoardData ReadModelObservations(const std::string& configDir, Utilities::logging_stream::Sptr log, int herd_id)
{
ObservationsForModels observations;
// ObservationsForModels observations;

(*log) << "Observations For Models:" << std::endl;

Expand All @@ -265,27 +265,44 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit
//rows from 1 are indivudual health board
//last row is for all of scotland
(*log) << "\t- " << scot_data_file << std::endl;
observations.cases = Utilities::read_csv<int>(scot_data_file, ',');
// observations.cases = Utilities::read_csv<int>(scot_data_file, ',');
std::vector<std::vector<int>> cases_in = Utilities::read_csv<int>(scot_data_file, ',');

unsigned int cases_rows = observations.cases.size();
unsigned int cases_cols = observations.cases[0].size();
unsigned int cases_rows = cases_in.size();
unsigned int cases_cols = cases_in[0].size();

ImportConsistencyCheck(scot_data_file, cases_rows, (nHealthBoards + 1), "rows");
ImportConsistencyCheck(scot_data_file, cases_cols, nCasesDays, "columns");

//Uploading population per age group
//columns are for each individual Health Borad
//last column is for Scotland
//rows are for each age group: [0] Under20,[1] 20-29,[2] 30-39,[3] 40-49,[4] 50-59,[5] 60-69,[6] Over70,[7] HCW
//rows are for each individual Health Board
//last row is for Scotland
//columns are for each age group: [0] Under20,[1] 20-29,[2] 30-39,[3] 40-49,[4] 50-59,[5] 60-69,[6] Over70,[7] HCW
(*log) << "\t- " << scot_ages_file << std::endl;
observations.age_pop = Utilities::read_csv<double>(scot_ages_file, ',');
// observations.age_pop = Utilities::read_csv<double>(scot_ages_file, ',');
std::vector<std::vector<double>> age_pop_in = Utilities::read_csv<double>(scot_ages_file, ',');

unsigned int age_pop_rows = observations.age_pop.size();
unsigned int age_pop_cols = observations.age_pop[0].size();
unsigned int age_pop_rows = age_pop_in.size();
unsigned int age_pop_cols = age_pop_in[0].size();

ImportConsistencyCheck(scot_ages_file, age_pop_rows, nHealthBoards, "rows");
ImportConsistencyCheck(scot_ages_file, age_pop_cols, (nAgeGroups - 1), "columns");

//Upload frailty probability p_f by age group
//columns are for each age group: [0] Under20,[1] 20-29,[2] 30-39,[3] 40-49,[4] 50-59,[5] 60-69,[6] Over70,[7] HCW
//rows are for each individual Health Board
//last row is for Scotland
(*log) << "\t- " << scot_frail_file << std::endl;
// observations.pf_pop = Utilities::read_csv<double>(scot_frail_file, ',');
std::vector<std::vector<double>> pf_pop_in = Utilities::read_csv<double>(scot_frail_file, ',');

unsigned int pf_pop_rows = pf_pop_in.size();
unsigned int pf_pop_cols = pf_pop_in[0].size();

ImportConsistencyCheck(scot_frail_file, pf_pop_rows, nHealthBoards, "rows");
ImportConsistencyCheck(scot_frail_file, pf_pop_cols, nAgeGroups, "columns");

HealthBoardData observations(herd_id, cases_in, age_pop_in, pf_pop_in);

//mean number of daily contacts per age group (overall)
(*log) << "\t- " << waifw_norm_file << std::endl;
Expand Down Expand Up @@ -331,19 +348,6 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit
ImportConsistencyCheck(cfr_byage_file, cfr_rows, nAgeGroups, "rows");
ImportConsistencyCheck(cfr_byage_file, cfr_cols, nCfrCategories, "columns");

//Upload frailty probability p_f by age group
//columns are for each age group: [0] Under20,[1] 20-29,[2] 30-39,[3] 40-49,[4] 50-59,[5] 60-69,[6] Over70,[7] HCW
//rows are for each individual Health Borad
//last row is for Scotland
(*log) << "\t- " << scot_frail_file << std::endl;
observations.pf_pop = Utilities::read_csv<double>(scot_frail_file, ',');

unsigned int pf_pop_rows = observations.pf_pop.size();
unsigned int pf_pop_cols = observations.pf_pop[0].size();

ImportConsistencyCheck(scot_frail_file, pf_pop_rows, nHealthBoards, "rows");
ImportConsistencyCheck(scot_frail_file, pf_pop_cols, nAgeGroups, "columns");

return observations;
}

Expand Down
4 changes: 2 additions & 2 deletions src/IO.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ std::vector<double> ReadPredictionParametersFromFile(const std::string& filePath
*
* @return Observations needed for Inference framework
*/
ObservationsForInference ReadInferenceObservations(const std::string& configDir, Utilities::logging_stream::Sptr log);
HealthBoardData ReadInferenceObservations(const std::string& configDir, Utilities::logging_stream::Sptr log, int herd_id);

/**
* @brief Read observations needed for all models
Expand All @@ -131,7 +131,7 @@ ObservationsForInference ReadInferenceObservations(const std::string& configDir,
*
* @return Observations needed for all models
*/
ObservationsForModels ReadModelObservations(const std::string& configDir, Utilities::logging_stream::Sptr log);
HealthBoardData ReadModelObservations(const std::string& configDir, Utilities::logging_stream::Sptr log, int herd_id);

/**
* @brief Read seed settings from the parameters file
Expand Down
6 changes: 3 additions & 3 deletions src/InferenceFramework.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ void InferenceFramework::Run()
SimpleTimer runTimer;

const int time_back = GetTimeOffSet(inferenceConfig_);
const std::vector<int>& regionalCases = inferenceConfig_.observations.cases[inferenceConfig_.herd_id];
const std::vector<int>& regionalDeaths = inferenceConfig_.observations.deaths[inferenceConfig_.herd_id];
const std::vector<int>& timeStamps = inferenceConfig_.observations.cases[0];
const std::vector<int>& regionalCases = inferenceConfig_.observations.cases;
const std::vector<int>& regionalDeaths = inferenceConfig_.observations.deaths;
const std::vector<int>& timeStamps = inferenceConfig_.observations.timeStamps;

const Observations::ObsSelect obs_selections = Observations::SelectObservations(
inferenceConfig_.day_shut, timeStamps, regionalCases,
Expand Down
8 changes: 4 additions & 4 deletions src/IrishModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace EERAModel {
namespace Model {

IrishModel::IrishModel(const CommonModelInputParameters& commonParameters,
const ObservationsForModels& observations, Random::RNGInterface::Sptr rng, Utilities::logging_stream::Sptr log)
const HealthBoardData& observations, Random::RNGInterface::Sptr rng, Utilities::logging_stream::Sptr log)
: rng_(rng) {

fixedParameters_ = BuildFixedParameters(
Expand All @@ -16,19 +16,19 @@ IrishModel::IrishModel(const CommonModelInputParameters& commonParameters,
observations.waifw_home,
observations.waifw_sdist,
observations.cfr_byage,
observations.pf_pop[commonParameters.herd_id - 1]
observations.pf_byage
};

int regionalPopulation = GetPopulationOfRegion(
observations, commonParameters.herd_id
observations
);

int healthCareWorkers = ComputeNumberOfHCWInRegion(
regionalPopulation, commonParameters.totN_hcw, observations
);

ageNums_ = ComputeAgeNums(
commonParameters.herd_id, regionalPopulation, healthCareWorkers, observations
regionalPopulation, healthCareWorkers, observations
);

(*log) << "[Model settings]" << std::endl;
Expand Down
2 changes: 1 addition & 1 deletion src/IrishModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class IrishModel : public ModelInterface
* @param rng Random number generator to be used by the model
* @param log Logger
*/
IrishModel(const CommonModelInputParameters& commonParameters, const ObservationsForModels& observations,
IrishModel(const CommonModelInputParameters& commonParameters, const HealthBoardData& observations,
Random::RNGInterface::Sptr rng, Utilities::logging_stream::Sptr log);

/**
Expand Down
18 changes: 9 additions & 9 deletions src/ModelCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ std::vector<params> BuildFixedParameters(unsigned int size, params parameters)
return std::vector<params>(size, parameters);
}

std::vector<int> ComputeAgeNums(int shb_id, int Npop, int N_hcw, const ObservationsForModels& obs) {
std::vector<int> ComputeAgeNums(int Npop, int N_hcw, const HealthBoardData& obs) {
std::vector<int> agenums;

// define age structure of the shb of interest. the -1 is to account for difference in number of
// rows between two datasets (age_pop does not have a row with column name)
const auto& agedist = obs.age_pop[shb_id - 1];
const auto& agedist = obs.age_structure;

for (const auto& var : agedist) {
// modulate the population of non-hcw now to proportion in each age group recorded in 2011
Expand All @@ -33,17 +33,17 @@ std::vector<int> ComputeAgeNums(int shb_id, int Npop, int N_hcw, const Observati
return agenums;
}

int GetPopulationOfRegion(const ObservationsForModels& obs, int region_id)
int GetPopulationOfRegion(const HealthBoardData& obs)
{
return obs.cases[region_id][0];
return obs.cases[0];
}

int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const ObservationsForModels& obs)
int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const HealthBoardData& obs)
{
int scotlandPopulation = 0;
for (unsigned int region = 0; region < obs.cases.size() - 1; ++region) {
scotlandPopulation += obs.cases[region][0];
}
int scotlandPopulation = obs.totScotPopulation;
// for (unsigned int region = 0; region < obs.cases.size() - 1; ++region) {
// scotlandPopulation += obs.cases[region][0];
// }
double regionalProportion = static_cast<double>(regionalPopulation) / scotlandPopulation;

return static_cast<int>(round(totalHCW * regionalProportion));
Expand Down
6 changes: 3 additions & 3 deletions src/ModelCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ int accumulate_compartments(const Compartments& comp);
*
* @return The population of the region
*/
int GetPopulationOfRegion(const ObservationsForModels& obs, int region_id);
int GetPopulationOfRegion(const HealthBoardData& obs);

/**
* @brief Compute number of health care workers (HCW) in the region
Expand All @@ -141,7 +141,7 @@ int GetPopulationOfRegion(const ObservationsForModels& obs, int region_id);
* @param totalHCW Total number of HCWs in the country
* @param obs Input observations
*/
int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const ObservationsForModels& obs);
int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const HealthBoardData& obs);

/**
* @brief Compute the agenums
Expand All @@ -152,7 +152,7 @@ int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const Obser
*
* @return agenums
*/
std::vector<int> ComputeAgeNums(int shb_id, int Npop, int N_hcw, const ObservationsForModels& obs);
std::vector<int> ComputeAgeNums(int Npop, int N_hcw, const HealthBoardData& obs);

/**
* @brief Build the fixed parameters data structure
Expand Down
77 changes: 76 additions & 1 deletion src/ModelTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include <vector>
#include <string>
#include <map>
#include <iostream>

namespace EERAModel {

Expand Down Expand Up @@ -155,6 +157,79 @@ struct Status
pop_array; /*!< Population per epidemiological state and per age group on every day. */
};

/**
* @brief Enumerated type to access data with axis/axes corresponding to Age Groups.
*/
enum AgeGroup {
Age_Pre_20 = 0,
Age_20_29 = 1,
Age_30_39 = 2,
Age_40_49 = 3,
Age_50_59 = 4,
Age_60_69 = 5,
Age_Post_70 = 6,
HealthCareWorkers = 7
};

/**
* @brief Enumerated type to access data with axis/axes corresponding to
* case fatality ratio identifiers
*/
enum CFRCategories {
ProbabilityOfHospitalisation = 0,
CaseFatalityRatio = 1,
ProbabilityOfDeath = 2
};

/**
* @brief Class that holds health board data.
* The overloaded constructors allow name consistency between,
* Health Board data needed for the Model and Inference framework.
*/
class HealthBoardData
{
public:
int HealthBoardID;
int totScotPopulation;
std::string HealthBoardLabel;
std::vector<int> cases;
std::vector<int> deaths;
std::vector<double> age_structure;
std::vector<double> pf_byage;
std::vector<int> timeStamps;
std::vector<std::vector<double>> waifw_norm;
std::vector<std::vector<double>> waifw_home;
std::vector<std::vector<double>> waifw_sdist;
std::vector<std::vector<double>> cfr_byage;

HealthBoardData() {}

HealthBoardData(
const int& HealthBoardID_in,
const std::vector<std::vector<int>>& cases_in,
const std::vector<std::vector<int>>& deaths_in
) {
HealthBoardID = HealthBoardID_in;
HealthBoardLabel = "Health Board " + std::to_string(HealthBoardID);
cases = cases_in[HealthBoardID];
deaths = deaths_in[HealthBoardID];
timeStamps = cases_in[0];
}
HealthBoardData(
const int& HealthBoardID_in,
const std::vector<std::vector<int>>& cases_in,
const std::vector<std::vector<double>>& age_structure_in,
const std::vector<std::vector<double>>& pf_byage_in
) {
HealthBoardID = HealthBoardID_in;
HealthBoardLabel = "Health Board " + std::to_string(HealthBoardID);
cases = cases_in[HealthBoardID];
age_structure = age_structure_in[HealthBoardID - 1];
pf_byage = pf_byage_in[HealthBoardID - 1];
totScotPopulation = cases_in[cases_in.size() - 1][0];
}
};

/**
* @brief Structure containing population counters after infection
*
Expand Down Expand Up @@ -230,7 +305,7 @@ struct InferenceConfig
int nSim;
int nParticleLimit;
std::vector<double> toleranceLimit;
ObservationsForInference observations;
HealthBoardData observations;
};

/**
Expand Down
Loading