diff --git a/src/IO.cpp b/src/IO.cpp index 596f2053..f8838b02 100644 --- a/src/IO.cpp +++ b/src/IO.cpp @@ -224,13 +224,13 @@ ObservationsForInference ReadInferenceObservations(const std::string& configDir, int nHealthBoards = validationParams.nHealthBoards; int nCasesDays = validationParams.nCasesDays; - unsigned int cases_rows = observations.cases.size(); + unsigned int cases_rows = Utilities::checkAndGetSize(observations.cases, "observations.cases"); unsigned int cases_cols = observations.cases[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_rows = Utilities::checkAndGetSize(observations.deaths, "observations.deaths"); unsigned int deaths_cols = observations.deaths[0].size(); ImportConsistencyCheck(scot_deaths_file, deaths_rows, (nHealthBoards + 1), "rows"); @@ -267,7 +267,8 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << scot_data_file << std::endl; observations.cases = Utilities::read_csv(scot_data_file, ','); - unsigned int cases_rows = observations.cases.size(); + unsigned int cases_rows = Utilities::checkAndGetSize(observations.cases, "observations.cases"); + unsigned int cases_cols = observations.cases[0].size(); ImportConsistencyCheck(scot_data_file, cases_rows, (nHealthBoards + 1), "rows"); @@ -280,7 +281,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << scot_ages_file << std::endl; observations.age_pop = Utilities::read_csv(scot_ages_file, ','); - unsigned int age_pop_rows = observations.age_pop.size(); + unsigned int age_pop_rows = Utilities::checkAndGetSize(observations.age_pop, "observations.age_pop"); unsigned int age_pop_cols = observations.age_pop[0].size(); ImportConsistencyCheck(scot_ages_file, age_pop_rows, nHealthBoards, "rows"); @@ -291,7 +292,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << waifw_norm_file << std::endl; observations.waifw_norm = Utilities::read_csv(waifw_norm_file, ','); - unsigned int waifw_norm_rows = observations.waifw_norm.size(); + unsigned int waifw_norm_rows = Utilities::checkAndGetSize(observations.waifw_norm, "observations.waifw_norm"); unsigned int waifw_norm_cols = observations.waifw_norm[0].size(); ImportConsistencyCheck(waifw_norm_file, waifw_norm_rows, nAgeGroups, "rows"); @@ -301,7 +302,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << waifw_home_file << std::endl; observations.waifw_home = Utilities::read_csv(waifw_home_file, ','); - unsigned int waifw_home_rows = observations.waifw_home.size(); + unsigned int waifw_home_rows = Utilities::checkAndGetSize(observations.waifw_home, "observations.waifw_home"); unsigned int waifw_home_cols = observations.waifw_home[0].size(); ImportConsistencyCheck(waifw_home_file, waifw_home_rows, nAgeGroups, "rows"); @@ -311,7 +312,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << waifw_sdist_file << std::endl; observations.waifw_sdist = Utilities::read_csv(waifw_sdist_file, ','); - unsigned int waifw_sdist_rows = observations.waifw_sdist.size(); + unsigned int waifw_sdist_rows = Utilities::checkAndGetSize(observations.waifw_sdist, "observations.waifw_sdist"); unsigned int waifw_sdist_cols = observations.waifw_sdist[0].size(); ImportConsistencyCheck(waifw_sdist_file, waifw_sdist_rows, nAgeGroups, "rows"); @@ -325,7 +326,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << cfr_byage_file << std::endl; observations.cfr_byage = Utilities::read_csv(cfr_byage_file, ','); - unsigned int cfr_rows = observations.cfr_byage.size(); + unsigned int cfr_rows = Utilities::checkAndGetSize(observations.cfr_byage, "observations.cfr_byage"); unsigned int cfr_cols = observations.cfr_byage[0].size(); ImportConsistencyCheck(cfr_byage_file, cfr_rows, nAgeGroups, "rows"); @@ -338,7 +339,7 @@ ObservationsForModels ReadModelObservations(const std::string& configDir, Utilit (*log) << "\t- " << scot_frail_file << std::endl; observations.pf_pop = Utilities::read_csv(scot_frail_file, ','); - unsigned int pf_pop_rows = observations.pf_pop.size(); + unsigned int pf_pop_rows = Utilities::checkAndGetSize(observations.pf_pop, "observations.pf_pop"); unsigned int pf_pop_cols = observations.pf_pop[0].size(); ImportConsistencyCheck(scot_frail_file, pf_pop_rows, nHealthBoards, "rows"); diff --git a/src/IrishModel.cpp b/src/IrishModel.cpp index 06d31f25..5602c870 100644 --- a/src/IrishModel.cpp +++ b/src/IrishModel.cpp @@ -10,6 +10,8 @@ IrishModel::IrishModel(const CommonModelInputParameters& commonParameters, fixedParameters_ = BuildFixedParameters( observations.waifw_norm.size(), commonParameters.paramlist ); + + Utilities::checkAndGetSize(observations.pf_pop, "observations.pf_pop"); ageGroupData_ = AgeGroupData{ observations.waifw_norm, diff --git a/src/ModelCommon.cpp b/src/ModelCommon.cpp index 6bd2eac1..3f27ad5f 100644 --- a/src/ModelCommon.cpp +++ b/src/ModelCommon.cpp @@ -21,6 +21,7 @@ std::vector ComputeAgeNums(int shb_id, int Npop, int N_hcw, const Observati // 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) + Utilities::checkAndGetSize(obs.age_pop); const auto& agedist = obs.age_pop[shb_id - 1]; for (const auto& var : agedist) { @@ -41,7 +42,10 @@ int GetPopulationOfRegion(const ObservationsForModels& obs, int region_id) int ComputeNumberOfHCWInRegion(int regionalPopulation, int totalHCW, const ObservationsForModels& obs) { int scotlandPopulation = 0; + Utilities::checkAndGetSize(obs.cases, "obs.cases"); + for (unsigned int region = 0; region < obs.cases.size() - 1; ++region) { + Utilities::checkAndGetSize(obs.cases[region], "obs.cases["+std::to_string(region)+"]"); scotlandPopulation += obs.cases[region][0]; } double regionalProportion = static_cast(regionalPopulation) / scotlandPopulation; diff --git a/src/ModelCommon.h b/src/ModelCommon.h index c3315817..b540c8ab 100644 --- a/src/ModelCommon.h +++ b/src/ModelCommon.h @@ -1,6 +1,7 @@ #pragma once #include "ModelTypes.h" +#include "Utilities.h" #include "Random.h" #include #include diff --git a/src/OriginalModel.cpp b/src/OriginalModel.cpp index 3481989d..b3b8b2a7 100644 --- a/src/OriginalModel.cpp +++ b/src/OriginalModel.cpp @@ -10,7 +10,9 @@ OriginalModel::OriginalModel(const CommonModelInputParameters& commonParameters, fixedParameters_ = BuildFixedParameters( observations.waifw_norm.size(), commonParameters.paramlist ); - + + Utilities::checkAndGetSize(observations.pf_pop, "observations.pf_pop"); + ageGroupData_ = AgeGroupData{ observations.waifw_norm, observations.waifw_home, diff --git a/src/TempModel.cpp b/src/TempModel.cpp index ffc9f424..4ea493a6 100644 --- a/src/TempModel.cpp +++ b/src/TempModel.cpp @@ -10,6 +10,8 @@ TempModel::TempModel(const CommonModelInputParameters& commonParameters, fixedParameters_ = BuildFixedParameters( observations.waifw_norm.size(), commonParameters.paramlist ); + + Utilities::checkAndGetSize(observations.pf_pop, "observations.pf_pop"); ageGroupData_ = AgeGroupData{ observations.waifw_norm, diff --git a/src/Utilities.h b/src/Utilities.h index c20d5d44..679b93da 100644 --- a/src/Utilities.h +++ b/src/Utilities.h @@ -110,6 +110,27 @@ std::vector AccumulateEveryN(const std::vector& data, unsigned int n) return _temp; } +/** + * @brief Verifying container access + * + * Determines if container is non-zero before attempting access + * if successful the size of the container is returned. + * + * @param container container object, e.g. STL vector + * + * @return size of the container +*/ +template +unsigned int checkAndGetSize(const T& container, std::string name="container") +{ + if(container.size() < 1) + { + throw std::out_of_range("Cannot access elements of '"+name+"' object which is size zero."); + } + + return container.size(); +} + /*! @brief Logging Stream Class @details Class to send output to both cout and output log file @date last modified 2020-05-18 diff --git a/src/main.cpp b/src/main.cpp index dee09c3e..d18db6b6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -46,6 +46,7 @@ int main(int argc, char** argv) // Import model observational data std::string modelConfigDir(std::string(ROOT_DIR) + "/data"); + ObservationsForModels modelObservations = IO::ReadModelObservations(modelConfigDir, logger); // Log the disease seed settings