6 #include <boost/date_time/gregorian/greg_date.hpp> 7 #include <boost/property_tree/xml_parser.hpp> 36 Hdf5Loader::Hdf5Loader(
const char* filename) :
37 m_filename(filename) {
41 }
catch (FileIException error) {
46 void Hdf5Loader::loadConfigs() {
47 H5File file(m_filename, H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
49 DataSet dataset = DataSet(file.openDataSet(
"Configuration/configuration"));
50 ConfigDataType configData[1];
55 auto getPropTree = [](
string xml_content, ptree& dest_pt) {
58 xml_parser::read_xml(iss, dest_pt, boost::property_tree::xml_parser::trim_whitespace);
61 getPropTree(configData[0].m_config_content, m_pt_config);
62 getPropTree(configData[0].m_disease_content, m_pt_disease);
63 getPropTree(configData[0].m_age_contact_content, m_pt_contact);
68 H5File file(m_filename, H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
71 ss <<
"/Timestep_" << std::setfill(
'0') << std::setw(6) << timestep;
72 string dataset_name = ss.str();
75 this->loadCalendar(file, dataset_name, sim);
76 this->loadPersonTDData(file, dataset_name, sim);
77 this->loadTravellers(file, dataset_name, sim);
81 return lhs.getId() < rhs.getId();
83 std::sort(sim->m_population->m_original.begin(), sim->m_population->m_original.end(), sortByID);
85 this->loadClusters(file, dataset_name +
"/household_clusters", sim->m_households, sim);
86 this->loadClusters(file, dataset_name +
"/school_clusters", sim->m_school_clusters, sim);
87 this->loadClusters(file, dataset_name +
"/work_clusters", sim->m_work_clusters, sim);
88 this->loadClusters(file, dataset_name +
"/primary_community_clusters", sim->m_primary_community, sim);
89 this->loadClusters(file, dataset_name +
"/secondary_community_clusters", sim->m_secondary_community, sim);
91 this->updateClusterImmuneIndices(sim);
93 if (sim->m_rng !=
nullptr) {
94 this->loadRngState(file, dataset_name, sim);
102 H5File file(m_filename, H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
103 DataSet dataset = DataSet(file.openDataSet(
"last_timestep"));
104 unsigned int data[1];
105 dataset.read(data, PredType::NATIVE_UINT);
112 void Hdf5Loader::updateClusterImmuneIndices(std::shared_ptr<Simulator> sim)
const {
113 for (
auto cluster : sim->m_households) {
114 cluster.m_index_immune = cluster.m_members.size() - 1;
116 for (
auto cluster : sim->m_school_clusters) {
117 cluster.m_index_immune = cluster.m_members.size() - 1;
119 for (
auto cluster : sim->m_work_clusters) {
120 cluster.m_index_immune = cluster.m_members.size() - 1;
122 for (
auto cluster : sim->m_primary_community) {
123 cluster.m_index_immune = cluster.m_members.size() - 1;
125 for (
auto cluster : sim->m_secondary_community) {
126 cluster.m_index_immune = cluster.m_members.size() - 1;
130 void Hdf5Loader::loadCalendar(H5File& file,
string dataset_name, shared_ptr<Simulator> sim)
const {
131 DataSet dataset = DataSet(file.openDataSet(dataset_name +
"/calendar"));
132 CalendarDataType calendar[1];
136 sim->m_calendar->m_day = calendar[0].m_day;
137 sim->m_calendar->m_date = boost::gregorian::from_simple_string(calendar[0].m_date);
141 void Hdf5Loader::loadTravellers(H5File& file,
string dataset_name, shared_ptr<Simulator> sim)
const {
143 DataSet dataset = DataSet(file.openDataSet(dataset_name +
"/travellers"));
144 DataSpace dataspace = dataset.getSpace();
145 hsize_t dims_travellers[1];
146 dataspace.getSimpleExtentDims(dims_travellers, NULL);
147 const unsigned int amt_travellers = dims_travellers[0];
150 if (amt_travellers == 0) {
155 auto travellers = make_unique<std::vector<TravellerDataType>>(amt_travellers);
163 for (
auto object : *travellers) {
167 object.m_new_id,
object.m_age,
168 object.m_new_household_id,
object.m_new_school_id,
object.m_new_work_id,
169 object.m_new_prim_comm_id,
object.m_new_sec_comm_id,
170 object.m_start_infectiousness,
object.m_start_symptomatic,
171 object.m_time_infectiousness,
object.m_time_symptomatic
173 person.m_health.m_status =
HealthStatus(
object.m_health_status);
174 person.m_health.m_disease_counter =
object.m_disease_counter;
175 person.m_is_participant =
object.m_participant;
177 sim->m_population->m_visitors.add(
object.m_days_left, person);
183 object.m_orig_id,
object.m_age,
184 object.m_orig_household_id,
object.m_orig_school_id,
object.m_orig_work_id,
185 object.m_orig_prim_comm_id,
object.m_orig_sec_comm_id,
186 object.m_start_infectiousness,
object.m_start_symptomatic,
187 object.m_time_infectiousness,
object.m_time_symptomatic
190 string home_sim_name =
object.m_home_sim_name;
191 string dest_sim_name =
object.m_dest_sim_name;
194 original_person, sim->m_population->m_visitors.getModifiableDay(
object.m_days_left)->back().get(),
195 home_sim_name, dest_sim_name,
object.m_home_sim_index);
197 traveller.getNewPerson()->setOnVacation(
false);
198 sim->m_planner.add(
object.m_days_left, traveller);
203 object.m_days_left)->back().get();
205 sim->m_work_clusters.at(
object.m_new_work_id).addPerson(added_person);
206 sim->m_primary_community.at(
object.m_new_prim_comm_id).addPerson(added_person);
207 sim->m_secondary_community.at(
object.m_new_sec_comm_id).addPerson(added_person);
211 sim->m_next_id =
object.m_new_id + 1;
212 sim->m_next_hh_id =
object.m_new_household_id + 1;
216 }
catch (DataSetIException e) {
223 void Hdf5Loader::loadPersonTDData(H5File& file,
string dataset_name, shared_ptr<Simulator> sim)
const {
224 DataSet dataset = DataSet(file.openDataSet(dataset_name +
"/person_time_dependent"));
225 unsigned long dims[1] = {sim->m_population.get()->m_original.size()};
228 for (
unsigned int i = 0; i < dims[0]; i++) {
229 PersonTDDataType person[1];
230 hsize_t dim_sub[1] = {1};
232 DataSpace memspace(1, dim_sub, NULL);
234 hsize_t offset[1] = {i};
235 hsize_t count[1] = {1};
237 hsize_t block[1] = {1};
239 DataSpace dataspace = dataset.getSpace();
240 dataspace.selectHyperslab(H5S_SELECT_SET, count, offset, stride, block);
241 dataset.read(person, type_person_TD, memspace, dataspace);
242 sim->m_population->m_original.at(i).m_is_participant = person[0].m_participant;
243 sim->m_population->m_original.at(i).m_health.m_status =
HealthStatus(person[0].m_health_status);
244 sim->m_population->m_original.at(i).m_health.m_disease_counter = person[0].m_disease_counter;
245 sim->m_population->m_original.at(i).m_is_on_vacation = person[0].m_on_vacation;
253 void Hdf5Loader::loadRngState(H5File& file,
string dataset_name, shared_ptr<Simulator> sim)
const {
254 DataSet dataset = DataSet(file.openDataSet(dataset_name +
"/randomgen"));
255 std::string rng_state;
256 dataset.read(rng_state, StrType(0, H5T_VARIABLE));
259 sim->m_rng->setState(rng_state);
263 void Hdf5Loader::loadClusters(H5File& file, std::string full_dataset_name, std::vector<Cluster>& cluster,
264 std::shared_ptr<Simulator> sim)
const {
265 std::shared_ptr<Population> pop = sim->m_population;
267 DataSet dataset = DataSet(file.openDataSet(full_dataset_name));
268 DataSpace dataspace = dataset.getSpace();
269 hsize_t dims_clusters[1];
270 dataspace.getSimpleExtentDims(dims_clusters, NULL);
271 const unsigned int amtIds = dims_clusters[0];
274 unsigned int cluster_data[amtIds];
275 unsigned int index = 0;
277 dataset.read(cluster_data, PredType::NATIVE_UINT);
281 vector<Simulator::PersonType*> travellers;
282 for (
auto&& day : sim->m_planner.getAgenda()) {
283 for (
auto&& traveller : *(day)) {
284 travellers.push_back(traveller->getNewPerson());
288 for (
unsigned int i = 0; i < cluster.size(); i++) {
289 for (
unsigned int j = 0; j < cluster.at(i).getSize(); j++) {
290 unsigned int id = cluster_data[index++];
292 if (id < pop->m_original.size()) {
294 cluster.at(i).m_members.at(j).first = person;
297 auto traveller = std::find_if(
301 return (traveller)->getId() == id;
303 cluster.at(i).m_members.at(j).first = (*traveller);
312 bool hdf5_file_exists = exists(system_complete(filename));
313 if (!hdf5_file_exists) {
314 throw runtime_error(
string(__func__) +
"> Hdf5 file " +
315 system_complete(filename).
string() +
" does not exist.");
317 const auto file_path_hdf5 = canonical(system_complete(filename));
318 if (!is_regular_file(file_path_hdf5)) {
319 throw runtime_error(
string(__func__) +
"> Hdf5 file " +
320 system_complete(filename).
string() +
" is not a regular file.");
323 H5File file(filename, H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
325 DataSet dataset = DataSet(file.openDataSet(
"Configuration/configuration"));
326 ConfigDataType configData[1];
331 auto writeToFile = [](
string filename,
string content) {
333 file.open(filename.c_str());
338 writeToFile(filename +
"_config.xml", configData[0].m_config_content);
339 writeToFile(filename +
"_disease.xml", configData[0].m_disease_content);
340 writeToFile(filename +
"_contact.xml", configData[0].m_age_contact_content);
341 writeToFile(filename +
"_holidays.json", configData[0].m_holidays_content);
Person< BehaviourPolicy, BeliefPolicy > PersonType
static CompType getCompType()
Interface for install directory queries.
Traveller< PersonType > TravellerType
void loadFromTimestep(unsigned int timestep, shared_ptr< Simulator > sim) const
Load from timestep, if the specified timestep is present in the hdf5 file.
Header file for the Calendar class.
Time Dependent Person DataType.
Utilities for the project.
static void extractConfigs(string filename)
Extract the configuration files saved in the hdf5 file.
Header for the SimulatorBuilder class.
static CompType getCompType()
Header file for the core Population class.
Header file for the Loader class for the checkpointing functionality.
static CompType getCompType()
Header for the core Cluster class.
unsigned int getLastSavedTimestep() const
Retrieves the last saved timestep index in the hdf5 file.
static CompType getCompType()