From 4621dabb9931e65ce53b8443055e80668fb35312 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Wed, 6 Mar 2024 15:52:57 +0100 Subject: [PATCH 01/60] SECIRTS model (init and eq) --- cpp/memilio/io/epi_data.h | 29 +- cpp/models/ode_secirvvs/README.md | 27 +- cpp/models/ode_secirvvs/analyze_result.h | 12 +- cpp/models/ode_secirvvs/infection_state.h | 2 + cpp/models/ode_secirvvs/model.h | 235 +++--- cpp/models/ode_secirvvs/parameter_space.cpp | 36 +- cpp/models/ode_secirvvs/parameter_space.h | 2 +- cpp/models/ode_secirvvs/parameters.h | 154 +++- cpp/models/ode_secirvvs/parameters_io.cpp | 283 +++---- cpp/models/ode_secirvvs/parameters_io.h | 820 +++++++++----------- 10 files changed, 807 insertions(+), 793 deletions(-) diff --git a/cpp/memilio/io/epi_data.h b/cpp/memilio/io/epi_data.h index 587d3e4761..392da4b799 100644 --- a/cpp/memilio/io/epi_data.h +++ b/cpp/memilio/io/epi_data.h @@ -392,6 +392,7 @@ IOResult set_vaccination_data_age_group_names(std::vector nam * @brief returns a vector with the ids of all nodes. * @param[in] path directory to population data * @param[in] is_node_for_county boolean specifying whether the nodes should be counties or districts + * @param[in] rki_age_groups boolean specifying whether population data should be interpolated to rki age groups. * @return list of node ids. */ IOResult> get_node_ids(const std::string& path, bool is_node_for_county, bool rki_age_groups = true); @@ -404,7 +405,8 @@ class VaccinationDataEntry public: static std::vector age_group_names; - double num_vaccinations_completed; + double num_second_vaccinations_completed, num_first_vaccinations_completed, num_vaccinations_refreshed, + num_vaccinations_refreshed_2; Date date; AgeGroup age_group; boost::optional state_id; @@ -414,16 +416,20 @@ class VaccinationDataEntry template static IOResult deserialize(IoContext& io) { - auto obj = io.expect_object("VaccinationDataEntry"); - auto num_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); - auto date = obj.expect_element("Date", Tag{}); - auto age_group_str = obj.expect_element("Age_RKI", Tag{}); - auto state_id = obj.expect_optional("ID_State", Tag{}); - auto county_id = obj.expect_optional("ID_County", Tag{}); - auto district_id = obj.expect_optional("ID_District", Tag{}); + auto obj = io.expect_object("VaccinationDataEntry"); + auto num_second_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); + auto num_first_vaccinations_completed = obj.expect_element("Vacc_partially", Tag{}); + auto num_vaccinations_refreshed = obj.expect_element("Vacc_refreshed", Tag{}); + auto num_vaccinations_refreshed_2 = obj.expect_element("Vacc_refreshed_2", Tag{}); + auto date = obj.expect_element("Date", Tag{}); + auto age_group_str = obj.expect_element("Age_RKI", Tag{}); + auto state_id = obj.expect_optional("ID_County", Tag{}); + auto county_id = obj.expect_optional("ID_County", Tag{}); + auto district_id = obj.expect_optional("ID_District", Tag{}); return mio::apply( io, - [](auto nf, auto d, auto&& a_str, auto sid, auto cid, auto did) -> IOResult { + [](auto nf, auto np, auto n_refreshed_1, auto n_refreshed_2, auto d, auto&& a_str, auto sid, auto cid, + auto did) -> IOResult { auto it = std::find(age_group_names.begin(), age_group_names.end(), a_str); auto a = AgeGroup(0); if (it != age_group_names.end()) { @@ -432,9 +438,10 @@ class VaccinationDataEntry else { return failure(StatusCode::InvalidValue, "Invalid vaccination data age group."); } - return success(VaccinationDataEntry{nf, d, a, sid, cid, did}); + return success(VaccinationDataEntry{nf, np, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); }, - num_vaccinations_completed, date, age_group_str, state_id, county_id, district_id); + num_second_vaccinations_completed, num_first_vaccinations_completed, num_vaccinations_refreshed, + num_vaccinations_refreshed_2, date, age_group_str, state_id, county_id, district_id); } }; diff --git a/cpp/models/ode_secirvvs/README.md b/cpp/models/ode_secirvvs/README.md index 726bf7df73..2e891bd7c8 100644 --- a/cpp/models/ode_secirvvs/README.md +++ b/cpp/models/ode_secirvvs/README.md @@ -1,14 +1,14 @@ -# SECIR model with COVID-19 variants and vaccinations +# SECIRS-type model including multi-layer waning immunity -This model extends the basic SECIR model by adding vaccinations and allowing the implicit modeling of a newly arriving variant that takes hold. +This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. -Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyFirstVaccination` and `DailyFullVaccination`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. +In the model, waning immunity is defined by the parameters `WaningPartialImmunity`, `WaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `WaningPartialImmunity` and `WaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. -The ratio of two variants can change over time, which affects the average transmissiblity of the disease. Infectiousness of different variants can be set in the parameters. +For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v1). Below is an overview of the model architecture and its compartments. -![SECIRVVS_model](https://github.com/SciCompMod/memilio/assets/69154294/5d1b72ec-2f45-44a4-8eba-b77533c9e6cf) +![SECIRVVS_model](https://github.com/SciCompMod/memilio/assets/69154294/6dec331f-bd91-410f-be5e-c8cf6eb0572b) | Mathematical variable | C++ variable name | Description | |---------------------------- | --------------- | -------------------------------------------------------------------------------------------------- | | $\lambda_{N,i} = \rho_{N,i} \sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `ext_inf_force_dummy` | Force of infection for susceptibles located in the naive immunity level. | @@ -24,19 +24,12 @@ Below is an overview of the model architecture and its compartments. | $T_{I_{Sy}}$ | `TimeInfectedSymptoms` | Time in days an individual stays in the InfectedSymptoms compartment. | | $T_{I_{Sev}}$ | `TimeInfectedSevere` | Time in days an individual stays in the InfectedSevere compartment. | | $T_{I_{Cr}}$ | `TimeInfectedCritical` | Time in days an individual stays in the InfectedCritical compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunPartialImmunity compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmunImprovedImmunity compartment. | +| $T_{W_{PI}}$ | `WaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | +| $T_{W_{II}}$ | `WaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | | $\mu_{I_{NS}}^{I_{Sy}}$ | `1 - RecoveredPerInfectedNoSymptoms` | Probability of transition from compartment InfectedNoSymptoms to InfectedSymptoms. | | $\mu_{I_{Sy}}^{I_{Sev}}$ | `SeverePerInfectedSymptoms` | Probability of transition from compartment InfectedSymptoms to InfectedSevere. | | $\mu_{I_{Sev}}^{I_{Cr}}$ | `CriticalPerSevere` | Probability of transition from compartment InfectedSevere to InfectedCritical. | | $\mu_{I_{Cr}}^{D}$ | `DeathsPerCritical` | Probability of dying when located in compartment InfectedCritical. | -| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | - -## Examples - -The extended model is used in the 2021_vaccination_sarscov2_delta_germany simulation. -An easier example can be found in [examples/ode_secirvvs.cpp](../../examples/ode_secirvvs.cpp) - -Examples of the basic SECIR model can be found at: - -- examples/ode_secir.cpp -- examples/ode_secir_ageres.cpp -- examples/ode_secir_parameter_study.cpp \ No newline at end of file +| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | \ No newline at end of file diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index a4d33e4e9e..5f2da02884 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -22,6 +22,7 @@ #include "ode_secirvvs/model.h" #include "memilio/data/analyze_result.h" +#include "ode_secirvvs/parameters.h" #include #include @@ -45,7 +46,7 @@ std::vector ensemble_params_percentile(const std::vector().template size(); + ensemble_params[0][0].parameters.template get().template size(); std::vector single_element_ensemble(num_runs); @@ -63,8 +64,9 @@ std::vector ensemble_params_percentile(const std::vector().resize(num_days); + percentile[node].parameters.template get().resize(num_days); percentile[node].parameters.template get().resize(num_days); + percentile[node].parameters.template get().resize(num_days); for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { //Population @@ -155,12 +157,16 @@ std::vector ensemble_params_percentile(const std::vector auto& { - return model.parameters.template get()[{i, day}]; + return model.parameters.template get()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { return model.parameters.template get()[{i, day}]; }); + param_percentil( + node, [ i, day ](auto&& model) -> auto& { + return model.parameters.template get()[{i, day}]; + }); } //virus variants param_percentil( diff --git a/cpp/models/ode_secirvvs/infection_state.h b/cpp/models/ode_secirvvs/infection_state.h index 1b475288e4..3ac9eee0d7 100644 --- a/cpp/models/ode_secirvvs/infection_state.h +++ b/cpp/models/ode_secirvvs/infection_state.h @@ -62,6 +62,8 @@ enum class InfectionState DeadNaive, DeadPartialImmunity, DeadImprovedImmunity, + TemporaryImmunPartialImmunity, + TemporaryImmunImprovedImmunity, Count }; diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 1aaa9587dd..ef6d8d8692 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2020-2024 MEmilio +* * Copyright (C) 2020-2024 MEmilio * * Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * @@ -37,52 +37,63 @@ namespace osecirvvs using Flows = TypeList< //naive Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, + Flow, //partial immunity Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, //improved immunity Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow>; + Flow, + + // waning + Flow, + Flow, + Flow, + Flow>; + // clang-format on class Model : public FlowModel, Parameters, Flows> @@ -159,6 +170,8 @@ class Model : public FlowModelpopulations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); size_t ISyIICi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); + size_t TImm1 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunPartialImmunity}); + size_t TImm2 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunImprovedImmunity}); size_t SIIi = this->populations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); double rateE = 1.0 / (2 * params.get()[i] - params.get()[i]); @@ -233,7 +246,7 @@ class Model : public FlowModel 0) ? 1.0 / Nj : 0; double ext_inf_force_dummy = cont_freq_eff * divNj * params.template get()[(AgeGroup)i] * @@ -254,6 +267,55 @@ class Model : public FlowModel({i})] += dummy_SII; } + // vaccinations + auto t_idx = SimulationDay((size_t)t); + if (t_idx > SimulationDay(0)) { + auto t_m1 = SimulationDay((size_t)t - 1); + double first_vacc; + double full_vacc; + double booster_vacc; + + first_vacc = params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_m1}]; + full_vacc = params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_m1}]; + booster_vacc = params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_m1}]; + + double first_vaccinations = + (y[SNi] - flows[get_flat_flow_index( + {i})] < + first_vacc) + ? y[SNi] - + flows[get_flat_flow_index( + {i})] + : first_vacc; + + double second_vaccinations = + (y[SPIi] - flows[get_flat_flow_index({i})] < + full_vacc) + ? y[SPIi] - flows[get_flat_flow_index({i})] + : full_vacc; + flows[get_flat_flow_index({i})] = first_vaccinations; + + flows[get_flat_flow_index({i})] = second_vaccinations; + + double third_vaccinations = + (y[SIIi] - flows[get_flat_flow_index({i})] < + booster_vacc) + ? y[SIIi] - flows[get_flat_flow_index({i})] + : booster_vacc; + + flows[get_flat_flow_index({i})] = third_vaccinations; + } + // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere // is different for different vaccination status. This is not the case here and in addition, ICUCapacity @@ -271,7 +333,7 @@ class Model : public FlowModel({i})] = + InfectionState::TemporaryImmunPartialImmunity>({i})] = params.get()[i] * rateINS * y[INSNi]; flows[get_flat_flow_index( {i})] = (1 - params.get()[i]) * rateINS * y[INSNi]; @@ -279,15 +341,15 @@ class Model : public FlowModel({i})] = (1 - params.get()[i]) * rateINS * y[INSNCi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunPartialImmunity>({i})] = params.get()[i] * rateINS * y[INSNCi]; - // InfectedSymptoms + // // InfectedSymptoms flows[get_flat_flow_index( {i})] = params.get()[i] / params.get()[i] * y[ISyNi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunPartialImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ISyNi]; flows[get_flat_flow_index()[i] / params.get()[i] * y[ISyNCi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunPartialImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ISyNCi]; // InfectedSevere flows[get_flat_flow_index( {i})] = criticalPerSevereAdjusted / params.get()[i] * y[ISevNi]; - flows[get_flat_flow_index( - {i})] = (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; flows[get_flat_flow_index({i})] = deathsPerSevereAdjusted / params.get()[i] * y[ISevNi]; - // InfectedCritical flows[get_flat_flow_index({i})] = params.get()[i] / params.get()[i] * y[ICrNi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunPartialImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ICrNi]; - // /**** path of partially immune (e.g., one dose of vaccination) ***/ + // TemporaryImmunPartialImmunity + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[TImm1]; + + // /**** path of partially immune ***/ + // Exposed flows[get_flat_flow_index({i})] += rateE * y[EPIi]; // InfectedNoSymptoms flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.get()[i])) * rateINS / reducTimeInfectedMild * y[INSPIi]; @@ -336,7 +404,7 @@ class Model : public FlowModel()[i]) * (rateINS / reducTimeInfectedMild) * y[INSPICi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.get()[i])) * rateINS / reducTimeInfectedMild * y[INSPICi]; @@ -349,7 +417,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyPIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; @@ -361,7 +429,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyPICi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; @@ -373,7 +441,7 @@ class Model : public FlowModel()[i] * y[ISevPIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.get()[i]) / params.get()[i] * y[ISevPIi]; @@ -382,7 +450,6 @@ class Model : public FlowModel({i})] = (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * deathsPerSevereAdjusted / params.get()[i] * y[ISevPIi]; - // InfectedCritical flows[get_flat_flow_index({i})] = @@ -390,19 +457,19 @@ class Model : public FlowModel()[i] / params.get()[i] * y[ICrPIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.get()[i]) / params.get()[i] * y[ICrPIi]; - // /**** path of twice vaccinated, here called immune although reinfection is possible now ***/ + // /**** path of improved immunity ***/ // Exposed flows[get_flat_flow_index({i})] += rateE * y[EIIi]; // InfectedNoSymptoms flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.get()[i])) * rateINS / reducTimeInfectedMild * y[INSIIi]; @@ -415,7 +482,7 @@ class Model : public FlowModel()[i]) * (rateINS / reducTimeInfectedMild) * y[INSIICi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.get()[i])) * rateINS / reducTimeInfectedMild * y[INSIICi]; @@ -428,7 +495,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyIIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; @@ -440,7 +507,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyIICi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; @@ -452,7 +519,7 @@ class Model : public FlowModel()[i] * y[ISevIIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.get()[i]) / @@ -470,11 +537,23 @@ class Model : public FlowModel()[i] / params.get()[i] * y[ICrIIi]; flows[get_flat_flow_index({i})] = + InfectionState::TemporaryImmunImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.get()[i]) / params.get()[i] * y[ICrIIi]; + + // TemporaryImmunImprovedImmunity + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[TImm2]; + + // waning + flows[get_flat_flow_index( + {i})] = 1 / params.get()[i] * y[SPIi]; + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[SIIi]; } } @@ -518,13 +597,13 @@ class Simulation; * @param model the compartment model with initial values. * @param t current simulation time. * @param y current value of compartments. -* @tparam Base simulation type that uses a secir compartment model. see Simulation. +* @tparam Base simulation type that uses the SECIRS-type compartment model. see Simulation. */ template > double get_infections_relative(const Simulation& model, double t, const Eigen::Ref& y); /** - * specialization of compartment model simulation for the SECIRVVS model. + * specialization of compartment model simulation for the SECIRS-type model. * @tparam BaseT simulation type, default mio::Simulation. For testing purposes only! */ template @@ -574,55 +653,6 @@ class Simulation : public BaseT } } - void apply_vaccination(double t) - { - auto t_idx = SimulationDay((size_t)t); - auto& params = this->get_model().parameters; - size_t num_groups = (size_t)params.get_num_groups(); - auto last_value = this->get_result().get_last_value(); - - auto count = (size_t)InfectionState::Count; - auto S = (size_t)InfectionState::SusceptibleNaive; - auto SV = (size_t)InfectionState::SusceptiblePartialImmunity; - auto R = (size_t)InfectionState::SusceptibleImprovedImmunity; - - for (size_t i = 0; i < num_groups; ++i) { - - double first_vacc; - double full_vacc; - if (t_idx == SimulationDay(0)) { - first_vacc = params.template get()[{(AgeGroup)i, t_idx}]; - full_vacc = params.template get()[{(AgeGroup)i, t_idx}]; - } - else { - first_vacc = params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; - full_vacc = params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; - } - - if (last_value(count * i + S) - first_vacc < 0) { - auto corrected = 0.99 * last_value(count * i + S); - log_warning("too many first vaccinated at time {}: setting first_vacc from {} to {}", t, first_vacc, - corrected); - first_vacc = corrected; - } - - last_value(count * i + S) -= first_vacc; - last_value(count * i + SV) += first_vacc; - - if (last_value(count * i + SV) - full_vacc < 0) { - auto corrected = 0.99 * last_value(count * i + SV); - log_warning("too many fully vaccinated at time {}: setting full_vacc from {} to {}", t, full_vacc, - corrected); - full_vacc = corrected; - } - - last_value(count * i + SV) -= full_vacc; - last_value(count * i + R) += full_vacc; - } - } - /** * @brief advance simulation to tmax. * Overwrites Simulation::advance and includes a check for dynamic NPIs in regular intervals. @@ -651,13 +681,8 @@ class Simulation : public BaseT dt_eff = 1.0; } - if (t == 0) { - //this->apply_vaccination(t); // done in init now? - this->apply_variant(t, base_infectiousness); - } BaseT::advance(t + dt_eff); if (t + 0.5 + dt_eff - std::floor(t + 0.5) >= 1) { - this->apply_vaccination(t + 0.5 + dt_eff); this->apply_variant(t, base_infectiousness); } @@ -710,12 +735,12 @@ class Simulation : public BaseT }; /** - * @brief Specialization of simulate for SECIRVVS models using Simulation. + * @brief Specialization of simulate for SECIRS-type models using Simulation. * * @param[in] t0 start time. * @param[in] tmax end time. * @param[in] dt time step. - * @param[in] model SECIRVVS model to simulate. + * @param[in] model SECIRS-type model to simulate. * @param[in] integrator optional integrator, uses rk45 if nullptr. * * @return Returns the result of the simulation. @@ -727,12 +752,12 @@ inline auto simulate(double t0, double tmax, double dt, const Model& model, } /** - * @brief Specialization of simulate for SECIRVVS models using the FlowSimulation. + * @brief Specialization of simulate for SECIRS-type models using the FlowSimulation. * * @param[in] t0 start time. * @param[in] tmax end time. * @param[in] dt time step. - * @param[in] model SECIRVVS model to simulate. + * @param[in] model SECIRS-type model to simulate. * @param[in] integrator optional integrator, uses rk45 if nullptr. * * @return Returns the result of the Flowsimulation. @@ -771,7 +796,7 @@ double get_infections_relative(const Simulation& sim, double /*t*/, const * @param t current simulation time. * @param y current value of compartments. * @return vector expression, same size as y, with migration factors per compartment. - * @tparam Base simulation type that uses a secir compartment model. see Simulation. + * @tparam Base simulation type that uses a SECIRS-type compartment model. see Simulation. */ template > auto get_migration_factors(const Simulation& sim, double /*t*/, const Eigen::Ref& y) diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index cb13a79456..3570ddd841 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -52,11 +52,18 @@ void draw_sample_demographics(Model& model) model.populations[{i, InfectionState::SusceptibleNaive}] = 0; double diff = model.populations.get_group_total(i) - group_total; if (diff > 0) { - model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] -= diff; + if (model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] - diff > 0) { + model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] = + model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] - diff - 1e-10; + } + else { + model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] = + model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] - diff - 1e-10; + } if (model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] < 0.0) { - log_error("Negative Compartment after sampling."); + log_error("Compartment SusceptibleImprovedImmunity negative after sampling."); } - assert(std::abs(group_total - model.populations.get_group_total(i)) < 1e-10 && "Sanity check."); + assert(group_total - model.populations.get_group_total(i) > 1e-10 && "Sanity check."); } model.populations.set_difference_from_group_total({i, InfectionState::SusceptibleNaive}, group_total); } @@ -72,6 +79,8 @@ void draw_sample_infection(Model& model) model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); @@ -127,7 +136,7 @@ void draw_sample(Model& model) model.apply_constraints(); } -Graph draw_sample(Graph& graph, bool variant_high) +Graph draw_sample(Graph& graph) { Graph sampled_graph; @@ -139,19 +148,6 @@ Graph draw_sample(Graph& auto& shared_dynamic_npis = shared_params_model.parameters.template get(); shared_dynamic_npis.draw_sample(); - double delta_fac; - if (variant_high) { - delta_fac = 1.6; - } - else { - delta_fac = 1.4; - } - - //infectiousness of virus variants is not sampled independently but depend on base infectiousness - for (auto i = AgeGroup(0); i < shared_params_model.parameters.get_num_groups(); ++i) { - shared_params_model.parameters.template get()[i] = delta_fac; - } - for (auto& params_node : graph.nodes()) { auto& node_model = params_node.property; @@ -163,14 +159,16 @@ Graph draw_sample(Graph& auto local_icu_capacity = node_model.parameters.template get(); auto local_tnt_capacity = node_model.parameters.template get(); auto local_holidays = node_model.parameters.template get().get_school_holidays(); - auto local_daily_v1 = node_model.parameters.template get(); + auto local_daily_v1 = node_model.parameters.template get(); auto local_daily_v2 = node_model.parameters.template get(); + auto local_daily_v3 = node_model.parameters.template get(); node_model.parameters = shared_params_model.parameters; node_model.parameters.template get() = local_icu_capacity; node_model.parameters.template get() = local_tnt_capacity; node_model.parameters.template get().get_school_holidays() = local_holidays; - node_model.parameters.template get() = local_daily_v1; + node_model.parameters.template get() = local_daily_v1; node_model.parameters.template get() = local_daily_v2; + node_model.parameters.template get() = local_daily_v3; node_model.parameters.template get().make_matrix(); node_model.apply_constraints(); diff --git a/cpp/models/ode_secirvvs/parameter_space.h b/cpp/models/ode_secirvvs/parameter_space.h index a883cc482a..88286e085d 100644 --- a/cpp/models/ode_secirvvs/parameter_space.h +++ b/cpp/models/ode_secirvvs/parameter_space.h @@ -61,7 +61,7 @@ void draw_sample(Model& model); * @param variant_high If true, use high value for infectiousness of variant. * @return Graph with nodes and edges from the input graph sampled. */ -Graph draw_sample(Graph& graph, bool variant_high); +Graph draw_sample(Graph& graph); } // namespace osecirvvs } // namespace mio diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index d69b60e7ba..699345fcdc 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -38,7 +38,7 @@ namespace osecirvvs { /** -* @brief the start day in the SECIRVVS model +* @brief the start day in the SECIRS-type model * The start day defines in which season the simulation can be started * If the start day is 180 and simulation takes place from t0=0 to * tmax=100 the days 180 to 280 of the year are simulated @@ -56,7 +56,7 @@ struct StartDay { }; /** -* @brief the start day of a new variant in the SECIRVVS model +* @brief the start day of a new variant in the SECIRS-type model * The start day of the new variant defines in which day of the simulation the new variant is introduced. * Starting on this day, the new variant will impact the transmission probability depending on the * infectiousness of the new variant in the parameter InfectiousnessNewVariant. @@ -74,7 +74,7 @@ struct StartDayNewVariant { }; /** -* @brief the seasonality in the SECIR model +* @brief the seasonality in the SECIRS-type model * the seasonality is given as (1+k*sin()) where the sine * curve is below one in summer and above one in winter */ @@ -91,7 +91,7 @@ struct Seasonality { }; /** -* @brief the icu capacity in the SECIR model +* @brief the icu capacity in the SECIRS-type model */ struct ICUCapacity { using Type = UncertainValue; @@ -151,7 +151,7 @@ struct DynamicNPIsInfectedSymptoms { }; /** -* @brief the incubation time in the SECIR model +* @brief the incubation time in the SECIRS-type model * @param tinc incubation time in day unit */ struct IncubationTime { @@ -168,7 +168,7 @@ struct IncubationTime { /** * @brief the infectious time for symptomatic cases that are infected but -* who do not need to be hsopitalized in the SECIR model in day unit +* who do not need to be hsopitalized in the SECIRS-type model in day unit */ struct TimeInfectedSymptoms { using Type = CustomIndexArray; @@ -183,7 +183,7 @@ struct TimeInfectedSymptoms { }; /** - * @brief the serial interval in the SECIR model in day unit + * @brief the serial interval in the SECIRS-type model in day unit */ struct SerialInterval { using Type = CustomIndexArray; @@ -198,7 +198,39 @@ struct SerialInterval { }; /** - * @brief the time people are 'simply' hospitalized before returning home in the SECIR model + * @brief the time people stays immune after infection or vaccination located in S + in the model in day unit + */ +struct TimeTemporaryImmunityPI { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityPI"; + } +}; + +/** + * @brief the time people stays immune after infection or vaccination located in S_pv or S_II + in the model in day unit + */ +struct TimeTemporaryImmunityII { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityII"; + } +}; + +/** + * @brief the time people are 'simply' hospitalized before returning home in the SECIRS-type model * in day unit */ struct TimeInfectedSevere { @@ -214,7 +246,7 @@ struct TimeInfectedSevere { }; /** - * @brief the time people are treated by ICU before returning home in the SECIR model + * @brief the time people are treated by ICU before returning home in the SECIRS-type model * in day unit */ struct TimeInfectedCritical { @@ -260,7 +292,7 @@ struct RelativeTransmissionNoSymptoms { }; /** -* @brief the percentage of asymptomatic cases in the SECIR model +* @brief the percentage of asymptomatic cases in the SECIRS-type model */ struct RecoveredPerInfectedNoSymptoms { using Type = CustomIndexArray; @@ -275,7 +307,7 @@ struct RecoveredPerInfectedNoSymptoms { }; /** -* @brief the risk of infection from symptomatic cases in the SECIR model +* @brief the risk of infection from symptomatic cases in the SECIRS-type model */ struct RiskOfInfectionFromSymptomatic { using Type = CustomIndexArray; @@ -305,7 +337,7 @@ struct MaxRiskOfInfectionFromSymptomatic { }; /** -* @brief the percentage of hospitalized patients per infected patients in the SECIR model +* @brief the percentage of hospitalized patients per infected patients in the SECIRS-type model */ struct SeverePerInfectedSymptoms { using Type = CustomIndexArray; @@ -320,7 +352,7 @@ struct SeverePerInfectedSymptoms { }; /** -* @brief the percentage of ICU patients per hospitalized patients in the SECIR model +* @brief the percentage of ICU patients per hospitalized patients in the SECIRS-type model */ struct CriticalPerSevere { using Type = CustomIndexArray; @@ -335,7 +367,7 @@ struct CriticalPerSevere { }; /** -* @brief the percentage of dead patients per ICU patients in the SECIR model +* @brief the percentage of dead patients per ICU patients in the SECIRS-type model */ struct DeathsPerCritical { using Type = CustomIndexArray; @@ -394,10 +426,55 @@ struct DaysUntilEffectiveImprovedImmunity { } }; +/** + * @brief Time in days until booster vaccine dose takes full effect. + */ +struct DaysUntilEffectiveBoosterImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 7.0); + } + static std::string name() + { + return "DaysUntilEffectiveBoosterImmunity"; + } +}; + +/** + * @brief Time in days to describe waning immunity to get person from S_pv -> S + */ +struct WaningPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "WaningPartialImmunity"; + } +}; + +/** + * @brief Time in days to describe waning immunity to get person from R -> S_pv + */ +struct WaningImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "WaningImprovedImmunity"; + } +}; + /** * @brief Total number of first vaccinations up to the given day. */ -struct DailyFirstVaccination { +struct DailyPartialVaccination { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -405,7 +482,7 @@ struct DailyFirstVaccination { } static std::string name() { - return "DailyFirstVaccination"; + return "DailyPartialVaccination"; } }; @@ -424,6 +501,21 @@ struct DailyFullVaccination { } }; +/** +* @brief Total number of full vaccinations up to the given day. +*/ +struct DailyBoosterVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type({size, SimulationDay(0)}); + } + static std::string name() + { + return "DailyBoosterVaccination"; + } +}; + /** * @brief Factor to reduce infection risk for persons with partial immunity. */ @@ -551,14 +643,17 @@ using ParametersBase = TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, - DaysUntilEffectiveImprovedImmunity, DailyFullVaccination, DailyFirstVaccination, - ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, + DaysUntilEffectiveImprovedImmunity, DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, + DailyBoosterVaccination, DailyPartialVaccination, ReducExposedPartialImmunity, + ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, - ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, - StartDayNewVariant>; + ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, StartDayNewVariant, + InfectiousnessNewVariant, WaningPartialImmunity, WaningImprovedImmunity, TimeTemporaryImmunityPI, + TimeTemporaryImmunityII>; /** - * @brief Parameters of an age-resolved SECIR/SECIHURD model with paths for partial and improved immunity through vaccination. + * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over +time. */ class Parameters : public ParametersBase { @@ -830,6 +925,14 @@ class Parameters : public ParametersBase this->get()[i] = 0; corrected = true; } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {:0.4f} to {:d}", + this->get()[i], 0); + } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {:0.4f} to {:d}", + this->get()[i], 0); + } } return corrected; } @@ -991,6 +1094,15 @@ class Parameters : public ParametersBase log_error("Constraint check: Parameter InfectiousnessNewVariant smaller {}", 0); return true; } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter TimeTemporaryImmunityPI smaller {:d}", 0); + return true; + } + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter TimeTemporaryImmunityII smaller {:d}", 0); + return true; + } } return false; } diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index dc5a687a10..a6264cc3bc 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -21,6 +21,7 @@ #include "ode_secirvvs/parameters_io.h" #include "memilio/geography/regions.h" #include "memilio/io/io.h" +#include "ode_secirvvs/parameters.h" #ifdef MEMILIO_HAS_JSONCPP @@ -65,18 +66,18 @@ IOResult read_confirmed_cases_data( std::string const& path, std::vector const& vregion, Date date, std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, - std::vector>& vnum_death, std::vector>& vnum_rec, + std::vector>& vnum_death, std::vector>& vnum_timm_i, const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vmu_C_R, - const std::vector>& vmu_I_H, const std::vector>& vmu_H_U, - const std::vector& scaling_factor_inf) + const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, + const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) { BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); - return read_confirmed_cases_data(rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, - vnum_InfectedSymptoms, vnum_InfectedSevere, vnum_icu, vnum_death, vnum_rec, - vt_Exposed, vt_InfectedNoSymptoms, vt_InfectedSymptoms, vt_InfectedSevere, - vt_InfectedCritical, vmu_C_R, vmu_I_H, vmu_H_U, scaling_factor_inf); + return read_confirmed_cases_data( + rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, vnum_InfectedSevere, + vnum_icu, vnum_death, vnum_timm_i, vt_Exposed, vt_InfectedNoSymptoms, vt_InfectedSymptoms, vt_InfectedSevere, + vt_InfectedCritical, vt_imm_interval_i, vmu_C_R, vmu_I_H, vmu_H_U, scaling_factor_inf); } IOResult read_confirmed_cases_data( @@ -84,12 +85,12 @@ IOResult read_confirmed_cases_data( std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, std::vector>& vnum_death, - std::vector>& vnum_rec, const std::vector>& vt_Exposed, + std::vector>& vnum_timm_i, const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vmu_C_R, - const std::vector>& vmu_I_H, const std::vector>& vmu_H_U, - const std::vector& scaling_factor_inf) + const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, + const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) { auto max_date_entry = std::max_element(rki_data.begin(), rki_data.end(), [](auto&& a, auto&& b) { return a.date < b.date; @@ -124,25 +125,26 @@ IOResult read_confirmed_cases_data( auto& t_InfectedSymptoms = vt_InfectedSymptoms[region_idx]; auto& t_InfectedSevere = vt_InfectedSevere[region_idx]; auto& t_InfectedCritical = vt_InfectedCritical[region_idx]; + auto& t_imm_interval_i = vt_imm_interval_i[region_idx]; auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; - auto& num_rec = vnum_rec[region_idx]; auto& num_Exposed = vnum_Exposed[region_idx]; auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; auto& num_death = vnum_death[region_idx]; auto& num_icu = vnum_icu[region_idx]; + auto& num_imm = vnum_timm_i[region_idx]; auto& mu_C_R = vmu_C_R[region_idx]; auto& mu_I_H = vmu_I_H[region_idx]; auto& mu_H_U = vmu_H_U[region_idx]; - bool read_icu = false; // params.populations.get({age, SecirCompartments::U}) == 0; + bool read_icu = false; auto age = (size_t)entry.age_group; if (entry.date == offset_date_by_days(date, 0)) { num_InfectedSymptoms[age] += scaling_factor_inf[age] * entry.num_confirmed; - num_rec[age] += entry.num_confirmed; + num_imm[age] += entry.num_confirmed; } if (entry.date == offset_date_by_days(date, t_InfectedNoSymptoms[age] + days_surplus)) { num_InfectedNoSymptoms[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; @@ -171,6 +173,9 @@ IOResult read_confirmed_cases_data( num_icu[age] -= mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; } } + if (entry.date == offset_date_by_days(date, 0 - t_imm_interval_i[age])) { + num_imm[age] -= entry.num_confirmed; + } } } @@ -179,22 +184,14 @@ IOResult read_confirmed_cases_data( auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; - auto& num_rec = vnum_rec[region_idx]; auto& num_Exposed = vnum_Exposed[region_idx]; auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; auto& num_death = vnum_death[region_idx]; auto& num_icu = vnum_icu[region_idx]; + auto& num_timm_i = vnum_timm_i[region_idx]; size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); for (size_t i = 0; i < num_groups; i++) { - // subtract infected confirmed cases which are not yet recovered - // and remove dark figure scaling factor - num_rec[i] -= num_InfectedSymptoms[i] / scaling_factor_inf[i]; - num_rec[i] -= num_InfectedSevere[i] / scaling_factor_inf[i]; - num_rec[i] -= - num_icu[i] / - scaling_factor_inf[i]; // TODO: this has to be adapted for scaling_factor_inf != 1 or != ***_icu - num_rec[i] -= num_death[i] / scaling_factor_inf[i]; auto try_fix_constraints = [region, i](double& value, double error, auto str) { if (value < error) { // this should probably return a failure @@ -213,92 +210,57 @@ IOResult read_confirmed_cases_data( } }; - try_fix_constraints(num_InfectedSymptoms[i], -5, "InfectedSymptoms"); - try_fix_constraints(num_InfectedNoSymptoms[i], -5, "InfectedNoSymptoms"); - try_fix_constraints(num_Exposed[i], -5, "Exposed"); - try_fix_constraints(num_InfectedSevere[i], -5, "InfectedSevere"); - try_fix_constraints(num_death[i], -5, "Dead"); - try_fix_constraints(num_icu[i], -5, "InfectedCritical"); - try_fix_constraints(num_rec[i], -20, "Recovered or vaccinated"); + const double tol_error = -1e-8; + try_fix_constraints(num_InfectedSymptoms[i], tol_error, "InfectedSymptoms"); + try_fix_constraints(num_InfectedNoSymptoms[i], tol_error, "InfectedNoSymptoms"); + try_fix_constraints(num_Exposed[i], tol_error, "Exposed"); + try_fix_constraints(num_InfectedSevere[i], tol_error, "InfectedSevere"); + try_fix_constraints(num_death[i], tol_error, "Dead"); + try_fix_constraints(num_icu[i], tol_error, "InfectedCritical"); + try_fix_constraints(num_timm_i[i], tol_error, "Recently Recovered"); } } return success(); } -IOResult read_confirmed_cases_data_fix_recovered(std::string const& path, std::vector const& vregion, - Date date, std::vector>& vnum_rec, - double delay) -{ - BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); - return read_confirmed_cases_data_fix_recovered(rki_data, vregion, date, vnum_rec, delay); -} - -IOResult read_confirmed_cases_data_fix_recovered(const std::vector& rki_data, - std::vector const& vregion, Date date, - std::vector>& vnum_rec, double delay) +IOResult>> read_immunity_population(const std::string& path, const int& num_age_groups) { - auto max_date_entry = std::max_element(rki_data.begin(), rki_data.end(), [](auto&& a, auto&& b) { - return a.date < b.date; - }); - if (max_date_entry == rki_data.end()) { - log_error("RKI data is empty."); - return failure(StatusCode::InvalidValue, "RKI data is empty."); - } - auto max_date = max_date_entry->date; - if (max_date < date) { - log_error("Specified date does not exist in RKI data"); - return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); - } - - // shifts the initilization to the recent past if simulation starts - // around current day and data of the future would be required. - // Only needed for preinfection compartments, exposed and InfectedNoSymptoms. - auto days_surplus = get_offset_in_days(max_date, date) - 6; // 6 > T_E^C + T_C^I - if (days_surplus > 0) { - days_surplus = 0; + std::vector> ans(3, std::vector(num_age_groups, 0.0)); + std::fstream immunity_file; + immunity_file.open(path, std::ios::in); + if (immunity_file.fail()) { // checks to see if file opended + return mio::failure(mio::StatusCode::InvalidValue, "Failed to open immunity_population.txt."); } - - for (auto&& rki_entry : rki_data) { - auto it = std::find_if(vregion.begin(), vregion.end(), [&rki_entry](auto r) { - return r == 0 || get_region_id(rki_entry) == r; - }); - if (it != vregion.end()) { - auto region_idx = size_t(it - vregion.begin()); - if (rki_entry.date == offset_date_by_days(date, int(-delay))) { - vnum_rec[region_idx][size_t(rki_entry.age_group)] = rki_entry.num_confirmed; - } + if (immunity_file.is_open()) { + std::string tp; + int linenumber = 0; + while (linenumber < 3) { + getline(immunity_file, tp); + // delete /r at the end by delete last entry. + tp.erase(tp.size() - 1); + auto line = split(tp, ' '); + ans[linenumber][0] = std::stod(line[0]); + ans[linenumber][1] = std::stod(line[1]); + ans[linenumber][2] = std::stod(line[2]); + ans[linenumber][3] = std::stod(line[3]); + ans[linenumber][4] = std::stod(line[4]); + ans[linenumber][5] = std::stod(line[5]); + linenumber++; } + immunity_file.close(); //close the file object. } - - for (size_t region_idx = 0; region_idx < vregion.size(); ++region_idx) { - auto region = vregion[region_idx]; - auto& num_rec = vnum_rec[region_idx]; - - size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); - for (size_t i = 0; i < num_groups; i++) { - auto try_fix_constraints = [region, i](double& value, double error, auto str) { - if (value < error) { - // this should probably return a failure - // but the algorithm is not robust enough to avoid large negative - // values and there are tests that rely on it - log_error("{:s} for age group {:s} is {:.4f} for region {:d}, " - "exceeds expected negative value.", - str, ConfirmedCasesDataEntry::age_group_names[i], value, region); - value = 0.0; - } - else if (value < 0) { - log_info("{:s} for age group {:s} is {:.4f} for region {:d}, " - "automatically corrected", - str, ConfirmedCasesDataEntry::age_group_names[i], value, region); - value = 0.0; - } - }; - try_fix_constraints(num_rec[i], 0, "Recovered"); + // assert that the sum of the rows is 1 (tolerance 1-10) + for (size_t i = 0; i < ans.size(); i++) { + double sum = std::accumulate(ans[i].begin(), ans[i].end(), 0.0); + if (std::abs(sum - 1.0) > 1e-10) { + log_error("Sum of row {:d} in immunity of the population is not 1.0, but {:.4f}.", i, sum); + return mio::failure(mio::StatusCode::InvalidValue, + "Sum of row in the immunity of the population is not 1.0."); } } - return success(); + return ans; } IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, @@ -384,21 +346,24 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto num_groups = model[0].parameters.get_num_groups(); - auto days_until_effective1 = (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto days_until_effective2 = + auto days_until_effective_n = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto days_until_effective_pi = (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto vaccination_distance = (int)(double)model[0].parameters.get()[AgeGroup(0)]; - + auto days_until_effective_ii = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; // iterate over regions (e.g., counties) for (size_t i = 0; i < model.size(); ++i) { // iterate over age groups in region for (auto g = AgeGroup(0); g < num_groups; ++g) { - model[i].parameters.template get().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get().resize(SimulationDay(num_days + 1)); model[i].parameters.template get().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get().resize(SimulationDay(num_days + 1)); for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { - model[i].parameters.template get()[{g, d}] = 0.0; - model[i].parameters.template get()[{g, d}] = 0.0; + model[i].parameters.template get()[{g, d}] = 0.0; + model[i].parameters.template get()[{g, d}] = 0.0; + model[i].parameters.template get()[{g, d}] = 0.0; } } } @@ -410,6 +375,10 @@ IOResult set_vaccination_data(std::vector& model, const std::string return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); } auto max_date = max_date_entry->date; + if (max_date < offset_date_by_days(date, num_days)) { + log_error("Vaccination data does not contain all dates. After the last day the data, vaccinations per day are " + "set to 0."); + } for (auto&& vacc_data_entry : vacc_data) { auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { @@ -422,73 +391,73 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto region_idx = size_t(it - vregion.begin()); auto age = vacc_data_entry.age_group; + // initialize the temporary immunity states + if (date_df >= + offset_date_by_days( + date, + -model[region_idx].parameters.template get()[age] - + model[region_idx].parameters.template get()[age]) && + date_df <= + offset_date_by_days( + date, -model[region_idx].parameters.template get()[age])) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += + vacc_data_entry.num_second_vaccinations_completed; + } + + if (date_df >= + offset_date_by_days( + date, + -model[region_idx].parameters.template get()[age] - + model[region_idx].parameters.template get()[age]) && + date_df <= + offset_date_by_days( + date, -model[region_idx].parameters.template get()[age]) + + ) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + } + + // get daily vaccinations for each layer for (size_t d = 0; d < (size_t)num_days + 1; ++d) { - int days_plus; - // In the following, second dose means previous 'full immunization', now 'Grundimmunisierung'. - // --- - // date: start_date of the simulation (Input from IO call read_input_data_county_vaccmodel()) - // d: day of simulation, counted from 0 to num_days (for which we need (approximated) vaccination numbers) - // root[i]["Vacc_completed"]: accumulated number of total second doses up to day date_df; - // taken from input dataframe, single value, per county and age group - // ---- - // An averaged distance between first and second doses (vaccination_distance) is assumed in the following - // and the first doses are computed based on the second doses given 'vaccination_distance' days later. - // ---- - // a person whose second dose is reported at start_date + simulation_day - days_until_effective1 + vaccination_distance - // had the first dose on start_date + simulation_day - days_until_effective1. Furthermore, he/she has the full protection - // of the first dose at day X = start_date + simulation_day - // Storing its value in get() will eventually (in the simulation) - // transfer the difference (between get() at d and d-1) of - // N susceptible individuals to 'Susceptible Partially Vaccinated' state at day d; see secir_vaccinated.h - auto offset_first_date = - offset_date_by_days(date, (int)d - days_until_effective1 + vaccination_distance); + auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); if (max_date >= offset_first_date) { - // Option 1: considered offset_first_date is available in input data frame if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_completed; + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + vacc_data_entry.num_first_vaccinations_completed; } } - else { // offset_first_date > max_date - // Option 2: considered offset_first_date is NOT available in input data frame - // Here, a constant number of first and second doses is assumed, i.e., - // the the number of vaccinationes at day d (N days after max_date) will be: - // total number of vaccinations up to day max_date + N * number of vaccinations ON max_date - // (where the latter is computed as the difference between the total number at max_date and max_date-1) - days_plus = get_offset_in_days(offset_first_date, max_date); - if (date_df == offset_date_by_days(max_date, -1)) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= - days_plus * vacc_data_entry.num_vaccinations_completed; - } - else if (date_df == max_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += - (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + 0; } } - // a person whose second dose is reported at start_date + simulation_day - days_until_effective2 - // has the full protection of the second dose at day X = start_date + simulation_day - // Storing its value in get() will eventually (in the simulation) - // transfer the difference (between get() at d and d-1) of - // N susceptible, partially vaccinated individuals to 'SusceptibleImprovedImmunity' state at day d; see secir_vaccinated.h - auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective2); + auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); if (max_date >= offset_full_date) { - // Option 1: considered offset_full_date is available in input data frame if (date_df == offset_full_date) { model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_completed; + vacc_data_entry.num_second_vaccinations_completed; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = 0; } } - else { // offset_full_date > max_full_date - // Option 2: considered offset_full_date is NOT available in input data frame - days_plus = get_offset_in_days(offset_full_date, max_date); - if (date_df == offset_date_by_days(max_date, -1)) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= - days_plus * vacc_data_entry.num_vaccinations_completed; + + auto offset_booster_date = offset_date_by_days(date, (int)d - days_until_effective_ii); + if (max_date >= offset_booster_date) { + if (date_df == offset_booster_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; } - else if (date_df == max_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += - (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + 0; } } } diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index ab01a70243..93415b4a02 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -59,61 +59,49 @@ IOResult read_confirmed_cases_data( std::string const& path, std::vector const& vregion, Date date, std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, std::vector>& num_icu, - std::vector>& num_death, std::vector>& num_rec, + std::vector>& num_death, std::vector>& vnum_timm_i, const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, - const std::vector>& t_InfectedCritical, const std::vector>& mu_C_R, - const std::vector>& mu_I_H, const std::vector>& mu_H_U, - const std::vector& scaling_factor_inf); + const std::vector>& t_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& mu_C_R, const std::vector>& mu_I_H, + const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); IOResult read_confirmed_cases_data( const std::vector& rki_data, std::vector const& vregion, Date date, std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, std::vector>& num_icu, std::vector>& num_death, - std::vector>& num_rec, const std::vector>& t_Exposed, + std::vector>& vnum_timm_i, const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, const std::vector>& t_InfectedCritical, - const std::vector>& mu_C_R, const std::vector>& mu_I_H, - const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); + const std::vector>& vt_imm_interval_i, const std::vector>& mu_C_R, + const std::vector>& mu_I_H, const std::vector>& mu_H_U, + const std::vector& scaling_factor_inf); /**@}*/ -/** - * @brief Reads confirmed cases data and translates data of day t0-delay to recovered compartment, - * @param path Path to RKI confirmed cases file. - * @param vregion vector of keys of the region of interest - * @param date Date for which the arrays are initialized - * @param num_rec output vector for number of people in the compartement recovered - * @param delay number of days in the past the are used to set recovered compartment. - * @see mio::read_confirmed_cases_data - * @{ - */ -IOResult read_confirmed_cases_data_fix_recovered(const std::vector& rki_data, - std::vector const& vregion, Date date, - std::vector>& vnum_rec, double delay = 14.); -IOResult read_confirmed_cases_data_fix_recovered(std::string const& path, std::vector const& vregion, - Date date, std::vector>& vnum_rec, - double delay = 14.); +IOResult>> read_immunity_population(const std::string& path, const int& num_age_groups); /**@}*/ /** - * @brief sets populations data from a transformed RKI cases file into a Model. + * @brief sets infected and immun compartment(s) from a transformed RKI cases file into a Model. * @param model vector of objects in which the data is set * @param path Path to transformed RKI cases file * @param region vector of keys of the region of interest * @param date Date for which the arrays are initialized * @param scaling_factor_inf factors by which to scale the confirmed cases of - * rki data + * @param immunity_data_path Path to immunity data file */ template -IOResult set_confirmed_cases_data(std::vector& model, const std::string& path, - std::vector const& region, Date date, - const std::vector& scaling_factor_inf) +IOResult +set_confirmed_cases_data(std::vector& model, const std::string& path, std::vector const& region, Date date, + const std::vector& scaling_factor_inf, const std::string& immunity_data_path) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); assert(scaling_factor_inf.size() == num_age_groups); //TODO: allow vector or scalar valued scaling factors assert(ConfirmedCasesDataEntry::age_group_names.size() == num_age_groups); + BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); std::vector> t_Exposed{model.size()}; @@ -121,6 +109,8 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st std::vector> t_InfectedSymptoms{model.size()}; std::vector> t_InfectedSevere{model.size()}; std::vector> t_InfectedCritical{model.size()}; + std::vector> t_imm_interval1{model.size()}; + std::vector> t_imm_interval2{model.size()}; std::vector> mu_C_R{model.size()}; std::vector> mu_I_H{model.size()}; @@ -128,21 +118,28 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st std::vector> num_InfectedSymptoms(model.size()); std::vector> num_death(model.size()); - std::vector> num_rec(model.size()); std::vector> num_Exposed(model.size()); std::vector> num_InfectedNoSymptoms(model.size()); std::vector> num_InfectedSevere(model.size()); std::vector> num_icu(model.size()); + std::vector> num_timm1(model.size()); + std::vector> num_timm2(model.size()); + + std::vector denom_E(num_age_groups, 0.0); + std::vector denom_I_NS(num_age_groups, 0.0); + std::vector denom_I_Sy(num_age_groups, 0.0); + std::vector denom_I_Sev(num_age_groups, 0.0); /*----------- UNVACCINATED -----------*/ for (size_t county = 0; county < model.size(); county++) { num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); - num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); num_icu[county] = std::vector(num_age_groups, 0.0); + num_timm1[county] = std::vector(num_age_groups, 0.0); + num_timm2[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { t_InfectedNoSymptoms[county].push_back(static_cast( @@ -157,34 +154,71 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st std::round(model[county].parameters.template get()[(AgeGroup)group]))); t_InfectedCritical[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_imm_interval1[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + t_imm_interval2[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); mu_C_R[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); mu_I_H[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); mu_H_U[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + + // calculate the denominators to split the reported case numbers to the different immunity layers. + denom_E[group] = + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_NS[group] = + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_Sy[group] = + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_Sev[group] = + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county] + .parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county] + .parameters.template get()[(AgeGroup)group]); } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, - num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, - t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = + immunity_population[0][i] * denom_E[i] * num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaive}] = - num_InfectedNoSymptoms[county][i]; + immunity_population[0][i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaive}] = - num_InfectedSymptoms[county][i]; + immunity_population[0][i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereNaive}] = - num_InfectedSevere[county][i]; - model[county].populations[{AgeGroup(i), InfectionState::SusceptibleImprovedImmunity}] = num_rec[county][i]; + immunity_population[0][i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; } // } @@ -209,7 +243,6 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); - num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); @@ -254,24 +287,38 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, - num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, - t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunity}] = - num_InfectedSymptoms[county][i]; + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSeverePartialImmunity}] = - num_InfectedSevere[county][i]; + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sev[i] * num_InfectedSevere[county][i]; + // the += is necessary because we already set the previous vaccinated individuals + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_timm1[county][i]; } // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { @@ -295,7 +342,6 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); - num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); @@ -340,24 +386,38 @@ IOResult set_confirmed_cases_data(std::vector& model, const std::st } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, - num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, - t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm2, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval2, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunity}] = - num_InfectedSymptoms[county][i]; + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereImprovedImmunity}] = - num_InfectedSevere[county][i]; + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sev[i] * num_InfectedSevere[county][i]; + // the += is necessary because we already set the previous vaccinated individuals + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_timm2[county][i]; } // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { @@ -435,156 +495,47 @@ IOResult>> read_population_data(const std::vecto /**@}*/ template -IOResult set_population_data(std::vector& model, const std::string& path, const std::string& path_rki, - const std::vector& vregion, Date date) +IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, + const std::string& immunity_data_path) { BOOST_OUTCOME_TRY(num_population, read_population_data(path, vregion)); auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); - - BOOST_OUTCOME_TRY(read_confirmed_cases_data_fix_recovered(path_rki, vregion, date, num_rec, 14.)); + BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); for (size_t region = 0; region < vregion.size(); region++) { if (std::accumulate(num_population[region].begin(), num_population[region].end(), 0.0) > 0) { auto num_groups = model[region].parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; i++) { - double S_v = - std::min(model[region].parameters.template get()[{i, SimulationDay(0)}] + - num_rec[region][size_t(i)], - num_population[region][size_t(i)]); - double S_pv = - std::max(model[region].parameters.template get()[{i, SimulationDay(0)}] - - model[region].parameters.template get()[{i, SimulationDay(0)}], - 0.0); // use std::max with 0 - double S; - if (num_population[region][size_t(i)] - S_pv - S_v < 0.0) { - log_warning("Number of vaccinated persons greater than population in county {}, age group {}.", - region, size_t(i)); - S = 0.0; - S_v = num_population[region][size_t(i)] - S_pv; - } - else { - S = num_population[region][size_t(i)] - S_pv - S_v; - } - - double denom_E = - 1 / (S + S_pv * model[region].parameters.template get()[i] + - S_v * model[region].parameters.template get()[i]); - double denom_C = - 1 / (S + S_pv * model[region].parameters.template get()[i] + - S_v * model[region].parameters.template get()[i]); - double denom_I = - 1 / (S + S_pv * model[region].parameters.template get()[i] + - S_v * model[region].parameters.template get()[i]); - double denom_HU = - 1 / - (S + - S_pv * model[region].parameters.template get()[i] + - S_v * model[region].parameters.template get()[i]); - - model[region].populations[{i, InfectionState::ExposedNaive}] = - S * model[region].populations[{i, InfectionState::ExposedNaive}] * denom_E; - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] = - S_pv * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] * denom_E; - model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] = - S_v * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] * denom_E; - - model[region].populations[{i, InfectionState::InfectedNoSymptomsNaive}] = - S * model[region].populations[{i, InfectionState::InfectedNoSymptomsNaive}] * denom_C; - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] = - S_pv * model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] * denom_C; - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] = - S_v * model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] * denom_C; - - model[region].populations[{i, InfectionState::InfectedNoSymptomsNaiveConfirmed}] = - S * model[region].populations[{i, InfectionState::InfectedNoSymptomsNaiveConfirmed}] * denom_C; - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = - S_pv * model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] * - denom_C; - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = - S_v * model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] * - denom_C; - - model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] = - S * model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] * denom_I; - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] = - S_pv * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] * denom_I; - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] = - S_v * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] * denom_I; - - model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] = - S * model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] * denom_I; - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = - S_pv * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] * denom_I; - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = - S_v * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] * denom_I; - - model[region].populations[{i, InfectionState::InfectedSevereNaive}] = - S * model[region].populations[{i, InfectionState::InfectedSevereNaive}] * denom_HU; - model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] = - S_pv * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] * denom_HU; - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] = - S_v * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] * denom_HU; - - model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] = - S_pv * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] = - S_v * model[region].parameters.template get()[i] * - model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; - model[region].populations[{i, InfectionState::InfectedCriticalNaive}] = - S * model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; + double SN = num_population[region][size_t(i)] * immunity_population[0][size_t(i)]; + double SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; + double SII = num_population[region][size_t(i)] - SN - SPI; model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = - model[region].parameters.template get()[{i, SimulationDay(0)}] + - model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] - - (model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] + - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSevereNaive}] + - model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] + - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalNaive}] + - model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + - model[region].populations[{i, InfectionState::DeadNaive}] + - model[region].populations[{i, InfectionState::DeadPartialImmunity}] + - model[region].populations[{i, InfectionState::DeadImprovedImmunity}]); + SII - (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + + model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]); model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::min( - S_v - model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] - - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] - - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] - - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] - - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] - - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] - - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] - - model[region].populations[{i, InfectionState::DeadImprovedImmunity}], + SII, std::max(0.0, double(model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, - S_pv - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] - + SPI - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] - model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] - model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] - - model[region].populations[{i, InfectionState::DeadPartialImmunity}]); + model[region].populations[{i, InfectionState::DeadPartialImmunity}] - + model[region].populations[{i, InfectionState::TemporaryImmunPartialImmunity}]); model[region].populations.template set_difference_from_group_total( {i, InfectionState::SusceptibleNaive}, num_population[region][size_t(i)]); @@ -630,14 +581,18 @@ IOResult set_vaccination_data(std::vector& model, const std::string * @param divi_data_path path to divi data file * @param confirmed_cases_path path to confirmed cases file * @param population_data_path path to population data file + * @param immunity_data_path path to immunity data file */ template IOResult export_input_data_county_timeseries( const std::vector& model, const std::string& dir, std::vector const& region, Date start_date, const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, - const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path) + const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, + const std::string& immunity_data_path) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); + BOOST_OUTCOME_TRY(immunity_population, details::read_immunity_population(immunity_data_path, num_age_groups)); + assert(scaling_factor_inf.size() == num_age_groups); assert(num_age_groups == ConfirmedCasesDataEntry::age_group_names.size()); assert(model.size() == region.size()); @@ -653,48 +608,53 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_uv{model.size()}; - std::vector> t_Exposed_uv{model.size()}; - std::vector> t_InfectedSymptoms_uv{model.size()}; - std::vector> t_InfectedSevere_uv{model.size()}; - std::vector> t_InfectedCritical_uv{model.size()}; - - std::vector> mu_C_R_uv{model.size()}; - std::vector> mu_I_H_uv{model.size()}; - std::vector> mu_H_U_uv{model.size()}; + std::vector> t_InfectedNoSymptoms_n{model.size()}; + std::vector> t_Exposed_n{model.size()}; + std::vector> t_InfectedSymptoms_n{model.size()}; + std::vector> t_InfectedSevere_n{model.size()}; + std::vector> t_InfectedCritical_n{model.size()}; + std::vector> t_imm_interval1{model.size()}; + std::vector> t_imm_interval2{model.size()}; + + std::vector> mu_C_R_n{model.size()}; + std::vector> mu_I_H_n{model.size()}; + std::vector> mu_H_U_n{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_uv(model.size(), 0); - std::vector> mu_I_U_uv{model.size()}; + std::vector sum_mu_I_U_n(model.size(), 0); + std::vector> mu_I_U_n{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - t_Exposed_uv[county].push_back(static_cast( + t_Exposed_n[county].push_back(static_cast( std::round(2 * model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_uv[county].push_back(static_cast( + t_InfectedNoSymptoms_n[county].push_back(static_cast( std::round(2 * (model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group])))); - t_InfectedSymptoms_uv[county].push_back(static_cast( + t_InfectedSymptoms_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedSevere_uv[county].push_back(static_cast( + t_InfectedSevere_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_uv[county].push_back(static_cast( + t_InfectedCritical_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_imm_interval1[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + t_imm_interval2[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); - mu_C_R_uv[county].push_back( + mu_C_R_n[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); - mu_I_H_uv[county].push_back( + mu_I_H_n[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); - mu_H_U_uv[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U_n[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); /* begin: NOT in set_confirmed_cases_data() */ - sum_mu_I_U_uv[county] += - model[county].parameters.template get()[AgeGroup(group)] * - model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_uv[county].push_back( + sum_mu_I_U_n[county] += model[county].parameters.template get()[AgeGroup(group)] * + model[county].parameters.template get()[AgeGroup(group)]; + mu_I_U_n[county].push_back( model[county].parameters.template get()[AgeGroup(group)] * model[county].parameters.template get()[AgeGroup(group)]); /* end: NOT in set_confirmed_cases_data() */ @@ -705,37 +665,37 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_pv{model.size()}; - std::vector> t_Exposed_pv{model.size()}; - std::vector> t_InfectedSymptoms_pv{model.size()}; - std::vector> t_InfectedSevere_pv{model.size()}; - std::vector> t_InfectedCritical_pv{model.size()}; + std::vector> t_InfectedNoSymptoms_pi{model.size()}; + std::vector> t_Exposed_pi{model.size()}; + std::vector> t_InfectedSymptoms_pi{model.size()}; + std::vector> t_InfectedSevere_pi{model.size()}; + std::vector> t_InfectedCritical_pi{model.size()}; - std::vector> mu_C_R_pv{model.size()}; - std::vector> mu_I_H_pv{model.size()}; - std::vector> mu_H_U_pv{model.size()}; + std::vector> mu_C_R_pi{model.size()}; + std::vector> mu_I_H_pi{model.size()}; + std::vector> mu_H_U_pi{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_pv(model.size(), 0); - std::vector> mu_I_U_pv{model.size()}; + std::vector sum_mu_I_U_pi(model.size(), 0); + std::vector> mu_I_U_pi{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_pv[county].push_back(static_cast( + t_Exposed_pi[county].push_back(static_cast( std::round(2 * model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_pv[county].push_back(static_cast( + t_InfectedNoSymptoms_pi[county].push_back(static_cast( std::round(reduc_t * 2 * (model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group])))); - t_InfectedSymptoms_pv[county].push_back(static_cast( + t_InfectedSymptoms_pi[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_pv[county].push_back(static_cast( + t_InfectedSevere_pi[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_pv[county].push_back(static_cast( + t_InfectedCritical_pi[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); double exp_fact_part_immune = @@ -748,23 +708,23 @@ IOResult export_input_data_county_timeseries( double icu_fact_part_immune = model[county] .parameters.template get()[(AgeGroup)group]; - mu_C_R_pv[county].push_back( + mu_C_R_pi[county].push_back( (1 - inf_fact_part_immune / exp_fact_part_immune * (1 - model[county].parameters.template get()[(AgeGroup)group]))); - mu_I_H_pv[county].push_back( + mu_I_H_pi[county].push_back( hosp_fact_part_immune / inf_fact_part_immune * model[county].parameters.template get()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_pv[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * + mu_H_U_pi[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[(AgeGroup)group]); - sum_mu_I_U_pv[county] += + sum_mu_I_U_pi[county] += icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / inf_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_pv[county].push_back( + mu_I_U_pi[county].push_back( icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / inf_fact_part_immune * @@ -776,36 +736,36 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_fv{model.size()}; - std::vector> t_Exposed_fv{model.size()}; - std::vector> t_InfectedSymptoms_fv{model.size()}; - std::vector> t_InfectedSevere_fv{model.size()}; - std::vector> t_InfectedCritical_fv{model.size()}; - - std::vector> mu_C_R_fv{model.size()}; - std::vector> mu_I_H_fv{model.size()}; - std::vector> mu_H_U_fv{model.size()}; + std::vector> t_InfectedNoSymptoms_ii{model.size()}; + std::vector> t_Exposed_ii{model.size()}; + std::vector> t_InfectedSymptoms_ii{model.size()}; + std::vector> t_InfectedSevere_ii{model.size()}; + std::vector> t_InfectedCritical_ii{model.size()}; + + std::vector> mu_C_R_ii{model.size()}; + std::vector> mu_I_H_ii{model.size()}; + std::vector> mu_H_U_ii{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_fv(model.size(), 0); - std::vector> mu_I_U_fv{model.size()}; + std::vector sum_mu_I_U_ii(model.size(), 0); + std::vector> mu_I_U_ii{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_fv[county].push_back(static_cast( + t_Exposed_ii[county].push_back(static_cast( std::round(2 * model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_fv[county].push_back(static_cast( + t_InfectedNoSymptoms_ii[county].push_back(static_cast( std::round(reduc_t * 2 * (model[county].parameters.template get()[(AgeGroup)group] - model[county].parameters.template get()[(AgeGroup)group])))); - t_InfectedSymptoms_fv[county].push_back(static_cast( + t_InfectedSymptoms_ii[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_fv[county].push_back(static_cast( + t_InfectedSevere_ii[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_fv[county].push_back(static_cast( + t_InfectedCritical_ii[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); double reduc_immune_exp = @@ -818,22 +778,22 @@ IOResult export_input_data_county_timeseries( double reduc_immune_icu = model[county] .parameters.template get()[(AgeGroup)group]; - mu_C_R_fv[county].push_back( + mu_C_R_ii[county].push_back( (1 - reduc_immune_inf / reduc_immune_exp * (1 - model[county].parameters.template get()[(AgeGroup)group]))); - mu_I_H_fv[county].push_back( + mu_I_H_ii[county].push_back( reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_fv[county].push_back(reduc_immune_icu / reduc_immune_hosp * + mu_H_U_ii[county].push_back(reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[(AgeGroup)group]); - sum_mu_I_U_fv[county] += + sum_mu_I_U_ii[county] += reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_fv[county].push_back( + mu_I_U_ii[county].push_back( reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]); @@ -846,38 +806,39 @@ IOResult export_input_data_county_timeseries( auto date = offset_date_by_days(start_date, int(day)); // unvaccinated - std::vector> num_Exposed_uv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_uv(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_uv(model.size(), - std::vector(num_age_groups, 0.0)); + std::vector> num_Exposed_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_n(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptoms_n(model.size(), std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_uv(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_uv(model.size(), - std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptomsConfirmed_n(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptomsConfirmed_n(model.size(), + std::vector(num_age_groups, 0.0)); // end TODO - std::vector> num_rec_uv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSevere_uv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_death_uv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_rec_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_death_n(model.size(), std::vector(num_age_groups, 0.0)); std::vector> dummy_icu(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_timm1(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_timm2(model.size(), std::vector(num_age_groups, 0.0)); BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_uv, num_InfectedNoSymptoms_uv, num_InfectedSymptoms_uv, - num_InfectedSevere_uv, dummy_icu, num_death_uv, num_rec_uv, t_Exposed_uv, t_InfectedNoSymptoms_uv, - t_InfectedSymptoms_uv, t_InfectedSevere_uv, t_InfectedCritical_uv, mu_C_R_uv, mu_I_H_uv, mu_H_U_uv, - scaling_factor_inf)); + rki_data, region, date, num_Exposed_n, num_InfectedNoSymptoms_n, num_InfectedSymptoms_n, + num_InfectedSevere_n, dummy_icu, num_death_n, num_timm1, t_Exposed_n, t_InfectedNoSymptoms_n, + t_InfectedSymptoms_n, t_InfectedSevere_n, t_InfectedCritical_n, t_imm_interval1, mu_C_R_n, mu_I_H_n, + mu_H_U_n, scaling_factor_inf)); // partially vaccinated - std::vector> num_Exposed_pv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_pv(model.size(), + std::vector> num_Exposed_pi(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_pi(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_pv(model.size(), + std::vector> num_InfectedSymptoms_pi(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSevere_pv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_pi(model.size(), std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_pv(model.size(), + std::vector> num_InfectedNoSymptomsConfirmed_pi(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_pv(model.size(), + std::vector> num_InfectedSymptomsConfirmed_pi(model.size(), std::vector(num_age_groups, 0.0)); // end TODO std::vector> dummy_death(model.size(), std::vector(num_age_groups, 0.0)); @@ -887,34 +848,34 @@ IOResult export_input_data_county_timeseries( dummy_icu[county] = std::vector(num_age_groups, 0.0); } BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_pv, num_InfectedNoSymptoms_pv, num_InfectedSymptoms_pv, - num_InfectedSevere_pv, dummy_icu, dummy_death, dummy_rec, t_Exposed_pv, t_InfectedNoSymptoms_pv, - t_InfectedSymptoms_pv, t_InfectedSevere_pv, t_InfectedCritical_pv, mu_C_R_pv, mu_I_H_pv, mu_H_U_pv, - scaling_factor_inf)); + rki_data, region, date, num_Exposed_pi, num_InfectedNoSymptoms_pi, num_InfectedSymptoms_pi, + num_InfectedSevere_pi, dummy_icu, dummy_death, num_timm1, t_Exposed_pi, t_InfectedNoSymptoms_pi, + t_InfectedSymptoms_pi, t_InfectedSevere_pi, t_InfectedCritical_pi, t_imm_interval1, mu_C_R_pi, mu_I_H_pi, + mu_H_U_pi, scaling_factor_inf)); // fully vaccinated - std::vector> num_Exposed_fv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_fv(model.size(), + std::vector> num_Exposed_ii(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_ii(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_fv(model.size(), + std::vector> num_InfectedSymptoms_ii(model.size(), std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_fv(model.size(), + std::vector> num_InfectedNoSymptomsConfirmed_ii(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_fv(model.size(), + std::vector> num_InfectedSymptomsConfirmed_ii(model.size(), std::vector(num_age_groups, 0.0)); // end TODO - std::vector> num_InfectedSevere_fv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_ii(model.size(), std::vector(num_age_groups, 0.0)); for (size_t county = 0; county < model.size(); county++) { dummy_rec[county] = std::vector(num_age_groups, 0.0); dummy_death[county] = std::vector(num_age_groups, 0.0); dummy_icu[county] = std::vector(num_age_groups, 0.0); } BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_fv, num_InfectedNoSymptoms_fv, num_InfectedSymptoms_fv, - num_InfectedSevere_fv, dummy_icu, dummy_death, dummy_rec, t_Exposed_fv, t_InfectedNoSymptoms_fv, - t_InfectedSymptoms_fv, t_InfectedSevere_fv, t_InfectedCritical_fv, mu_C_R_fv, mu_I_H_fv, mu_H_U_fv, - scaling_factor_inf)); + rki_data, region, date, num_Exposed_ii, num_InfectedNoSymptoms_ii, num_InfectedSymptoms_ii, + num_InfectedSevere_ii, dummy_icu, dummy_death, num_timm2, t_Exposed_ii, t_InfectedNoSymptoms_ii, + t_InfectedSymptoms_ii, t_InfectedSevere_ii, t_InfectedCritical_ii, t_imm_interval2, mu_C_R_ii, mu_I_H_ii, + mu_H_U_ii, scaling_factor_inf)); // ICU only read for compartment InfectionState::InfectedCritical and then distributed later std::vector dummy_icu2(model.size(), 0.0); @@ -924,7 +885,7 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < region.size(); county++) { for (size_t age = 0; age < num_age_groups; age++) { num_icu[county][age] = - scaling_factor_icu * dummy_icu2[county] * mu_I_U_uv[county][age] / sum_mu_I_U_uv[county]; + scaling_factor_icu * dummy_icu2[county] * mu_I_U_n[county][age] / sum_mu_I_U_n[county]; } } @@ -932,267 +893,207 @@ IOResult export_input_data_county_timeseries( BOOST_OUTCOME_TRY(num_population, details::read_population_data(population_data, region)); std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); - BOOST_OUTCOME_TRY(details::read_confirmed_cases_data_fix_recovered(rki_data, region, date, num_rec, 14.)); for (size_t county = 0; county < region.size(); county++) { if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { for (size_t age = 0; age < num_age_groups; age++) { - auto age_group_offset = age * (size_t)InfectionState::Count; - double S_v = std::min( - model[county] - .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] + - num_rec[county][age], - num_population[county][age]); - double S_pv = std::max( - model[county] - .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] - - model[county] - .parameters.template get()[{AgeGroup(age), SimulationDay(day)}], - 0.0); // use std::max with 0 - double S; - if (num_population[county][age] - S_pv - S_v < 0.0) { - log_warning("Number of vaccinated greater than population at county {}, age group {}: {} + " - "{} > {}.", - county, age, S_pv, S_v, num_population[county][age]); - S = 0.0; - S_v = num_population[county][age] - S_pv; - } - else { - S = num_population[county][age] - S_pv - S_v; - } + double SN = num_population[county][size_t(age)] * immunity_population[0][size_t(age)]; + double SPI = num_population[county][size_t(age)] * immunity_population[1][size_t(age)]; + double SII = num_population[county][size_t(age)] - SN - SPI; double denom_E = 1 / - (S + - S_pv * model[county].parameters.template get()[AgeGroup(age)] + - S_v * model[county].parameters.template get()[AgeGroup(age)]); + (SN + + SPI * model[county].parameters.template get()[AgeGroup(age)] + + SII * model[county].parameters.template get()[AgeGroup(age)]); double denom_C = 1 / - (S + - S_pv * model[county].parameters.template get()[AgeGroup(age)] + - S_v * model[county].parameters.template get()[AgeGroup(age)]); + (SN + + SPI * model[county].parameters.template get()[AgeGroup(age)] + + SII * model[county].parameters.template get()[AgeGroup(age)]); double denom_I = 1 / - (S + - S_pv * model[county] - .parameters.template get()[AgeGroup(age)] + - S_v * model[county] + (SN + + SPI * model[county] + .parameters.template get()[AgeGroup(age)] + + SII * model[county] .parameters.template get()[AgeGroup(age)]); double denom_HU = - 1 / (S + - S_pv * model[county] - .parameters - .template get()[AgeGroup(age)] + - S_v * model[county] + 1 / (SN + + SPI * model[county] + .parameters + .template get()[AgeGroup(age)] + + SII * model[county] .parameters .template get()[AgeGroup(age)]); extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) = - S * denom_E * num_Exposed_uv[county][age]; + SN * denom_E * num_Exposed_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) = - S_pv * model[county].parameters.template get()[AgeGroup(age)] * - denom_E * num_Exposed_pv[county][age]; + SPI * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) = - S_v * model[county].parameters.template get()[AgeGroup(age)] * - denom_E * num_Exposed_fv[county][age]; + SII * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + age_group_offset) = - S * denom_C * num_InfectedNoSymptoms_uv[county][age]; + SN * denom_C * num_InfectedNoSymptoms_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + age_group_offset) = - S_pv * denom_C * num_InfectedNoSymptoms_pv[county][age]; + SPI * denom_C * num_InfectedNoSymptoms_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + age_group_offset) = - S_v * denom_C * num_InfectedNoSymptoms_fv[county][age]; + SII * denom_C * num_InfectedNoSymptoms_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaiveConfirmed + age_group_offset) = - S * denom_C * num_InfectedNoSymptomsConfirmed_uv[county][age]; + SN * denom_C * num_InfectedNoSymptomsConfirmed_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + age_group_offset) = - S_pv * denom_C * num_InfectedNoSymptomsConfirmed_pv[county][age]; + SPI * denom_C * num_InfectedNoSymptomsConfirmed_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + age_group_offset) = - S_v * denom_C * num_InfectedNoSymptomsConfirmed_fv[county][age]; + SII * denom_C * num_InfectedNoSymptomsConfirmed_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) = - S * denom_I * num_InfectedSymptoms_uv[county][age]; + SN * denom_I * num_InfectedSymptoms_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) = - S_pv * + SPI * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_pv[county][age]; + denom_I * num_InfectedSymptoms_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) = - S_v * + SII * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_fv[county][age]; + denom_I * num_InfectedSymptoms_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + age_group_offset) = - S * denom_I * num_InfectedSymptomsConfirmed_uv[county][age]; + SN * denom_I * num_InfectedSymptomsConfirmed_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) = - S_pv * + SPI * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_pv[county][age]; + denom_I * num_InfectedSymptomsConfirmed_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) = - S_v * + SII * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_fv[county][age]; + denom_I * num_InfectedSymptomsConfirmed_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) = - S * denom_HU * num_InfectedSevere_uv[county][age]; + SN * denom_HU * num_InfectedSevere_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + age_group_offset) = - S_pv * + SPI * model[county] .parameters.template get()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_pv[county][age]; + denom_HU * num_InfectedSevere_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) = - S_v * + SII * model[county] .parameters.template get()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_fv[county][age]; + denom_HU * num_InfectedSevere_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) = - S * denom_HU * num_icu[county][age]; + SN * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + age_group_offset) = - S_pv * + SPI * model[county] .parameters.template get()[AgeGroup(age)] * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) = - S_v * + SII * model[county] .parameters.template get()[AgeGroup(age)] * denom_HU * num_icu[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunPartialImmunity + + age_group_offset) = + num_timm1[county][age] * immunity_population[0][size_t(age)]; + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + + age_group_offset) = + num_timm2[county][age] * immunity_population[1][size_t(age)] + + immunity_population[2][size_t(age)] * immunity_population[2][size_t(age)]; + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) = - model[county] - .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] + - num_rec_uv[county][age] - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + SII - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + extrapolated_rki[county][day]( (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + - age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + - age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)); extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) = std::min( - S_v - - extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + - age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + - age_group_offset) - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + - age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + - age_group_offset) - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + - age_group_offset) - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + - age_group_offset) - - extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset), + SII - (extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)), std::max(0.0, double(extrapolated_rki[county][day]( (size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset)))); + ///////////////// extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + age_group_offset) = - std::max(0.0, - S_pv - - extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + - age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedNoSymptomsPartialImmunity + age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + - age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + - age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSeverePartialImmunity + age_group_offset) - - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedCriticalPartialImmunity + age_group_offset) - - extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + - age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = - num_population[county][age] - - (extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + + SPI - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + + age_group_offset) = + std::min(SPI, std::max(0.0, double(extrapolated_rki[county][day]( + (size_t)InfectionState::SusceptiblePartialImmunity + + age_group_offset)))); + + ///////////////// + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = + SPI - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + - age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset)); + extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = + std::min(SN, std::max(0.0, double(extrapolated_rki[county][day]( + (size_t)InfectionState::SusceptibleNaive + age_group_offset)))); // in set_confirmed_cases_data initilization, deaths are now set to 0. In order to visualize // the extrapolated real number of deaths, they have to be set here. In the comparison of data @@ -1202,7 +1103,7 @@ IOResult export_input_data_county_timeseries( // available here. // Do only add deaths after substraction. extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) = - num_death_uv[county][age]; + num_death_n[county][age]; } } else { @@ -1224,20 +1125,19 @@ IOResult export_input_data_county_timeseries( } template -IOResult -export_input_data_county_timeseries(std::vector&& model, const std::string& dir, std::vector const& region, - Date date, const std::vector& scaling_factor_inf, double scaling_factor_icu, - int num_days, const std::string& divi_data_path, - const std::string& confirmed_cases_path, const std::string& population_data_path, - bool set_vaccination_data, const std::string& vaccination_data_path) +IOResult export_input_data_county_timeseries( + std::vector&& model, const std::string& dir, std::vector const& region, Date date, + const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, + const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, + bool set_vaccination_data, const std::string& vaccination_data_path, const std::string& immunity_data_path) { if (set_vaccination_data) { BOOST_OUTCOME_TRY(details::set_vaccination_data(model, vaccination_data_path, date, region, num_days)); } - BOOST_OUTCOME_TRY(export_input_data_county_timeseries(model, dir, region, date, scaling_factor_inf, - scaling_factor_icu, num_days, divi_data_path, - confirmed_cases_path, population_data_path)); + BOOST_OUTCOME_TRY(export_input_data_county_timeseries( + model, dir, region, date, scaling_factor_inf, scaling_factor_icu, num_days, divi_data_path, + confirmed_cases_path, population_data_path, immunity_data_path)); return success(); } @@ -1249,7 +1149,7 @@ export_input_data_county_timeseries(std::vector&& model, const std::strin * Estimates all compartments from available data using the model parameters, so the * model parameters must be set before calling this function. * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRVVS models, one per county. + * @param model Vector of SECIRS-type models, one per county. * @param date Date for which the data should be read. * @param county Ids of the counties. * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. @@ -1277,10 +1177,11 @@ IOResult read_input_data_county(std::vector& model, Date date, cons } BOOST_OUTCOME_TRY(details::set_confirmed_cases_data( - model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf)); + model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf, + path_join(dir, "pydata/Germany", "immunity_population.txt"))); BOOST_OUTCOME_TRY( - details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), - path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date)); + details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), county, + path_join(dir, "pydata/Germany", "immunity_population.txt"))); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! @@ -1292,7 +1193,8 @@ IOResult read_input_data_county(std::vector& model, Date date, cons export_input_data_county_timeseries(model, dir, county, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), - path_join(dir, "pydata/Germany", "county_current_population.json"))); + path_join(dir, "pydata/Germany", "county_current_population.json"), + path_join(dir, "pydata/Germany", "immunity_population.txt"))); } return success(); @@ -1303,7 +1205,7 @@ IOResult read_input_data_county(std::vector& model, Date date, cons * Estimates all compartments from available data using the model parameters, so the * model parameters must be set before calling this function. * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRVVS models, one per county. + * @param model Vector of SECIRS-type models, one per county. * @param date Date for which the data should be read. * @param county Ids of the counties. * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. @@ -1333,8 +1235,8 @@ IOResult read_input_data(std::vector& model, Date date, const std:: BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, date, scaling_factor_inf)); - BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), - path_join(data_dir, "confirmed_cases.json"), node_ids, date)); + BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, + path_join(data_dir, "immunity_population.txt"))); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! From bb3be6e6d52bcc53488b728e6ee8b3a81daff75f Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 7 Mar 2024 09:01:59 +0100 Subject: [PATCH 02/60] [wip] fix build --- cpp/benchmarks/flow_simulation_ode_secirvvs.h | 10 +++---- cpp/benchmarks/graph_simulation.cpp | 4 +-- cpp/examples/ode_secirvvs.cpp | 4 +-- cpp/memilio/io/epi_data.h | 24 +++++++-------- cpp/models/ode_secirvvs/parameters_io.cpp | 6 ++-- cpp/models/ode_secirvvs/parameters_io.h | 5 ++-- cpp/tests/data/immunity_population.txt | 3 ++ cpp/tests/data/test_all_ageinf_vacc.json | 4 +-- cpp/tests/test_epi_data_io.cpp | 8 ++++- cpp/tests/test_odesecirvvs.cpp | 30 +++++++++++-------- data/pydata/Germany/immunity_population.txt | 3 ++ 11 files changed, 59 insertions(+), 42 deletions(-) create mode 100755 cpp/tests/data/immunity_population.txt create mode 100755 data/pydata/Germany/immunity_population.txt diff --git a/cpp/benchmarks/flow_simulation_ode_secirvvs.h b/cpp/benchmarks/flow_simulation_ode_secirvvs.h index 01115d085a..3810e0d1b9 100644 --- a/cpp/benchmarks/flow_simulation_ode_secirvvs.h +++ b/cpp/benchmarks/flow_simulation_ode_secirvvs.h @@ -461,13 +461,13 @@ class Simulation : public Base double first_vacc; double full_vacc; if (t_idx == SimulationDay(0)) { - first_vacc = params.template get()[{(AgeGroup)i, t_idx}]; + first_vacc = params.template get()[{(AgeGroup)i, t_idx}]; full_vacc = params.template get()[{(AgeGroup)i, t_idx}]; } else { first_vacc = - params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; + params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; full_vacc = params.template get()[{(AgeGroup)i, t_idx}] - params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; @@ -638,8 +638,8 @@ void setup_model(Model& model) model.parameters.template get() = 100; model.parameters.template get() = 0.0143; - model.parameters.template get().resize(SimulationDay(size_t(1000))); - model.parameters.template get().array().setConstant(5); + model.parameters.template get().resize(SimulationDay(size_t(1000))); + model.parameters.template get().array().setConstant(5); model.parameters.template get().resize(SimulationDay(size_t(1000))); model.parameters.template get().array().setConstant(3); diff --git a/cpp/benchmarks/graph_simulation.cpp b/cpp/benchmarks/graph_simulation.cpp index 9ecb156d85..d9394fa4e7 100644 --- a/cpp/benchmarks/graph_simulation.cpp +++ b/cpp/benchmarks/graph_simulation.cpp @@ -68,8 +68,8 @@ mio::osecirvvs::Model create_model(size_t num_agegroups, const ScalarType tmax) const size_t vacc_full = 5; model.parameters.get() = 100; model.parameters.get() = 0.0143; - model.parameters.get().resize(mio::SimulationDay(tmax)); - model.parameters.get().array().setConstant(vacc_first); + model.parameters.get().resize(mio::SimulationDay(tmax)); + model.parameters.get().array().setConstant(vacc_first); model.parameters.get().resize(mio::SimulationDay(tmax)); model.parameters.get().array().setConstant(vacc_full); diff --git a/cpp/examples/ode_secirvvs.cpp b/cpp/examples/ode_secirvvs.cpp index 4dedd583df..cab36bc100 100644 --- a/cpp/examples/ode_secirvvs.cpp +++ b/cpp/examples/ode_secirvvs.cpp @@ -66,8 +66,8 @@ int main() model.parameters.get() = 100; model.parameters.get() = 0.0143; - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(5); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(5); model.parameters.get().resize(mio::SimulationDay(size_t(1000))); model.parameters.get().array().setConstant(3); diff --git a/cpp/memilio/io/epi_data.h b/cpp/memilio/io/epi_data.h index 392da4b799..3e77be0c48 100644 --- a/cpp/memilio/io/epi_data.h +++ b/cpp/memilio/io/epi_data.h @@ -405,7 +405,7 @@ class VaccinationDataEntry public: static std::vector age_group_names; - double num_second_vaccinations_completed, num_first_vaccinations_completed, num_vaccinations_refreshed, + double num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed, num_vaccinations_refreshed_2; Date date; AgeGroup age_group; @@ -416,16 +416,16 @@ class VaccinationDataEntry template static IOResult deserialize(IoContext& io) { - auto obj = io.expect_object("VaccinationDataEntry"); - auto num_second_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); - auto num_first_vaccinations_completed = obj.expect_element("Vacc_partially", Tag{}); - auto num_vaccinations_refreshed = obj.expect_element("Vacc_refreshed", Tag{}); - auto num_vaccinations_refreshed_2 = obj.expect_element("Vacc_refreshed_2", Tag{}); - auto date = obj.expect_element("Date", Tag{}); - auto age_group_str = obj.expect_element("Age_RKI", Tag{}); - auto state_id = obj.expect_optional("ID_County", Tag{}); - auto county_id = obj.expect_optional("ID_County", Tag{}); - auto district_id = obj.expect_optional("ID_District", Tag{}); + auto obj = io.expect_object("VaccinationDataEntry"); + auto num_vaccinations_partial = obj.expect_element("Vacc_partially", Tag{}); + auto num_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); + auto num_vaccinations_refreshed = obj.expect_element("Vacc_refreshed", Tag{}); + auto num_vaccinations_refreshed_2 = obj.expect_element("Vacc_refreshed_2", Tag{}); + auto date = obj.expect_element("Date", Tag{}); + auto age_group_str = obj.expect_element("Age_RKI", Tag{}); + auto state_id = obj.expect_optional("ID_County", Tag{}); + auto county_id = obj.expect_optional("ID_County", Tag{}); + auto district_id = obj.expect_optional("ID_District", Tag{}); return mio::apply( io, [](auto nf, auto np, auto n_refreshed_1, auto n_refreshed_2, auto d, auto&& a_str, auto sid, auto cid, @@ -440,7 +440,7 @@ class VaccinationDataEntry } return success(VaccinationDataEntry{nf, np, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); }, - num_second_vaccinations_completed, num_first_vaccinations_completed, num_vaccinations_refreshed, + num_vaccinations_completed, num_vaccinations_partial, num_vaccinations_refreshed, num_vaccinations_refreshed_2, date, age_group_str, state_id, county_id, district_id); } }; diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index a6264cc3bc..1b91572011 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -401,7 +401,7 @@ IOResult set_vaccination_data(std::vector& model, const std::string offset_date_by_days( date, -model[region_idx].parameters.template get()[age])) { model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += - vacc_data_entry.num_second_vaccinations_completed; + vacc_data_entry.num_vaccinations_completed; } if (date_df >= @@ -424,7 +424,7 @@ IOResult set_vaccination_data(std::vector& model, const std::string if (max_date >= offset_first_date) { if (date_df == offset_first_date) { model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_first_vaccinations_completed; + vacc_data_entry.num_vaccinations_partial; } } else { @@ -438,7 +438,7 @@ IOResult set_vaccination_data(std::vector& model, const std::string if (max_date >= offset_full_date) { if (date_df == offset_full_date) { model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_second_vaccinations_completed; + vacc_data_entry.num_vaccinations_completed; } } else { diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index 93415b4a02..5c5f3e06b6 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -1234,7 +1234,8 @@ IOResult read_input_data(std::vector& model, Date date, const std:: } BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, - date, scaling_factor_inf)); + date, scaling_factor_inf, + path_join(data_dir, "immunity_population.json"))); BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, path_join(data_dir, "immunity_population.txt"))); @@ -1247,7 +1248,7 @@ IOResult read_input_data(std::vector& model, Date date, const std:: BOOST_OUTCOME_TRY(export_input_data_county_timeseries( model, data_dir, node_ids, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(data_dir, "critical_cases.json"), path_join(data_dir, "confirmed_cases.json"), - path_join(data_dir, "population_data.json"))); + path_join(data_dir, "population_data.json"), path_join(data_dir, "immunity_population.txt"))); } return success(); diff --git a/cpp/tests/data/immunity_population.txt b/cpp/tests/data/immunity_population.txt new file mode 100755 index 0000000000..653b1ae446 --- /dev/null +++ b/cpp/tests/data/immunity_population.txt @@ -0,0 +1,3 @@ +0.04 0.04 0.075 0.08 0.035 0.01 +0.61 0.61 0.62 0.62 0.58 0.41 +0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file diff --git a/cpp/tests/data/test_all_ageinf_vacc.json b/cpp/tests/data/test_all_ageinf_vacc.json index 022c4d94be..ce14a618be 100644 --- a/cpp/tests/data/test_all_ageinf_vacc.json +++ b/cpp/tests/data/test_all_ageinf_vacc.json @@ -1,2 +1,2 @@ -[{"Date":"2022-04-12","ID_County":1001,"ID_District":1234,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":5.0}, -{"Date":"2022-04-15","ID_District":1235,"Age_RKI":"15-34","Vacc_partially":0.0,"Vacc_completed":1.0}] +[{"Date":"2022-04-12","ID_County":1001,"ID_District":1234,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":5.0,"Vacc_refreshed":2.0,"Vacc_refreshed_2":1.0}, +{"Date":"2022-04-15","ID_District":1235,"Age_RKI":"15-34","Vacc_partially":1.0,"Vacc_completed":1.0, "Vacc_refreshed":4.0,"Vacc_refreshed_2":3.0}] diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index 7f197fa4a3..0c37c6581d 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -311,13 +311,19 @@ TEST(TestEpiDataIO, read_vaccination_data) ASSERT_EQ(vacc_data[0].age_group, mio::AgeGroup(0)); ASSERT_EQ(vacc_data[0].county_id, mio::regions::CountyId(1001)); ASSERT_EQ(vacc_data[0].district_id, mio::regions::DistrictId(1234)); + ASSERT_EQ(vacc_data[0].num_vaccinations_partial, 0.0); ASSERT_EQ(vacc_data[0].num_vaccinations_completed, 5.0); + ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed, 2.0); + ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed_2, 1.0); ASSERT_EQ(vacc_data[1].date, mio::Date(2022, 4, 15)); ASSERT_EQ(vacc_data[1].age_group, mio::AgeGroup(2)); ASSERT_EQ(vacc_data[1].county_id, boost::none); ASSERT_EQ(vacc_data[1].district_id, mio::regions::DistrictId(1235)); + ASSERT_EQ(vacc_data[1].num_vaccinations_partial, 1.0); ASSERT_EQ(vacc_data[1].num_vaccinations_completed, 1.0); + ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed, 4.0); + ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed_2, 3.0); } TEST(TestEpiData, set_vaccination_data) @@ -344,7 +350,7 @@ TEST(TestEpiData, set_vaccination_data) ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), MatrixNear(print_wrap(expected_values_FV), 1e-8, 1e-8)); - ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), MatrixNear(print_wrap(expected_values_PV), 1e-8, 1e-8)); } diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 41e4029502..574e8e3ec9 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -60,8 +60,8 @@ TEST(TestOdeSECIRVVS, simulateDefault) model.populations.set_total(10); model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleNaive}, 10); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); model.parameters.get().resize(mio::SimulationDay(size_t(1000))); model.parameters.get().array().setConstant(0); mio::TimeSeries result = simulate(t0, tmax, dt, model); @@ -114,8 +114,8 @@ TEST(TestOdeSECIRVVS, reduceToSecirAndCompareWithPreviousRun) model.parameters.get() = 10000; model.parameters.get() = 10000; - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); model.parameters.get().resize(mio::SimulationDay(size_t(1000))); model.parameters.get().array().setConstant(0); @@ -267,8 +267,8 @@ void set_demographic_parameters(mio::osecirvvs::Model::ParameterSet& parameters, assign_uniform_distribution(parameters.get(), 20, 50, set_invalid_initial_value); assign_uniform_distribution(parameters.get(), 100, 200, set_invalid_initial_value); - parameters.get().resize(mio::SimulationDay(size_t(1000))); - parameters.get().array().setConstant(5); + parameters.get().resize(mio::SimulationDay(size_t(1000))); + parameters.get().array().setConstant(5); parameters.get().resize(mio::SimulationDay(size_t(1000))); parameters.get().array().setConstant(3); } @@ -432,7 +432,7 @@ TEST(TestOdeSECIRVVS, draw_sample) graph.add_node(0, make_model(num_age_groups, /*set_invalid_initial_value*/ true)); graph.add_edge(0, 1, Eigen::VectorXd::Constant(num_age_groups, num_age_groups)); - auto sampled_graph = mio::osecirvvs::draw_sample(graph, true); + auto sampled_graph = mio::osecirvvs::draw_sample(graph); ASSERT_EQ(sampled_graph.nodes().size(), graph.nodes().size()); ASSERT_EQ(sampled_graph.edges().size(), graph.edges().size()); @@ -504,6 +504,7 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::vector> t_InfectedSymptoms(1); std::vector> t_InfectedSevere(1); std::vector> t_InfectedCritical(1); + std::vector> t_imm_interval1(1); std::vector> mu_C_R(1); std::vector> mu_I_H(1); @@ -511,7 +512,7 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::vector> num_InfectedSymptoms(1); std::vector> num_death(1); - std::vector> num_rec(1); + std::vector> num_timm(1); std::vector> num_Exposed(1); std::vector> num_InfectedNoSymptoms(1); std::vector> num_InfectedSevere(1); @@ -519,7 +520,7 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) num_InfectedSymptoms[0] = std::vector(num_age_groups, 0.0); num_death[0] = std::vector(num_age_groups, 0.0); - num_rec[0] = std::vector(num_age_groups, 0.0); + num_timm[0] = std::vector(num_age_groups, 0.0); num_Exposed[0] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[0] = std::vector(num_age_groups, 0.0); num_InfectedSevere[0] = std::vector(num_age_groups, 0.0); @@ -538,6 +539,8 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); t_InfectedCritical[0].push_back(static_cast(std::round( model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_imm_interval1[0].push_back(static_cast(std::round( + model[0].parameters.template get()[(mio::AgeGroup)group]))); mu_C_R[0].push_back( model[0].parameters.template get()[(mio::AgeGroup)group]); @@ -549,8 +552,8 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) auto read = mio::osecirvvs::details::read_confirmed_cases_data( path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, - num_icu, num_death, num_rec, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); + num_icu, num_death, num_timm, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); ASSERT_THAT(read, IsSuccess()); } @@ -728,7 +731,8 @@ TEST(TestOdeSECIRVVS, export_time_series_init) mio::path_join(TEST_DATA_DIR, "county_divi_ma7.json"), mio::path_join(TEST_DATA_DIR, "cases_all_county_age_ma7.json"), mio::path_join(TEST_DATA_DIR, "county_current_population.json"), true, - mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json")), + mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json"), + mio::path_join(TEST_DATA_DIR, "immunity_population.txt")), IsSuccess()); auto data_extrapolated = mio::read_result(mio::path_join(tmp_results_dir, "Results_rki.h5")); @@ -809,7 +813,7 @@ TEST(TestOdeSECIRVVS, parameter_percentiles) //sample a few times auto sampled_graphs = std::vector>(); std::generate_n(std::back_inserter(sampled_graphs), 10, [&graph]() { - return mio::osecirvvs::draw_sample(graph, true); + return mio::osecirvvs::draw_sample(graph); }); //extract nodes from graph diff --git a/data/pydata/Germany/immunity_population.txt b/data/pydata/Germany/immunity_population.txt new file mode 100755 index 0000000000..653b1ae446 --- /dev/null +++ b/data/pydata/Germany/immunity_population.txt @@ -0,0 +1,3 @@ +0.04 0.04 0.075 0.08 0.035 0.01 +0.61 0.61 0.62 0.62 0.58 0.41 +0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file From 82deb6f66cccc7a0c8b68507c5715535f537838a Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 7 Mar 2024 09:38:01 +0100 Subject: [PATCH 03/60] again --- cpp/simulations/CMakeLists.txt | 7 +++---- cpp/tests/test_odesecirvvs.cpp | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cpp/simulations/CMakeLists.txt b/cpp/simulations/CMakeLists.txt index a784b83ba5..adcf494d0f 100644 --- a/cpp/simulations/CMakeLists.txt +++ b/cpp/simulations/CMakeLists.txt @@ -3,10 +3,9 @@ if(MEMILIO_HAS_JSONCPP AND MEMILIO_HAS_HDF5) target_link_libraries(2020_npis_wildtype PRIVATE memilio ode_secir Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(2020_npis_wildtype PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) - add_executable(2021_vaccination_delta 2021_vaccination_sarscov2_delta_germany.cpp) - target_link_libraries(2021_vaccination_delta PRIVATE memilio ode_secirvvs Boost::filesystem ${HDF5_C_LIBRARIES}) - target_compile_options(2021_vaccination_delta PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) - + # add_executable(2021_vaccination_delta 2021_vaccination_sarscov2_delta_germany.cpp) + # target_link_libraries(2021_vaccination_delta PRIVATE memilio ode_secirvvs Boost::filesystem ${HDF5_C_LIBRARIES}) + # target_compile_options(2021_vaccination_delta PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) add_executable(abm_simulation abm.cpp) target_link_libraries(abm_simulation PRIVATE memilio abm Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(abm_simulation PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 574e8e3ec9..725f0849a9 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -64,6 +64,8 @@ TEST(TestOdeSECIRVVS, simulateDefault) model.parameters.get().array().setConstant(0); model.parameters.get().resize(mio::SimulationDay(size_t(1000))); model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); mio::TimeSeries result = simulate(t0, tmax, dt, model); EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); @@ -271,6 +273,8 @@ void set_demographic_parameters(mio::osecirvvs::Model::ParameterSet& parameters, parameters.get().array().setConstant(5); parameters.get().resize(mio::SimulationDay(size_t(1000))); parameters.get().array().setConstant(3); + parameters.get().resize(mio::SimulationDay(size_t(1000))); + parameters.get().array().setConstant(3); } void set_contact_parameters(mio::osecirvvs::Model::ParameterSet& parameters, bool set_invalid_initial_value) From 6dc2b161bead3e1f2ffdda7a6219b1c2ad3d68e6 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 7 Mar 2024 10:43:52 +0100 Subject: [PATCH 04/60] fix epi data io tests and hopefully msvc --- cpp/memilio/io/epi_data.h | 6 +- cpp/models/ode_secirvvs/parameters_io.cpp | 2 +- cpp/tests/test_epi_data_io.cpp | 74 ++++++++++++++--------- cpp/tests/test_odesecirvvs.cpp | 2 +- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/cpp/memilio/io/epi_data.h b/cpp/memilio/io/epi_data.h index 3e77be0c48..3a4635cdcd 100644 --- a/cpp/memilio/io/epi_data.h +++ b/cpp/memilio/io/epi_data.h @@ -428,7 +428,7 @@ class VaccinationDataEntry auto district_id = obj.expect_optional("ID_District", Tag{}); return mio::apply( io, - [](auto nf, auto np, auto n_refreshed_1, auto n_refreshed_2, auto d, auto&& a_str, auto sid, auto cid, + [](auto np, auto nc, auto n_refreshed_1, auto n_refreshed_2, auto d, auto&& a_str, auto sid, auto cid, auto did) -> IOResult { auto it = std::find(age_group_names.begin(), age_group_names.end(), a_str); auto a = AgeGroup(0); @@ -438,9 +438,9 @@ class VaccinationDataEntry else { return failure(StatusCode::InvalidValue, "Invalid vaccination data age group."); } - return success(VaccinationDataEntry{nf, np, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); + return success(VaccinationDataEntry{np, nc, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); }, - num_vaccinations_completed, num_vaccinations_partial, num_vaccinations_refreshed, + num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed, num_vaccinations_refreshed_2, date, age_group_str, state_id, county_id, district_id); } }; diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index 1b91572011..d331d2f582 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -389,7 +389,7 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto date_df = vacc_data_entry.date; if (it != vregion.end()) { auto region_idx = size_t(it - vregion.begin()); - auto age = vacc_data_entry.age_group; + AgeGroup age = vacc_data_entry.age_group; // initialize the temporary immunity states if (date_df >= diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index 0c37c6581d..069036437b 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -329,43 +329,55 @@ TEST(TestEpiDataIO, read_vaccination_data) TEST(TestEpiData, set_vaccination_data) { auto num_age_groups = 1; - auto num_days = 10; + auto num_days = 9; std::vector county_ids = {1001}; mio::osecirvvs::Model model(num_age_groups); model.parameters.set(3); model.parameters.set(1); model.parameters.set(2); + model.parameters.set(1); std::vector model_vector{model}; auto f = mio::osecirvvs::details::set_vaccination_data(model_vector, mio::path_join(TEST_DATA_DIR, "vaccination_test.json"), mio::Date(2022, 4, 15), county_ids, num_days); - auto expected_values_PV = - (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 7, 8, 9, 9, 10, 12, 14, 16, 18, 20, 22).finished(); + auto expected_values_PI = + (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 7, 10, 20, 15, 10, 5, 2, 15, 8, 0).finished(); - auto expected_values_FV = - (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 2, 4, 5, 5, 7, 8, 9, 9, 10, 12, 14).finished(); + auto expected_values_II = + (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 2, 4, 5, 5, 7, 8, 9, 9, 10, 12).finished(); + + auto expected_values_B = + (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 5, 7, 9, 11, 13, 9, 7, 5, 5, 0).finished(); - ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), - MatrixNear(print_wrap(expected_values_FV), 1e-8, 1e-8)); ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), - MatrixNear(print_wrap(expected_values_PV), 1e-8, 1e-8)); + MatrixNear(print_wrap(expected_values_PI), 1e-8, 1e-8)); + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + MatrixNear(print_wrap(expected_values_II), 1e-8, 1e-8)); + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + MatrixNear(print_wrap(expected_values_B), 1e-8, 1e-8)); } TEST(TestEpiData, vaccination_data) { - auto js = Json::Value(Json::arrayValue); - js[0]["Date"] = "2021-12-01"; - js[0]["ID_County"] = 1011; - js[0]["Vacc_completed"] = 23.05; - js[0]["Age_RKI"] = "5-14"; - - js[1]["Date"] = "2021-12-02"; - js[1]["ID_County"] = 1012; - js[1]["Vacc_completed"] = 12.0; - js[1]["Age_RKI"] = "80-99"; + auto js = Json::Value(Json::arrayValue); + js[0]["Date"] = "2021-12-01"; + js[0]["ID_County"] = 1011; + js[0]["Vacc_partially"] = 2.0; + js[0]["Vacc_completed"] = 23.05; + js[0]["Vacc_refreshed"] = 6.2; + js[0]["Vacc_refreshed_2"] = 10.05; + js[0]["Age_RKI"] = "5-14"; + + js[1]["Date"] = "2021-12-02"; + js[1]["ID_County"] = 1012; + js[1]["Vacc_partially"] = 14.0; + js[1]["Vacc_completed"] = 12.0; + js[1]["Vacc_refreshed"] = 6.2; + js[1]["Vacc_refreshed_2"] = 0.0; + js[1]["Age_RKI"] = "80-99"; auto r = mio::deserialize_vaccination_data(js); ASSERT_THAT(print_wrap(r), IsSuccess()); @@ -386,16 +398,22 @@ TEST(TestEpiData, vaccination_data) TEST(TestEpiData, vaccination_data_error_age) { - auto js = Json::Value(Json::arrayValue); - js[0]["Date"] = "2021-12-01"; - js[0]["ID_County"] = 1011; - js[0]["Vacc_completed"] = 23.05; - js[0]["Age_RKI"] = "5-15"; //error - - js[1]["Date"] = "2021-12-02"; - js[1]["ID_County"] = 1012; - js[1]["Vacc_completed"] = 12.0; - js[1]["Age_RKI"] = "80-99"; + auto js = Json::Value(Json::arrayValue); + js[0]["Date"] = "2021-12-01"; + js[0]["ID_County"] = 1011; + js[0]["Vacc_partially"] = 2.0; + js[0]["Vacc_completed"] = 23.05; + js[0]["Vacc_refreshed"] = 6.2; + js[0]["Vacc_refreshed_2"] = 10.05; + js[0]["Age_RKI"] = "5-15"; //error + + js[1]["Date"] = "2021-12-02"; + js[1]["ID_County"] = 1012; + js[1]["Vacc_partially"] = 14.0; + js[1]["Vacc_completed"] = 12.0; + js[1]["Vacc_refreshed"] = 6.2; + js[1]["Vacc_refreshed_2"] = 0.0; + js[1]["Age_RKI"] = "80-99"; auto r = mio::deserialize_vaccination_data(js); ASSERT_THAT(print_wrap(r), IsFailure(mio::StatusCode::InvalidValue)); diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 725f0849a9..751fe3282e 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -877,7 +877,7 @@ TEST(TestOdeSECIRVVS, get_migration_factors) auto expected_values = (Eigen::VectorXd(Eigen::Index(mio::osecirvvs::InfectionState::Count) * num_age_groups) << 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .finished(); ASSERT_THAT(print_wrap(migration_factors), MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); } From 286aff582f34a7ba705ded3960a2cf580b471784 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 7 Mar 2024 10:44:30 +0100 Subject: [PATCH 05/60] vacc data with multiple vacc --- cpp/tests/data/vaccination_test.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cpp/tests/data/vaccination_test.json b/cpp/tests/data/vaccination_test.json index 30f68aa567..d0822ccf20 100644 --- a/cpp/tests/data/vaccination_test.json +++ b/cpp/tests/data/vaccination_test.json @@ -1,11 +1,11 @@ -[{"Date":"2022-04-12","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":1.0}, -{"Date":"2022-04-13","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":2.0}, -{"Date":"2022-04-14","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":4.0}, -{"Date":"2022-04-15","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":5.0}, -{"Date":"2022-04-16","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":5.0}, -{"Date":"2022-04-17","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":7.0}, -{"Date":"2022-04-18","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":8.0}, -{"Date":"2022-04-19","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":9.0}, -{"Date":"2022-04-20","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":9.0}, -{"Date":"2022-04-21","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":10.0}, -{"Date":"2022-04-22","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":0.0,"Vacc_completed":12.0}] +[{"Date":"2022-04-12","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":3.0,"Vacc_completed":1.0,"Vacc_refreshed":2.0,"Vacc_refreshed_2":1.0}, +{"Date":"2022-04-13","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":5.0,"Vacc_completed":2.0,"Vacc_refreshed":3.0,"Vacc_refreshed_2":0.0}, +{"Date":"2022-04-14","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":7.0,"Vacc_completed":4.0,"Vacc_refreshed":4.0,"Vacc_refreshed_2":1.0}, +{"Date":"2022-04-15","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":10.0,"Vacc_completed":5.0,"Vacc_refreshed":5.0,"Vacc_refreshed_2":2.0}, +{"Date":"2022-04-16","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":20.0,"Vacc_completed":5.0,"Vacc_refreshed":6.0,"Vacc_refreshed_2":3.0}, +{"Date":"2022-04-17","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":15.0,"Vacc_completed":7.0,"Vacc_refreshed":7.0,"Vacc_refreshed_2":4.0}, +{"Date":"2022-04-18","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":10.0,"Vacc_completed":8.0,"Vacc_refreshed":8.0,"Vacc_refreshed_2":5.0}, +{"Date":"2022-04-19","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":5.0,"Vacc_completed":9.0,"Vacc_refreshed":7.0,"Vacc_refreshed_2":2.0}, +{"Date":"2022-04-20","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":2.0,"Vacc_completed":9.0,"Vacc_refreshed":6.0,"Vacc_refreshed_2":1.0}, +{"Date":"2022-04-21","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":15.0,"Vacc_completed":10.0,"Vacc_refreshed":5.0,"Vacc_refreshed_2":0.0}, +{"Date":"2022-04-22","ID_County":1001,"Age_RKI":"0-4","Vacc_partially":8.0,"Vacc_completed":12.0,"Vacc_refreshed":4.0,"Vacc_refreshed_2":1.0}] From 60d3d5c4a544f4021b2184c8c0772b393e12edfc Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 7 Mar 2024 14:19:36 +0100 Subject: [PATCH 06/60] fix tests --- cpp/models/ode_secirvvs/parameters.h | 6 +- cpp/models/ode_secirvvs/parameters_io.cpp | 28 +- cpp/models/ode_secirvvs/parameters_io.h | 11 +- .../pydata/District/vaccination_data.json | 9382 +++++++++-------- .../Germany/all_county_ageinf_vacc_ma7.json | 9382 +++++++++-------- cpp/tests/data/vacc_county_ageinf_ma7.json | 9382 +++++++++-------- cpp/tests/data/vaccination_data.json | 9382 +++++++++-------- cpp/tests/test_odesecirvvs.cpp | 60 +- export_time_series_initialization_osecirts.h5 | Bin 0 -> 10008 bytes 9 files changed, 19916 insertions(+), 17717 deletions(-) create mode 100644 export_time_series_initialization_osecirts.h5 diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 699345fcdc..3b69122cfd 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -214,7 +214,7 @@ struct TimeTemporaryImmunityPI { }; /** - * @brief the time people stays immune after infection or vaccination located in S_pv or S_II + * @brief the time people stays immune after infection or vaccination located in S_PI or S_II in the model in day unit */ struct TimeTemporaryImmunityII { @@ -442,7 +442,7 @@ struct DaysUntilEffectiveBoosterImmunity { }; /** - * @brief Time in days to describe waning immunity to get person from S_pv -> S + * @brief Time in days to describe waning immunity to get person from S_PI -> S */ struct WaningPartialImmunity { using Type = CustomIndexArray; @@ -457,7 +457,7 @@ struct WaningPartialImmunity { }; /** - * @brief Time in days to describe waning immunity to get person from R -> S_pv + * @brief Time in days to describe waning immunity to get person from SII -> SPI */ struct WaningImprovedImmunity { using Type = CustomIndexArray; diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index d331d2f582..8a5171d36e 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -238,26 +238,20 @@ IOResult>> read_immunity_population(const std::s while (linenumber < 3) { getline(immunity_file, tp); // delete /r at the end by delete last entry. - tp.erase(tp.size() - 1); - auto line = split(tp, ' '); - ans[linenumber][0] = std::stod(line[0]); - ans[linenumber][1] = std::stod(line[1]); - ans[linenumber][2] = std::stod(line[2]); - ans[linenumber][3] = std::stod(line[3]); - ans[linenumber][4] = std::stod(line[4]); - ans[linenumber][5] = std::stod(line[5]); + if (linenumber < 2) + tp.erase(tp.size() - 1); + auto line = split(tp, ' '); + for (int i = 0; i < num_age_groups; i++) { + ans[linenumber][i] = std::stod(line[i]); + } linenumber++; } immunity_file.close(); //close the file object. } - // assert that the sum of the rows is 1 (tolerance 1-10) - for (size_t i = 0; i < ans.size(); i++) { - double sum = std::accumulate(ans[i].begin(), ans[i].end(), 0.0); - if (std::abs(sum - 1.0) > 1e-10) { - log_error("Sum of row {:d} in immunity of the population is not 1.0, but {:.4f}.", i, sum); - return mio::failure(mio::StatusCode::InvalidValue, - "Sum of row in the immunity of the population is not 1.0."); - } + + // assert that the sum of the cols is 1 (tolerance 1-10) + for (size_t i = 0; i < 6; ++i) { + assert(std::abs(ans[0][i] + ans[1][i] + ans[2][i] - 1.0) < 1e-10); } return ans; @@ -389,7 +383,7 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto date_df = vacc_data_entry.date; if (it != vregion.end()) { auto region_idx = size_t(it - vregion.begin()); - AgeGroup age = vacc_data_entry.age_group; + auto age = vacc_data_entry.age_group; // initialize the temporary immunity states if (date_df >= diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index 5c5f3e06b6..cd4b326815 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -501,7 +501,6 @@ IOResult set_population_data(std::vector& model, const std::string& BOOST_OUTCOME_TRY(num_population, read_population_data(path, vregion)); auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); - std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); for (size_t region = 0; region < vregion.size(); region++) { @@ -816,15 +815,15 @@ IOResult export_input_data_county_timeseries( std::vector> num_InfectedSymptomsConfirmed_n(model.size(), std::vector(num_age_groups, 0.0)); // end TODO - std::vector> num_rec_n(model.size(), std::vector(num_age_groups, 0.0)); std::vector> num_InfectedSevere_n(model.size(), std::vector(num_age_groups, 0.0)); std::vector> num_death_n(model.size(), std::vector(num_age_groups, 0.0)); std::vector> dummy_icu(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> dummy_timm(model.size(), std::vector(num_age_groups, 0.0)); std::vector> num_timm1(model.size(), std::vector(num_age_groups, 0.0)); std::vector> num_timm2(model.size(), std::vector(num_age_groups, 0.0)); BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( rki_data, region, date, num_Exposed_n, num_InfectedNoSymptoms_n, num_InfectedSymptoms_n, - num_InfectedSevere_n, dummy_icu, num_death_n, num_timm1, t_Exposed_n, t_InfectedNoSymptoms_n, + num_InfectedSevere_n, dummy_icu, num_death_n, dummy_timm, t_Exposed_n, t_InfectedNoSymptoms_n, t_InfectedSymptoms_n, t_InfectedSevere_n, t_InfectedCritical_n, t_imm_interval1, mu_C_R_n, mu_I_H_n, mu_H_U_n, scaling_factor_inf)); @@ -842,7 +841,6 @@ IOResult export_input_data_county_timeseries( std::vector(num_age_groups, 0.0)); // end TODO std::vector> dummy_death(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> dummy_rec(model.size(), std::vector(num_age_groups, 0.0)); for (size_t county = 0; county < model.size(); county++) { dummy_death[county] = std::vector(num_age_groups, 0.0); dummy_icu[county] = std::vector(num_age_groups, 0.0); @@ -867,7 +865,6 @@ IOResult export_input_data_county_timeseries( // end TODO std::vector> num_InfectedSevere_ii(model.size(), std::vector(num_age_groups, 0.0)); for (size_t county = 0; county < model.size(); county++) { - dummy_rec[county] = std::vector(num_age_groups, 0.0); dummy_death[county] = std::vector(num_age_groups, 0.0); dummy_icu[county] = std::vector(num_age_groups, 0.0); } @@ -892,8 +889,6 @@ IOResult export_input_data_county_timeseries( // read population basics BOOST_OUTCOME_TRY(num_population, details::read_population_data(population_data, region)); - std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); - for (size_t county = 0; county < region.size(); county++) { if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { for (size_t age = 0; age < num_age_groups; age++) { @@ -1235,7 +1230,7 @@ IOResult read_input_data(std::vector& model, Date date, const std:: BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, date, scaling_factor_inf, - path_join(data_dir, "immunity_population.json"))); + path_join(data_dir, "immunity_population.txt"))); BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, path_join(data_dir, "immunity_population.txt"))); diff --git a/cpp/tests/data/pydata/District/vaccination_data.json b/cpp/tests/data/pydata/District/vaccination_data.json index 852023b477..b6dc849643 100644 --- a/cpp/tests/data/pydata/District/vaccination_data.json +++ b/cpp/tests/data/pydata/District/vaccination_data.json @@ -1,4418 +1,4970 @@ [ { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14093.5670993244, - "Vacc_completed":1058.2133302677, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14094.6780758432, - "Vacc_completed":1058.2386490178, - "Vacc_refreshed":3.9480185817 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14102.3458622773, - "Vacc_completed":1063.1811826304, - "Vacc_refreshed":7.8235846725 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14106.0158477852, - "Vacc_completed":1071.0829580916, - "Vacc_refreshed":13.0365435255 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14115.8958402416, - "Vacc_completed":1072.5136218055, - "Vacc_refreshed":15.4582843201 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14116.0603009948, - "Vacc_completed":1080.8706574256, - "Vacc_refreshed":22.3037298829 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14124.4849162097, - "Vacc_completed":1087.4957123195, - "Vacc_refreshed":27.7666004775 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14132.812800891, - "Vacc_completed":1094.2936630058, - "Vacc_refreshed":29.4212640594 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14139.2772895404, - "Vacc_completed":1100.1665827188, - "Vacc_refreshed":29.4568827793 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14145.4868397119, - "Vacc_completed":1105.3345419667, - "Vacc_refreshed":34.7217238502 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14147.7480966959, - "Vacc_completed":1111.2289166538, - "Vacc_refreshed":34.771310214 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14154.5204084505, - "Vacc_completed":1114.7870563855, - "Vacc_refreshed":41.8898823514 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14155.4472543415, - "Vacc_completed":1124.6385432496, - "Vacc_refreshed":48.6348857735 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14162.2764203336, - "Vacc_completed":1128.54825128, - "Vacc_refreshed":48.7694054724 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14163.6229511244, - "Vacc_completed":1128.7143765883, - "Vacc_refreshed":53.2059941772 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14170.704731349, - "Vacc_completed":1138.0466956792, - "Vacc_refreshed":59.0394633797 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14177.9754226866, - "Vacc_completed":1144.8391611423, - "Vacc_refreshed":68.7607294969 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14180.6917277285, - "Vacc_completed":1145.8477444825, - "Vacc_refreshed":68.9221667424 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14183.6510488722, - "Vacc_completed":1148.5261706572, - "Vacc_refreshed":74.1781085786 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14187.685478561, - "Vacc_completed":1156.317724845, - "Vacc_refreshed":82.4605426733 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14190.8756861073, - "Vacc_completed":1158.3230049846, - "Vacc_refreshed":85.9686058349 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14194.7125443701, - "Vacc_completed":1162.8869701267, - "Vacc_refreshed":86.9745448839 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14198.1736788429, - "Vacc_completed":1172.5122981568, - "Vacc_refreshed":87.3520867387 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14200.0337444888, - "Vacc_completed":1173.9022323601, - "Vacc_refreshed":96.1323881978 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14209.9091251899, - "Vacc_completed":1180.4819879148, - "Vacc_refreshed":102.8081520102 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14215.7510791988, - "Vacc_completed":1187.6749019896, - "Vacc_refreshed":111.0676626302 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14216.891975169, - "Vacc_completed":1194.8246181318, - "Vacc_refreshed":112.2172983632 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14226.1128719795, - "Vacc_completed":1199.3288757923, - "Vacc_refreshed":115.0035825103 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14234.2678640476, - "Vacc_completed":1200.3667784603, - "Vacc_refreshed":122.2552339507 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14236.1003192184, - "Vacc_completed":1204.1967603181, - "Vacc_refreshed":127.0429292216 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14242.538633822, - "Vacc_completed":1212.5454877324, - "Vacc_refreshed":134.6939665016 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14244.3387278104, - "Vacc_completed":1213.6034702862, - "Vacc_refreshed":136.0920891424 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14251.4120506037, - "Vacc_completed":1216.4725302456, - "Vacc_refreshed":140.2813449601 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14260.7111088561, - "Vacc_completed":1223.9349650326, - "Vacc_refreshed":144.4607939662 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.4310619138, - "Vacc_completed":1230.2964929538, - "Vacc_refreshed":149.281965675 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.8430243455, - "Vacc_completed":1233.791799902, - "Vacc_refreshed":152.843700775 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14270.6723528208, - "Vacc_completed":1235.7852283109, - "Vacc_refreshed":158.6087157945 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14276.398217781, - "Vacc_completed":1244.1189399585, - "Vacc_refreshed":161.780101215 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14282.7632141243, - "Vacc_completed":1252.4246776385, - "Vacc_refreshed":164.4087953839 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14285.2172118541, - "Vacc_completed":1253.0967186007, - "Vacc_refreshed":165.7333648079 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14288.3981413127, - "Vacc_completed":1261.2285273698, - "Vacc_refreshed":175.6751183454 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14296.6990830234, - "Vacc_completed":1261.8928424603, - "Vacc_refreshed":181.3746988194 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14304.9324135674, - "Vacc_completed":1268.1858225933, - "Vacc_refreshed":182.8207287588 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14312.7990335985, - "Vacc_completed":1270.8693167453, - "Vacc_refreshed":192.6352794711 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14316.0317804647, - "Vacc_completed":1276.8328604136, - "Vacc_refreshed":199.109084232 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14317.8224126817, - "Vacc_completed":1285.9345839202, - "Vacc_refreshed":204.9564534429 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14319.969225103, - "Vacc_completed":1292.0814432843, - "Vacc_refreshed":209.3116185701 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14325.5010146205, - "Vacc_completed":1296.8562638588, - "Vacc_refreshed":214.164106287 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14334.64723979, - "Vacc_completed":1299.2846390455, - "Vacc_refreshed":215.8187786169 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14341.3416549169, - "Vacc_completed":1307.3997120401, - "Vacc_refreshed":220.1718442512 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14349.3146443239, - "Vacc_completed":1309.8026404332, - "Vacc_refreshed":222.9315364644 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14359.2839765392, - "Vacc_completed":1313.6592234511, - "Vacc_refreshed":226.6469703335 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14365.2176903694, - "Vacc_completed":1319.2137305156, - "Vacc_refreshed":227.7079880211 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14372.2949635005, - "Vacc_completed":1325.3928078641, - "Vacc_refreshed":234.0214496372 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14377.1100641854, - "Vacc_completed":1326.7384263101, - "Vacc_refreshed":242.1400638609 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14381.7559278649, - "Vacc_completed":1329.4413693873, - "Vacc_refreshed":246.2374710913 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14385.7162526455, - "Vacc_completed":1338.1839321545, - "Vacc_refreshed":252.0149200475 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14389.4326934411, - "Vacc_completed":1345.9094675595, - "Vacc_refreshed":256.9046042339 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14391.2007554132, - "Vacc_completed":1348.71606757, - "Vacc_refreshed":258.1776032516 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14394.8621297613, - "Vacc_completed":1354.2416050796, - "Vacc_refreshed":267.8589065036 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.3456243909, - "Vacc_completed":1359.868800934, - "Vacc_refreshed":270.9855298163 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.4645205246, - "Vacc_completed":1363.0538159145, - "Vacc_refreshed":275.840425604 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14399.1657319944, - "Vacc_completed":1365.5993182323, - "Vacc_refreshed":277.5856365007 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14402.7230837573, - "Vacc_completed":1368.6201543223, - "Vacc_refreshed":286.3361695339 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14403.1500082752, - "Vacc_completed":1371.4419603277, - "Vacc_refreshed":291.9429549926 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14409.601025491, - "Vacc_completed":1375.0385110041, - "Vacc_refreshed":294.4838831323 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.5992098988, - "Vacc_completed":1379.7282797993, - "Vacc_refreshed":304.3709721295 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.7379664054, - "Vacc_completed":1388.4437755617, - "Vacc_refreshed":310.9469195789 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14413.0256783966, - "Vacc_completed":1395.0228908154, - "Vacc_refreshed":316.1322991564 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14418.5923400284, - "Vacc_completed":1395.4421160716, - "Vacc_refreshed":324.326203234 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14427.1006875636, - "Vacc_completed":1400.9550416303, - "Vacc_refreshed":326.1675291407 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14428.1259159444, - "Vacc_completed":1401.6589165675, - "Vacc_refreshed":336.1473853823 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14429.6710322591, - "Vacc_completed":1406.4316961423, - "Vacc_refreshed":338.7341080527 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14435.5405186058, - "Vacc_completed":1406.8193757343, - "Vacc_refreshed":348.5515447081 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14440.6128511884, - "Vacc_completed":1406.8790930463, - "Vacc_refreshed":349.9224707035 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14448.1553470558, - "Vacc_completed":1407.8576900416, - "Vacc_refreshed":354.7521313753 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14456.4196110425, - "Vacc_completed":1411.7530351787, - "Vacc_refreshed":361.5526839017 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14466.1757833279, - "Vacc_completed":1412.4941157515, - "Vacc_refreshed":364.0766791828 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14472.9152722164, - "Vacc_completed":1421.7399661156, - "Vacc_refreshed":371.2418954122 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14474.3971159945, - "Vacc_completed":1423.8796012137, - "Vacc_refreshed":378.3445685688 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14482.9259977884, - "Vacc_completed":1428.8212618966, - "Vacc_refreshed":382.6712538747 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14491.6837567491, - "Vacc_completed":1430.1481016913, - "Vacc_refreshed":392.5489632959 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14499.5728298642, - "Vacc_completed":1439.468906008, - "Vacc_refreshed":397.6649554861 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14500.4884339857, - "Vacc_completed":1447.6074532094, - "Vacc_refreshed":404.4236802991 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14508.6628209678, - "Vacc_completed":1449.1955087396, - "Vacc_refreshed":413.1290507873 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14509.0177335192, - "Vacc_completed":1457.0313439789, - "Vacc_refreshed":418.6984801264 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14518.7925361684, - "Vacc_completed":1462.4055060107, - "Vacc_refreshed":419.6070699812 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14522.121758092, - "Vacc_completed":1468.1811367429, - "Vacc_refreshed":425.9772045183 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14528.5474917037, - "Vacc_completed":1473.5164593205, - "Vacc_refreshed":435.7810319021 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14536.5601109176, - "Vacc_completed":1481.2704120463, - "Vacc_refreshed":438.2410199432 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14542.1473955627, - "Vacc_completed":1482.7064631605, - "Vacc_refreshed":445.3488141502 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"0-4", - "Vacc_partially":14544.5952478081, - "Vacc_completed":1486.0552178086, - "Vacc_refreshed":446.1812966093 - }, - { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10765.9941189788, - "Vacc_completed":1603.3500569399, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.3717745702, - "Vacc_completed":1605.3068408797, - "Vacc_refreshed":3.6283182226 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.4956401429, - "Vacc_completed":1610.6119068185, - "Vacc_refreshed":6.1967396209 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10774.4184508751, - "Vacc_completed":1613.016161978, - "Vacc_refreshed":15.7069691534 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10780.8073818373, - "Vacc_completed":1622.1917795654, - "Vacc_refreshed":20.1697274397 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10785.5287460006, - "Vacc_completed":1625.0602525893, - "Vacc_refreshed":22.4671684217 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10790.1084610651, - "Vacc_completed":1627.3787523231, - "Vacc_refreshed":28.5217462646 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10796.2300309, - "Vacc_completed":1630.4363483664, - "Vacc_refreshed":35.3070676184 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10801.7222904172, - "Vacc_completed":1638.725087864, - "Vacc_refreshed":43.7679344272 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10804.7724722766, - "Vacc_completed":1646.4905335365, - "Vacc_refreshed":44.1718542676 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10814.3453353804, - "Vacc_completed":1650.9992837124, - "Vacc_refreshed":49.5204655539 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10821.6255112157, - "Vacc_completed":1656.4335840831, - "Vacc_refreshed":52.7009855172 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10830.9379325639, - "Vacc_completed":1657.186187271, - "Vacc_refreshed":56.5428649986 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10838.202902864, - "Vacc_completed":1662.1470499364, - "Vacc_refreshed":58.6277824858 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10840.8786753296, - "Vacc_completed":1670.6860254071, - "Vacc_refreshed":58.7593924743 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10843.7453960183, - "Vacc_completed":1673.6372365137, - "Vacc_refreshed":61.8595630166 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10849.1151892515, - "Vacc_completed":1675.1066023109, - "Vacc_refreshed":64.6020615007 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10850.9329685403, - "Vacc_completed":1679.1505675366, - "Vacc_refreshed":72.0237510859 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10854.4610677614, - "Vacc_completed":1681.5473018047, - "Vacc_refreshed":75.0145349272 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10858.0662824418, - "Vacc_completed":1688.7179113019, - "Vacc_refreshed":82.7641475111 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10867.8357803799, - "Vacc_completed":1688.741478882, - "Vacc_refreshed":92.1411476813 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10877.245759177, - "Vacc_completed":1696.3354153291, - "Vacc_refreshed":93.5350586202 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10878.9277486403, - "Vacc_completed":1704.5169058825, - "Vacc_refreshed":99.9257252117 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10881.5163902637, - "Vacc_completed":1704.5184844203, - "Vacc_refreshed":104.0563799981 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10882.0628121233, - "Vacc_completed":1710.1811092467, - "Vacc_refreshed":110.998904559 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10884.1868939764, - "Vacc_completed":1711.6669667815, - "Vacc_refreshed":119.5835613879 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10890.26315895, - "Vacc_completed":1712.8219244738, - "Vacc_refreshed":126.203975023 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10894.6858788747, - "Vacc_completed":1721.7467435031, - "Vacc_refreshed":135.9649739788 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10897.5575288795, - "Vacc_completed":1721.7787127468, - "Vacc_refreshed":145.614673399 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10903.1231721286, - "Vacc_completed":1724.7269587992, - "Vacc_refreshed":149.6717929743 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10911.1763853993, - "Vacc_completed":1726.3071857535, - "Vacc_refreshed":158.0496522084 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10919.5582023277, - "Vacc_completed":1727.9236223535, - "Vacc_refreshed":160.5751263702 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10920.4962369047, - "Vacc_completed":1730.7211296321, - "Vacc_refreshed":162.2038531114 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10930.0062994591, - "Vacc_completed":1733.2273616859, - "Vacc_refreshed":164.6178844659 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10931.0781786076, - "Vacc_completed":1743.0639116966, - "Vacc_refreshed":171.6949336111 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10936.2371584575, - "Vacc_completed":1743.4973637943, - "Vacc_refreshed":173.1954991423 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10937.1969149599, - "Vacc_completed":1752.0043206175, - "Vacc_refreshed":173.4521249531 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10942.5829785849, - "Vacc_completed":1758.5438162851, - "Vacc_refreshed":175.0971428389 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10945.8458051779, - "Vacc_completed":1765.593119461, - "Vacc_refreshed":184.781293552 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10955.2619609788, - "Vacc_completed":1766.7516696253, - "Vacc_refreshed":194.3279051811 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0529992794, - "Vacc_completed":1774.4096958807, - "Vacc_refreshed":199.3585168564 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0740456643, - "Vacc_completed":1776.7353479155, - "Vacc_refreshed":200.2783085421 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7647446192, - "Vacc_completed":1786.1838226639, - "Vacc_refreshed":202.522841172 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7950553291, - "Vacc_completed":1788.5013884886, - "Vacc_refreshed":205.1107008609 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10973.1049316279, - "Vacc_completed":1790.2712267193, - "Vacc_refreshed":214.0688577867 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10976.2696576646, - "Vacc_completed":1797.8582422894, - "Vacc_refreshed":219.0460187772 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10984.9161656634, - "Vacc_completed":1801.5924446935, - "Vacc_refreshed":227.656626047 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10994.063273181, - "Vacc_completed":1802.6817444812, - "Vacc_refreshed":235.6032823069 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":10996.8771305673, - "Vacc_completed":1802.9071097171, - "Vacc_refreshed":237.7242073629 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11002.0527900673, - "Vacc_completed":1809.5395950318, - "Vacc_refreshed":241.3631599251 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11007.1528572096, - "Vacc_completed":1813.9025489723, - "Vacc_refreshed":245.5305344153 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11013.1337350258, - "Vacc_completed":1821.5275057931, - "Vacc_refreshed":250.3168579858 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11015.6696905796, - "Vacc_completed":1822.9598630397, - "Vacc_refreshed":255.6335351411 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11023.4754023371, - "Vacc_completed":1827.2471461973, - "Vacc_refreshed":265.5951098299 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11032.8284479669, - "Vacc_completed":1827.5539031975, - "Vacc_refreshed":267.3513136054 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.3845078238, - "Vacc_completed":1828.9970028031, - "Vacc_refreshed":270.5903250252 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.693720803, - "Vacc_completed":1836.2049019351, - "Vacc_refreshed":272.0758803579 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11047.8242120991, - "Vacc_completed":1837.1027842122, - "Vacc_refreshed":275.2277393803 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11053.900379851, - "Vacc_completed":1838.273599421, - "Vacc_refreshed":282.2344875735 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11059.6633767419, - "Vacc_completed":1845.0089267377, - "Vacc_refreshed":284.3140546038 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11068.9288674107, - "Vacc_completed":1852.7615624634, - "Vacc_refreshed":287.0304142153 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11072.6595101177, - "Vacc_completed":1857.871819743, - "Vacc_refreshed":289.2733395979 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11082.5784142097, - "Vacc_completed":1865.7647392626, - "Vacc_refreshed":291.3426551576 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11089.5185616411, - "Vacc_completed":1869.3958231852, - "Vacc_refreshed":299.8179962185 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11097.3087770941, - "Vacc_completed":1878.7026117675, - "Vacc_refreshed":306.1608208876 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11101.8508357142, - "Vacc_completed":1879.7270518854, - "Vacc_refreshed":308.0716738039 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11103.0915214706, - "Vacc_completed":1883.5574266434, - "Vacc_refreshed":311.2801806804 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11111.9334619087, - "Vacc_completed":1887.7967037043, - "Vacc_refreshed":320.2156677375 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11118.8667730664, - "Vacc_completed":1896.6793284207, - "Vacc_refreshed":321.8561637233 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11123.0290736537, - "Vacc_completed":1902.1985445903, - "Vacc_refreshed":328.4656069808 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11129.3471714321, - "Vacc_completed":1902.2057666507, - "Vacc_refreshed":334.8734059386 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11137.9949570833, - "Vacc_completed":1907.7915885083, - "Vacc_refreshed":339.9783670978 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11139.4617826874, - "Vacc_completed":1910.6126501167, - "Vacc_refreshed":342.8472462544 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11144.4191917936, - "Vacc_completed":1917.8558172992, - "Vacc_refreshed":351.3104814196 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11153.423123173, - "Vacc_completed":1927.8115362669, - "Vacc_refreshed":359.1887782128 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11155.4646855253, - "Vacc_completed":1931.0938823989, - "Vacc_refreshed":363.4217582407 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11164.8755655095, - "Vacc_completed":1932.0922021433, - "Vacc_refreshed":369.5881371093 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11168.2127634861, - "Vacc_completed":1937.8864562316, - "Vacc_refreshed":371.2850357688 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11170.3919325879, - "Vacc_completed":1943.9625258254, - "Vacc_refreshed":372.564368772 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11178.2156716034, - "Vacc_completed":1946.3680545291, - "Vacc_refreshed":377.1791450411 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11187.7206334256, - "Vacc_completed":1950.3408321869, - "Vacc_refreshed":385.28114877 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11189.2295548943, - "Vacc_completed":1952.7801877326, - "Vacc_refreshed":386.4768386941 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11193.8090943925, - "Vacc_completed":1960.5337079214, - "Vacc_refreshed":395.6463777137 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11198.0758128722, - "Vacc_completed":1964.4220756604, - "Vacc_refreshed":404.4005517293 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11200.1395546734, - "Vacc_completed":1974.1843879258, - "Vacc_refreshed":410.4354615606 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.0858861212, - "Vacc_completed":1978.0710124849, - "Vacc_refreshed":414.2205337181 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.5521637654, - "Vacc_completed":1981.3589179628, - "Vacc_refreshed":419.5840242501 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11211.6562498266, - "Vacc_completed":1989.6665585254, - "Vacc_refreshed":426.6154672823 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11219.1926870115, - "Vacc_completed":1996.1459430488, - "Vacc_refreshed":430.16915603 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11221.4656474699, - "Vacc_completed":2001.4601213853, - "Vacc_refreshed":430.8770850788 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11224.2379660032, - "Vacc_completed":2006.2961081678, - "Vacc_refreshed":433.8074021391 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"5-14", - "Vacc_partially":11229.137503588, - "Vacc_completed":2013.2392255015, - "Vacc_refreshed":441.1218403265 - }, - { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15118.5419446559, - "Vacc_completed":1046.4766182565, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15127.0441726861, - "Vacc_completed":1051.8189573454, - "Vacc_refreshed":4.7668817312 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15134.2198668737, - "Vacc_completed":1051.8898550539, - "Vacc_refreshed":6.8954841457 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15138.5012633389, - "Vacc_completed":1054.1938291422, - "Vacc_refreshed":12.8850967826 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15140.019297286, - "Vacc_completed":1057.2812920036, - "Vacc_refreshed":15.610006044 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15141.0655653453, - "Vacc_completed":1061.1873607435, - "Vacc_refreshed":18.0052067519 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15146.6047446953, - "Vacc_completed":1067.3953196211, - "Vacc_refreshed":27.5155266211 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15150.2459378898, - "Vacc_completed":1077.315397207, - "Vacc_refreshed":28.0742687581 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15153.3836683973, - "Vacc_completed":1082.8237823387, - "Vacc_refreshed":32.6629347887 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15155.2486658897, - "Vacc_completed":1087.8721865368, - "Vacc_refreshed":42.082807235 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15157.4630323429, - "Vacc_completed":1090.0916620904, - "Vacc_refreshed":43.8436800298 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15158.7941750828, - "Vacc_completed":1091.8322828475, - "Vacc_refreshed":44.7371311455 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15159.4697179186, - "Vacc_completed":1097.9581123146, - "Vacc_refreshed":52.5410403094 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15166.8797207146, - "Vacc_completed":1103.4838023049, - "Vacc_refreshed":58.4482610787 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.177591783, - "Vacc_completed":1107.529236183, - "Vacc_refreshed":61.868532741 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.3473624207, - "Vacc_completed":1108.0854442406, - "Vacc_refreshed":64.122741794 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15176.6656703161, - "Vacc_completed":1114.7623442184, - "Vacc_refreshed":73.3909194547 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15182.6538662202, - "Vacc_completed":1121.0967139584, - "Vacc_refreshed":78.4108273222 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15191.0826029366, - "Vacc_completed":1124.8733122731, - "Vacc_refreshed":88.1249123157 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15195.1567917247, - "Vacc_completed":1133.1683853487, - "Vacc_refreshed":94.0586819047 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15197.6523517992, - "Vacc_completed":1140.1742056487, - "Vacc_refreshed":97.7116921077 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15202.8832794911, - "Vacc_completed":1140.4207518542, - "Vacc_refreshed":101.0390519368 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15209.502983548, - "Vacc_completed":1144.1138351675, - "Vacc_refreshed":104.5568369595 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15218.5591667959, - "Vacc_completed":1153.0110444013, - "Vacc_refreshed":111.8121115483 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15223.6275127037, - "Vacc_completed":1157.3585549388, - "Vacc_refreshed":113.9066704897 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.4100349304, - "Vacc_completed":1162.1581378525, - "Vacc_refreshed":116.416758139 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.7888080253, - "Vacc_completed":1166.5300160643, - "Vacc_refreshed":119.2414894864 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15235.240974732, - "Vacc_completed":1171.76423914, - "Vacc_refreshed":129.0137217302 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15236.252829019, - "Vacc_completed":1174.1820893055, - "Vacc_refreshed":130.8298102316 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15244.5996289271, - "Vacc_completed":1181.3457343202, - "Vacc_refreshed":138.0198133972 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15247.7688417561, - "Vacc_completed":1186.4632437534, - "Vacc_refreshed":147.549469044 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15254.8324409461, - "Vacc_completed":1196.0640695451, - "Vacc_refreshed":148.035813332 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15263.9056700401, - "Vacc_completed":1202.0195228295, - "Vacc_refreshed":152.9647063671 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15271.3608079113, - "Vacc_completed":1205.9189472233, - "Vacc_refreshed":159.4326071199 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15274.5391192733, - "Vacc_completed":1209.5333389579, - "Vacc_refreshed":165.8197711746 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15279.9252173752, - "Vacc_completed":1217.5022918804, - "Vacc_refreshed":170.1668415009 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15289.6429605219, - "Vacc_completed":1218.0921627258, - "Vacc_refreshed":176.8858359396 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15297.4452269777, - "Vacc_completed":1218.4916546179, - "Vacc_refreshed":177.0224757358 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15304.6068820067, - "Vacc_completed":1221.1648349639, - "Vacc_refreshed":182.8363512803 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15308.4472782837, - "Vacc_completed":1221.3254317254, - "Vacc_refreshed":188.4124431026 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15313.3535420035, - "Vacc_completed":1228.797689569, - "Vacc_refreshed":197.4958413402 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15319.6989570363, - "Vacc_completed":1230.5766158569, - "Vacc_refreshed":207.1280776834 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15329.2757609065, - "Vacc_completed":1232.5532561558, - "Vacc_refreshed":216.6030971785 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15331.3854251166, - "Vacc_completed":1240.7858568563, - "Vacc_refreshed":224.0947128601 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15335.6254694555, - "Vacc_completed":1248.7648628072, - "Vacc_refreshed":228.3914917972 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15342.4956408139, - "Vacc_completed":1253.345700271, - "Vacc_refreshed":237.7873655386 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15349.2985100866, - "Vacc_completed":1254.923228178, - "Vacc_refreshed":243.7398150729 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.0642849231, - "Vacc_completed":1256.1247258557, - "Vacc_refreshed":246.0998008594 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.3098206871, - "Vacc_completed":1258.7673082658, - "Vacc_refreshed":255.4830156808 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.8477668821, - "Vacc_completed":1261.8739088788, - "Vacc_refreshed":262.4150374381 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15355.0053188609, - "Vacc_completed":1268.7063064011, - "Vacc_refreshed":268.0354130392 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15356.8245202899, - "Vacc_completed":1275.6335562552, - "Vacc_refreshed":272.2800844077 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15357.7799420851, - "Vacc_completed":1276.6526923528, - "Vacc_refreshed":272.4509982396 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15360.090059624, - "Vacc_completed":1286.3717718947, - "Vacc_refreshed":276.5108897334 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15368.9251730685, - "Vacc_completed":1289.9608638772, - "Vacc_refreshed":286.1598516049 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15374.4348532349, - "Vacc_completed":1292.7431692071, - "Vacc_refreshed":286.9834989324 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15375.2266568732, - "Vacc_completed":1293.6118841564, - "Vacc_refreshed":287.1997495191 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15378.8167187789, - "Vacc_completed":1294.2472234682, - "Vacc_refreshed":293.7465776915 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15381.8183566081, - "Vacc_completed":1296.5074589754, - "Vacc_refreshed":294.394169978 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15390.3384592829, - "Vacc_completed":1298.1144038724, - "Vacc_refreshed":295.3508481166 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15397.4841102393, - "Vacc_completed":1301.7744150574, - "Vacc_refreshed":295.636121459 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15406.9128765942, - "Vacc_completed":1306.3546732411, - "Vacc_refreshed":299.2176949608 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15412.9312961067, - "Vacc_completed":1313.4112918553, - "Vacc_refreshed":304.1283567048 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15413.8396565369, - "Vacc_completed":1323.1872711778, - "Vacc_refreshed":309.3767578057 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15417.5353933956, - "Vacc_completed":1332.5570169907, - "Vacc_refreshed":310.9982936972 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15418.826072466, - "Vacc_completed":1333.4298810326, - "Vacc_refreshed":318.8191964614 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15428.6081802722, - "Vacc_completed":1335.4576305614, - "Vacc_refreshed":322.681425219 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15434.4342053135, - "Vacc_completed":1341.8151001107, - "Vacc_refreshed":328.87826872 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15442.7494739491, - "Vacc_completed":1342.4758295952, - "Vacc_refreshed":336.8125605002 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15451.9615776405, - "Vacc_completed":1343.8595431355, - "Vacc_refreshed":340.6379428895 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15461.0343740586, - "Vacc_completed":1352.0217149096, - "Vacc_refreshed":342.4652609374 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15467.8869999547, - "Vacc_completed":1353.9994636638, - "Vacc_refreshed":343.6202751504 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15474.9129704383, - "Vacc_completed":1363.3653927841, - "Vacc_refreshed":345.0578595323 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15483.483328834, - "Vacc_completed":1372.0348541584, - "Vacc_refreshed":348.4131919851 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15489.3942653446, - "Vacc_completed":1377.4077406314, - "Vacc_refreshed":355.6717942515 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15494.2503612359, - "Vacc_completed":1377.4290090401, - "Vacc_refreshed":358.9820312389 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15495.3394152185, - "Vacc_completed":1378.0321848221, - "Vacc_refreshed":364.7453207897 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15497.7000250685, - "Vacc_completed":1378.1938721933, - "Vacc_refreshed":367.9820639836 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15498.7689863883, - "Vacc_completed":1381.0445655705, - "Vacc_refreshed":371.501202086 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15501.5446144083, - "Vacc_completed":1383.5660020007, - "Vacc_refreshed":378.7475176563 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15509.8230148672, - "Vacc_completed":1390.2361319678, - "Vacc_refreshed":382.7365149116 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15516.8607244434, - "Vacc_completed":1391.5356833196, - "Vacc_refreshed":387.0287274101 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15525.4621417067, - "Vacc_completed":1391.7538408053, - "Vacc_refreshed":394.832505058 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15530.1412323442, - "Vacc_completed":1393.5856974411, - "Vacc_refreshed":402.9766589833 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15538.5266345599, - "Vacc_completed":1394.0860887346, - "Vacc_refreshed":409.427624651 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15545.1857152555, - "Vacc_completed":1400.9009375981, - "Vacc_refreshed":414.8161834543 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15550.0113840393, - "Vacc_completed":1405.1190388135, - "Vacc_refreshed":423.1492506703 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15557.7502728646, - "Vacc_completed":1412.7232837907, - "Vacc_refreshed":429.51858195 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15558.6635273277, - "Vacc_completed":1416.4367765358, - "Vacc_refreshed":433.7574702422 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15567.8923476818, - "Vacc_completed":1417.419547185, - "Vacc_refreshed":436.3988331827 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15572.0110691064, - "Vacc_completed":1422.1291332179, - "Vacc_refreshed":444.7065625402 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"15-34", - "Vacc_partially":15580.056372857, - "Vacc_completed":1429.5241883626, - "Vacc_refreshed":445.9185645116 - }, - { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14604.162091487, - "Vacc_completed":1396.5367205842, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14608.6011110978, - "Vacc_completed":1403.0638750962, - "Vacc_refreshed":0.4818747518 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14617.4016613244, - "Vacc_completed":1412.4617013546, - "Vacc_refreshed":2.8841327921 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14626.8147148128, - "Vacc_completed":1413.5937989207, - "Vacc_refreshed":4.347225901 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14636.7930742671, - "Vacc_completed":1416.5445655325, - "Vacc_refreshed":10.9126558661 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14639.261920851, - "Vacc_completed":1419.7526675766, - "Vacc_refreshed":12.1285186735 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14646.6246553828, - "Vacc_completed":1429.1501916355, - "Vacc_refreshed":14.2999622979 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14655.9228453283, - "Vacc_completed":1433.2061319495, - "Vacc_refreshed":18.6765331159 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.6905295279, - "Vacc_completed":1437.4319338048, - "Vacc_refreshed":19.3435044237 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.8883385186, - "Vacc_completed":1446.7135497598, - "Vacc_refreshed":28.359576628 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14660.5634553543, - "Vacc_completed":1450.9111526521, - "Vacc_refreshed":38.3056947196 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14667.0822550267, - "Vacc_completed":1458.1473384005, - "Vacc_refreshed":38.8316353015 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14668.0361388154, - "Vacc_completed":1464.9440155832, - "Vacc_refreshed":44.1485629725 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14669.4679031112, - "Vacc_completed":1470.1284856322, - "Vacc_refreshed":47.7639888511 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.2618994679, - "Vacc_completed":1476.9344530457, - "Vacc_refreshed":56.361748961 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.3447644481, - "Vacc_completed":1477.2393580763, - "Vacc_refreshed":57.2273767339 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14684.0130216555, - "Vacc_completed":1484.3234594705, - "Vacc_refreshed":63.4497732245 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14691.8154699011, - "Vacc_completed":1492.8513113216, - "Vacc_refreshed":71.1720264341 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14697.5036031252, - "Vacc_completed":1493.7450842417, - "Vacc_refreshed":77.3635307257 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14702.599106658, - "Vacc_completed":1503.4641107157, - "Vacc_refreshed":82.0575571669 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14706.3806325115, - "Vacc_completed":1509.7236994586, - "Vacc_refreshed":82.4020129882 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14711.1723860607, - "Vacc_completed":1510.3801441147, - "Vacc_refreshed":89.5249618369 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14720.0093085987, - "Vacc_completed":1517.7733661353, - "Vacc_refreshed":99.2211580734 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14727.6474505495, - "Vacc_completed":1519.2060691793, - "Vacc_refreshed":104.7140344902 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14737.2025033477, - "Vacc_completed":1520.8147599339, - "Vacc_refreshed":111.7829864033 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14739.5787007901, - "Vacc_completed":1526.8277919335, - "Vacc_refreshed":118.2526435067 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14740.2622466128, - "Vacc_completed":1533.9654672239, - "Vacc_refreshed":121.0872593022 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.3105527103, - "Vacc_completed":1534.5209202615, - "Vacc_refreshed":130.3683956867 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.4386233429, - "Vacc_completed":1534.652607589, - "Vacc_refreshed":131.8609814668 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14750.7660084012, - "Vacc_completed":1541.7255942491, - "Vacc_refreshed":135.0718914562 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14754.5460710197, - "Vacc_completed":1550.2608445951, - "Vacc_refreshed":143.3620456295 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14759.0944017155, - "Vacc_completed":1555.0005459425, - "Vacc_refreshed":149.1268404613 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14765.0469016605, - "Vacc_completed":1561.0596836707, - "Vacc_refreshed":156.632878281 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14767.8747922121, - "Vacc_completed":1562.2055298685, - "Vacc_refreshed":158.7846499619 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14770.6956031505, - "Vacc_completed":1564.0912014269, - "Vacc_refreshed":160.2235512232 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14771.8405767953, - "Vacc_completed":1569.1767284097, - "Vacc_refreshed":163.0960075253 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14772.2052559189, - "Vacc_completed":1577.0342160583, - "Vacc_refreshed":171.338237261 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14775.8209952029, - "Vacc_completed":1582.4601331483, - "Vacc_refreshed":171.7811634642 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14783.195452278, - "Vacc_completed":1590.5417141678, - "Vacc_refreshed":180.3921690168 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14789.7908493035, - "Vacc_completed":1599.1828252755, - "Vacc_refreshed":184.3843375412 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14799.5061304555, - "Vacc_completed":1604.6353429891, - "Vacc_refreshed":186.9160630046 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14800.1953862328, - "Vacc_completed":1607.3418569739, - "Vacc_refreshed":194.8977352638 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14804.6194220955, - "Vacc_completed":1610.8601925588, - "Vacc_refreshed":198.1360514295 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14807.6135970058, - "Vacc_completed":1620.4676732545, - "Vacc_refreshed":199.7756827366 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14812.6404573806, - "Vacc_completed":1625.8005590907, - "Vacc_refreshed":208.9834954342 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14821.7780993542, - "Vacc_completed":1634.2191287828, - "Vacc_refreshed":218.0082295343 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14826.4757459809, - "Vacc_completed":1642.5529482935, - "Vacc_refreshed":225.0524176739 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14831.5528263871, - "Vacc_completed":1649.3317542887, - "Vacc_refreshed":229.0729255762 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14835.4543265309, - "Vacc_completed":1656.6375918093, - "Vacc_refreshed":230.6069957275 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14843.0829401722, - "Vacc_completed":1661.236165662, - "Vacc_refreshed":240.090987042 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14846.441543514, - "Vacc_completed":1663.7621214807, - "Vacc_refreshed":242.6005891297 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14852.8592673291, - "Vacc_completed":1670.5438763585, - "Vacc_refreshed":243.1550853514 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14859.7577792484, - "Vacc_completed":1671.9654195564, - "Vacc_refreshed":252.4226950148 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14860.9361402439, - "Vacc_completed":1673.0063955744, - "Vacc_refreshed":254.9337371613 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14866.4446359141, - "Vacc_completed":1680.8225588341, - "Vacc_refreshed":260.3047312661 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14873.2607186268, - "Vacc_completed":1689.7385811283, - "Vacc_refreshed":267.8936320344 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14880.5922770798, - "Vacc_completed":1689.9651236491, - "Vacc_refreshed":275.7764918768 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14887.440916863, - "Vacc_completed":1696.5525450807, - "Vacc_refreshed":283.5225421273 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14888.0132355705, - "Vacc_completed":1703.9968022938, - "Vacc_refreshed":284.1554601622 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14897.4895745985, - "Vacc_completed":1707.7124979313, - "Vacc_refreshed":293.9654633907 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14900.9132287675, - "Vacc_completed":1714.1256328363, - "Vacc_refreshed":300.1498047442 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14907.9968139113, - "Vacc_completed":1717.9722882107, - "Vacc_refreshed":303.8260258963 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14914.3000727157, - "Vacc_completed":1723.7459149842, - "Vacc_refreshed":310.6001358466 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14915.2709520902, - "Vacc_completed":1725.3728171833, - "Vacc_refreshed":311.7419250413 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14924.9251049714, - "Vacc_completed":1730.3968331067, - "Vacc_refreshed":318.9914066325 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14929.9737051543, - "Vacc_completed":1735.419819131, - "Vacc_refreshed":327.2769475594 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.0867908297, - "Vacc_completed":1735.4531164502, - "Vacc_refreshed":333.9507530528 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.1585043075, - "Vacc_completed":1744.7112606784, - "Vacc_refreshed":337.8096837232 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14939.2420152133, - "Vacc_completed":1745.8678859662, - "Vacc_refreshed":344.4742142552 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14940.9708787633, - "Vacc_completed":1748.1937727819, - "Vacc_refreshed":352.7895987096 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14950.0282400838, - "Vacc_completed":1750.2751748343, - "Vacc_refreshed":354.0652893483 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14956.5498846765, - "Vacc_completed":1758.7641351746, - "Vacc_refreshed":361.0736440858 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14957.5908121778, - "Vacc_completed":1763.4528309235, - "Vacc_refreshed":364.3501912771 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14960.7281563782, - "Vacc_completed":1772.006809538, - "Vacc_refreshed":364.6804469838 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14969.2457673746, - "Vacc_completed":1776.5678522654, - "Vacc_refreshed":374.4882812856 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14974.8615073088, - "Vacc_completed":1779.9556763371, - "Vacc_refreshed":377.4421123342 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14984.5914886251, - "Vacc_completed":1782.6146675026, - "Vacc_refreshed":381.2082916917 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14987.5876984189, - "Vacc_completed":1791.1028428437, - "Vacc_refreshed":385.3294438436 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.58002825, - "Vacc_completed":1793.9473770292, - "Vacc_refreshed":388.9073184565 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.8771499871, - "Vacc_completed":1796.0612762347, - "Vacc_refreshed":390.0186176392 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14993.5505864267, - "Vacc_completed":1798.6017730753, - "Vacc_refreshed":390.5734438836 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":14998.158414122, - "Vacc_completed":1802.0655230464, - "Vacc_refreshed":391.8649823662 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.4313521872, - "Vacc_completed":1804.413054883, - "Vacc_refreshed":395.3533451537 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.7989985243, - "Vacc_completed":1812.4490035114, - "Vacc_refreshed":401.8191046925 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15002.2088852954, - "Vacc_completed":1814.4865305652, - "Vacc_refreshed":409.5825438963 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15008.2705384657, - "Vacc_completed":1823.0023861142, - "Vacc_refreshed":411.4567502649 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15013.4515790087, - "Vacc_completed":1830.5873803301, - "Vacc_refreshed":417.6053918266 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15022.965858679, - "Vacc_completed":1833.2575088513, - "Vacc_refreshed":421.7562400513 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15024.3362350043, - "Vacc_completed":1839.0848659035, - "Vacc_refreshed":429.2321579029 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15025.0436784182, - "Vacc_completed":1840.7238800201, - "Vacc_refreshed":434.1256619822 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15026.1929816575, - "Vacc_completed":1848.4826094697, - "Vacc_refreshed":436.1767563509 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"35-59", - "Vacc_partially":15028.1115762872, - "Vacc_completed":1851.353962867, - "Vacc_refreshed":439.6190575403 - }, - { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12940.2728292563, - "Vacc_completed":1761.2082450081, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12944.552426313, - "Vacc_completed":1763.9916052944, - "Vacc_refreshed":5.8453121761 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12946.2293033065, - "Vacc_completed":1764.8651614651, - "Vacc_refreshed":11.3614134516 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12954.4553975676, - "Vacc_completed":1773.9720915654, - "Vacc_refreshed":19.8633846559 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12962.1675537316, - "Vacc_completed":1776.6871749169, - "Vacc_refreshed":23.5340750877 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12970.2114807284, - "Vacc_completed":1779.4482697767, - "Vacc_refreshed":32.7047145334 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12971.1155781651, - "Vacc_completed":1787.6912361171, - "Vacc_refreshed":41.3859214133 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12976.1479148685, - "Vacc_completed":1796.0609011819, - "Vacc_refreshed":49.2224218631 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12985.389251021, - "Vacc_completed":1806.0439647379, - "Vacc_refreshed":58.4565372826 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12987.6528992192, - "Vacc_completed":1814.2136648594, - "Vacc_refreshed":68.4133404236 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12988.8953336446, - "Vacc_completed":1820.4740554862, - "Vacc_refreshed":69.4164203636 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12989.930788247, - "Vacc_completed":1825.1779692151, - "Vacc_refreshed":71.594311523 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12993.9481590439, - "Vacc_completed":1834.4690603586, - "Vacc_refreshed":75.4387792504 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12997.41102572, - "Vacc_completed":1836.6145856268, - "Vacc_refreshed":81.7875242048 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":12999.5337504327, - "Vacc_completed":1839.9662175544, - "Vacc_refreshed":87.9455065083 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13007.2251436977, - "Vacc_completed":1842.6498922014, - "Vacc_refreshed":93.1900542901 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13012.0856312446, - "Vacc_completed":1844.701996872, - "Vacc_refreshed":99.712698674 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13021.33252246, - "Vacc_completed":1849.3061445307, - "Vacc_refreshed":102.5319545699 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13027.1500152398, - "Vacc_completed":1850.8078304213, - "Vacc_refreshed":105.0259857828 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13035.650988116, - "Vacc_completed":1851.8577100095, - "Vacc_refreshed":110.1445342625 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13042.2123284129, - "Vacc_completed":1856.2056162281, - "Vacc_refreshed":113.6459186876 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13048.5274669921, - "Vacc_completed":1856.9596604869, - "Vacc_refreshed":119.7006093985 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13056.4261041722, - "Vacc_completed":1859.9946313318, - "Vacc_refreshed":128.4930741519 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13061.2580735831, - "Vacc_completed":1864.4241013454, - "Vacc_refreshed":129.4122729818 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13069.8769575412, - "Vacc_completed":1870.828968765, - "Vacc_refreshed":133.5606697443 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13074.4847352314, - "Vacc_completed":1873.0576602324, - "Vacc_refreshed":142.5189975609 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13077.43910001, - "Vacc_completed":1881.1763507471, - "Vacc_refreshed":143.4948395736 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13082.3470601758, - "Vacc_completed":1888.5808588713, - "Vacc_refreshed":149.0381282873 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13091.0962170402, - "Vacc_completed":1894.9989493108, - "Vacc_refreshed":149.7527355276 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13097.0655225667, - "Vacc_completed":1904.9660517959, - "Vacc_refreshed":155.7716165644 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13105.8431803144, - "Vacc_completed":1907.1233275333, - "Vacc_refreshed":162.7399373626 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13110.9052745957, - "Vacc_completed":1915.3369502585, - "Vacc_refreshed":166.1686970271 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13120.2888484357, - "Vacc_completed":1924.594235894, - "Vacc_refreshed":174.1871820852 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13122.2684309305, - "Vacc_completed":1926.8954039089, - "Vacc_refreshed":179.1800373951 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13129.679389954, - "Vacc_completed":1929.8687720822, - "Vacc_refreshed":186.5609898946 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13136.2121968271, - "Vacc_completed":1930.5419008182, - "Vacc_refreshed":190.3285119819 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13140.8693305096, - "Vacc_completed":1933.1368513989, - "Vacc_refreshed":199.5045342081 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13141.6505152789, - "Vacc_completed":1938.3539275062, - "Vacc_refreshed":199.9231054484 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13146.3819720109, - "Vacc_completed":1943.0787615053, - "Vacc_refreshed":203.5617342411 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.5833925737, - "Vacc_completed":1944.8505615419, - "Vacc_refreshed":206.5254255239 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.8864321418, - "Vacc_completed":1946.7574709443, - "Vacc_refreshed":208.0171497057 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13160.8319905342, - "Vacc_completed":1949.6926878806, - "Vacc_refreshed":213.0797703475 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13165.109826694, - "Vacc_completed":1955.2468047197, - "Vacc_refreshed":222.6760329578 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13168.7847714036, - "Vacc_completed":1956.1809363506, - "Vacc_refreshed":231.6808966253 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13176.0869758252, - "Vacc_completed":1960.8024990411, - "Vacc_refreshed":233.4328765098 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13180.123104626, - "Vacc_completed":1969.8047949709, - "Vacc_refreshed":241.5696524948 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13184.6423078124, - "Vacc_completed":1974.8566545144, - "Vacc_refreshed":250.4550885677 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13190.9452560841, - "Vacc_completed":1975.9346724558, - "Vacc_refreshed":252.799671753 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13194.9586490897, - "Vacc_completed":1984.1998929758, - "Vacc_refreshed":256.8657355625 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13203.1981501018, - "Vacc_completed":1992.2264996957, - "Vacc_refreshed":262.7110996677 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13210.570704838, - "Vacc_completed":2000.1284432323, - "Vacc_refreshed":268.7466273707 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13217.6966464936, - "Vacc_completed":2001.108779963, - "Vacc_refreshed":270.063420564 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13222.8454105611, - "Vacc_completed":2006.445790007, - "Vacc_refreshed":272.306211944 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13231.9459038211, - "Vacc_completed":2014.1245558198, - "Vacc_refreshed":274.2682102675 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.4430744102, - "Vacc_completed":2021.01783734, - "Vacc_refreshed":283.272422859 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.9880313892, - "Vacc_completed":2021.3278488109, - "Vacc_refreshed":288.8833613171 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13244.1020800967, - "Vacc_completed":2028.5342497408, - "Vacc_refreshed":295.5476346222 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13246.2035006005, - "Vacc_completed":2034.7337820973, - "Vacc_refreshed":295.8527619766 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13250.3034672718, - "Vacc_completed":2040.4526371692, - "Vacc_refreshed":297.6289642024 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13258.1309651863, - "Vacc_completed":2043.9166550693, - "Vacc_refreshed":307.2590005259 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13264.00554028, - "Vacc_completed":2046.5596745193, - "Vacc_refreshed":309.1250398792 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.4212557374, - "Vacc_completed":2049.7116443058, - "Vacc_refreshed":314.0515587013 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.7885616679, - "Vacc_completed":2051.2982177338, - "Vacc_refreshed":320.3832182075 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13274.2264538665, - "Vacc_completed":2058.2989667129, - "Vacc_refreshed":323.7063680074 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13281.9141553951, - "Vacc_completed":2063.8206751836, - "Vacc_refreshed":326.9158074422 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13290.64171309, - "Vacc_completed":2064.3110765988, - "Vacc_refreshed":336.7710359746 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.1885069646, - "Vacc_completed":2072.8766922561, - "Vacc_refreshed":344.574816718 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.7117921559, - "Vacc_completed":2081.2889195134, - "Vacc_refreshed":352.6791052892 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13295.741331211, - "Vacc_completed":2082.371745109, - "Vacc_refreshed":358.7062427923 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13303.8543248793, - "Vacc_completed":2084.7970217381, - "Vacc_refreshed":363.3629273081 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13305.910901253, - "Vacc_completed":2089.496376583, - "Vacc_refreshed":364.4184919111 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13310.1770755649, - "Vacc_completed":2091.8877772854, - "Vacc_refreshed":373.8861441424 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13318.5822731817, - "Vacc_completed":2100.0656871327, - "Vacc_refreshed":380.7622590612 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13326.848015265, - "Vacc_completed":2103.7807367097, - "Vacc_refreshed":383.494468406 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13329.8351558424, - "Vacc_completed":2106.3811743673, - "Vacc_refreshed":385.7094999088 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13334.0243800891, - "Vacc_completed":2110.0143078684, - "Vacc_refreshed":387.028737638 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13340.0473805148, - "Vacc_completed":2114.17877764, - "Vacc_refreshed":390.7872507231 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13342.4710995253, - "Vacc_completed":2117.5584807218, - "Vacc_refreshed":394.4459716696 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13345.9586603577, - "Vacc_completed":2124.6343373595, - "Vacc_refreshed":401.3739608899 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13354.1694340722, - "Vacc_completed":2132.584533812, - "Vacc_refreshed":404.149558168 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13360.0480186273, - "Vacc_completed":2135.2279773256, - "Vacc_refreshed":407.0589420913 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13362.9287822042, - "Vacc_completed":2135.7661733179, - "Vacc_refreshed":412.3495727781 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13365.9702033874, - "Vacc_completed":2140.0801351424, - "Vacc_refreshed":414.1173144704 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13375.8578305813, - "Vacc_completed":2147.1687721976, - "Vacc_refreshed":416.1274613074 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.3434411484, - "Vacc_completed":2149.6360498231, - "Vacc_refreshed":422.5420941028 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.8386238776, - "Vacc_completed":2156.2105881723, - "Vacc_refreshed":428.2913369026 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13388.7750604929, - "Vacc_completed":2160.929719286, - "Vacc_refreshed":437.0909930573 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13397.0959920005, - "Vacc_completed":2169.0772334568, - "Vacc_refreshed":438.0782576038 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13406.1913483212, - "Vacc_completed":2172.8397968306, - "Vacc_refreshed":445.0079409299 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13410.1064630998, - "Vacc_completed":2179.4067803849, - "Vacc_refreshed":453.2550919609 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.2872479216, - "Vacc_completed":2183.7956163614, - "Vacc_refreshed":462.0847473084 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.7274837683, - "Vacc_completed":2186.2625889833, - "Vacc_refreshed":470.3671533805 - }, - { - "Date":"2020-10-01", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15108.1816487494, - "Vacc_completed":1951.3500240632, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15112.0388992614, - "Vacc_completed":1956.8484422205, - "Vacc_refreshed":4.7764537598 - }, - { - "Date":"2020-10-03", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15115.1174991099, - "Vacc_completed":1961.6166149519, - "Vacc_refreshed":11.6778924479 - }, - { - "Date":"2020-10-04", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15121.0352670933, - "Vacc_completed":1969.039883077, - "Vacc_refreshed":19.464449507 - }, - { - "Date":"2020-10-05", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15130.8297777562, - "Vacc_completed":1970.7344191294, - "Vacc_refreshed":28.0813773392 - }, - { - "Date":"2020-10-06", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15139.7963570637, - "Vacc_completed":1971.420038313, - "Vacc_refreshed":34.2304461363 - }, - { - "Date":"2020-10-07", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15149.3578353885, - "Vacc_completed":1977.7986093705, - "Vacc_refreshed":42.9385547047 - }, - { - "Date":"2020-10-08", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15150.8906121637, - "Vacc_completed":1981.6633590428, - "Vacc_refreshed":46.0030569507 - }, - { - "Date":"2020-10-09", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15153.3987479409, - "Vacc_completed":1986.7151251441, - "Vacc_refreshed":54.9967129669 - }, - { - "Date":"2020-10-10", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15155.2112066, - "Vacc_completed":1993.3668502516, - "Vacc_refreshed":59.2446234015 - }, - { - "Date":"2020-10-11", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15157.213160056, - "Vacc_completed":2000.1282773775, - "Vacc_refreshed":61.576334937 - }, - { - "Date":"2020-10-12", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15159.7206353696, - "Vacc_completed":2000.5786646957, - "Vacc_refreshed":62.4328961844 - }, - { - "Date":"2020-10-13", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15165.6048851908, - "Vacc_completed":2000.600816545, - "Vacc_refreshed":70.2254449832 - }, - { - "Date":"2020-10-14", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15175.5401574577, - "Vacc_completed":2003.6984716795, - "Vacc_refreshed":80.0202808521 - }, - { - "Date":"2020-10-15", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15178.2193352397, - "Vacc_completed":2010.5259174304, - "Vacc_refreshed":80.5289834705 - }, - { - "Date":"2020-10-16", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15186.1911779287, - "Vacc_completed":2020.3094769054, - "Vacc_refreshed":88.939485925 - }, - { - "Date":"2020-10-17", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15192.9408650715, - "Vacc_completed":2027.102138126, - "Vacc_refreshed":93.403990271 - }, - { - "Date":"2020-10-18", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15197.2522804828, - "Vacc_completed":2033.1768424672, - "Vacc_refreshed":103.3495680716 - }, - { - "Date":"2020-10-19", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15201.4718571012, - "Vacc_completed":2041.9289374755, - "Vacc_refreshed":107.0046191576 - }, - { - "Date":"2020-10-20", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15203.6899934618, - "Vacc_completed":2042.5550193085, - "Vacc_refreshed":108.1692912263 - }, - { - "Date":"2020-10-21", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15210.5751055, - "Vacc_completed":2049.1508387429, - "Vacc_refreshed":115.4885047404 - }, - { - "Date":"2020-10-22", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15216.3570734734, - "Vacc_completed":2052.3213561982, - "Vacc_refreshed":119.2061326333 - }, - { - "Date":"2020-10-23", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15225.8779749457, - "Vacc_completed":2057.4663468474, - "Vacc_refreshed":126.226397743 - }, - { - "Date":"2020-10-24", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15230.8206176005, - "Vacc_completed":2064.8586744443, - "Vacc_refreshed":133.0501812916 - }, - { - "Date":"2020-10-25", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15231.8828151205, - "Vacc_completed":2068.2097593649, - "Vacc_refreshed":142.0174284746 - }, - { - "Date":"2020-10-26", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15238.2426035555, - "Vacc_completed":2071.8714182096, - "Vacc_refreshed":148.7355853512 - }, - { - "Date":"2020-10-27", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15247.7928253295, - "Vacc_completed":2078.7188555952, - "Vacc_refreshed":156.2462830057 - }, - { - "Date":"2020-10-28", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15257.1929610505, - "Vacc_completed":2083.6123346127, - "Vacc_refreshed":163.8060000189 - }, - { - "Date":"2020-10-29", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15261.4225446127, - "Vacc_completed":2092.4315663384, - "Vacc_refreshed":165.098643188 - }, - { - "Date":"2020-10-30", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15264.9230201438, - "Vacc_completed":2098.3647861992, - "Vacc_refreshed":173.1581071885 - }, - { - "Date":"2020-10-31", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15274.2090277291, - "Vacc_completed":2098.6684198619, - "Vacc_refreshed":179.3045017397 - }, - { - "Date":"2020-11-01", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15275.4881156514, - "Vacc_completed":2104.7296501443, - "Vacc_refreshed":184.3873991738 - }, - { - "Date":"2020-11-02", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.4296689803, - "Vacc_completed":2109.0258070133, - "Vacc_refreshed":190.3361011534 - }, - { - "Date":"2020-11-03", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.7641225132, - "Vacc_completed":2111.2503398848, - "Vacc_refreshed":196.3057900505 - }, - { - "Date":"2020-11-04", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15280.5288668271, - "Vacc_completed":2120.2846622436, - "Vacc_refreshed":201.8816019943 - }, - { - "Date":"2020-11-05", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15286.6794056665, - "Vacc_completed":2127.5294418815, - "Vacc_refreshed":205.8247713924 - }, - { - "Date":"2020-11-06", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15287.919376399, - "Vacc_completed":2127.7213986428, - "Vacc_refreshed":207.0848824799 - }, - { - "Date":"2020-11-07", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15288.8972252423, - "Vacc_completed":2131.7043154907, - "Vacc_refreshed":214.6605013946 - }, - { - "Date":"2020-11-08", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15295.1676694583, - "Vacc_completed":2141.6853776317, - "Vacc_refreshed":217.321705385 - }, - { - "Date":"2020-11-09", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.8279320379, - "Vacc_completed":2150.6081907236, - "Vacc_refreshed":224.1814306469 - }, - { - "Date":"2020-11-10", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.9502690873, - "Vacc_completed":2150.8297260642, - "Vacc_refreshed":224.2857175024 - }, - { - "Date":"2020-11-11", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15305.4629063272, - "Vacc_completed":2159.4075137345, - "Vacc_refreshed":226.4536786248 - }, - { - "Date":"2020-11-12", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15313.0091699117, - "Vacc_completed":2160.0885470064, - "Vacc_refreshed":232.5677391068 - }, - { - "Date":"2020-11-13", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15316.6742133238, - "Vacc_completed":2163.6640679748, - "Vacc_refreshed":242.4458167027 - }, - { - "Date":"2020-11-14", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15325.7736410299, - "Vacc_completed":2171.6222500116, - "Vacc_refreshed":251.5591803171 - }, - { - "Date":"2020-11-15", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15333.3685319398, - "Vacc_completed":2174.4162160121, - "Vacc_refreshed":254.1541702573 - }, - { - "Date":"2020-11-16", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15337.5758896556, - "Vacc_completed":2180.7560110181, - "Vacc_refreshed":255.4491825287 - }, - { - "Date":"2020-11-17", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15346.8261947795, - "Vacc_completed":2184.562660479, - "Vacc_refreshed":256.0794667401 - }, - { - "Date":"2020-11-18", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15347.5063487999, - "Vacc_completed":2192.7053918922, - "Vacc_refreshed":264.8657432896 - }, - { - "Date":"2020-11-19", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15355.2915215882, - "Vacc_completed":2197.3639423288, - "Vacc_refreshed":266.2003474583 - }, - { - "Date":"2020-11-20", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15357.0291297717, - "Vacc_completed":2203.5668703416, - "Vacc_refreshed":266.2591235692 - }, - { - "Date":"2020-11-21", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15363.7351300479, - "Vacc_completed":2212.51470716, - "Vacc_refreshed":268.1554009506 - }, - { - "Date":"2020-11-22", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15366.2054877706, - "Vacc_completed":2220.7805776981, - "Vacc_refreshed":270.2429125628 - }, - { - "Date":"2020-11-23", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15374.7828886007, - "Vacc_completed":2223.4779151007, - "Vacc_refreshed":271.3258668517 - }, - { - "Date":"2020-11-24", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15375.8644766411, - "Vacc_completed":2223.902202818, - "Vacc_refreshed":277.3418287874 - }, - { - "Date":"2020-11-25", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15384.0103684975, - "Vacc_completed":2233.2600148125, - "Vacc_refreshed":286.2795142721 - }, - { - "Date":"2020-11-26", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15388.2433647335, - "Vacc_completed":2242.2405085188, - "Vacc_refreshed":295.9058348626 - }, - { - "Date":"2020-11-27", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15395.874552707, - "Vacc_completed":2242.5126967683, - "Vacc_refreshed":297.0217883024 - }, - { - "Date":"2020-11-28", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15399.399317417, - "Vacc_completed":2250.19318626, - "Vacc_refreshed":297.4497074595 - }, - { - "Date":"2020-11-29", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15407.4994879004, - "Vacc_completed":2258.8146667712, - "Vacc_refreshed":302.8025504676 - }, - { - "Date":"2020-11-30", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15410.1346998553, - "Vacc_completed":2259.5361618465, - "Vacc_refreshed":305.0699464575 - }, - { - "Date":"2020-12-01", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15415.5662938607, - "Vacc_completed":2266.2419298528, - "Vacc_refreshed":306.5583985118 - }, - { - "Date":"2020-12-02", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15424.362408066, - "Vacc_completed":2270.6973906417, - "Vacc_refreshed":307.7300944183 - }, - { - "Date":"2020-12-03", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15427.4641661532, - "Vacc_completed":2273.4475287465, - "Vacc_refreshed":315.9257071161 - }, - { - "Date":"2020-12-04", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15430.3003374401, - "Vacc_completed":2280.4953549554, - "Vacc_refreshed":320.4057109928 - }, - { - "Date":"2020-12-05", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15434.7161891817, - "Vacc_completed":2283.6641990131, - "Vacc_refreshed":329.6425079267 - }, - { - "Date":"2020-12-06", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15439.6389263804, - "Vacc_completed":2286.269595866, - "Vacc_refreshed":336.6032551175 - }, - { - "Date":"2020-12-07", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.607595077, - "Vacc_completed":2292.1795115763, - "Vacc_refreshed":339.4752869467 - }, - { - "Date":"2020-12-08", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.7317234732, - "Vacc_completed":2299.0428376394, - "Vacc_refreshed":342.2213588852 - }, - { - "Date":"2020-12-09", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15448.8137925508, - "Vacc_completed":2303.3104194582, - "Vacc_refreshed":346.3780017598 - }, - { - "Date":"2020-12-10", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15449.4812178935, - "Vacc_completed":2311.9261799324, - "Vacc_refreshed":351.1765190663 - }, - { - "Date":"2020-12-11", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9089483618, - "Vacc_completed":2315.5711542884, - "Vacc_refreshed":352.532745084 - }, - { - "Date":"2020-12-12", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9943266817, - "Vacc_completed":2322.1716179078, - "Vacc_refreshed":355.0774800773 - }, - { - "Date":"2020-12-13", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15459.7074068986, - "Vacc_completed":2323.3027059178, - "Vacc_refreshed":364.5645466744 - }, - { - "Date":"2020-12-14", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15465.686171573, - "Vacc_completed":2325.8040208828, - "Vacc_refreshed":365.9637341301 - }, - { - "Date":"2020-12-15", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15466.2025927257, - "Vacc_completed":2332.7537065257, - "Vacc_refreshed":366.2841969775 - }, - { - "Date":"2020-12-16", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15471.0643499093, - "Vacc_completed":2333.7718947218, - "Vacc_refreshed":370.7174701468 - }, - { - "Date":"2020-12-17", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15480.1820736709, - "Vacc_completed":2336.425519339, - "Vacc_refreshed":378.1719392306 - }, - { - "Date":"2020-12-18", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15489.2619602904, - "Vacc_completed":2342.4314320637, - "Vacc_refreshed":382.1070985379 - }, - { - "Date":"2020-12-19", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15497.197059921, - "Vacc_completed":2351.5508059781, - "Vacc_refreshed":390.0131449372 - }, - { - "Date":"2020-12-20", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15506.8997820546, - "Vacc_completed":2354.7951207515, - "Vacc_refreshed":397.4755552416 - }, - { - "Date":"2020-12-21", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15514.6356932026, - "Vacc_completed":2359.4543858263, - "Vacc_refreshed":405.5265192328 - }, - { - "Date":"2020-12-22", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15517.1065215082, - "Vacc_completed":2362.3705119741, - "Vacc_refreshed":406.2503084488 - }, - { - "Date":"2020-12-23", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15526.1890623234, - "Vacc_completed":2369.2123027947, - "Vacc_refreshed":407.9863557734 - }, - { - "Date":"2020-12-24", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15529.1257916241, - "Vacc_completed":2371.0230854052, - "Vacc_refreshed":415.4330021443 - }, - { - "Date":"2020-12-25", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15534.1422800755, - "Vacc_completed":2376.4314141852, - "Vacc_refreshed":417.8710629027 - }, - { - "Date":"2020-12-26", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15536.9779956012, - "Vacc_completed":2380.9412020655, - "Vacc_refreshed":418.6065556413 - }, - { - "Date":"2020-12-27", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15542.623117778, - "Vacc_completed":2383.2295524317, - "Vacc_refreshed":425.5318613018 - }, - { - "Date":"2020-12-28", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15545.7349127212, - "Vacc_completed":2388.7438112703, - "Vacc_refreshed":435.2708995295 - }, - { - "Date":"2020-12-29", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15552.7663039717, - "Vacc_completed":2398.7179519564, - "Vacc_refreshed":436.7806978293 - }, - { - "Date":"2020-12-30", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15553.9038494269, - "Vacc_completed":2401.9470135031, - "Vacc_refreshed":445.294989416 - }, - { - "Date":"2020-12-31", - "ID_District":1002, - "Age_RKI":"80-99", - "Vacc_partially":15563.5219522465, - "Vacc_completed":2408.3277109489, - "Vacc_refreshed":449.1868908695 + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14093.5670993244, + "Vacc_completed": 1058.2133302677, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14094.6780758432, + "Vacc_completed": 1058.2386490178, + "Vacc_refreshed": 3.9480185817, + "Vacc_refreshed_2": 1.97400929085 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14102.3458622773, + "Vacc_completed": 1063.1811826304, + "Vacc_refreshed": 7.8235846725, + "Vacc_refreshed_2": 3.91179233625 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14106.0158477852, + "Vacc_completed": 1071.0829580916, + "Vacc_refreshed": 13.0365435255, + "Vacc_refreshed_2": 6.51827176275 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14115.8958402416, + "Vacc_completed": 1072.5136218055, + "Vacc_refreshed": 15.4582843201, + "Vacc_refreshed_2": 7.72914216005 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14116.0603009948, + "Vacc_completed": 1080.8706574256, + "Vacc_refreshed": 22.3037298829, + "Vacc_refreshed_2": 11.15186494145 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14124.4849162097, + "Vacc_completed": 1087.4957123195, + "Vacc_refreshed": 27.7666004775, + "Vacc_refreshed_2": 13.88330023875 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14132.812800891, + "Vacc_completed": 1094.2936630058, + "Vacc_refreshed": 29.4212640594, + "Vacc_refreshed_2": 14.7106320297 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14139.2772895404, + "Vacc_completed": 1100.1665827188, + "Vacc_refreshed": 29.4568827793, + "Vacc_refreshed_2": 14.72844138965 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14145.4868397119, + "Vacc_completed": 1105.3345419667, + "Vacc_refreshed": 34.7217238502, + "Vacc_refreshed_2": 17.3608619251 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14147.7480966959, + "Vacc_completed": 1111.2289166538, + "Vacc_refreshed": 34.771310214, + "Vacc_refreshed_2": 17.385655107 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14154.5204084505, + "Vacc_completed": 1114.7870563855, + "Vacc_refreshed": 41.8898823514, + "Vacc_refreshed_2": 20.9449411757 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14155.4472543415, + "Vacc_completed": 1124.6385432496, + "Vacc_refreshed": 48.6348857735, + "Vacc_refreshed_2": 24.31744288675 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14162.2764203336, + "Vacc_completed": 1128.54825128, + "Vacc_refreshed": 48.7694054724, + "Vacc_refreshed_2": 24.3847027362 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14163.6229511244, + "Vacc_completed": 1128.7143765883, + "Vacc_refreshed": 53.2059941772, + "Vacc_refreshed_2": 26.6029970886 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14170.704731349, + "Vacc_completed": 1138.0466956792, + "Vacc_refreshed": 59.0394633797, + "Vacc_refreshed_2": 29.51973168985 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14177.9754226866, + "Vacc_completed": 1144.8391611423, + "Vacc_refreshed": 68.7607294969, + "Vacc_refreshed_2": 34.38036474845 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14180.6917277285, + "Vacc_completed": 1145.8477444825, + "Vacc_refreshed": 68.9221667424, + "Vacc_refreshed_2": 34.4610833712 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14183.6510488722, + "Vacc_completed": 1148.5261706572, + "Vacc_refreshed": 74.1781085786, + "Vacc_refreshed_2": 37.0890542893 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14187.685478561, + "Vacc_completed": 1156.317724845, + "Vacc_refreshed": 82.4605426733, + "Vacc_refreshed_2": 41.23027133665 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14190.8756861073, + "Vacc_completed": 1158.3230049846, + "Vacc_refreshed": 85.9686058349, + "Vacc_refreshed_2": 42.98430291745 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14194.7125443701, + "Vacc_completed": 1162.8869701267, + "Vacc_refreshed": 86.9745448839, + "Vacc_refreshed_2": 43.48727244195 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14198.1736788429, + "Vacc_completed": 1172.5122981568, + "Vacc_refreshed": 87.3520867387, + "Vacc_refreshed_2": 43.67604336935 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14200.0337444888, + "Vacc_completed": 1173.9022323601, + "Vacc_refreshed": 96.1323881978, + "Vacc_refreshed_2": 48.0661940989 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14209.9091251899, + "Vacc_completed": 1180.4819879148, + "Vacc_refreshed": 102.8081520102, + "Vacc_refreshed_2": 51.4040760051 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14215.7510791988, + "Vacc_completed": 1187.6749019896, + "Vacc_refreshed": 111.0676626302, + "Vacc_refreshed_2": 55.5338313151 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14216.891975169, + "Vacc_completed": 1194.8246181318, + "Vacc_refreshed": 112.2172983632, + "Vacc_refreshed_2": 56.1086491816 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14226.1128719795, + "Vacc_completed": 1199.3288757923, + "Vacc_refreshed": 115.0035825103, + "Vacc_refreshed_2": 57.50179125515 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14234.2678640476, + "Vacc_completed": 1200.3667784603, + "Vacc_refreshed": 122.2552339507, + "Vacc_refreshed_2": 61.12761697535 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14236.1003192184, + "Vacc_completed": 1204.1967603181, + "Vacc_refreshed": 127.0429292216, + "Vacc_refreshed_2": 63.5214646108 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14242.538633822, + "Vacc_completed": 1212.5454877324, + "Vacc_refreshed": 134.6939665016, + "Vacc_refreshed_2": 67.3469832508 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14244.3387278104, + "Vacc_completed": 1213.6034702862, + "Vacc_refreshed": 136.0920891424, + "Vacc_refreshed_2": 68.0460445712 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14251.4120506037, + "Vacc_completed": 1216.4725302456, + "Vacc_refreshed": 140.2813449601, + "Vacc_refreshed_2": 70.14067248005 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14260.7111088561, + "Vacc_completed": 1223.9349650326, + "Vacc_refreshed": 144.4607939662, + "Vacc_refreshed_2": 72.2303969831 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.4310619138, + "Vacc_completed": 1230.2964929538, + "Vacc_refreshed": 149.281965675, + "Vacc_refreshed_2": 74.6409828375 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.8430243455, + "Vacc_completed": 1233.791799902, + "Vacc_refreshed": 152.843700775, + "Vacc_refreshed_2": 76.4218503875 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14270.6723528208, + "Vacc_completed": 1235.7852283109, + "Vacc_refreshed": 158.6087157945, + "Vacc_refreshed_2": 79.30435789725 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14276.398217781, + "Vacc_completed": 1244.1189399585, + "Vacc_refreshed": 161.780101215, + "Vacc_refreshed_2": 80.8900506075 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14282.7632141243, + "Vacc_completed": 1252.4246776385, + "Vacc_refreshed": 164.4087953839, + "Vacc_refreshed_2": 82.20439769195 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14285.2172118541, + "Vacc_completed": 1253.0967186007, + "Vacc_refreshed": 165.7333648079, + "Vacc_refreshed_2": 82.86668240395 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14288.3981413127, + "Vacc_completed": 1261.2285273698, + "Vacc_refreshed": 175.6751183454, + "Vacc_refreshed_2": 87.8375591727 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14296.6990830234, + "Vacc_completed": 1261.8928424603, + "Vacc_refreshed": 181.3746988194, + "Vacc_refreshed_2": 90.6873494097 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14304.9324135674, + "Vacc_completed": 1268.1858225933, + "Vacc_refreshed": 182.8207287588, + "Vacc_refreshed_2": 91.4103643794 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14312.7990335985, + "Vacc_completed": 1270.8693167453, + "Vacc_refreshed": 192.6352794711, + "Vacc_refreshed_2": 96.31763973555 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14316.0317804647, + "Vacc_completed": 1276.8328604136, + "Vacc_refreshed": 199.109084232, + "Vacc_refreshed_2": 99.554542116 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14317.8224126817, + "Vacc_completed": 1285.9345839202, + "Vacc_refreshed": 204.9564534429, + "Vacc_refreshed_2": 102.47822672145 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14319.969225103, + "Vacc_completed": 1292.0814432843, + "Vacc_refreshed": 209.3116185701, + "Vacc_refreshed_2": 104.65580928505 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14325.5010146205, + "Vacc_completed": 1296.8562638588, + "Vacc_refreshed": 214.164106287, + "Vacc_refreshed_2": 107.0820531435 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14334.64723979, + "Vacc_completed": 1299.2846390455, + "Vacc_refreshed": 215.8187786169, + "Vacc_refreshed_2": 107.90938930845 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14341.3416549169, + "Vacc_completed": 1307.3997120401, + "Vacc_refreshed": 220.1718442512, + "Vacc_refreshed_2": 110.0859221256 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14349.3146443239, + "Vacc_completed": 1309.8026404332, + "Vacc_refreshed": 222.9315364644, + "Vacc_refreshed_2": 111.4657682322 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14359.2839765392, + "Vacc_completed": 1313.6592234511, + "Vacc_refreshed": 226.6469703335, + "Vacc_refreshed_2": 113.32348516675 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14365.2176903694, + "Vacc_completed": 1319.2137305156, + "Vacc_refreshed": 227.7079880211, + "Vacc_refreshed_2": 113.85399401055 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14372.2949635005, + "Vacc_completed": 1325.3928078641, + "Vacc_refreshed": 234.0214496372, + "Vacc_refreshed_2": 117.0107248186 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14377.1100641854, + "Vacc_completed": 1326.7384263101, + "Vacc_refreshed": 242.1400638609, + "Vacc_refreshed_2": 121.07003193045 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14381.7559278649, + "Vacc_completed": 1329.4413693873, + "Vacc_refreshed": 246.2374710913, + "Vacc_refreshed_2": 123.11873554565 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14385.7162526455, + "Vacc_completed": 1338.1839321545, + "Vacc_refreshed": 252.0149200475, + "Vacc_refreshed_2": 126.00746002375 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14389.4326934411, + "Vacc_completed": 1345.9094675595, + "Vacc_refreshed": 256.9046042339, + "Vacc_refreshed_2": 128.45230211695 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14391.2007554132, + "Vacc_completed": 1348.71606757, + "Vacc_refreshed": 258.1776032516, + "Vacc_refreshed_2": 129.0888016258 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14394.8621297613, + "Vacc_completed": 1354.2416050796, + "Vacc_refreshed": 267.8589065036, + "Vacc_refreshed_2": 133.9294532518 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.3456243909, + "Vacc_completed": 1359.868800934, + "Vacc_refreshed": 270.9855298163, + "Vacc_refreshed_2": 135.49276490815 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.4645205246, + "Vacc_completed": 1363.0538159145, + "Vacc_refreshed": 275.840425604, + "Vacc_refreshed_2": 137.920212802 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14399.1657319944, + "Vacc_completed": 1365.5993182323, + "Vacc_refreshed": 277.5856365007, + "Vacc_refreshed_2": 138.79281825035 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14402.7230837573, + "Vacc_completed": 1368.6201543223, + "Vacc_refreshed": 286.3361695339, + "Vacc_refreshed_2": 143.16808476695 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14403.1500082752, + "Vacc_completed": 1371.4419603277, + "Vacc_refreshed": 291.9429549926, + "Vacc_refreshed_2": 145.9714774963 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14409.601025491, + "Vacc_completed": 1375.0385110041, + "Vacc_refreshed": 294.4838831323, + "Vacc_refreshed_2": 147.24194156615 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.5992098988, + "Vacc_completed": 1379.7282797993, + "Vacc_refreshed": 304.3709721295, + "Vacc_refreshed_2": 152.18548606475 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.7379664054, + "Vacc_completed": 1388.4437755617, + "Vacc_refreshed": 310.9469195789, + "Vacc_refreshed_2": 155.47345978945 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14413.0256783966, + "Vacc_completed": 1395.0228908154, + "Vacc_refreshed": 316.1322991564, + "Vacc_refreshed_2": 158.0661495782 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14418.5923400284, + "Vacc_completed": 1395.4421160716, + "Vacc_refreshed": 324.326203234, + "Vacc_refreshed_2": 162.163101617 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14427.1006875636, + "Vacc_completed": 1400.9550416303, + "Vacc_refreshed": 326.1675291407, + "Vacc_refreshed_2": 163.08376457035 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14428.1259159444, + "Vacc_completed": 1401.6589165675, + "Vacc_refreshed": 336.1473853823, + "Vacc_refreshed_2": 168.07369269115 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14429.6710322591, + "Vacc_completed": 1406.4316961423, + "Vacc_refreshed": 338.7341080527, + "Vacc_refreshed_2": 169.36705402635 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14435.5405186058, + "Vacc_completed": 1406.8193757343, + "Vacc_refreshed": 348.5515447081, + "Vacc_refreshed_2": 174.27577235405 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14440.6128511884, + "Vacc_completed": 1406.8790930463, + "Vacc_refreshed": 349.9224707035, + "Vacc_refreshed_2": 174.96123535175 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14448.1553470558, + "Vacc_completed": 1407.8576900416, + "Vacc_refreshed": 354.7521313753, + "Vacc_refreshed_2": 177.37606568765 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14456.4196110425, + "Vacc_completed": 1411.7530351787, + "Vacc_refreshed": 361.5526839017, + "Vacc_refreshed_2": 180.77634195085 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14466.1757833279, + "Vacc_completed": 1412.4941157515, + "Vacc_refreshed": 364.0766791828, + "Vacc_refreshed_2": 182.0383395914 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14472.9152722164, + "Vacc_completed": 1421.7399661156, + "Vacc_refreshed": 371.2418954122, + "Vacc_refreshed_2": 185.6209477061 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14474.3971159945, + "Vacc_completed": 1423.8796012137, + "Vacc_refreshed": 378.3445685688, + "Vacc_refreshed_2": 189.1722842844 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14482.9259977884, + "Vacc_completed": 1428.8212618966, + "Vacc_refreshed": 382.6712538747, + "Vacc_refreshed_2": 191.33562693735 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14491.6837567491, + "Vacc_completed": 1430.1481016913, + "Vacc_refreshed": 392.5489632959, + "Vacc_refreshed_2": 196.27448164795 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14499.5728298642, + "Vacc_completed": 1439.468906008, + "Vacc_refreshed": 397.6649554861, + "Vacc_refreshed_2": 198.83247774305 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14500.4884339857, + "Vacc_completed": 1447.6074532094, + "Vacc_refreshed": 404.4236802991, + "Vacc_refreshed_2": 202.21184014955 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14508.6628209678, + "Vacc_completed": 1449.1955087396, + "Vacc_refreshed": 413.1290507873, + "Vacc_refreshed_2": 206.56452539365 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14509.0177335192, + "Vacc_completed": 1457.0313439789, + "Vacc_refreshed": 418.6984801264, + "Vacc_refreshed_2": 209.3492400632 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14518.7925361684, + "Vacc_completed": 1462.4055060107, + "Vacc_refreshed": 419.6070699812, + "Vacc_refreshed_2": 209.8035349906 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14522.121758092, + "Vacc_completed": 1468.1811367429, + "Vacc_refreshed": 425.9772045183, + "Vacc_refreshed_2": 212.98860225915 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14528.5474917037, + "Vacc_completed": 1473.5164593205, + "Vacc_refreshed": 435.7810319021, + "Vacc_refreshed_2": 217.89051595105 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14536.5601109176, + "Vacc_completed": 1481.2704120463, + "Vacc_refreshed": 438.2410199432, + "Vacc_refreshed_2": 219.1205099716 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14542.1473955627, + "Vacc_completed": 1482.7064631605, + "Vacc_refreshed": 445.3488141502, + "Vacc_refreshed_2": 222.6744070751 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14544.5952478081, + "Vacc_completed": 1486.0552178086, + "Vacc_refreshed": 446.1812966093, + "Vacc_refreshed_2": 223.09064830465 + }, + { + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10765.9941189788, + "Vacc_completed": 1603.3500569399, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.3717745702, + "Vacc_completed": 1605.3068408797, + "Vacc_refreshed": 3.6283182226, + "Vacc_refreshed_2": 1.8141591113 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.4956401429, + "Vacc_completed": 1610.6119068185, + "Vacc_refreshed": 6.1967396209, + "Vacc_refreshed_2": 3.09836981045 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10774.4184508751, + "Vacc_completed": 1613.016161978, + "Vacc_refreshed": 15.7069691534, + "Vacc_refreshed_2": 7.8534845767 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10780.8073818373, + "Vacc_completed": 1622.1917795654, + "Vacc_refreshed": 20.1697274397, + "Vacc_refreshed_2": 10.08486371985 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10785.5287460006, + "Vacc_completed": 1625.0602525893, + "Vacc_refreshed": 22.4671684217, + "Vacc_refreshed_2": 11.23358421085 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10790.1084610651, + "Vacc_completed": 1627.3787523231, + "Vacc_refreshed": 28.5217462646, + "Vacc_refreshed_2": 14.2608731323 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10796.2300309, + "Vacc_completed": 1630.4363483664, + "Vacc_refreshed": 35.3070676184, + "Vacc_refreshed_2": 17.6535338092 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10801.7222904172, + "Vacc_completed": 1638.725087864, + "Vacc_refreshed": 43.7679344272, + "Vacc_refreshed_2": 21.8839672136 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10804.7724722766, + "Vacc_completed": 1646.4905335365, + "Vacc_refreshed": 44.1718542676, + "Vacc_refreshed_2": 22.0859271338 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10814.3453353804, + "Vacc_completed": 1650.9992837124, + "Vacc_refreshed": 49.5204655539, + "Vacc_refreshed_2": 24.76023277695 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10821.6255112157, + "Vacc_completed": 1656.4335840831, + "Vacc_refreshed": 52.7009855172, + "Vacc_refreshed_2": 26.3504927586 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10830.9379325639, + "Vacc_completed": 1657.186187271, + "Vacc_refreshed": 56.5428649986, + "Vacc_refreshed_2": 28.2714324993 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10838.202902864, + "Vacc_completed": 1662.1470499364, + "Vacc_refreshed": 58.6277824858, + "Vacc_refreshed_2": 29.3138912429 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10840.8786753296, + "Vacc_completed": 1670.6860254071, + "Vacc_refreshed": 58.7593924743, + "Vacc_refreshed_2": 29.37969623715 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10843.7453960183, + "Vacc_completed": 1673.6372365137, + "Vacc_refreshed": 61.8595630166, + "Vacc_refreshed_2": 30.9297815083 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10849.1151892515, + "Vacc_completed": 1675.1066023109, + "Vacc_refreshed": 64.6020615007, + "Vacc_refreshed_2": 32.30103075035 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10850.9329685403, + "Vacc_completed": 1679.1505675366, + "Vacc_refreshed": 72.0237510859, + "Vacc_refreshed_2": 36.01187554295 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10854.4610677614, + "Vacc_completed": 1681.5473018047, + "Vacc_refreshed": 75.0145349272, + "Vacc_refreshed_2": 37.5072674636 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10858.0662824418, + "Vacc_completed": 1688.7179113019, + "Vacc_refreshed": 82.7641475111, + "Vacc_refreshed_2": 41.38207375555 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10867.8357803799, + "Vacc_completed": 1688.741478882, + "Vacc_refreshed": 92.1411476813, + "Vacc_refreshed_2": 46.07057384065 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10877.245759177, + "Vacc_completed": 1696.3354153291, + "Vacc_refreshed": 93.5350586202, + "Vacc_refreshed_2": 46.7675293101 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10878.9277486403, + "Vacc_completed": 1704.5169058825, + "Vacc_refreshed": 99.9257252117, + "Vacc_refreshed_2": 49.96286260585 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10881.5163902637, + "Vacc_completed": 1704.5184844203, + "Vacc_refreshed": 104.0563799981, + "Vacc_refreshed_2": 52.02818999905 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10882.0628121233, + "Vacc_completed": 1710.1811092467, + "Vacc_refreshed": 110.998904559, + "Vacc_refreshed_2": 55.4994522795 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10884.1868939764, + "Vacc_completed": 1711.6669667815, + "Vacc_refreshed": 119.5835613879, + "Vacc_refreshed_2": 59.79178069395 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10890.26315895, + "Vacc_completed": 1712.8219244738, + "Vacc_refreshed": 126.203975023, + "Vacc_refreshed_2": 63.1019875115 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10894.6858788747, + "Vacc_completed": 1721.7467435031, + "Vacc_refreshed": 135.9649739788, + "Vacc_refreshed_2": 67.9824869894 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10897.5575288795, + "Vacc_completed": 1721.7787127468, + "Vacc_refreshed": 145.614673399, + "Vacc_refreshed_2": 72.8073366995 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10903.1231721286, + "Vacc_completed": 1724.7269587992, + "Vacc_refreshed": 149.6717929743, + "Vacc_refreshed_2": 74.83589648715 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10911.1763853993, + "Vacc_completed": 1726.3071857535, + "Vacc_refreshed": 158.0496522084, + "Vacc_refreshed_2": 79.0248261042 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10919.5582023277, + "Vacc_completed": 1727.9236223535, + "Vacc_refreshed": 160.5751263702, + "Vacc_refreshed_2": 80.2875631851 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10920.4962369047, + "Vacc_completed": 1730.7211296321, + "Vacc_refreshed": 162.2038531114, + "Vacc_refreshed_2": 81.1019265557 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10930.0062994591, + "Vacc_completed": 1733.2273616859, + "Vacc_refreshed": 164.6178844659, + "Vacc_refreshed_2": 82.30894223295 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10931.0781786076, + "Vacc_completed": 1743.0639116966, + "Vacc_refreshed": 171.6949336111, + "Vacc_refreshed_2": 85.84746680555 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10936.2371584575, + "Vacc_completed": 1743.4973637943, + "Vacc_refreshed": 173.1954991423, + "Vacc_refreshed_2": 86.59774957115 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10937.1969149599, + "Vacc_completed": 1752.0043206175, + "Vacc_refreshed": 173.4521249531, + "Vacc_refreshed_2": 86.72606247655 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10942.5829785849, + "Vacc_completed": 1758.5438162851, + "Vacc_refreshed": 175.0971428389, + "Vacc_refreshed_2": 87.54857141945 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10945.8458051779, + "Vacc_completed": 1765.593119461, + "Vacc_refreshed": 184.781293552, + "Vacc_refreshed_2": 92.390646776 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10955.2619609788, + "Vacc_completed": 1766.7516696253, + "Vacc_refreshed": 194.3279051811, + "Vacc_refreshed_2": 97.16395259055 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0529992794, + "Vacc_completed": 1774.4096958807, + "Vacc_refreshed": 199.3585168564, + "Vacc_refreshed_2": 99.6792584282 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0740456643, + "Vacc_completed": 1776.7353479155, + "Vacc_refreshed": 200.2783085421, + "Vacc_refreshed_2": 100.13915427105 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7647446192, + "Vacc_completed": 1786.1838226639, + "Vacc_refreshed": 202.522841172, + "Vacc_refreshed_2": 101.261420586 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7950553291, + "Vacc_completed": 1788.5013884886, + "Vacc_refreshed": 205.1107008609, + "Vacc_refreshed_2": 102.55535043045 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10973.1049316279, + "Vacc_completed": 1790.2712267193, + "Vacc_refreshed": 214.0688577867, + "Vacc_refreshed_2": 107.03442889335 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10976.2696576646, + "Vacc_completed": 1797.8582422894, + "Vacc_refreshed": 219.0460187772, + "Vacc_refreshed_2": 109.5230093886 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10984.9161656634, + "Vacc_completed": 1801.5924446935, + "Vacc_refreshed": 227.656626047, + "Vacc_refreshed_2": 113.8283130235 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10994.063273181, + "Vacc_completed": 1802.6817444812, + "Vacc_refreshed": 235.6032823069, + "Vacc_refreshed_2": 117.80164115345 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10996.8771305673, + "Vacc_completed": 1802.9071097171, + "Vacc_refreshed": 237.7242073629, + "Vacc_refreshed_2": 118.86210368145 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11002.0527900673, + "Vacc_completed": 1809.5395950318, + "Vacc_refreshed": 241.3631599251, + "Vacc_refreshed_2": 120.68157996255 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11007.1528572096, + "Vacc_completed": 1813.9025489723, + "Vacc_refreshed": 245.5305344153, + "Vacc_refreshed_2": 122.76526720765 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11013.1337350258, + "Vacc_completed": 1821.5275057931, + "Vacc_refreshed": 250.3168579858, + "Vacc_refreshed_2": 125.1584289929 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11015.6696905796, + "Vacc_completed": 1822.9598630397, + "Vacc_refreshed": 255.6335351411, + "Vacc_refreshed_2": 127.81676757055 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11023.4754023371, + "Vacc_completed": 1827.2471461973, + "Vacc_refreshed": 265.5951098299, + "Vacc_refreshed_2": 132.79755491495 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11032.8284479669, + "Vacc_completed": 1827.5539031975, + "Vacc_refreshed": 267.3513136054, + "Vacc_refreshed_2": 133.6756568027 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.3845078238, + "Vacc_completed": 1828.9970028031, + "Vacc_refreshed": 270.5903250252, + "Vacc_refreshed_2": 135.2951625126 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.693720803, + "Vacc_completed": 1836.2049019351, + "Vacc_refreshed": 272.0758803579, + "Vacc_refreshed_2": 136.03794017895 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11047.8242120991, + "Vacc_completed": 1837.1027842122, + "Vacc_refreshed": 275.2277393803, + "Vacc_refreshed_2": 137.61386969015 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11053.900379851, + "Vacc_completed": 1838.273599421, + "Vacc_refreshed": 282.2344875735, + "Vacc_refreshed_2": 141.11724378675 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11059.6633767419, + "Vacc_completed": 1845.0089267377, + "Vacc_refreshed": 284.3140546038, + "Vacc_refreshed_2": 142.1570273019 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11068.9288674107, + "Vacc_completed": 1852.7615624634, + "Vacc_refreshed": 287.0304142153, + "Vacc_refreshed_2": 143.51520710765 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11072.6595101177, + "Vacc_completed": 1857.871819743, + "Vacc_refreshed": 289.2733395979, + "Vacc_refreshed_2": 144.63666979895 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11082.5784142097, + "Vacc_completed": 1865.7647392626, + "Vacc_refreshed": 291.3426551576, + "Vacc_refreshed_2": 145.6713275788 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11089.5185616411, + "Vacc_completed": 1869.3958231852, + "Vacc_refreshed": 299.8179962185, + "Vacc_refreshed_2": 149.90899810925 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11097.3087770941, + "Vacc_completed": 1878.7026117675, + "Vacc_refreshed": 306.1608208876, + "Vacc_refreshed_2": 153.0804104438 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11101.8508357142, + "Vacc_completed": 1879.7270518854, + "Vacc_refreshed": 308.0716738039, + "Vacc_refreshed_2": 154.03583690195 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11103.0915214706, + "Vacc_completed": 1883.5574266434, + "Vacc_refreshed": 311.2801806804, + "Vacc_refreshed_2": 155.6400903402 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11111.9334619087, + "Vacc_completed": 1887.7967037043, + "Vacc_refreshed": 320.2156677375, + "Vacc_refreshed_2": 160.10783386875 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11118.8667730664, + "Vacc_completed": 1896.6793284207, + "Vacc_refreshed": 321.8561637233, + "Vacc_refreshed_2": 160.92808186165 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11123.0290736537, + "Vacc_completed": 1902.1985445903, + "Vacc_refreshed": 328.4656069808, + "Vacc_refreshed_2": 164.2328034904 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11129.3471714321, + "Vacc_completed": 1902.2057666507, + "Vacc_refreshed": 334.8734059386, + "Vacc_refreshed_2": 167.4367029693 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11137.9949570833, + "Vacc_completed": 1907.7915885083, + "Vacc_refreshed": 339.9783670978, + "Vacc_refreshed_2": 169.9891835489 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11139.4617826874, + "Vacc_completed": 1910.6126501167, + "Vacc_refreshed": 342.8472462544, + "Vacc_refreshed_2": 171.4236231272 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11144.4191917936, + "Vacc_completed": 1917.8558172992, + "Vacc_refreshed": 351.3104814196, + "Vacc_refreshed_2": 175.6552407098 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11153.423123173, + "Vacc_completed": 1927.8115362669, + "Vacc_refreshed": 359.1887782128, + "Vacc_refreshed_2": 179.5943891064 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11155.4646855253, + "Vacc_completed": 1931.0938823989, + "Vacc_refreshed": 363.4217582407, + "Vacc_refreshed_2": 181.71087912035 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11164.8755655095, + "Vacc_completed": 1932.0922021433, + "Vacc_refreshed": 369.5881371093, + "Vacc_refreshed_2": 184.79406855465 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11168.2127634861, + "Vacc_completed": 1937.8864562316, + "Vacc_refreshed": 371.2850357688, + "Vacc_refreshed_2": 185.6425178844 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11170.3919325879, + "Vacc_completed": 1943.9625258254, + "Vacc_refreshed": 372.564368772, + "Vacc_refreshed_2": 186.282184386 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11178.2156716034, + "Vacc_completed": 1946.3680545291, + "Vacc_refreshed": 377.1791450411, + "Vacc_refreshed_2": 188.58957252055 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11187.7206334256, + "Vacc_completed": 1950.3408321869, + "Vacc_refreshed": 385.28114877, + "Vacc_refreshed_2": 192.640574385 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11189.2295548943, + "Vacc_completed": 1952.7801877326, + "Vacc_refreshed": 386.4768386941, + "Vacc_refreshed_2": 193.23841934705 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11193.8090943925, + "Vacc_completed": 1960.5337079214, + "Vacc_refreshed": 395.6463777137, + "Vacc_refreshed_2": 197.82318885685 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11198.0758128722, + "Vacc_completed": 1964.4220756604, + "Vacc_refreshed": 404.4005517293, + "Vacc_refreshed_2": 202.20027586465 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11200.1395546734, + "Vacc_completed": 1974.1843879258, + "Vacc_refreshed": 410.4354615606, + "Vacc_refreshed_2": 205.2177307803 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.0858861212, + "Vacc_completed": 1978.0710124849, + "Vacc_refreshed": 414.2205337181, + "Vacc_refreshed_2": 207.11026685905 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.5521637654, + "Vacc_completed": 1981.3589179628, + "Vacc_refreshed": 419.5840242501, + "Vacc_refreshed_2": 209.79201212505 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11211.6562498266, + "Vacc_completed": 1989.6665585254, + "Vacc_refreshed": 426.6154672823, + "Vacc_refreshed_2": 213.30773364115 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11219.1926870115, + "Vacc_completed": 1996.1459430488, + "Vacc_refreshed": 430.16915603, + "Vacc_refreshed_2": 215.084578015 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11221.4656474699, + "Vacc_completed": 2001.4601213853, + "Vacc_refreshed": 430.8770850788, + "Vacc_refreshed_2": 215.4385425394 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11224.2379660032, + "Vacc_completed": 2006.2961081678, + "Vacc_refreshed": 433.8074021391, + "Vacc_refreshed_2": 216.90370106955 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11229.137503588, + "Vacc_completed": 2013.2392255015, + "Vacc_refreshed": 441.1218403265, + "Vacc_refreshed_2": 220.56092016325 + }, + { + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15118.5419446559, + "Vacc_completed": 1046.4766182565, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15127.0441726861, + "Vacc_completed": 1051.8189573454, + "Vacc_refreshed": 4.7668817312, + "Vacc_refreshed_2": 2.3834408656 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15134.2198668737, + "Vacc_completed": 1051.8898550539, + "Vacc_refreshed": 6.8954841457, + "Vacc_refreshed_2": 3.44774207285 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15138.5012633389, + "Vacc_completed": 1054.1938291422, + "Vacc_refreshed": 12.8850967826, + "Vacc_refreshed_2": 6.4425483913 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15140.019297286, + "Vacc_completed": 1057.2812920036, + "Vacc_refreshed": 15.610006044, + "Vacc_refreshed_2": 7.805003022 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15141.0655653453, + "Vacc_completed": 1061.1873607435, + "Vacc_refreshed": 18.0052067519, + "Vacc_refreshed_2": 9.00260337595 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15146.6047446953, + "Vacc_completed": 1067.3953196211, + "Vacc_refreshed": 27.5155266211, + "Vacc_refreshed_2": 13.75776331055 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15150.2459378898, + "Vacc_completed": 1077.315397207, + "Vacc_refreshed": 28.0742687581, + "Vacc_refreshed_2": 14.03713437905 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15153.3836683973, + "Vacc_completed": 1082.8237823387, + "Vacc_refreshed": 32.6629347887, + "Vacc_refreshed_2": 16.33146739435 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15155.2486658897, + "Vacc_completed": 1087.8721865368, + "Vacc_refreshed": 42.082807235, + "Vacc_refreshed_2": 21.0414036175 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15157.4630323429, + "Vacc_completed": 1090.0916620904, + "Vacc_refreshed": 43.8436800298, + "Vacc_refreshed_2": 21.9218400149 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15158.7941750828, + "Vacc_completed": 1091.8322828475, + "Vacc_refreshed": 44.7371311455, + "Vacc_refreshed_2": 22.36856557275 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15159.4697179186, + "Vacc_completed": 1097.9581123146, + "Vacc_refreshed": 52.5410403094, + "Vacc_refreshed_2": 26.2705201547 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15166.8797207146, + "Vacc_completed": 1103.4838023049, + "Vacc_refreshed": 58.4482610787, + "Vacc_refreshed_2": 29.22413053935 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.177591783, + "Vacc_completed": 1107.529236183, + "Vacc_refreshed": 61.868532741, + "Vacc_refreshed_2": 30.9342663705 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.3473624207, + "Vacc_completed": 1108.0854442406, + "Vacc_refreshed": 64.122741794, + "Vacc_refreshed_2": 32.061370897 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15176.6656703161, + "Vacc_completed": 1114.7623442184, + "Vacc_refreshed": 73.3909194547, + "Vacc_refreshed_2": 36.69545972735 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15182.6538662202, + "Vacc_completed": 1121.0967139584, + "Vacc_refreshed": 78.4108273222, + "Vacc_refreshed_2": 39.2054136611 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15191.0826029366, + "Vacc_completed": 1124.8733122731, + "Vacc_refreshed": 88.1249123157, + "Vacc_refreshed_2": 44.06245615785 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15195.1567917247, + "Vacc_completed": 1133.1683853487, + "Vacc_refreshed": 94.0586819047, + "Vacc_refreshed_2": 47.02934095235 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15197.6523517992, + "Vacc_completed": 1140.1742056487, + "Vacc_refreshed": 97.7116921077, + "Vacc_refreshed_2": 48.85584605385 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15202.8832794911, + "Vacc_completed": 1140.4207518542, + "Vacc_refreshed": 101.0390519368, + "Vacc_refreshed_2": 50.5195259684 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15209.502983548, + "Vacc_completed": 1144.1138351675, + "Vacc_refreshed": 104.5568369595, + "Vacc_refreshed_2": 52.27841847975 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15218.5591667959, + "Vacc_completed": 1153.0110444013, + "Vacc_refreshed": 111.8121115483, + "Vacc_refreshed_2": 55.90605577415 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15223.6275127037, + "Vacc_completed": 1157.3585549388, + "Vacc_refreshed": 113.9066704897, + "Vacc_refreshed_2": 56.95333524485 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.4100349304, + "Vacc_completed": 1162.1581378525, + "Vacc_refreshed": 116.416758139, + "Vacc_refreshed_2": 58.2083790695 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.7888080253, + "Vacc_completed": 1166.5300160643, + "Vacc_refreshed": 119.2414894864, + "Vacc_refreshed_2": 59.6207447432 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15235.240974732, + "Vacc_completed": 1171.76423914, + "Vacc_refreshed": 129.0137217302, + "Vacc_refreshed_2": 64.5068608651 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15236.252829019, + "Vacc_completed": 1174.1820893055, + "Vacc_refreshed": 130.8298102316, + "Vacc_refreshed_2": 65.4149051158 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15244.5996289271, + "Vacc_completed": 1181.3457343202, + "Vacc_refreshed": 138.0198133972, + "Vacc_refreshed_2": 69.0099066986 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15247.7688417561, + "Vacc_completed": 1186.4632437534, + "Vacc_refreshed": 147.549469044, + "Vacc_refreshed_2": 73.774734522 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15254.8324409461, + "Vacc_completed": 1196.0640695451, + "Vacc_refreshed": 148.035813332, + "Vacc_refreshed_2": 74.017906666 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15263.9056700401, + "Vacc_completed": 1202.0195228295, + "Vacc_refreshed": 152.9647063671, + "Vacc_refreshed_2": 76.48235318355 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15271.3608079113, + "Vacc_completed": 1205.9189472233, + "Vacc_refreshed": 159.4326071199, + "Vacc_refreshed_2": 79.71630355995 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15274.5391192733, + "Vacc_completed": 1209.5333389579, + "Vacc_refreshed": 165.8197711746, + "Vacc_refreshed_2": 82.9098855873 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15279.9252173752, + "Vacc_completed": 1217.5022918804, + "Vacc_refreshed": 170.1668415009, + "Vacc_refreshed_2": 85.08342075045 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15289.6429605219, + "Vacc_completed": 1218.0921627258, + "Vacc_refreshed": 176.8858359396, + "Vacc_refreshed_2": 88.4429179698 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15297.4452269777, + "Vacc_completed": 1218.4916546179, + "Vacc_refreshed": 177.0224757358, + "Vacc_refreshed_2": 88.5112378679 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15304.6068820067, + "Vacc_completed": 1221.1648349639, + "Vacc_refreshed": 182.8363512803, + "Vacc_refreshed_2": 91.41817564015 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15308.4472782837, + "Vacc_completed": 1221.3254317254, + "Vacc_refreshed": 188.4124431026, + "Vacc_refreshed_2": 94.2062215513 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15313.3535420035, + "Vacc_completed": 1228.797689569, + "Vacc_refreshed": 197.4958413402, + "Vacc_refreshed_2": 98.7479206701 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15319.6989570363, + "Vacc_completed": 1230.5766158569, + "Vacc_refreshed": 207.1280776834, + "Vacc_refreshed_2": 103.5640388417 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15329.2757609065, + "Vacc_completed": 1232.5532561558, + "Vacc_refreshed": 216.6030971785, + "Vacc_refreshed_2": 108.30154858925 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15331.3854251166, + "Vacc_completed": 1240.7858568563, + "Vacc_refreshed": 224.0947128601, + "Vacc_refreshed_2": 112.04735643005 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15335.6254694555, + "Vacc_completed": 1248.7648628072, + "Vacc_refreshed": 228.3914917972, + "Vacc_refreshed_2": 114.1957458986 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15342.4956408139, + "Vacc_completed": 1253.345700271, + "Vacc_refreshed": 237.7873655386, + "Vacc_refreshed_2": 118.8936827693 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15349.2985100866, + "Vacc_completed": 1254.923228178, + "Vacc_refreshed": 243.7398150729, + "Vacc_refreshed_2": 121.86990753645 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.0642849231, + "Vacc_completed": 1256.1247258557, + "Vacc_refreshed": 246.0998008594, + "Vacc_refreshed_2": 123.0499004297 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.3098206871, + "Vacc_completed": 1258.7673082658, + "Vacc_refreshed": 255.4830156808, + "Vacc_refreshed_2": 127.7415078404 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.8477668821, + "Vacc_completed": 1261.8739088788, + "Vacc_refreshed": 262.4150374381, + "Vacc_refreshed_2": 131.20751871905 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15355.0053188609, + "Vacc_completed": 1268.7063064011, + "Vacc_refreshed": 268.0354130392, + "Vacc_refreshed_2": 134.0177065196 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15356.8245202899, + "Vacc_completed": 1275.6335562552, + "Vacc_refreshed": 272.2800844077, + "Vacc_refreshed_2": 136.14004220385 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15357.7799420851, + "Vacc_completed": 1276.6526923528, + "Vacc_refreshed": 272.4509982396, + "Vacc_refreshed_2": 136.2254991198 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15360.090059624, + "Vacc_completed": 1286.3717718947, + "Vacc_refreshed": 276.5108897334, + "Vacc_refreshed_2": 138.2554448667 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15368.9251730685, + "Vacc_completed": 1289.9608638772, + "Vacc_refreshed": 286.1598516049, + "Vacc_refreshed_2": 143.07992580245 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15374.4348532349, + "Vacc_completed": 1292.7431692071, + "Vacc_refreshed": 286.9834989324, + "Vacc_refreshed_2": 143.4917494662 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15375.2266568732, + "Vacc_completed": 1293.6118841564, + "Vacc_refreshed": 287.1997495191, + "Vacc_refreshed_2": 143.59987475955 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15378.8167187789, + "Vacc_completed": 1294.2472234682, + "Vacc_refreshed": 293.7465776915, + "Vacc_refreshed_2": 146.87328884575 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15381.8183566081, + "Vacc_completed": 1296.5074589754, + "Vacc_refreshed": 294.394169978, + "Vacc_refreshed_2": 147.197084989 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15390.3384592829, + "Vacc_completed": 1298.1144038724, + "Vacc_refreshed": 295.3508481166, + "Vacc_refreshed_2": 147.6754240583 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15397.4841102393, + "Vacc_completed": 1301.7744150574, + "Vacc_refreshed": 295.636121459, + "Vacc_refreshed_2": 147.8180607295 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15406.9128765942, + "Vacc_completed": 1306.3546732411, + "Vacc_refreshed": 299.2176949608, + "Vacc_refreshed_2": 149.6088474804 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15412.9312961067, + "Vacc_completed": 1313.4112918553, + "Vacc_refreshed": 304.1283567048, + "Vacc_refreshed_2": 152.0641783524 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15413.8396565369, + "Vacc_completed": 1323.1872711778, + "Vacc_refreshed": 309.3767578057, + "Vacc_refreshed_2": 154.68837890285 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15417.5353933956, + "Vacc_completed": 1332.5570169907, + "Vacc_refreshed": 310.9982936972, + "Vacc_refreshed_2": 155.4991468486 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15418.826072466, + "Vacc_completed": 1333.4298810326, + "Vacc_refreshed": 318.8191964614, + "Vacc_refreshed_2": 159.4095982307 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15428.6081802722, + "Vacc_completed": 1335.4576305614, + "Vacc_refreshed": 322.681425219, + "Vacc_refreshed_2": 161.3407126095 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15434.4342053135, + "Vacc_completed": 1341.8151001107, + "Vacc_refreshed": 328.87826872, + "Vacc_refreshed_2": 164.43913436 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15442.7494739491, + "Vacc_completed": 1342.4758295952, + "Vacc_refreshed": 336.8125605002, + "Vacc_refreshed_2": 168.4062802501 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15451.9615776405, + "Vacc_completed": 1343.8595431355, + "Vacc_refreshed": 340.6379428895, + "Vacc_refreshed_2": 170.31897144475 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15461.0343740586, + "Vacc_completed": 1352.0217149096, + "Vacc_refreshed": 342.4652609374, + "Vacc_refreshed_2": 171.2326304687 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15467.8869999547, + "Vacc_completed": 1353.9994636638, + "Vacc_refreshed": 343.6202751504, + "Vacc_refreshed_2": 171.8101375752 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15474.9129704383, + "Vacc_completed": 1363.3653927841, + "Vacc_refreshed": 345.0578595323, + "Vacc_refreshed_2": 172.52892976615 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15483.483328834, + "Vacc_completed": 1372.0348541584, + "Vacc_refreshed": 348.4131919851, + "Vacc_refreshed_2": 174.20659599255 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15489.3942653446, + "Vacc_completed": 1377.4077406314, + "Vacc_refreshed": 355.6717942515, + "Vacc_refreshed_2": 177.83589712575 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15494.2503612359, + "Vacc_completed": 1377.4290090401, + "Vacc_refreshed": 358.9820312389, + "Vacc_refreshed_2": 179.49101561945 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15495.3394152185, + "Vacc_completed": 1378.0321848221, + "Vacc_refreshed": 364.7453207897, + "Vacc_refreshed_2": 182.37266039485 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15497.7000250685, + "Vacc_completed": 1378.1938721933, + "Vacc_refreshed": 367.9820639836, + "Vacc_refreshed_2": 183.9910319918 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15498.7689863883, + "Vacc_completed": 1381.0445655705, + "Vacc_refreshed": 371.501202086, + "Vacc_refreshed_2": 185.750601043 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15501.5446144083, + "Vacc_completed": 1383.5660020007, + "Vacc_refreshed": 378.7475176563, + "Vacc_refreshed_2": 189.37375882815 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15509.8230148672, + "Vacc_completed": 1390.2361319678, + "Vacc_refreshed": 382.7365149116, + "Vacc_refreshed_2": 191.3682574558 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15516.8607244434, + "Vacc_completed": 1391.5356833196, + "Vacc_refreshed": 387.0287274101, + "Vacc_refreshed_2": 193.51436370505 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15525.4621417067, + "Vacc_completed": 1391.7538408053, + "Vacc_refreshed": 394.832505058, + "Vacc_refreshed_2": 197.416252529 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15530.1412323442, + "Vacc_completed": 1393.5856974411, + "Vacc_refreshed": 402.9766589833, + "Vacc_refreshed_2": 201.48832949165 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15538.5266345599, + "Vacc_completed": 1394.0860887346, + "Vacc_refreshed": 409.427624651, + "Vacc_refreshed_2": 204.7138123255 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15545.1857152555, + "Vacc_completed": 1400.9009375981, + "Vacc_refreshed": 414.8161834543, + "Vacc_refreshed_2": 207.40809172715 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15550.0113840393, + "Vacc_completed": 1405.1190388135, + "Vacc_refreshed": 423.1492506703, + "Vacc_refreshed_2": 211.57462533515 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15557.7502728646, + "Vacc_completed": 1412.7232837907, + "Vacc_refreshed": 429.51858195, + "Vacc_refreshed_2": 214.759290975 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15558.6635273277, + "Vacc_completed": 1416.4367765358, + "Vacc_refreshed": 433.7574702422, + "Vacc_refreshed_2": 216.8787351211 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15567.8923476818, + "Vacc_completed": 1417.419547185, + "Vacc_refreshed": 436.3988331827, + "Vacc_refreshed_2": 218.19941659135 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15572.0110691064, + "Vacc_completed": 1422.1291332179, + "Vacc_refreshed": 444.7065625402, + "Vacc_refreshed_2": 222.3532812701 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15580.056372857, + "Vacc_completed": 1429.5241883626, + "Vacc_refreshed": 445.9185645116, + "Vacc_refreshed_2": 222.9592822558 + }, + { + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14604.162091487, + "Vacc_completed": 1396.5367205842, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14608.6011110978, + "Vacc_completed": 1403.0638750962, + "Vacc_refreshed": 0.4818747518, + "Vacc_refreshed_2": 0.2409373759 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14617.4016613244, + "Vacc_completed": 1412.4617013546, + "Vacc_refreshed": 2.8841327921, + "Vacc_refreshed_2": 1.44206639605 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14626.8147148128, + "Vacc_completed": 1413.5937989207, + "Vacc_refreshed": 4.347225901, + "Vacc_refreshed_2": 2.1736129505 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14636.7930742671, + "Vacc_completed": 1416.5445655325, + "Vacc_refreshed": 10.9126558661, + "Vacc_refreshed_2": 5.45632793305 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14639.261920851, + "Vacc_completed": 1419.7526675766, + "Vacc_refreshed": 12.1285186735, + "Vacc_refreshed_2": 6.06425933675 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14646.6246553828, + "Vacc_completed": 1429.1501916355, + "Vacc_refreshed": 14.2999622979, + "Vacc_refreshed_2": 7.14998114895 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14655.9228453283, + "Vacc_completed": 1433.2061319495, + "Vacc_refreshed": 18.6765331159, + "Vacc_refreshed_2": 9.33826655795 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.6905295279, + "Vacc_completed": 1437.4319338048, + "Vacc_refreshed": 19.3435044237, + "Vacc_refreshed_2": 9.67175221185 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.8883385186, + "Vacc_completed": 1446.7135497598, + "Vacc_refreshed": 28.359576628, + "Vacc_refreshed_2": 14.179788314 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14660.5634553543, + "Vacc_completed": 1450.9111526521, + "Vacc_refreshed": 38.3056947196, + "Vacc_refreshed_2": 19.1528473598 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14667.0822550267, + "Vacc_completed": 1458.1473384005, + "Vacc_refreshed": 38.8316353015, + "Vacc_refreshed_2": 19.41581765075 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14668.0361388154, + "Vacc_completed": 1464.9440155832, + "Vacc_refreshed": 44.1485629725, + "Vacc_refreshed_2": 22.07428148625 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14669.4679031112, + "Vacc_completed": 1470.1284856322, + "Vacc_refreshed": 47.7639888511, + "Vacc_refreshed_2": 23.88199442555 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.2618994679, + "Vacc_completed": 1476.9344530457, + "Vacc_refreshed": 56.361748961, + "Vacc_refreshed_2": 28.1808744805 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.3447644481, + "Vacc_completed": 1477.2393580763, + "Vacc_refreshed": 57.2273767339, + "Vacc_refreshed_2": 28.61368836695 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14684.0130216555, + "Vacc_completed": 1484.3234594705, + "Vacc_refreshed": 63.4497732245, + "Vacc_refreshed_2": 31.72488661225 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14691.8154699011, + "Vacc_completed": 1492.8513113216, + "Vacc_refreshed": 71.1720264341, + "Vacc_refreshed_2": 35.58601321705 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14697.5036031252, + "Vacc_completed": 1493.7450842417, + "Vacc_refreshed": 77.3635307257, + "Vacc_refreshed_2": 38.68176536285 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14702.599106658, + "Vacc_completed": 1503.4641107157, + "Vacc_refreshed": 82.0575571669, + "Vacc_refreshed_2": 41.02877858345 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14706.3806325115, + "Vacc_completed": 1509.7236994586, + "Vacc_refreshed": 82.4020129882, + "Vacc_refreshed_2": 41.2010064941 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14711.1723860607, + "Vacc_completed": 1510.3801441147, + "Vacc_refreshed": 89.5249618369, + "Vacc_refreshed_2": 44.76248091845 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14720.0093085987, + "Vacc_completed": 1517.7733661353, + "Vacc_refreshed": 99.2211580734, + "Vacc_refreshed_2": 49.6105790367 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14727.6474505495, + "Vacc_completed": 1519.2060691793, + "Vacc_refreshed": 104.7140344902, + "Vacc_refreshed_2": 52.3570172451 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14737.2025033477, + "Vacc_completed": 1520.8147599339, + "Vacc_refreshed": 111.7829864033, + "Vacc_refreshed_2": 55.89149320165 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14739.5787007901, + "Vacc_completed": 1526.8277919335, + "Vacc_refreshed": 118.2526435067, + "Vacc_refreshed_2": 59.12632175335 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14740.2622466128, + "Vacc_completed": 1533.9654672239, + "Vacc_refreshed": 121.0872593022, + "Vacc_refreshed_2": 60.5436296511 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.3105527103, + "Vacc_completed": 1534.5209202615, + "Vacc_refreshed": 130.3683956867, + "Vacc_refreshed_2": 65.18419784335 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.4386233429, + "Vacc_completed": 1534.652607589, + "Vacc_refreshed": 131.8609814668, + "Vacc_refreshed_2": 65.9304907334 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14750.7660084012, + "Vacc_completed": 1541.7255942491, + "Vacc_refreshed": 135.0718914562, + "Vacc_refreshed_2": 67.5359457281 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14754.5460710197, + "Vacc_completed": 1550.2608445951, + "Vacc_refreshed": 143.3620456295, + "Vacc_refreshed_2": 71.68102281475 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14759.0944017155, + "Vacc_completed": 1555.0005459425, + "Vacc_refreshed": 149.1268404613, + "Vacc_refreshed_2": 74.56342023065 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14765.0469016605, + "Vacc_completed": 1561.0596836707, + "Vacc_refreshed": 156.632878281, + "Vacc_refreshed_2": 78.3164391405 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14767.8747922121, + "Vacc_completed": 1562.2055298685, + "Vacc_refreshed": 158.7846499619, + "Vacc_refreshed_2": 79.39232498095 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14770.6956031505, + "Vacc_completed": 1564.0912014269, + "Vacc_refreshed": 160.2235512232, + "Vacc_refreshed_2": 80.1117756116 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14771.8405767953, + "Vacc_completed": 1569.1767284097, + "Vacc_refreshed": 163.0960075253, + "Vacc_refreshed_2": 81.54800376265 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14772.2052559189, + "Vacc_completed": 1577.0342160583, + "Vacc_refreshed": 171.338237261, + "Vacc_refreshed_2": 85.6691186305 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14775.8209952029, + "Vacc_completed": 1582.4601331483, + "Vacc_refreshed": 171.7811634642, + "Vacc_refreshed_2": 85.8905817321 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14783.195452278, + "Vacc_completed": 1590.5417141678, + "Vacc_refreshed": 180.3921690168, + "Vacc_refreshed_2": 90.1960845084 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14789.7908493035, + "Vacc_completed": 1599.1828252755, + "Vacc_refreshed": 184.3843375412, + "Vacc_refreshed_2": 92.1921687706 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14799.5061304555, + "Vacc_completed": 1604.6353429891, + "Vacc_refreshed": 186.9160630046, + "Vacc_refreshed_2": 93.4580315023 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14800.1953862328, + "Vacc_completed": 1607.3418569739, + "Vacc_refreshed": 194.8977352638, + "Vacc_refreshed_2": 97.4488676319 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14804.6194220955, + "Vacc_completed": 1610.8601925588, + "Vacc_refreshed": 198.1360514295, + "Vacc_refreshed_2": 99.06802571475 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14807.6135970058, + "Vacc_completed": 1620.4676732545, + "Vacc_refreshed": 199.7756827366, + "Vacc_refreshed_2": 99.8878413683 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14812.6404573806, + "Vacc_completed": 1625.8005590907, + "Vacc_refreshed": 208.9834954342, + "Vacc_refreshed_2": 104.4917477171 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14821.7780993542, + "Vacc_completed": 1634.2191287828, + "Vacc_refreshed": 218.0082295343, + "Vacc_refreshed_2": 109.00411476715 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14826.4757459809, + "Vacc_completed": 1642.5529482935, + "Vacc_refreshed": 225.0524176739, + "Vacc_refreshed_2": 112.52620883695 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14831.5528263871, + "Vacc_completed": 1649.3317542887, + "Vacc_refreshed": 229.0729255762, + "Vacc_refreshed_2": 114.5364627881 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14835.4543265309, + "Vacc_completed": 1656.6375918093, + "Vacc_refreshed": 230.6069957275, + "Vacc_refreshed_2": 115.30349786375 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14843.0829401722, + "Vacc_completed": 1661.236165662, + "Vacc_refreshed": 240.090987042, + "Vacc_refreshed_2": 120.045493521 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14846.441543514, + "Vacc_completed": 1663.7621214807, + "Vacc_refreshed": 242.6005891297, + "Vacc_refreshed_2": 121.30029456485 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14852.8592673291, + "Vacc_completed": 1670.5438763585, + "Vacc_refreshed": 243.1550853514, + "Vacc_refreshed_2": 121.5775426757 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14859.7577792484, + "Vacc_completed": 1671.9654195564, + "Vacc_refreshed": 252.4226950148, + "Vacc_refreshed_2": 126.2113475074 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14860.9361402439, + "Vacc_completed": 1673.0063955744, + "Vacc_refreshed": 254.9337371613, + "Vacc_refreshed_2": 127.46686858065 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14866.4446359141, + "Vacc_completed": 1680.8225588341, + "Vacc_refreshed": 260.3047312661, + "Vacc_refreshed_2": 130.15236563305 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14873.2607186268, + "Vacc_completed": 1689.7385811283, + "Vacc_refreshed": 267.8936320344, + "Vacc_refreshed_2": 133.9468160172 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14880.5922770798, + "Vacc_completed": 1689.9651236491, + "Vacc_refreshed": 275.7764918768, + "Vacc_refreshed_2": 137.8882459384 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14887.440916863, + "Vacc_completed": 1696.5525450807, + "Vacc_refreshed": 283.5225421273, + "Vacc_refreshed_2": 141.76127106365 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14888.0132355705, + "Vacc_completed": 1703.9968022938, + "Vacc_refreshed": 284.1554601622, + "Vacc_refreshed_2": 142.0777300811 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14897.4895745985, + "Vacc_completed": 1707.7124979313, + "Vacc_refreshed": 293.9654633907, + "Vacc_refreshed_2": 146.98273169535 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14900.9132287675, + "Vacc_completed": 1714.1256328363, + "Vacc_refreshed": 300.1498047442, + "Vacc_refreshed_2": 150.0749023721 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14907.9968139113, + "Vacc_completed": 1717.9722882107, + "Vacc_refreshed": 303.8260258963, + "Vacc_refreshed_2": 151.91301294815 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14914.3000727157, + "Vacc_completed": 1723.7459149842, + "Vacc_refreshed": 310.6001358466, + "Vacc_refreshed_2": 155.3000679233 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14915.2709520902, + "Vacc_completed": 1725.3728171833, + "Vacc_refreshed": 311.7419250413, + "Vacc_refreshed_2": 155.87096252065 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14924.9251049714, + "Vacc_completed": 1730.3968331067, + "Vacc_refreshed": 318.9914066325, + "Vacc_refreshed_2": 159.49570331625 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14929.9737051543, + "Vacc_completed": 1735.419819131, + "Vacc_refreshed": 327.2769475594, + "Vacc_refreshed_2": 163.6384737797 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.0867908297, + "Vacc_completed": 1735.4531164502, + "Vacc_refreshed": 333.9507530528, + "Vacc_refreshed_2": 166.9753765264 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.1585043075, + "Vacc_completed": 1744.7112606784, + "Vacc_refreshed": 337.8096837232, + "Vacc_refreshed_2": 168.9048418616 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14939.2420152133, + "Vacc_completed": 1745.8678859662, + "Vacc_refreshed": 344.4742142552, + "Vacc_refreshed_2": 172.2371071276 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14940.9708787633, + "Vacc_completed": 1748.1937727819, + "Vacc_refreshed": 352.7895987096, + "Vacc_refreshed_2": 176.3947993548 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14950.0282400838, + "Vacc_completed": 1750.2751748343, + "Vacc_refreshed": 354.0652893483, + "Vacc_refreshed_2": 177.03264467415 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14956.5498846765, + "Vacc_completed": 1758.7641351746, + "Vacc_refreshed": 361.0736440858, + "Vacc_refreshed_2": 180.5368220429 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14957.5908121778, + "Vacc_completed": 1763.4528309235, + "Vacc_refreshed": 364.3501912771, + "Vacc_refreshed_2": 182.17509563855 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14960.7281563782, + "Vacc_completed": 1772.006809538, + "Vacc_refreshed": 364.6804469838, + "Vacc_refreshed_2": 182.3402234919 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14969.2457673746, + "Vacc_completed": 1776.5678522654, + "Vacc_refreshed": 374.4882812856, + "Vacc_refreshed_2": 187.2441406428 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14974.8615073088, + "Vacc_completed": 1779.9556763371, + "Vacc_refreshed": 377.4421123342, + "Vacc_refreshed_2": 188.7210561671 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14984.5914886251, + "Vacc_completed": 1782.6146675026, + "Vacc_refreshed": 381.2082916917, + "Vacc_refreshed_2": 190.60414584585 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14987.5876984189, + "Vacc_completed": 1791.1028428437, + "Vacc_refreshed": 385.3294438436, + "Vacc_refreshed_2": 192.6647219218 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.58002825, + "Vacc_completed": 1793.9473770292, + "Vacc_refreshed": 388.9073184565, + "Vacc_refreshed_2": 194.45365922825 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.8771499871, + "Vacc_completed": 1796.0612762347, + "Vacc_refreshed": 390.0186176392, + "Vacc_refreshed_2": 195.0093088196 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14993.5505864267, + "Vacc_completed": 1798.6017730753, + "Vacc_refreshed": 390.5734438836, + "Vacc_refreshed_2": 195.2867219418 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14998.158414122, + "Vacc_completed": 1802.0655230464, + "Vacc_refreshed": 391.8649823662, + "Vacc_refreshed_2": 195.9324911831 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.4313521872, + "Vacc_completed": 1804.413054883, + "Vacc_refreshed": 395.3533451537, + "Vacc_refreshed_2": 197.67667257685 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.7989985243, + "Vacc_completed": 1812.4490035114, + "Vacc_refreshed": 401.8191046925, + "Vacc_refreshed_2": 200.90955234625 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15002.2088852954, + "Vacc_completed": 1814.4865305652, + "Vacc_refreshed": 409.5825438963, + "Vacc_refreshed_2": 204.79127194815 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15008.2705384657, + "Vacc_completed": 1823.0023861142, + "Vacc_refreshed": 411.4567502649, + "Vacc_refreshed_2": 205.72837513245 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15013.4515790087, + "Vacc_completed": 1830.5873803301, + "Vacc_refreshed": 417.6053918266, + "Vacc_refreshed_2": 208.8026959133 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15022.965858679, + "Vacc_completed": 1833.2575088513, + "Vacc_refreshed": 421.7562400513, + "Vacc_refreshed_2": 210.87812002565 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15024.3362350043, + "Vacc_completed": 1839.0848659035, + "Vacc_refreshed": 429.2321579029, + "Vacc_refreshed_2": 214.61607895145 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15025.0436784182, + "Vacc_completed": 1840.7238800201, + "Vacc_refreshed": 434.1256619822, + "Vacc_refreshed_2": 217.0628309911 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15026.1929816575, + "Vacc_completed": 1848.4826094697, + "Vacc_refreshed": 436.1767563509, + "Vacc_refreshed_2": 218.08837817545 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15028.1115762872, + "Vacc_completed": 1851.353962867, + "Vacc_refreshed": 439.6190575403, + "Vacc_refreshed_2": 219.80952877015 + }, + { + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12940.2728292563, + "Vacc_completed": 1761.2082450081, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12944.552426313, + "Vacc_completed": 1763.9916052944, + "Vacc_refreshed": 5.8453121761, + "Vacc_refreshed_2": 2.92265608805 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12946.2293033065, + "Vacc_completed": 1764.8651614651, + "Vacc_refreshed": 11.3614134516, + "Vacc_refreshed_2": 5.6807067258 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12954.4553975676, + "Vacc_completed": 1773.9720915654, + "Vacc_refreshed": 19.8633846559, + "Vacc_refreshed_2": 9.93169232795 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12962.1675537316, + "Vacc_completed": 1776.6871749169, + "Vacc_refreshed": 23.5340750877, + "Vacc_refreshed_2": 11.76703754385 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12970.2114807284, + "Vacc_completed": 1779.4482697767, + "Vacc_refreshed": 32.7047145334, + "Vacc_refreshed_2": 16.3523572667 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12971.1155781651, + "Vacc_completed": 1787.6912361171, + "Vacc_refreshed": 41.3859214133, + "Vacc_refreshed_2": 20.69296070665 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12976.1479148685, + "Vacc_completed": 1796.0609011819, + "Vacc_refreshed": 49.2224218631, + "Vacc_refreshed_2": 24.61121093155 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12985.389251021, + "Vacc_completed": 1806.0439647379, + "Vacc_refreshed": 58.4565372826, + "Vacc_refreshed_2": 29.2282686413 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12987.6528992192, + "Vacc_completed": 1814.2136648594, + "Vacc_refreshed": 68.4133404236, + "Vacc_refreshed_2": 34.2066702118 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12988.8953336446, + "Vacc_completed": 1820.4740554862, + "Vacc_refreshed": 69.4164203636, + "Vacc_refreshed_2": 34.7082101818 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12989.930788247, + "Vacc_completed": 1825.1779692151, + "Vacc_refreshed": 71.594311523, + "Vacc_refreshed_2": 35.7971557615 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12993.9481590439, + "Vacc_completed": 1834.4690603586, + "Vacc_refreshed": 75.4387792504, + "Vacc_refreshed_2": 37.7193896252 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12997.41102572, + "Vacc_completed": 1836.6145856268, + "Vacc_refreshed": 81.7875242048, + "Vacc_refreshed_2": 40.8937621024 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12999.5337504327, + "Vacc_completed": 1839.9662175544, + "Vacc_refreshed": 87.9455065083, + "Vacc_refreshed_2": 43.97275325415 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13007.2251436977, + "Vacc_completed": 1842.6498922014, + "Vacc_refreshed": 93.1900542901, + "Vacc_refreshed_2": 46.59502714505 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13012.0856312446, + "Vacc_completed": 1844.701996872, + "Vacc_refreshed": 99.712698674, + "Vacc_refreshed_2": 49.856349337 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13021.33252246, + "Vacc_completed": 1849.3061445307, + "Vacc_refreshed": 102.5319545699, + "Vacc_refreshed_2": 51.26597728495 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13027.1500152398, + "Vacc_completed": 1850.8078304213, + "Vacc_refreshed": 105.0259857828, + "Vacc_refreshed_2": 52.5129928914 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13035.650988116, + "Vacc_completed": 1851.8577100095, + "Vacc_refreshed": 110.1445342625, + "Vacc_refreshed_2": 55.07226713125 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13042.2123284129, + "Vacc_completed": 1856.2056162281, + "Vacc_refreshed": 113.6459186876, + "Vacc_refreshed_2": 56.8229593438 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13048.5274669921, + "Vacc_completed": 1856.9596604869, + "Vacc_refreshed": 119.7006093985, + "Vacc_refreshed_2": 59.85030469925 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13056.4261041722, + "Vacc_completed": 1859.9946313318, + "Vacc_refreshed": 128.4930741519, + "Vacc_refreshed_2": 64.24653707595 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13061.2580735831, + "Vacc_completed": 1864.4241013454, + "Vacc_refreshed": 129.4122729818, + "Vacc_refreshed_2": 64.7061364909 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13069.8769575412, + "Vacc_completed": 1870.828968765, + "Vacc_refreshed": 133.5606697443, + "Vacc_refreshed_2": 66.78033487215 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13074.4847352314, + "Vacc_completed": 1873.0576602324, + "Vacc_refreshed": 142.5189975609, + "Vacc_refreshed_2": 71.25949878045 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13077.43910001, + "Vacc_completed": 1881.1763507471, + "Vacc_refreshed": 143.4948395736, + "Vacc_refreshed_2": 71.7474197868 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13082.3470601758, + "Vacc_completed": 1888.5808588713, + "Vacc_refreshed": 149.0381282873, + "Vacc_refreshed_2": 74.51906414365 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13091.0962170402, + "Vacc_completed": 1894.9989493108, + "Vacc_refreshed": 149.7527355276, + "Vacc_refreshed_2": 74.8763677638 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13097.0655225667, + "Vacc_completed": 1904.9660517959, + "Vacc_refreshed": 155.7716165644, + "Vacc_refreshed_2": 77.8858082822 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13105.8431803144, + "Vacc_completed": 1907.1233275333, + "Vacc_refreshed": 162.7399373626, + "Vacc_refreshed_2": 81.3699686813 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13110.9052745957, + "Vacc_completed": 1915.3369502585, + "Vacc_refreshed": 166.1686970271, + "Vacc_refreshed_2": 83.08434851355 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13120.2888484357, + "Vacc_completed": 1924.594235894, + "Vacc_refreshed": 174.1871820852, + "Vacc_refreshed_2": 87.0935910426 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13122.2684309305, + "Vacc_completed": 1926.8954039089, + "Vacc_refreshed": 179.1800373951, + "Vacc_refreshed_2": 89.59001869755 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13129.679389954, + "Vacc_completed": 1929.8687720822, + "Vacc_refreshed": 186.5609898946, + "Vacc_refreshed_2": 93.2804949473 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13136.2121968271, + "Vacc_completed": 1930.5419008182, + "Vacc_refreshed": 190.3285119819, + "Vacc_refreshed_2": 95.16425599095 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13140.8693305096, + "Vacc_completed": 1933.1368513989, + "Vacc_refreshed": 199.5045342081, + "Vacc_refreshed_2": 99.75226710405 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13141.6505152789, + "Vacc_completed": 1938.3539275062, + "Vacc_refreshed": 199.9231054484, + "Vacc_refreshed_2": 99.9615527242 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13146.3819720109, + "Vacc_completed": 1943.0787615053, + "Vacc_refreshed": 203.5617342411, + "Vacc_refreshed_2": 101.78086712055 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.5833925737, + "Vacc_completed": 1944.8505615419, + "Vacc_refreshed": 206.5254255239, + "Vacc_refreshed_2": 103.26271276195 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.8864321418, + "Vacc_completed": 1946.7574709443, + "Vacc_refreshed": 208.0171497057, + "Vacc_refreshed_2": 104.00857485285 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13160.8319905342, + "Vacc_completed": 1949.6926878806, + "Vacc_refreshed": 213.0797703475, + "Vacc_refreshed_2": 106.53988517375 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13165.109826694, + "Vacc_completed": 1955.2468047197, + "Vacc_refreshed": 222.6760329578, + "Vacc_refreshed_2": 111.3380164789 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13168.7847714036, + "Vacc_completed": 1956.1809363506, + "Vacc_refreshed": 231.6808966253, + "Vacc_refreshed_2": 115.84044831265 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13176.0869758252, + "Vacc_completed": 1960.8024990411, + "Vacc_refreshed": 233.4328765098, + "Vacc_refreshed_2": 116.7164382549 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13180.123104626, + "Vacc_completed": 1969.8047949709, + "Vacc_refreshed": 241.5696524948, + "Vacc_refreshed_2": 120.7848262474 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13184.6423078124, + "Vacc_completed": 1974.8566545144, + "Vacc_refreshed": 250.4550885677, + "Vacc_refreshed_2": 125.22754428385 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13190.9452560841, + "Vacc_completed": 1975.9346724558, + "Vacc_refreshed": 252.799671753, + "Vacc_refreshed_2": 126.3998358765 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13194.9586490897, + "Vacc_completed": 1984.1998929758, + "Vacc_refreshed": 256.8657355625, + "Vacc_refreshed_2": 128.43286778125 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13203.1981501018, + "Vacc_completed": 1992.2264996957, + "Vacc_refreshed": 262.7110996677, + "Vacc_refreshed_2": 131.35554983385 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13210.570704838, + "Vacc_completed": 2000.1284432323, + "Vacc_refreshed": 268.7466273707, + "Vacc_refreshed_2": 134.37331368535 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13217.6966464936, + "Vacc_completed": 2001.108779963, + "Vacc_refreshed": 270.063420564, + "Vacc_refreshed_2": 135.031710282 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13222.8454105611, + "Vacc_completed": 2006.445790007, + "Vacc_refreshed": 272.306211944, + "Vacc_refreshed_2": 136.153105972 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13231.9459038211, + "Vacc_completed": 2014.1245558198, + "Vacc_refreshed": 274.2682102675, + "Vacc_refreshed_2": 137.13410513375 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.4430744102, + "Vacc_completed": 2021.01783734, + "Vacc_refreshed": 283.272422859, + "Vacc_refreshed_2": 141.6362114295 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.9880313892, + "Vacc_completed": 2021.3278488109, + "Vacc_refreshed": 288.8833613171, + "Vacc_refreshed_2": 144.44168065855 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13244.1020800967, + "Vacc_completed": 2028.5342497408, + "Vacc_refreshed": 295.5476346222, + "Vacc_refreshed_2": 147.7738173111 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13246.2035006005, + "Vacc_completed": 2034.7337820973, + "Vacc_refreshed": 295.8527619766, + "Vacc_refreshed_2": 147.9263809883 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13250.3034672718, + "Vacc_completed": 2040.4526371692, + "Vacc_refreshed": 297.6289642024, + "Vacc_refreshed_2": 148.8144821012 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13258.1309651863, + "Vacc_completed": 2043.9166550693, + "Vacc_refreshed": 307.2590005259, + "Vacc_refreshed_2": 153.62950026295 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13264.00554028, + "Vacc_completed": 2046.5596745193, + "Vacc_refreshed": 309.1250398792, + "Vacc_refreshed_2": 154.5625199396 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.4212557374, + "Vacc_completed": 2049.7116443058, + "Vacc_refreshed": 314.0515587013, + "Vacc_refreshed_2": 157.02577935065 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.7885616679, + "Vacc_completed": 2051.2982177338, + "Vacc_refreshed": 320.3832182075, + "Vacc_refreshed_2": 160.19160910375 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13274.2264538665, + "Vacc_completed": 2058.2989667129, + "Vacc_refreshed": 323.7063680074, + "Vacc_refreshed_2": 161.8531840037 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13281.9141553951, + "Vacc_completed": 2063.8206751836, + "Vacc_refreshed": 326.9158074422, + "Vacc_refreshed_2": 163.4579037211 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13290.64171309, + "Vacc_completed": 2064.3110765988, + "Vacc_refreshed": 336.7710359746, + "Vacc_refreshed_2": 168.3855179873 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.1885069646, + "Vacc_completed": 2072.8766922561, + "Vacc_refreshed": 344.574816718, + "Vacc_refreshed_2": 172.287408359 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.7117921559, + "Vacc_completed": 2081.2889195134, + "Vacc_refreshed": 352.6791052892, + "Vacc_refreshed_2": 176.3395526446 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13295.741331211, + "Vacc_completed": 2082.371745109, + "Vacc_refreshed": 358.7062427923, + "Vacc_refreshed_2": 179.35312139615 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13303.8543248793, + "Vacc_completed": 2084.7970217381, + "Vacc_refreshed": 363.3629273081, + "Vacc_refreshed_2": 181.68146365405 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13305.910901253, + "Vacc_completed": 2089.496376583, + "Vacc_refreshed": 364.4184919111, + "Vacc_refreshed_2": 182.20924595555 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13310.1770755649, + "Vacc_completed": 2091.8877772854, + "Vacc_refreshed": 373.8861441424, + "Vacc_refreshed_2": 186.9430720712 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13318.5822731817, + "Vacc_completed": 2100.0656871327, + "Vacc_refreshed": 380.7622590612, + "Vacc_refreshed_2": 190.3811295306 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13326.848015265, + "Vacc_completed": 2103.7807367097, + "Vacc_refreshed": 383.494468406, + "Vacc_refreshed_2": 191.747234203 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13329.8351558424, + "Vacc_completed": 2106.3811743673, + "Vacc_refreshed": 385.7094999088, + "Vacc_refreshed_2": 192.8547499544 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13334.0243800891, + "Vacc_completed": 2110.0143078684, + "Vacc_refreshed": 387.028737638, + "Vacc_refreshed_2": 193.514368819 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13340.0473805148, + "Vacc_completed": 2114.17877764, + "Vacc_refreshed": 390.7872507231, + "Vacc_refreshed_2": 195.39362536155 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13342.4710995253, + "Vacc_completed": 2117.5584807218, + "Vacc_refreshed": 394.4459716696, + "Vacc_refreshed_2": 197.2229858348 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13345.9586603577, + "Vacc_completed": 2124.6343373595, + "Vacc_refreshed": 401.3739608899, + "Vacc_refreshed_2": 200.68698044495 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13354.1694340722, + "Vacc_completed": 2132.584533812, + "Vacc_refreshed": 404.149558168, + "Vacc_refreshed_2": 202.074779084 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13360.0480186273, + "Vacc_completed": 2135.2279773256, + "Vacc_refreshed": 407.0589420913, + "Vacc_refreshed_2": 203.52947104565 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13362.9287822042, + "Vacc_completed": 2135.7661733179, + "Vacc_refreshed": 412.3495727781, + "Vacc_refreshed_2": 206.17478638905 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13365.9702033874, + "Vacc_completed": 2140.0801351424, + "Vacc_refreshed": 414.1173144704, + "Vacc_refreshed_2": 207.0586572352 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13375.8578305813, + "Vacc_completed": 2147.1687721976, + "Vacc_refreshed": 416.1274613074, + "Vacc_refreshed_2": 208.0637306537 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.3434411484, + "Vacc_completed": 2149.6360498231, + "Vacc_refreshed": 422.5420941028, + "Vacc_refreshed_2": 211.2710470514 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.8386238776, + "Vacc_completed": 2156.2105881723, + "Vacc_refreshed": 428.2913369026, + "Vacc_refreshed_2": 214.1456684513 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13388.7750604929, + "Vacc_completed": 2160.929719286, + "Vacc_refreshed": 437.0909930573, + "Vacc_refreshed_2": 218.54549652865 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13397.0959920005, + "Vacc_completed": 2169.0772334568, + "Vacc_refreshed": 438.0782576038, + "Vacc_refreshed_2": 219.0391288019 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13406.1913483212, + "Vacc_completed": 2172.8397968306, + "Vacc_refreshed": 445.0079409299, + "Vacc_refreshed_2": 222.50397046495 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13410.1064630998, + "Vacc_completed": 2179.4067803849, + "Vacc_refreshed": 453.2550919609, + "Vacc_refreshed_2": 226.62754598045 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.2872479216, + "Vacc_completed": 2183.7956163614, + "Vacc_refreshed": 462.0847473084, + "Vacc_refreshed_2": 231.0423736542 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.7274837683, + "Vacc_completed": 2186.2625889833, + "Vacc_refreshed": 470.3671533805, + "Vacc_refreshed_2": 235.18357669025 + }, + { + "Date": "2020-10-01", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15108.1816487494, + "Vacc_completed": 1951.3500240632, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15112.0388992614, + "Vacc_completed": 1956.8484422205, + "Vacc_refreshed": 4.7764537598, + "Vacc_refreshed_2": 2.3882268799 + }, + { + "Date": "2020-10-03", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15115.1174991099, + "Vacc_completed": 1961.6166149519, + "Vacc_refreshed": 11.6778924479, + "Vacc_refreshed_2": 5.83894622395 + }, + { + "Date": "2020-10-04", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15121.0352670933, + "Vacc_completed": 1969.039883077, + "Vacc_refreshed": 19.464449507, + "Vacc_refreshed_2": 9.7322247535 + }, + { + "Date": "2020-10-05", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15130.8297777562, + "Vacc_completed": 1970.7344191294, + "Vacc_refreshed": 28.0813773392, + "Vacc_refreshed_2": 14.0406886696 + }, + { + "Date": "2020-10-06", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15139.7963570637, + "Vacc_completed": 1971.420038313, + "Vacc_refreshed": 34.2304461363, + "Vacc_refreshed_2": 17.11522306815 + }, + { + "Date": "2020-10-07", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15149.3578353885, + "Vacc_completed": 1977.7986093705, + "Vacc_refreshed": 42.9385547047, + "Vacc_refreshed_2": 21.46927735235 + }, + { + "Date": "2020-10-08", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15150.8906121637, + "Vacc_completed": 1981.6633590428, + "Vacc_refreshed": 46.0030569507, + "Vacc_refreshed_2": 23.00152847535 + }, + { + "Date": "2020-10-09", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15153.3987479409, + "Vacc_completed": 1986.7151251441, + "Vacc_refreshed": 54.9967129669, + "Vacc_refreshed_2": 27.49835648345 + }, + { + "Date": "2020-10-10", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15155.2112066, + "Vacc_completed": 1993.3668502516, + "Vacc_refreshed": 59.2446234015, + "Vacc_refreshed_2": 29.62231170075 + }, + { + "Date": "2020-10-11", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15157.213160056, + "Vacc_completed": 2000.1282773775, + "Vacc_refreshed": 61.576334937, + "Vacc_refreshed_2": 30.7881674685 + }, + { + "Date": "2020-10-12", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15159.7206353696, + "Vacc_completed": 2000.5786646957, + "Vacc_refreshed": 62.4328961844, + "Vacc_refreshed_2": 31.2164480922 + }, + { + "Date": "2020-10-13", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15165.6048851908, + "Vacc_completed": 2000.600816545, + "Vacc_refreshed": 70.2254449832, + "Vacc_refreshed_2": 35.1127224916 + }, + { + "Date": "2020-10-14", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15175.5401574577, + "Vacc_completed": 2003.6984716795, + "Vacc_refreshed": 80.0202808521, + "Vacc_refreshed_2": 40.01014042605 + }, + { + "Date": "2020-10-15", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15178.2193352397, + "Vacc_completed": 2010.5259174304, + "Vacc_refreshed": 80.5289834705, + "Vacc_refreshed_2": 40.26449173525 + }, + { + "Date": "2020-10-16", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15186.1911779287, + "Vacc_completed": 2020.3094769054, + "Vacc_refreshed": 88.939485925, + "Vacc_refreshed_2": 44.4697429625 + }, + { + "Date": "2020-10-17", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15192.9408650715, + "Vacc_completed": 2027.102138126, + "Vacc_refreshed": 93.403990271, + "Vacc_refreshed_2": 46.7019951355 + }, + { + "Date": "2020-10-18", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15197.2522804828, + "Vacc_completed": 2033.1768424672, + "Vacc_refreshed": 103.3495680716, + "Vacc_refreshed_2": 51.6747840358 + }, + { + "Date": "2020-10-19", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15201.4718571012, + "Vacc_completed": 2041.9289374755, + "Vacc_refreshed": 107.0046191576, + "Vacc_refreshed_2": 53.5023095788 + }, + { + "Date": "2020-10-20", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15203.6899934618, + "Vacc_completed": 2042.5550193085, + "Vacc_refreshed": 108.1692912263, + "Vacc_refreshed_2": 54.08464561315 + }, + { + "Date": "2020-10-21", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15210.5751055, + "Vacc_completed": 2049.1508387429, + "Vacc_refreshed": 115.4885047404, + "Vacc_refreshed_2": 57.7442523702 + }, + { + "Date": "2020-10-22", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15216.3570734734, + "Vacc_completed": 2052.3213561982, + "Vacc_refreshed": 119.2061326333, + "Vacc_refreshed_2": 59.60306631665 + }, + { + "Date": "2020-10-23", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15225.8779749457, + "Vacc_completed": 2057.4663468474, + "Vacc_refreshed": 126.226397743, + "Vacc_refreshed_2": 63.1131988715 + }, + { + "Date": "2020-10-24", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15230.8206176005, + "Vacc_completed": 2064.8586744443, + "Vacc_refreshed": 133.0501812916, + "Vacc_refreshed_2": 66.5250906458 + }, + { + "Date": "2020-10-25", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15231.8828151205, + "Vacc_completed": 2068.2097593649, + "Vacc_refreshed": 142.0174284746, + "Vacc_refreshed_2": 71.0087142373 + }, + { + "Date": "2020-10-26", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15238.2426035555, + "Vacc_completed": 2071.8714182096, + "Vacc_refreshed": 148.7355853512, + "Vacc_refreshed_2": 74.3677926756 + }, + { + "Date": "2020-10-27", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15247.7928253295, + "Vacc_completed": 2078.7188555952, + "Vacc_refreshed": 156.2462830057, + "Vacc_refreshed_2": 78.12314150285 + }, + { + "Date": "2020-10-28", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15257.1929610505, + "Vacc_completed": 2083.6123346127, + "Vacc_refreshed": 163.8060000189, + "Vacc_refreshed_2": 81.90300000945 + }, + { + "Date": "2020-10-29", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15261.4225446127, + "Vacc_completed": 2092.4315663384, + "Vacc_refreshed": 165.098643188, + "Vacc_refreshed_2": 82.549321594 + }, + { + "Date": "2020-10-30", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15264.9230201438, + "Vacc_completed": 2098.3647861992, + "Vacc_refreshed": 173.1581071885, + "Vacc_refreshed_2": 86.57905359425 + }, + { + "Date": "2020-10-31", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15274.2090277291, + "Vacc_completed": 2098.6684198619, + "Vacc_refreshed": 179.3045017397, + "Vacc_refreshed_2": 89.65225086985 + }, + { + "Date": "2020-11-01", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15275.4881156514, + "Vacc_completed": 2104.7296501443, + "Vacc_refreshed": 184.3873991738, + "Vacc_refreshed_2": 92.1936995869 + }, + { + "Date": "2020-11-02", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.4296689803, + "Vacc_completed": 2109.0258070133, + "Vacc_refreshed": 190.3361011534, + "Vacc_refreshed_2": 95.1680505767 + }, + { + "Date": "2020-11-03", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.7641225132, + "Vacc_completed": 2111.2503398848, + "Vacc_refreshed": 196.3057900505, + "Vacc_refreshed_2": 98.15289502525 + }, + { + "Date": "2020-11-04", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15280.5288668271, + "Vacc_completed": 2120.2846622436, + "Vacc_refreshed": 201.8816019943, + "Vacc_refreshed_2": 100.94080099715 + }, + { + "Date": "2020-11-05", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15286.6794056665, + "Vacc_completed": 2127.5294418815, + "Vacc_refreshed": 205.8247713924, + "Vacc_refreshed_2": 102.9123856962 + }, + { + "Date": "2020-11-06", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15287.919376399, + "Vacc_completed": 2127.7213986428, + "Vacc_refreshed": 207.0848824799, + "Vacc_refreshed_2": 103.54244123995 + }, + { + "Date": "2020-11-07", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15288.8972252423, + "Vacc_completed": 2131.7043154907, + "Vacc_refreshed": 214.6605013946, + "Vacc_refreshed_2": 107.3302506973 + }, + { + "Date": "2020-11-08", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15295.1676694583, + "Vacc_completed": 2141.6853776317, + "Vacc_refreshed": 217.321705385, + "Vacc_refreshed_2": 108.6608526925 + }, + { + "Date": "2020-11-09", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.8279320379, + "Vacc_completed": 2150.6081907236, + "Vacc_refreshed": 224.1814306469, + "Vacc_refreshed_2": 112.09071532345 + }, + { + "Date": "2020-11-10", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.9502690873, + "Vacc_completed": 2150.8297260642, + "Vacc_refreshed": 224.2857175024, + "Vacc_refreshed_2": 112.1428587512 + }, + { + "Date": "2020-11-11", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15305.4629063272, + "Vacc_completed": 2159.4075137345, + "Vacc_refreshed": 226.4536786248, + "Vacc_refreshed_2": 113.2268393124 + }, + { + "Date": "2020-11-12", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15313.0091699117, + "Vacc_completed": 2160.0885470064, + "Vacc_refreshed": 232.5677391068, + "Vacc_refreshed_2": 116.2838695534 + }, + { + "Date": "2020-11-13", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15316.6742133238, + "Vacc_completed": 2163.6640679748, + "Vacc_refreshed": 242.4458167027, + "Vacc_refreshed_2": 121.22290835135 + }, + { + "Date": "2020-11-14", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15325.7736410299, + "Vacc_completed": 2171.6222500116, + "Vacc_refreshed": 251.5591803171, + "Vacc_refreshed_2": 125.77959015855 + }, + { + "Date": "2020-11-15", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15333.3685319398, + "Vacc_completed": 2174.4162160121, + "Vacc_refreshed": 254.1541702573, + "Vacc_refreshed_2": 127.07708512865 + }, + { + "Date": "2020-11-16", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15337.5758896556, + "Vacc_completed": 2180.7560110181, + "Vacc_refreshed": 255.4491825287, + "Vacc_refreshed_2": 127.72459126435 + }, + { + "Date": "2020-11-17", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15346.8261947795, + "Vacc_completed": 2184.562660479, + "Vacc_refreshed": 256.0794667401, + "Vacc_refreshed_2": 128.03973337005 + }, + { + "Date": "2020-11-18", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15347.5063487999, + "Vacc_completed": 2192.7053918922, + "Vacc_refreshed": 264.8657432896, + "Vacc_refreshed_2": 132.4328716448 + }, + { + "Date": "2020-11-19", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15355.2915215882, + "Vacc_completed": 2197.3639423288, + "Vacc_refreshed": 266.2003474583, + "Vacc_refreshed_2": 133.10017372915 + }, + { + "Date": "2020-11-20", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15357.0291297717, + "Vacc_completed": 2203.5668703416, + "Vacc_refreshed": 266.2591235692, + "Vacc_refreshed_2": 133.1295617846 + }, + { + "Date": "2020-11-21", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15363.7351300479, + "Vacc_completed": 2212.51470716, + "Vacc_refreshed": 268.1554009506, + "Vacc_refreshed_2": 134.0777004753 + }, + { + "Date": "2020-11-22", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15366.2054877706, + "Vacc_completed": 2220.7805776981, + "Vacc_refreshed": 270.2429125628, + "Vacc_refreshed_2": 135.1214562814 + }, + { + "Date": "2020-11-23", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15374.7828886007, + "Vacc_completed": 2223.4779151007, + "Vacc_refreshed": 271.3258668517, + "Vacc_refreshed_2": 135.66293342585 + }, + { + "Date": "2020-11-24", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15375.8644766411, + "Vacc_completed": 2223.902202818, + "Vacc_refreshed": 277.3418287874, + "Vacc_refreshed_2": 138.6709143937 + }, + { + "Date": "2020-11-25", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15384.0103684975, + "Vacc_completed": 2233.2600148125, + "Vacc_refreshed": 286.2795142721, + "Vacc_refreshed_2": 143.13975713605 + }, + { + "Date": "2020-11-26", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15388.2433647335, + "Vacc_completed": 2242.2405085188, + "Vacc_refreshed": 295.9058348626, + "Vacc_refreshed_2": 147.9529174313 + }, + { + "Date": "2020-11-27", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15395.874552707, + "Vacc_completed": 2242.5126967683, + "Vacc_refreshed": 297.0217883024, + "Vacc_refreshed_2": 148.5108941512 + }, + { + "Date": "2020-11-28", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15399.399317417, + "Vacc_completed": 2250.19318626, + "Vacc_refreshed": 297.4497074595, + "Vacc_refreshed_2": 148.72485372975 + }, + { + "Date": "2020-11-29", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15407.4994879004, + "Vacc_completed": 2258.8146667712, + "Vacc_refreshed": 302.8025504676, + "Vacc_refreshed_2": 151.4012752338 + }, + { + "Date": "2020-11-30", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15410.1346998553, + "Vacc_completed": 2259.5361618465, + "Vacc_refreshed": 305.0699464575, + "Vacc_refreshed_2": 152.53497322875 + }, + { + "Date": "2020-12-01", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15415.5662938607, + "Vacc_completed": 2266.2419298528, + "Vacc_refreshed": 306.5583985118, + "Vacc_refreshed_2": 153.2791992559 + }, + { + "Date": "2020-12-02", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15424.362408066, + "Vacc_completed": 2270.6973906417, + "Vacc_refreshed": 307.7300944183, + "Vacc_refreshed_2": 153.86504720915 + }, + { + "Date": "2020-12-03", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15427.4641661532, + "Vacc_completed": 2273.4475287465, + "Vacc_refreshed": 315.9257071161, + "Vacc_refreshed_2": 157.96285355805 + }, + { + "Date": "2020-12-04", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15430.3003374401, + "Vacc_completed": 2280.4953549554, + "Vacc_refreshed": 320.4057109928, + "Vacc_refreshed_2": 160.2028554964 + }, + { + "Date": "2020-12-05", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15434.7161891817, + "Vacc_completed": 2283.6641990131, + "Vacc_refreshed": 329.6425079267, + "Vacc_refreshed_2": 164.82125396335 + }, + { + "Date": "2020-12-06", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15439.6389263804, + "Vacc_completed": 2286.269595866, + "Vacc_refreshed": 336.6032551175, + "Vacc_refreshed_2": 168.30162755875 + }, + { + "Date": "2020-12-07", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.607595077, + "Vacc_completed": 2292.1795115763, + "Vacc_refreshed": 339.4752869467, + "Vacc_refreshed_2": 169.73764347335 + }, + { + "Date": "2020-12-08", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.7317234732, + "Vacc_completed": 2299.0428376394, + "Vacc_refreshed": 342.2213588852, + "Vacc_refreshed_2": 171.1106794426 + }, + { + "Date": "2020-12-09", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15448.8137925508, + "Vacc_completed": 2303.3104194582, + "Vacc_refreshed": 346.3780017598, + "Vacc_refreshed_2": 173.1890008799 + }, + { + "Date": "2020-12-10", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15449.4812178935, + "Vacc_completed": 2311.9261799324, + "Vacc_refreshed": 351.1765190663, + "Vacc_refreshed_2": 175.58825953315 + }, + { + "Date": "2020-12-11", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9089483618, + "Vacc_completed": 2315.5711542884, + "Vacc_refreshed": 352.532745084, + "Vacc_refreshed_2": 176.266372542 + }, + { + "Date": "2020-12-12", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9943266817, + "Vacc_completed": 2322.1716179078, + "Vacc_refreshed": 355.0774800773, + "Vacc_refreshed_2": 177.53874003865 + }, + { + "Date": "2020-12-13", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15459.7074068986, + "Vacc_completed": 2323.3027059178, + "Vacc_refreshed": 364.5645466744, + "Vacc_refreshed_2": 182.2822733372 + }, + { + "Date": "2020-12-14", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15465.686171573, + "Vacc_completed": 2325.8040208828, + "Vacc_refreshed": 365.9637341301, + "Vacc_refreshed_2": 182.98186706505 + }, + { + "Date": "2020-12-15", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15466.2025927257, + "Vacc_completed": 2332.7537065257, + "Vacc_refreshed": 366.2841969775, + "Vacc_refreshed_2": 183.14209848875 + }, + { + "Date": "2020-12-16", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15471.0643499093, + "Vacc_completed": 2333.7718947218, + "Vacc_refreshed": 370.7174701468, + "Vacc_refreshed_2": 185.3587350734 + }, + { + "Date": "2020-12-17", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15480.1820736709, + "Vacc_completed": 2336.425519339, + "Vacc_refreshed": 378.1719392306, + "Vacc_refreshed_2": 189.0859696153 + }, + { + "Date": "2020-12-18", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15489.2619602904, + "Vacc_completed": 2342.4314320637, + "Vacc_refreshed": 382.1070985379, + "Vacc_refreshed_2": 191.05354926895 + }, + { + "Date": "2020-12-19", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15497.197059921, + "Vacc_completed": 2351.5508059781, + "Vacc_refreshed": 390.0131449372, + "Vacc_refreshed_2": 195.0065724686 + }, + { + "Date": "2020-12-20", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15506.8997820546, + "Vacc_completed": 2354.7951207515, + "Vacc_refreshed": 397.4755552416, + "Vacc_refreshed_2": 198.7377776208 + }, + { + "Date": "2020-12-21", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15514.6356932026, + "Vacc_completed": 2359.4543858263, + "Vacc_refreshed": 405.5265192328, + "Vacc_refreshed_2": 202.7632596164 + }, + { + "Date": "2020-12-22", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15517.1065215082, + "Vacc_completed": 2362.3705119741, + "Vacc_refreshed": 406.2503084488, + "Vacc_refreshed_2": 203.1251542244 + }, + { + "Date": "2020-12-23", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15526.1890623234, + "Vacc_completed": 2369.2123027947, + "Vacc_refreshed": 407.9863557734, + "Vacc_refreshed_2": 203.9931778867 + }, + { + "Date": "2020-12-24", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15529.1257916241, + "Vacc_completed": 2371.0230854052, + "Vacc_refreshed": 415.4330021443, + "Vacc_refreshed_2": 207.71650107215 + }, + { + "Date": "2020-12-25", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15534.1422800755, + "Vacc_completed": 2376.4314141852, + "Vacc_refreshed": 417.8710629027, + "Vacc_refreshed_2": 208.93553145135 + }, + { + "Date": "2020-12-26", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15536.9779956012, + "Vacc_completed": 2380.9412020655, + "Vacc_refreshed": 418.6065556413, + "Vacc_refreshed_2": 209.30327782065 + }, + { + "Date": "2020-12-27", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15542.623117778, + "Vacc_completed": 2383.2295524317, + "Vacc_refreshed": 425.5318613018, + "Vacc_refreshed_2": 212.7659306509 + }, + { + "Date": "2020-12-28", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15545.7349127212, + "Vacc_completed": 2388.7438112703, + "Vacc_refreshed": 435.2708995295, + "Vacc_refreshed_2": 217.63544976475 + }, + { + "Date": "2020-12-29", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15552.7663039717, + "Vacc_completed": 2398.7179519564, + "Vacc_refreshed": 436.7806978293, + "Vacc_refreshed_2": 218.39034891465 + }, + { + "Date": "2020-12-30", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15553.9038494269, + "Vacc_completed": 2401.9470135031, + "Vacc_refreshed": 445.294989416, + "Vacc_refreshed_2": 222.647494708 + }, + { + "Date": "2020-12-31", + "ID_District": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15563.5219522465, + "Vacc_completed": 2408.3277109489, + "Vacc_refreshed": 449.1868908695, + "Vacc_refreshed_2": 224.59344543475 } -] +] \ No newline at end of file diff --git a/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json b/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json index 38ba2a8c95..0716826088 100644 --- a/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json +++ b/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json @@ -1,4418 +1,4970 @@ [ { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14093.5670993244, - "Vacc_completed":1058.2133302677, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14094.6780758432, - "Vacc_completed":1058.2386490178, - "Vacc_refreshed":3.9480185817 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14102.3458622773, - "Vacc_completed":1063.1811826304, - "Vacc_refreshed":7.8235846725 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14106.0158477852, - "Vacc_completed":1071.0829580916, - "Vacc_refreshed":13.0365435255 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14115.8958402416, - "Vacc_completed":1072.5136218055, - "Vacc_refreshed":15.4582843201 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14116.0603009948, - "Vacc_completed":1080.8706574256, - "Vacc_refreshed":22.3037298829 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14124.4849162097, - "Vacc_completed":1087.4957123195, - "Vacc_refreshed":27.7666004775 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14132.812800891, - "Vacc_completed":1094.2936630058, - "Vacc_refreshed":29.4212640594 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14139.2772895404, - "Vacc_completed":1100.1665827188, - "Vacc_refreshed":29.4568827793 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14145.4868397119, - "Vacc_completed":1105.3345419667, - "Vacc_refreshed":34.7217238502 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14147.7480966959, - "Vacc_completed":1111.2289166538, - "Vacc_refreshed":34.771310214 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14154.5204084505, - "Vacc_completed":1114.7870563855, - "Vacc_refreshed":41.8898823514 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14155.4472543415, - "Vacc_completed":1124.6385432496, - "Vacc_refreshed":48.6348857735 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14162.2764203336, - "Vacc_completed":1128.54825128, - "Vacc_refreshed":48.7694054724 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14163.6229511244, - "Vacc_completed":1128.7143765883, - "Vacc_refreshed":53.2059941772 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14170.704731349, - "Vacc_completed":1138.0466956792, - "Vacc_refreshed":59.0394633797 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14177.9754226866, - "Vacc_completed":1144.8391611423, - "Vacc_refreshed":68.7607294969 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14180.6917277285, - "Vacc_completed":1145.8477444825, - "Vacc_refreshed":68.9221667424 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14183.6510488722, - "Vacc_completed":1148.5261706572, - "Vacc_refreshed":74.1781085786 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14187.685478561, - "Vacc_completed":1156.317724845, - "Vacc_refreshed":82.4605426733 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14190.8756861073, - "Vacc_completed":1158.3230049846, - "Vacc_refreshed":85.9686058349 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14194.7125443701, - "Vacc_completed":1162.8869701267, - "Vacc_refreshed":86.9745448839 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14198.1736788429, - "Vacc_completed":1172.5122981568, - "Vacc_refreshed":87.3520867387 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14200.0337444888, - "Vacc_completed":1173.9022323601, - "Vacc_refreshed":96.1323881978 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14209.9091251899, - "Vacc_completed":1180.4819879148, - "Vacc_refreshed":102.8081520102 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14215.7510791988, - "Vacc_completed":1187.6749019896, - "Vacc_refreshed":111.0676626302 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14216.891975169, - "Vacc_completed":1194.8246181318, - "Vacc_refreshed":112.2172983632 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14226.1128719795, - "Vacc_completed":1199.3288757923, - "Vacc_refreshed":115.0035825103 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14234.2678640476, - "Vacc_completed":1200.3667784603, - "Vacc_refreshed":122.2552339507 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14236.1003192184, - "Vacc_completed":1204.1967603181, - "Vacc_refreshed":127.0429292216 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14242.538633822, - "Vacc_completed":1212.5454877324, - "Vacc_refreshed":134.6939665016 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14244.3387278104, - "Vacc_completed":1213.6034702862, - "Vacc_refreshed":136.0920891424 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14251.4120506037, - "Vacc_completed":1216.4725302456, - "Vacc_refreshed":140.2813449601 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14260.7111088561, - "Vacc_completed":1223.9349650326, - "Vacc_refreshed":144.4607939662 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.4310619138, - "Vacc_completed":1230.2964929538, - "Vacc_refreshed":149.281965675 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.8430243455, - "Vacc_completed":1233.791799902, - "Vacc_refreshed":152.843700775 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14270.6723528208, - "Vacc_completed":1235.7852283109, - "Vacc_refreshed":158.6087157945 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14276.398217781, - "Vacc_completed":1244.1189399585, - "Vacc_refreshed":161.780101215 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14282.7632141243, - "Vacc_completed":1252.4246776385, - "Vacc_refreshed":164.4087953839 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14285.2172118541, - "Vacc_completed":1253.0967186007, - "Vacc_refreshed":165.7333648079 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14288.3981413127, - "Vacc_completed":1261.2285273698, - "Vacc_refreshed":175.6751183454 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14296.6990830234, - "Vacc_completed":1261.8928424603, - "Vacc_refreshed":181.3746988194 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14304.9324135674, - "Vacc_completed":1268.1858225933, - "Vacc_refreshed":182.8207287588 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14312.7990335985, - "Vacc_completed":1270.8693167453, - "Vacc_refreshed":192.6352794711 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14316.0317804647, - "Vacc_completed":1276.8328604136, - "Vacc_refreshed":199.109084232 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14317.8224126817, - "Vacc_completed":1285.9345839202, - "Vacc_refreshed":204.9564534429 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14319.969225103, - "Vacc_completed":1292.0814432843, - "Vacc_refreshed":209.3116185701 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14325.5010146205, - "Vacc_completed":1296.8562638588, - "Vacc_refreshed":214.164106287 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14334.64723979, - "Vacc_completed":1299.2846390455, - "Vacc_refreshed":215.8187786169 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14341.3416549169, - "Vacc_completed":1307.3997120401, - "Vacc_refreshed":220.1718442512 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14349.3146443239, - "Vacc_completed":1309.8026404332, - "Vacc_refreshed":222.9315364644 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14359.2839765392, - "Vacc_completed":1313.6592234511, - "Vacc_refreshed":226.6469703335 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14365.2176903694, - "Vacc_completed":1319.2137305156, - "Vacc_refreshed":227.7079880211 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14372.2949635005, - "Vacc_completed":1325.3928078641, - "Vacc_refreshed":234.0214496372 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14377.1100641854, - "Vacc_completed":1326.7384263101, - "Vacc_refreshed":242.1400638609 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14381.7559278649, - "Vacc_completed":1329.4413693873, - "Vacc_refreshed":246.2374710913 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14385.7162526455, - "Vacc_completed":1338.1839321545, - "Vacc_refreshed":252.0149200475 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14389.4326934411, - "Vacc_completed":1345.9094675595, - "Vacc_refreshed":256.9046042339 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14391.2007554132, - "Vacc_completed":1348.71606757, - "Vacc_refreshed":258.1776032516 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14394.8621297613, - "Vacc_completed":1354.2416050796, - "Vacc_refreshed":267.8589065036 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.3456243909, - "Vacc_completed":1359.868800934, - "Vacc_refreshed":270.9855298163 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.4645205246, - "Vacc_completed":1363.0538159145, - "Vacc_refreshed":275.840425604 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14399.1657319944, - "Vacc_completed":1365.5993182323, - "Vacc_refreshed":277.5856365007 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14402.7230837573, - "Vacc_completed":1368.6201543223, - "Vacc_refreshed":286.3361695339 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14403.1500082752, - "Vacc_completed":1371.4419603277, - "Vacc_refreshed":291.9429549926 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14409.601025491, - "Vacc_completed":1375.0385110041, - "Vacc_refreshed":294.4838831323 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.5992098988, - "Vacc_completed":1379.7282797993, - "Vacc_refreshed":304.3709721295 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.7379664054, - "Vacc_completed":1388.4437755617, - "Vacc_refreshed":310.9469195789 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14413.0256783966, - "Vacc_completed":1395.0228908154, - "Vacc_refreshed":316.1322991564 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14418.5923400284, - "Vacc_completed":1395.4421160716, - "Vacc_refreshed":324.326203234 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14427.1006875636, - "Vacc_completed":1400.9550416303, - "Vacc_refreshed":326.1675291407 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14428.1259159444, - "Vacc_completed":1401.6589165675, - "Vacc_refreshed":336.1473853823 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14429.6710322591, - "Vacc_completed":1406.4316961423, - "Vacc_refreshed":338.7341080527 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14435.5405186058, - "Vacc_completed":1406.8193757343, - "Vacc_refreshed":348.5515447081 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14440.6128511884, - "Vacc_completed":1406.8790930463, - "Vacc_refreshed":349.9224707035 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14448.1553470558, - "Vacc_completed":1407.8576900416, - "Vacc_refreshed":354.7521313753 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14456.4196110425, - "Vacc_completed":1411.7530351787, - "Vacc_refreshed":361.5526839017 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14466.1757833279, - "Vacc_completed":1412.4941157515, - "Vacc_refreshed":364.0766791828 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14472.9152722164, - "Vacc_completed":1421.7399661156, - "Vacc_refreshed":371.2418954122 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14474.3971159945, - "Vacc_completed":1423.8796012137, - "Vacc_refreshed":378.3445685688 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14482.9259977884, - "Vacc_completed":1428.8212618966, - "Vacc_refreshed":382.6712538747 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14491.6837567491, - "Vacc_completed":1430.1481016913, - "Vacc_refreshed":392.5489632959 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14499.5728298642, - "Vacc_completed":1439.468906008, - "Vacc_refreshed":397.6649554861 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14500.4884339857, - "Vacc_completed":1447.6074532094, - "Vacc_refreshed":404.4236802991 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14508.6628209678, - "Vacc_completed":1449.1955087396, - "Vacc_refreshed":413.1290507873 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14509.0177335192, - "Vacc_completed":1457.0313439789, - "Vacc_refreshed":418.6984801264 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14518.7925361684, - "Vacc_completed":1462.4055060107, - "Vacc_refreshed":419.6070699812 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14522.121758092, - "Vacc_completed":1468.1811367429, - "Vacc_refreshed":425.9772045183 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14528.5474917037, - "Vacc_completed":1473.5164593205, - "Vacc_refreshed":435.7810319021 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14536.5601109176, - "Vacc_completed":1481.2704120463, - "Vacc_refreshed":438.2410199432 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14542.1473955627, - "Vacc_completed":1482.7064631605, - "Vacc_refreshed":445.3488141502 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14544.5952478081, - "Vacc_completed":1486.0552178086, - "Vacc_refreshed":446.1812966093 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10765.9941189788, - "Vacc_completed":1603.3500569399, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.3717745702, - "Vacc_completed":1605.3068408797, - "Vacc_refreshed":3.6283182226 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.4956401429, - "Vacc_completed":1610.6119068185, - "Vacc_refreshed":6.1967396209 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10774.4184508751, - "Vacc_completed":1613.016161978, - "Vacc_refreshed":15.7069691534 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10780.8073818373, - "Vacc_completed":1622.1917795654, - "Vacc_refreshed":20.1697274397 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10785.5287460006, - "Vacc_completed":1625.0602525893, - "Vacc_refreshed":22.4671684217 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10790.1084610651, - "Vacc_completed":1627.3787523231, - "Vacc_refreshed":28.5217462646 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10796.2300309, - "Vacc_completed":1630.4363483664, - "Vacc_refreshed":35.3070676184 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10801.7222904172, - "Vacc_completed":1638.725087864, - "Vacc_refreshed":43.7679344272 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10804.7724722766, - "Vacc_completed":1646.4905335365, - "Vacc_refreshed":44.1718542676 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10814.3453353804, - "Vacc_completed":1650.9992837124, - "Vacc_refreshed":49.5204655539 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10821.6255112157, - "Vacc_completed":1656.4335840831, - "Vacc_refreshed":52.7009855172 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10830.9379325639, - "Vacc_completed":1657.186187271, - "Vacc_refreshed":56.5428649986 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10838.202902864, - "Vacc_completed":1662.1470499364, - "Vacc_refreshed":58.6277824858 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10840.8786753296, - "Vacc_completed":1670.6860254071, - "Vacc_refreshed":58.7593924743 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10843.7453960183, - "Vacc_completed":1673.6372365137, - "Vacc_refreshed":61.8595630166 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10849.1151892515, - "Vacc_completed":1675.1066023109, - "Vacc_refreshed":64.6020615007 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10850.9329685403, - "Vacc_completed":1679.1505675366, - "Vacc_refreshed":72.0237510859 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10854.4610677614, - "Vacc_completed":1681.5473018047, - "Vacc_refreshed":75.0145349272 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10858.0662824418, - "Vacc_completed":1688.7179113019, - "Vacc_refreshed":82.7641475111 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10867.8357803799, - "Vacc_completed":1688.741478882, - "Vacc_refreshed":92.1411476813 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10877.245759177, - "Vacc_completed":1696.3354153291, - "Vacc_refreshed":93.5350586202 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10878.9277486403, - "Vacc_completed":1704.5169058825, - "Vacc_refreshed":99.9257252117 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10881.5163902637, - "Vacc_completed":1704.5184844203, - "Vacc_refreshed":104.0563799981 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10882.0628121233, - "Vacc_completed":1710.1811092467, - "Vacc_refreshed":110.998904559 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10884.1868939764, - "Vacc_completed":1711.6669667815, - "Vacc_refreshed":119.5835613879 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10890.26315895, - "Vacc_completed":1712.8219244738, - "Vacc_refreshed":126.203975023 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10894.6858788747, - "Vacc_completed":1721.7467435031, - "Vacc_refreshed":135.9649739788 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10897.5575288795, - "Vacc_completed":1721.7787127468, - "Vacc_refreshed":145.614673399 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10903.1231721286, - "Vacc_completed":1724.7269587992, - "Vacc_refreshed":149.6717929743 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10911.1763853993, - "Vacc_completed":1726.3071857535, - "Vacc_refreshed":158.0496522084 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10919.5582023277, - "Vacc_completed":1727.9236223535, - "Vacc_refreshed":160.5751263702 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10920.4962369047, - "Vacc_completed":1730.7211296321, - "Vacc_refreshed":162.2038531114 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10930.0062994591, - "Vacc_completed":1733.2273616859, - "Vacc_refreshed":164.6178844659 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10931.0781786076, - "Vacc_completed":1743.0639116966, - "Vacc_refreshed":171.6949336111 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10936.2371584575, - "Vacc_completed":1743.4973637943, - "Vacc_refreshed":173.1954991423 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10937.1969149599, - "Vacc_completed":1752.0043206175, - "Vacc_refreshed":173.4521249531 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10942.5829785849, - "Vacc_completed":1758.5438162851, - "Vacc_refreshed":175.0971428389 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10945.8458051779, - "Vacc_completed":1765.593119461, - "Vacc_refreshed":184.781293552 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10955.2619609788, - "Vacc_completed":1766.7516696253, - "Vacc_refreshed":194.3279051811 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0529992794, - "Vacc_completed":1774.4096958807, - "Vacc_refreshed":199.3585168564 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0740456643, - "Vacc_completed":1776.7353479155, - "Vacc_refreshed":200.2783085421 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7647446192, - "Vacc_completed":1786.1838226639, - "Vacc_refreshed":202.522841172 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7950553291, - "Vacc_completed":1788.5013884886, - "Vacc_refreshed":205.1107008609 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10973.1049316279, - "Vacc_completed":1790.2712267193, - "Vacc_refreshed":214.0688577867 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10976.2696576646, - "Vacc_completed":1797.8582422894, - "Vacc_refreshed":219.0460187772 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10984.9161656634, - "Vacc_completed":1801.5924446935, - "Vacc_refreshed":227.656626047 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10994.063273181, - "Vacc_completed":1802.6817444812, - "Vacc_refreshed":235.6032823069 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10996.8771305673, - "Vacc_completed":1802.9071097171, - "Vacc_refreshed":237.7242073629 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11002.0527900673, - "Vacc_completed":1809.5395950318, - "Vacc_refreshed":241.3631599251 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11007.1528572096, - "Vacc_completed":1813.9025489723, - "Vacc_refreshed":245.5305344153 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11013.1337350258, - "Vacc_completed":1821.5275057931, - "Vacc_refreshed":250.3168579858 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11015.6696905796, - "Vacc_completed":1822.9598630397, - "Vacc_refreshed":255.6335351411 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11023.4754023371, - "Vacc_completed":1827.2471461973, - "Vacc_refreshed":265.5951098299 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11032.8284479669, - "Vacc_completed":1827.5539031975, - "Vacc_refreshed":267.3513136054 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.3845078238, - "Vacc_completed":1828.9970028031, - "Vacc_refreshed":270.5903250252 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.693720803, - "Vacc_completed":1836.2049019351, - "Vacc_refreshed":272.0758803579 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11047.8242120991, - "Vacc_completed":1837.1027842122, - "Vacc_refreshed":275.2277393803 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11053.900379851, - "Vacc_completed":1838.273599421, - "Vacc_refreshed":282.2344875735 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11059.6633767419, - "Vacc_completed":1845.0089267377, - "Vacc_refreshed":284.3140546038 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11068.9288674107, - "Vacc_completed":1852.7615624634, - "Vacc_refreshed":287.0304142153 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11072.6595101177, - "Vacc_completed":1857.871819743, - "Vacc_refreshed":289.2733395979 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11082.5784142097, - "Vacc_completed":1865.7647392626, - "Vacc_refreshed":291.3426551576 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11089.5185616411, - "Vacc_completed":1869.3958231852, - "Vacc_refreshed":299.8179962185 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11097.3087770941, - "Vacc_completed":1878.7026117675, - "Vacc_refreshed":306.1608208876 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11101.8508357142, - "Vacc_completed":1879.7270518854, - "Vacc_refreshed":308.0716738039 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11103.0915214706, - "Vacc_completed":1883.5574266434, - "Vacc_refreshed":311.2801806804 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11111.9334619087, - "Vacc_completed":1887.7967037043, - "Vacc_refreshed":320.2156677375 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11118.8667730664, - "Vacc_completed":1896.6793284207, - "Vacc_refreshed":321.8561637233 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11123.0290736537, - "Vacc_completed":1902.1985445903, - "Vacc_refreshed":328.4656069808 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11129.3471714321, - "Vacc_completed":1902.2057666507, - "Vacc_refreshed":334.8734059386 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11137.9949570833, - "Vacc_completed":1907.7915885083, - "Vacc_refreshed":339.9783670978 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11139.4617826874, - "Vacc_completed":1910.6126501167, - "Vacc_refreshed":342.8472462544 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11144.4191917936, - "Vacc_completed":1917.8558172992, - "Vacc_refreshed":351.3104814196 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11153.423123173, - "Vacc_completed":1927.8115362669, - "Vacc_refreshed":359.1887782128 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11155.4646855253, - "Vacc_completed":1931.0938823989, - "Vacc_refreshed":363.4217582407 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11164.8755655095, - "Vacc_completed":1932.0922021433, - "Vacc_refreshed":369.5881371093 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11168.2127634861, - "Vacc_completed":1937.8864562316, - "Vacc_refreshed":371.2850357688 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11170.3919325879, - "Vacc_completed":1943.9625258254, - "Vacc_refreshed":372.564368772 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11178.2156716034, - "Vacc_completed":1946.3680545291, - "Vacc_refreshed":377.1791450411 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11187.7206334256, - "Vacc_completed":1950.3408321869, - "Vacc_refreshed":385.28114877 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11189.2295548943, - "Vacc_completed":1952.7801877326, - "Vacc_refreshed":386.4768386941 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11193.8090943925, - "Vacc_completed":1960.5337079214, - "Vacc_refreshed":395.6463777137 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11198.0758128722, - "Vacc_completed":1964.4220756604, - "Vacc_refreshed":404.4005517293 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11200.1395546734, - "Vacc_completed":1974.1843879258, - "Vacc_refreshed":410.4354615606 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.0858861212, - "Vacc_completed":1978.0710124849, - "Vacc_refreshed":414.2205337181 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.5521637654, - "Vacc_completed":1981.3589179628, - "Vacc_refreshed":419.5840242501 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11211.6562498266, - "Vacc_completed":1989.6665585254, - "Vacc_refreshed":426.6154672823 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11219.1926870115, - "Vacc_completed":1996.1459430488, - "Vacc_refreshed":430.16915603 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11221.4656474699, - "Vacc_completed":2001.4601213853, - "Vacc_refreshed":430.8770850788 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11224.2379660032, - "Vacc_completed":2006.2961081678, - "Vacc_refreshed":433.8074021391 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11229.137503588, - "Vacc_completed":2013.2392255015, - "Vacc_refreshed":441.1218403265 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15118.5419446559, - "Vacc_completed":1046.4766182565, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15127.0441726861, - "Vacc_completed":1051.8189573454, - "Vacc_refreshed":4.7668817312 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15134.2198668737, - "Vacc_completed":1051.8898550539, - "Vacc_refreshed":6.8954841457 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15138.5012633389, - "Vacc_completed":1054.1938291422, - "Vacc_refreshed":12.8850967826 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15140.019297286, - "Vacc_completed":1057.2812920036, - "Vacc_refreshed":15.610006044 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15141.0655653453, - "Vacc_completed":1061.1873607435, - "Vacc_refreshed":18.0052067519 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15146.6047446953, - "Vacc_completed":1067.3953196211, - "Vacc_refreshed":27.5155266211 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15150.2459378898, - "Vacc_completed":1077.315397207, - "Vacc_refreshed":28.0742687581 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15153.3836683973, - "Vacc_completed":1082.8237823387, - "Vacc_refreshed":32.6629347887 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15155.2486658897, - "Vacc_completed":1087.8721865368, - "Vacc_refreshed":42.082807235 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15157.4630323429, - "Vacc_completed":1090.0916620904, - "Vacc_refreshed":43.8436800298 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15158.7941750828, - "Vacc_completed":1091.8322828475, - "Vacc_refreshed":44.7371311455 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15159.4697179186, - "Vacc_completed":1097.9581123146, - "Vacc_refreshed":52.5410403094 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15166.8797207146, - "Vacc_completed":1103.4838023049, - "Vacc_refreshed":58.4482610787 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.177591783, - "Vacc_completed":1107.529236183, - "Vacc_refreshed":61.868532741 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.3473624207, - "Vacc_completed":1108.0854442406, - "Vacc_refreshed":64.122741794 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15176.6656703161, - "Vacc_completed":1114.7623442184, - "Vacc_refreshed":73.3909194547 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15182.6538662202, - "Vacc_completed":1121.0967139584, - "Vacc_refreshed":78.4108273222 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15191.0826029366, - "Vacc_completed":1124.8733122731, - "Vacc_refreshed":88.1249123157 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15195.1567917247, - "Vacc_completed":1133.1683853487, - "Vacc_refreshed":94.0586819047 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15197.6523517992, - "Vacc_completed":1140.1742056487, - "Vacc_refreshed":97.7116921077 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15202.8832794911, - "Vacc_completed":1140.4207518542, - "Vacc_refreshed":101.0390519368 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15209.502983548, - "Vacc_completed":1144.1138351675, - "Vacc_refreshed":104.5568369595 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15218.5591667959, - "Vacc_completed":1153.0110444013, - "Vacc_refreshed":111.8121115483 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15223.6275127037, - "Vacc_completed":1157.3585549388, - "Vacc_refreshed":113.9066704897 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.4100349304, - "Vacc_completed":1162.1581378525, - "Vacc_refreshed":116.416758139 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.7888080253, - "Vacc_completed":1166.5300160643, - "Vacc_refreshed":119.2414894864 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15235.240974732, - "Vacc_completed":1171.76423914, - "Vacc_refreshed":129.0137217302 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15236.252829019, - "Vacc_completed":1174.1820893055, - "Vacc_refreshed":130.8298102316 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15244.5996289271, - "Vacc_completed":1181.3457343202, - "Vacc_refreshed":138.0198133972 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15247.7688417561, - "Vacc_completed":1186.4632437534, - "Vacc_refreshed":147.549469044 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15254.8324409461, - "Vacc_completed":1196.0640695451, - "Vacc_refreshed":148.035813332 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15263.9056700401, - "Vacc_completed":1202.0195228295, - "Vacc_refreshed":152.9647063671 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15271.3608079113, - "Vacc_completed":1205.9189472233, - "Vacc_refreshed":159.4326071199 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15274.5391192733, - "Vacc_completed":1209.5333389579, - "Vacc_refreshed":165.8197711746 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15279.9252173752, - "Vacc_completed":1217.5022918804, - "Vacc_refreshed":170.1668415009 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15289.6429605219, - "Vacc_completed":1218.0921627258, - "Vacc_refreshed":176.8858359396 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15297.4452269777, - "Vacc_completed":1218.4916546179, - "Vacc_refreshed":177.0224757358 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15304.6068820067, - "Vacc_completed":1221.1648349639, - "Vacc_refreshed":182.8363512803 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15308.4472782837, - "Vacc_completed":1221.3254317254, - "Vacc_refreshed":188.4124431026 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15313.3535420035, - "Vacc_completed":1228.797689569, - "Vacc_refreshed":197.4958413402 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15319.6989570363, - "Vacc_completed":1230.5766158569, - "Vacc_refreshed":207.1280776834 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15329.2757609065, - "Vacc_completed":1232.5532561558, - "Vacc_refreshed":216.6030971785 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15331.3854251166, - "Vacc_completed":1240.7858568563, - "Vacc_refreshed":224.0947128601 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15335.6254694555, - "Vacc_completed":1248.7648628072, - "Vacc_refreshed":228.3914917972 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15342.4956408139, - "Vacc_completed":1253.345700271, - "Vacc_refreshed":237.7873655386 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15349.2985100866, - "Vacc_completed":1254.923228178, - "Vacc_refreshed":243.7398150729 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.0642849231, - "Vacc_completed":1256.1247258557, - "Vacc_refreshed":246.0998008594 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.3098206871, - "Vacc_completed":1258.7673082658, - "Vacc_refreshed":255.4830156808 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.8477668821, - "Vacc_completed":1261.8739088788, - "Vacc_refreshed":262.4150374381 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15355.0053188609, - "Vacc_completed":1268.7063064011, - "Vacc_refreshed":268.0354130392 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15356.8245202899, - "Vacc_completed":1275.6335562552, - "Vacc_refreshed":272.2800844077 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15357.7799420851, - "Vacc_completed":1276.6526923528, - "Vacc_refreshed":272.4509982396 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15360.090059624, - "Vacc_completed":1286.3717718947, - "Vacc_refreshed":276.5108897334 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15368.9251730685, - "Vacc_completed":1289.9608638772, - "Vacc_refreshed":286.1598516049 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15374.4348532349, - "Vacc_completed":1292.7431692071, - "Vacc_refreshed":286.9834989324 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15375.2266568732, - "Vacc_completed":1293.6118841564, - "Vacc_refreshed":287.1997495191 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15378.8167187789, - "Vacc_completed":1294.2472234682, - "Vacc_refreshed":293.7465776915 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15381.8183566081, - "Vacc_completed":1296.5074589754, - "Vacc_refreshed":294.394169978 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15390.3384592829, - "Vacc_completed":1298.1144038724, - "Vacc_refreshed":295.3508481166 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15397.4841102393, - "Vacc_completed":1301.7744150574, - "Vacc_refreshed":295.636121459 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15406.9128765942, - "Vacc_completed":1306.3546732411, - "Vacc_refreshed":299.2176949608 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15412.9312961067, - "Vacc_completed":1313.4112918553, - "Vacc_refreshed":304.1283567048 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15413.8396565369, - "Vacc_completed":1323.1872711778, - "Vacc_refreshed":309.3767578057 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15417.5353933956, - "Vacc_completed":1332.5570169907, - "Vacc_refreshed":310.9982936972 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15418.826072466, - "Vacc_completed":1333.4298810326, - "Vacc_refreshed":318.8191964614 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15428.6081802722, - "Vacc_completed":1335.4576305614, - "Vacc_refreshed":322.681425219 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15434.4342053135, - "Vacc_completed":1341.8151001107, - "Vacc_refreshed":328.87826872 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15442.7494739491, - "Vacc_completed":1342.4758295952, - "Vacc_refreshed":336.8125605002 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15451.9615776405, - "Vacc_completed":1343.8595431355, - "Vacc_refreshed":340.6379428895 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15461.0343740586, - "Vacc_completed":1352.0217149096, - "Vacc_refreshed":342.4652609374 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15467.8869999547, - "Vacc_completed":1353.9994636638, - "Vacc_refreshed":343.6202751504 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15474.9129704383, - "Vacc_completed":1363.3653927841, - "Vacc_refreshed":345.0578595323 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15483.483328834, - "Vacc_completed":1372.0348541584, - "Vacc_refreshed":348.4131919851 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15489.3942653446, - "Vacc_completed":1377.4077406314, - "Vacc_refreshed":355.6717942515 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15494.2503612359, - "Vacc_completed":1377.4290090401, - "Vacc_refreshed":358.9820312389 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15495.3394152185, - "Vacc_completed":1378.0321848221, - "Vacc_refreshed":364.7453207897 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15497.7000250685, - "Vacc_completed":1378.1938721933, - "Vacc_refreshed":367.9820639836 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15498.7689863883, - "Vacc_completed":1381.0445655705, - "Vacc_refreshed":371.501202086 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15501.5446144083, - "Vacc_completed":1383.5660020007, - "Vacc_refreshed":378.7475176563 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15509.8230148672, - "Vacc_completed":1390.2361319678, - "Vacc_refreshed":382.7365149116 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15516.8607244434, - "Vacc_completed":1391.5356833196, - "Vacc_refreshed":387.0287274101 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15525.4621417067, - "Vacc_completed":1391.7538408053, - "Vacc_refreshed":394.832505058 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15530.1412323442, - "Vacc_completed":1393.5856974411, - "Vacc_refreshed":402.9766589833 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15538.5266345599, - "Vacc_completed":1394.0860887346, - "Vacc_refreshed":409.427624651 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15545.1857152555, - "Vacc_completed":1400.9009375981, - "Vacc_refreshed":414.8161834543 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15550.0113840393, - "Vacc_completed":1405.1190388135, - "Vacc_refreshed":423.1492506703 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15557.7502728646, - "Vacc_completed":1412.7232837907, - "Vacc_refreshed":429.51858195 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15558.6635273277, - "Vacc_completed":1416.4367765358, - "Vacc_refreshed":433.7574702422 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15567.8923476818, - "Vacc_completed":1417.419547185, - "Vacc_refreshed":436.3988331827 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15572.0110691064, - "Vacc_completed":1422.1291332179, - "Vacc_refreshed":444.7065625402 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15580.056372857, - "Vacc_completed":1429.5241883626, - "Vacc_refreshed":445.9185645116 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14604.162091487, - "Vacc_completed":1396.5367205842, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14608.6011110978, - "Vacc_completed":1403.0638750962, - "Vacc_refreshed":0.4818747518 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14617.4016613244, - "Vacc_completed":1412.4617013546, - "Vacc_refreshed":2.8841327921 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14626.8147148128, - "Vacc_completed":1413.5937989207, - "Vacc_refreshed":4.347225901 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14636.7930742671, - "Vacc_completed":1416.5445655325, - "Vacc_refreshed":10.9126558661 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14639.261920851, - "Vacc_completed":1419.7526675766, - "Vacc_refreshed":12.1285186735 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14646.6246553828, - "Vacc_completed":1429.1501916355, - "Vacc_refreshed":14.2999622979 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14655.9228453283, - "Vacc_completed":1433.2061319495, - "Vacc_refreshed":18.6765331159 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.6905295279, - "Vacc_completed":1437.4319338048, - "Vacc_refreshed":19.3435044237 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.8883385186, - "Vacc_completed":1446.7135497598, - "Vacc_refreshed":28.359576628 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14660.5634553543, - "Vacc_completed":1450.9111526521, - "Vacc_refreshed":38.3056947196 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14667.0822550267, - "Vacc_completed":1458.1473384005, - "Vacc_refreshed":38.8316353015 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14668.0361388154, - "Vacc_completed":1464.9440155832, - "Vacc_refreshed":44.1485629725 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14669.4679031112, - "Vacc_completed":1470.1284856322, - "Vacc_refreshed":47.7639888511 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.2618994679, - "Vacc_completed":1476.9344530457, - "Vacc_refreshed":56.361748961 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.3447644481, - "Vacc_completed":1477.2393580763, - "Vacc_refreshed":57.2273767339 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14684.0130216555, - "Vacc_completed":1484.3234594705, - "Vacc_refreshed":63.4497732245 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14691.8154699011, - "Vacc_completed":1492.8513113216, - "Vacc_refreshed":71.1720264341 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14697.5036031252, - "Vacc_completed":1493.7450842417, - "Vacc_refreshed":77.3635307257 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14702.599106658, - "Vacc_completed":1503.4641107157, - "Vacc_refreshed":82.0575571669 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14706.3806325115, - "Vacc_completed":1509.7236994586, - "Vacc_refreshed":82.4020129882 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14711.1723860607, - "Vacc_completed":1510.3801441147, - "Vacc_refreshed":89.5249618369 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14720.0093085987, - "Vacc_completed":1517.7733661353, - "Vacc_refreshed":99.2211580734 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14727.6474505495, - "Vacc_completed":1519.2060691793, - "Vacc_refreshed":104.7140344902 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14737.2025033477, - "Vacc_completed":1520.8147599339, - "Vacc_refreshed":111.7829864033 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14739.5787007901, - "Vacc_completed":1526.8277919335, - "Vacc_refreshed":118.2526435067 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14740.2622466128, - "Vacc_completed":1533.9654672239, - "Vacc_refreshed":121.0872593022 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.3105527103, - "Vacc_completed":1534.5209202615, - "Vacc_refreshed":130.3683956867 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.4386233429, - "Vacc_completed":1534.652607589, - "Vacc_refreshed":131.8609814668 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14750.7660084012, - "Vacc_completed":1541.7255942491, - "Vacc_refreshed":135.0718914562 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14754.5460710197, - "Vacc_completed":1550.2608445951, - "Vacc_refreshed":143.3620456295 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14759.0944017155, - "Vacc_completed":1555.0005459425, - "Vacc_refreshed":149.1268404613 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14765.0469016605, - "Vacc_completed":1561.0596836707, - "Vacc_refreshed":156.632878281 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14767.8747922121, - "Vacc_completed":1562.2055298685, - "Vacc_refreshed":158.7846499619 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14770.6956031505, - "Vacc_completed":1564.0912014269, - "Vacc_refreshed":160.2235512232 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14771.8405767953, - "Vacc_completed":1569.1767284097, - "Vacc_refreshed":163.0960075253 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14772.2052559189, - "Vacc_completed":1577.0342160583, - "Vacc_refreshed":171.338237261 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14775.8209952029, - "Vacc_completed":1582.4601331483, - "Vacc_refreshed":171.7811634642 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14783.195452278, - "Vacc_completed":1590.5417141678, - "Vacc_refreshed":180.3921690168 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14789.7908493035, - "Vacc_completed":1599.1828252755, - "Vacc_refreshed":184.3843375412 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14799.5061304555, - "Vacc_completed":1604.6353429891, - "Vacc_refreshed":186.9160630046 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14800.1953862328, - "Vacc_completed":1607.3418569739, - "Vacc_refreshed":194.8977352638 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14804.6194220955, - "Vacc_completed":1610.8601925588, - "Vacc_refreshed":198.1360514295 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14807.6135970058, - "Vacc_completed":1620.4676732545, - "Vacc_refreshed":199.7756827366 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14812.6404573806, - "Vacc_completed":1625.8005590907, - "Vacc_refreshed":208.9834954342 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14821.7780993542, - "Vacc_completed":1634.2191287828, - "Vacc_refreshed":218.0082295343 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14826.4757459809, - "Vacc_completed":1642.5529482935, - "Vacc_refreshed":225.0524176739 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14831.5528263871, - "Vacc_completed":1649.3317542887, - "Vacc_refreshed":229.0729255762 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14835.4543265309, - "Vacc_completed":1656.6375918093, - "Vacc_refreshed":230.6069957275 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14843.0829401722, - "Vacc_completed":1661.236165662, - "Vacc_refreshed":240.090987042 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14846.441543514, - "Vacc_completed":1663.7621214807, - "Vacc_refreshed":242.6005891297 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14852.8592673291, - "Vacc_completed":1670.5438763585, - "Vacc_refreshed":243.1550853514 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14859.7577792484, - "Vacc_completed":1671.9654195564, - "Vacc_refreshed":252.4226950148 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14860.9361402439, - "Vacc_completed":1673.0063955744, - "Vacc_refreshed":254.9337371613 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14866.4446359141, - "Vacc_completed":1680.8225588341, - "Vacc_refreshed":260.3047312661 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14873.2607186268, - "Vacc_completed":1689.7385811283, - "Vacc_refreshed":267.8936320344 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14880.5922770798, - "Vacc_completed":1689.9651236491, - "Vacc_refreshed":275.7764918768 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14887.440916863, - "Vacc_completed":1696.5525450807, - "Vacc_refreshed":283.5225421273 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14888.0132355705, - "Vacc_completed":1703.9968022938, - "Vacc_refreshed":284.1554601622 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14897.4895745985, - "Vacc_completed":1707.7124979313, - "Vacc_refreshed":293.9654633907 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14900.9132287675, - "Vacc_completed":1714.1256328363, - "Vacc_refreshed":300.1498047442 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14907.9968139113, - "Vacc_completed":1717.9722882107, - "Vacc_refreshed":303.8260258963 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14914.3000727157, - "Vacc_completed":1723.7459149842, - "Vacc_refreshed":310.6001358466 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14915.2709520902, - "Vacc_completed":1725.3728171833, - "Vacc_refreshed":311.7419250413 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14924.9251049714, - "Vacc_completed":1730.3968331067, - "Vacc_refreshed":318.9914066325 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14929.9737051543, - "Vacc_completed":1735.419819131, - "Vacc_refreshed":327.2769475594 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.0867908297, - "Vacc_completed":1735.4531164502, - "Vacc_refreshed":333.9507530528 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.1585043075, - "Vacc_completed":1744.7112606784, - "Vacc_refreshed":337.8096837232 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14939.2420152133, - "Vacc_completed":1745.8678859662, - "Vacc_refreshed":344.4742142552 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14940.9708787633, - "Vacc_completed":1748.1937727819, - "Vacc_refreshed":352.7895987096 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14950.0282400838, - "Vacc_completed":1750.2751748343, - "Vacc_refreshed":354.0652893483 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14956.5498846765, - "Vacc_completed":1758.7641351746, - "Vacc_refreshed":361.0736440858 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14957.5908121778, - "Vacc_completed":1763.4528309235, - "Vacc_refreshed":364.3501912771 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14960.7281563782, - "Vacc_completed":1772.006809538, - "Vacc_refreshed":364.6804469838 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14969.2457673746, - "Vacc_completed":1776.5678522654, - "Vacc_refreshed":374.4882812856 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14974.8615073088, - "Vacc_completed":1779.9556763371, - "Vacc_refreshed":377.4421123342 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14984.5914886251, - "Vacc_completed":1782.6146675026, - "Vacc_refreshed":381.2082916917 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14987.5876984189, - "Vacc_completed":1791.1028428437, - "Vacc_refreshed":385.3294438436 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.58002825, - "Vacc_completed":1793.9473770292, - "Vacc_refreshed":388.9073184565 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.8771499871, - "Vacc_completed":1796.0612762347, - "Vacc_refreshed":390.0186176392 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14993.5505864267, - "Vacc_completed":1798.6017730753, - "Vacc_refreshed":390.5734438836 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14998.158414122, - "Vacc_completed":1802.0655230464, - "Vacc_refreshed":391.8649823662 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.4313521872, - "Vacc_completed":1804.413054883, - "Vacc_refreshed":395.3533451537 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.7989985243, - "Vacc_completed":1812.4490035114, - "Vacc_refreshed":401.8191046925 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15002.2088852954, - "Vacc_completed":1814.4865305652, - "Vacc_refreshed":409.5825438963 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15008.2705384657, - "Vacc_completed":1823.0023861142, - "Vacc_refreshed":411.4567502649 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15013.4515790087, - "Vacc_completed":1830.5873803301, - "Vacc_refreshed":417.6053918266 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15022.965858679, - "Vacc_completed":1833.2575088513, - "Vacc_refreshed":421.7562400513 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15024.3362350043, - "Vacc_completed":1839.0848659035, - "Vacc_refreshed":429.2321579029 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15025.0436784182, - "Vacc_completed":1840.7238800201, - "Vacc_refreshed":434.1256619822 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15026.1929816575, - "Vacc_completed":1848.4826094697, - "Vacc_refreshed":436.1767563509 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15028.1115762872, - "Vacc_completed":1851.353962867, - "Vacc_refreshed":439.6190575403 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12940.2728292563, - "Vacc_completed":1761.2082450081, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12944.552426313, - "Vacc_completed":1763.9916052944, - "Vacc_refreshed":5.8453121761 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12946.2293033065, - "Vacc_completed":1764.8651614651, - "Vacc_refreshed":11.3614134516 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12954.4553975676, - "Vacc_completed":1773.9720915654, - "Vacc_refreshed":19.8633846559 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12962.1675537316, - "Vacc_completed":1776.6871749169, - "Vacc_refreshed":23.5340750877 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12970.2114807284, - "Vacc_completed":1779.4482697767, - "Vacc_refreshed":32.7047145334 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12971.1155781651, - "Vacc_completed":1787.6912361171, - "Vacc_refreshed":41.3859214133 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12976.1479148685, - "Vacc_completed":1796.0609011819, - "Vacc_refreshed":49.2224218631 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12985.389251021, - "Vacc_completed":1806.0439647379, - "Vacc_refreshed":58.4565372826 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12987.6528992192, - "Vacc_completed":1814.2136648594, - "Vacc_refreshed":68.4133404236 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12988.8953336446, - "Vacc_completed":1820.4740554862, - "Vacc_refreshed":69.4164203636 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12989.930788247, - "Vacc_completed":1825.1779692151, - "Vacc_refreshed":71.594311523 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12993.9481590439, - "Vacc_completed":1834.4690603586, - "Vacc_refreshed":75.4387792504 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12997.41102572, - "Vacc_completed":1836.6145856268, - "Vacc_refreshed":81.7875242048 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12999.5337504327, - "Vacc_completed":1839.9662175544, - "Vacc_refreshed":87.9455065083 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13007.2251436977, - "Vacc_completed":1842.6498922014, - "Vacc_refreshed":93.1900542901 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13012.0856312446, - "Vacc_completed":1844.701996872, - "Vacc_refreshed":99.712698674 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13021.33252246, - "Vacc_completed":1849.3061445307, - "Vacc_refreshed":102.5319545699 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13027.1500152398, - "Vacc_completed":1850.8078304213, - "Vacc_refreshed":105.0259857828 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13035.650988116, - "Vacc_completed":1851.8577100095, - "Vacc_refreshed":110.1445342625 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13042.2123284129, - "Vacc_completed":1856.2056162281, - "Vacc_refreshed":113.6459186876 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13048.5274669921, - "Vacc_completed":1856.9596604869, - "Vacc_refreshed":119.7006093985 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13056.4261041722, - "Vacc_completed":1859.9946313318, - "Vacc_refreshed":128.4930741519 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13061.2580735831, - "Vacc_completed":1864.4241013454, - "Vacc_refreshed":129.4122729818 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13069.8769575412, - "Vacc_completed":1870.828968765, - "Vacc_refreshed":133.5606697443 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13074.4847352314, - "Vacc_completed":1873.0576602324, - "Vacc_refreshed":142.5189975609 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13077.43910001, - "Vacc_completed":1881.1763507471, - "Vacc_refreshed":143.4948395736 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13082.3470601758, - "Vacc_completed":1888.5808588713, - "Vacc_refreshed":149.0381282873 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13091.0962170402, - "Vacc_completed":1894.9989493108, - "Vacc_refreshed":149.7527355276 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13097.0655225667, - "Vacc_completed":1904.9660517959, - "Vacc_refreshed":155.7716165644 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13105.8431803144, - "Vacc_completed":1907.1233275333, - "Vacc_refreshed":162.7399373626 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13110.9052745957, - "Vacc_completed":1915.3369502585, - "Vacc_refreshed":166.1686970271 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13120.2888484357, - "Vacc_completed":1924.594235894, - "Vacc_refreshed":174.1871820852 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13122.2684309305, - "Vacc_completed":1926.8954039089, - "Vacc_refreshed":179.1800373951 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13129.679389954, - "Vacc_completed":1929.8687720822, - "Vacc_refreshed":186.5609898946 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13136.2121968271, - "Vacc_completed":1930.5419008182, - "Vacc_refreshed":190.3285119819 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13140.8693305096, - "Vacc_completed":1933.1368513989, - "Vacc_refreshed":199.5045342081 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13141.6505152789, - "Vacc_completed":1938.3539275062, - "Vacc_refreshed":199.9231054484 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13146.3819720109, - "Vacc_completed":1943.0787615053, - "Vacc_refreshed":203.5617342411 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.5833925737, - "Vacc_completed":1944.8505615419, - "Vacc_refreshed":206.5254255239 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.8864321418, - "Vacc_completed":1946.7574709443, - "Vacc_refreshed":208.0171497057 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13160.8319905342, - "Vacc_completed":1949.6926878806, - "Vacc_refreshed":213.0797703475 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13165.109826694, - "Vacc_completed":1955.2468047197, - "Vacc_refreshed":222.6760329578 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13168.7847714036, - "Vacc_completed":1956.1809363506, - "Vacc_refreshed":231.6808966253 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13176.0869758252, - "Vacc_completed":1960.8024990411, - "Vacc_refreshed":233.4328765098 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13180.123104626, - "Vacc_completed":1969.8047949709, - "Vacc_refreshed":241.5696524948 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13184.6423078124, - "Vacc_completed":1974.8566545144, - "Vacc_refreshed":250.4550885677 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13190.9452560841, - "Vacc_completed":1975.9346724558, - "Vacc_refreshed":252.799671753 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13194.9586490897, - "Vacc_completed":1984.1998929758, - "Vacc_refreshed":256.8657355625 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13203.1981501018, - "Vacc_completed":1992.2264996957, - "Vacc_refreshed":262.7110996677 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13210.570704838, - "Vacc_completed":2000.1284432323, - "Vacc_refreshed":268.7466273707 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13217.6966464936, - "Vacc_completed":2001.108779963, - "Vacc_refreshed":270.063420564 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13222.8454105611, - "Vacc_completed":2006.445790007, - "Vacc_refreshed":272.306211944 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13231.9459038211, - "Vacc_completed":2014.1245558198, - "Vacc_refreshed":274.2682102675 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.4430744102, - "Vacc_completed":2021.01783734, - "Vacc_refreshed":283.272422859 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.9880313892, - "Vacc_completed":2021.3278488109, - "Vacc_refreshed":288.8833613171 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13244.1020800967, - "Vacc_completed":2028.5342497408, - "Vacc_refreshed":295.5476346222 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13246.2035006005, - "Vacc_completed":2034.7337820973, - "Vacc_refreshed":295.8527619766 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13250.3034672718, - "Vacc_completed":2040.4526371692, - "Vacc_refreshed":297.6289642024 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13258.1309651863, - "Vacc_completed":2043.9166550693, - "Vacc_refreshed":307.2590005259 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13264.00554028, - "Vacc_completed":2046.5596745193, - "Vacc_refreshed":309.1250398792 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.4212557374, - "Vacc_completed":2049.7116443058, - "Vacc_refreshed":314.0515587013 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.7885616679, - "Vacc_completed":2051.2982177338, - "Vacc_refreshed":320.3832182075 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13274.2264538665, - "Vacc_completed":2058.2989667129, - "Vacc_refreshed":323.7063680074 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13281.9141553951, - "Vacc_completed":2063.8206751836, - "Vacc_refreshed":326.9158074422 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13290.64171309, - "Vacc_completed":2064.3110765988, - "Vacc_refreshed":336.7710359746 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.1885069646, - "Vacc_completed":2072.8766922561, - "Vacc_refreshed":344.574816718 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.7117921559, - "Vacc_completed":2081.2889195134, - "Vacc_refreshed":352.6791052892 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13295.741331211, - "Vacc_completed":2082.371745109, - "Vacc_refreshed":358.7062427923 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13303.8543248793, - "Vacc_completed":2084.7970217381, - "Vacc_refreshed":363.3629273081 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13305.910901253, - "Vacc_completed":2089.496376583, - "Vacc_refreshed":364.4184919111 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13310.1770755649, - "Vacc_completed":2091.8877772854, - "Vacc_refreshed":373.8861441424 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13318.5822731817, - "Vacc_completed":2100.0656871327, - "Vacc_refreshed":380.7622590612 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13326.848015265, - "Vacc_completed":2103.7807367097, - "Vacc_refreshed":383.494468406 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13329.8351558424, - "Vacc_completed":2106.3811743673, - "Vacc_refreshed":385.7094999088 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13334.0243800891, - "Vacc_completed":2110.0143078684, - "Vacc_refreshed":387.028737638 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13340.0473805148, - "Vacc_completed":2114.17877764, - "Vacc_refreshed":390.7872507231 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13342.4710995253, - "Vacc_completed":2117.5584807218, - "Vacc_refreshed":394.4459716696 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13345.9586603577, - "Vacc_completed":2124.6343373595, - "Vacc_refreshed":401.3739608899 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13354.1694340722, - "Vacc_completed":2132.584533812, - "Vacc_refreshed":404.149558168 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13360.0480186273, - "Vacc_completed":2135.2279773256, - "Vacc_refreshed":407.0589420913 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13362.9287822042, - "Vacc_completed":2135.7661733179, - "Vacc_refreshed":412.3495727781 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13365.9702033874, - "Vacc_completed":2140.0801351424, - "Vacc_refreshed":414.1173144704 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13375.8578305813, - "Vacc_completed":2147.1687721976, - "Vacc_refreshed":416.1274613074 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.3434411484, - "Vacc_completed":2149.6360498231, - "Vacc_refreshed":422.5420941028 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.8386238776, - "Vacc_completed":2156.2105881723, - "Vacc_refreshed":428.2913369026 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13388.7750604929, - "Vacc_completed":2160.929719286, - "Vacc_refreshed":437.0909930573 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13397.0959920005, - "Vacc_completed":2169.0772334568, - "Vacc_refreshed":438.0782576038 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13406.1913483212, - "Vacc_completed":2172.8397968306, - "Vacc_refreshed":445.0079409299 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13410.1064630998, - "Vacc_completed":2179.4067803849, - "Vacc_refreshed":453.2550919609 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.2872479216, - "Vacc_completed":2183.7956163614, - "Vacc_refreshed":462.0847473084 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.7274837683, - "Vacc_completed":2186.2625889833, - "Vacc_refreshed":470.3671533805 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15108.1816487494, - "Vacc_completed":1951.3500240632, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15112.0388992614, - "Vacc_completed":1956.8484422205, - "Vacc_refreshed":4.7764537598 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15115.1174991099, - "Vacc_completed":1961.6166149519, - "Vacc_refreshed":11.6778924479 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15121.0352670933, - "Vacc_completed":1969.039883077, - "Vacc_refreshed":19.464449507 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15130.8297777562, - "Vacc_completed":1970.7344191294, - "Vacc_refreshed":28.0813773392 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15139.7963570637, - "Vacc_completed":1971.420038313, - "Vacc_refreshed":34.2304461363 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15149.3578353885, - "Vacc_completed":1977.7986093705, - "Vacc_refreshed":42.9385547047 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15150.8906121637, - "Vacc_completed":1981.6633590428, - "Vacc_refreshed":46.0030569507 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15153.3987479409, - "Vacc_completed":1986.7151251441, - "Vacc_refreshed":54.9967129669 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15155.2112066, - "Vacc_completed":1993.3668502516, - "Vacc_refreshed":59.2446234015 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15157.213160056, - "Vacc_completed":2000.1282773775, - "Vacc_refreshed":61.576334937 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15159.7206353696, - "Vacc_completed":2000.5786646957, - "Vacc_refreshed":62.4328961844 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15165.6048851908, - "Vacc_completed":2000.600816545, - "Vacc_refreshed":70.2254449832 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15175.5401574577, - "Vacc_completed":2003.6984716795, - "Vacc_refreshed":80.0202808521 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15178.2193352397, - "Vacc_completed":2010.5259174304, - "Vacc_refreshed":80.5289834705 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15186.1911779287, - "Vacc_completed":2020.3094769054, - "Vacc_refreshed":88.939485925 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15192.9408650715, - "Vacc_completed":2027.102138126, - "Vacc_refreshed":93.403990271 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15197.2522804828, - "Vacc_completed":2033.1768424672, - "Vacc_refreshed":103.3495680716 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15201.4718571012, - "Vacc_completed":2041.9289374755, - "Vacc_refreshed":107.0046191576 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15203.6899934618, - "Vacc_completed":2042.5550193085, - "Vacc_refreshed":108.1692912263 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15210.5751055, - "Vacc_completed":2049.1508387429, - "Vacc_refreshed":115.4885047404 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15216.3570734734, - "Vacc_completed":2052.3213561982, - "Vacc_refreshed":119.2061326333 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15225.8779749457, - "Vacc_completed":2057.4663468474, - "Vacc_refreshed":126.226397743 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15230.8206176005, - "Vacc_completed":2064.8586744443, - "Vacc_refreshed":133.0501812916 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15231.8828151205, - "Vacc_completed":2068.2097593649, - "Vacc_refreshed":142.0174284746 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15238.2426035555, - "Vacc_completed":2071.8714182096, - "Vacc_refreshed":148.7355853512 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15247.7928253295, - "Vacc_completed":2078.7188555952, - "Vacc_refreshed":156.2462830057 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15257.1929610505, - "Vacc_completed":2083.6123346127, - "Vacc_refreshed":163.8060000189 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15261.4225446127, - "Vacc_completed":2092.4315663384, - "Vacc_refreshed":165.098643188 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15264.9230201438, - "Vacc_completed":2098.3647861992, - "Vacc_refreshed":173.1581071885 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15274.2090277291, - "Vacc_completed":2098.6684198619, - "Vacc_refreshed":179.3045017397 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15275.4881156514, - "Vacc_completed":2104.7296501443, - "Vacc_refreshed":184.3873991738 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.4296689803, - "Vacc_completed":2109.0258070133, - "Vacc_refreshed":190.3361011534 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.7641225132, - "Vacc_completed":2111.2503398848, - "Vacc_refreshed":196.3057900505 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15280.5288668271, - "Vacc_completed":2120.2846622436, - "Vacc_refreshed":201.8816019943 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15286.6794056665, - "Vacc_completed":2127.5294418815, - "Vacc_refreshed":205.8247713924 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15287.919376399, - "Vacc_completed":2127.7213986428, - "Vacc_refreshed":207.0848824799 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15288.8972252423, - "Vacc_completed":2131.7043154907, - "Vacc_refreshed":214.6605013946 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15295.1676694583, - "Vacc_completed":2141.6853776317, - "Vacc_refreshed":217.321705385 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.8279320379, - "Vacc_completed":2150.6081907236, - "Vacc_refreshed":224.1814306469 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.9502690873, - "Vacc_completed":2150.8297260642, - "Vacc_refreshed":224.2857175024 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15305.4629063272, - "Vacc_completed":2159.4075137345, - "Vacc_refreshed":226.4536786248 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15313.0091699117, - "Vacc_completed":2160.0885470064, - "Vacc_refreshed":232.5677391068 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15316.6742133238, - "Vacc_completed":2163.6640679748, - "Vacc_refreshed":242.4458167027 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15325.7736410299, - "Vacc_completed":2171.6222500116, - "Vacc_refreshed":251.5591803171 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15333.3685319398, - "Vacc_completed":2174.4162160121, - "Vacc_refreshed":254.1541702573 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15337.5758896556, - "Vacc_completed":2180.7560110181, - "Vacc_refreshed":255.4491825287 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15346.8261947795, - "Vacc_completed":2184.562660479, - "Vacc_refreshed":256.0794667401 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15347.5063487999, - "Vacc_completed":2192.7053918922, - "Vacc_refreshed":264.8657432896 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15355.2915215882, - "Vacc_completed":2197.3639423288, - "Vacc_refreshed":266.2003474583 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15357.0291297717, - "Vacc_completed":2203.5668703416, - "Vacc_refreshed":266.2591235692 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15363.7351300479, - "Vacc_completed":2212.51470716, - "Vacc_refreshed":268.1554009506 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15366.2054877706, - "Vacc_completed":2220.7805776981, - "Vacc_refreshed":270.2429125628 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15374.7828886007, - "Vacc_completed":2223.4779151007, - "Vacc_refreshed":271.3258668517 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15375.8644766411, - "Vacc_completed":2223.902202818, - "Vacc_refreshed":277.3418287874 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15384.0103684975, - "Vacc_completed":2233.2600148125, - "Vacc_refreshed":286.2795142721 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15388.2433647335, - "Vacc_completed":2242.2405085188, - "Vacc_refreshed":295.9058348626 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15395.874552707, - "Vacc_completed":2242.5126967683, - "Vacc_refreshed":297.0217883024 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15399.399317417, - "Vacc_completed":2250.19318626, - "Vacc_refreshed":297.4497074595 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15407.4994879004, - "Vacc_completed":2258.8146667712, - "Vacc_refreshed":302.8025504676 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15410.1346998553, - "Vacc_completed":2259.5361618465, - "Vacc_refreshed":305.0699464575 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15415.5662938607, - "Vacc_completed":2266.2419298528, - "Vacc_refreshed":306.5583985118 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15424.362408066, - "Vacc_completed":2270.6973906417, - "Vacc_refreshed":307.7300944183 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15427.4641661532, - "Vacc_completed":2273.4475287465, - "Vacc_refreshed":315.9257071161 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15430.3003374401, - "Vacc_completed":2280.4953549554, - "Vacc_refreshed":320.4057109928 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15434.7161891817, - "Vacc_completed":2283.6641990131, - "Vacc_refreshed":329.6425079267 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15439.6389263804, - "Vacc_completed":2286.269595866, - "Vacc_refreshed":336.6032551175 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.607595077, - "Vacc_completed":2292.1795115763, - "Vacc_refreshed":339.4752869467 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.7317234732, - "Vacc_completed":2299.0428376394, - "Vacc_refreshed":342.2213588852 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15448.8137925508, - "Vacc_completed":2303.3104194582, - "Vacc_refreshed":346.3780017598 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15449.4812178935, - "Vacc_completed":2311.9261799324, - "Vacc_refreshed":351.1765190663 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9089483618, - "Vacc_completed":2315.5711542884, - "Vacc_refreshed":352.532745084 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9943266817, - "Vacc_completed":2322.1716179078, - "Vacc_refreshed":355.0774800773 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15459.7074068986, - "Vacc_completed":2323.3027059178, - "Vacc_refreshed":364.5645466744 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15465.686171573, - "Vacc_completed":2325.8040208828, - "Vacc_refreshed":365.9637341301 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15466.2025927257, - "Vacc_completed":2332.7537065257, - "Vacc_refreshed":366.2841969775 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15471.0643499093, - "Vacc_completed":2333.7718947218, - "Vacc_refreshed":370.7174701468 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15480.1820736709, - "Vacc_completed":2336.425519339, - "Vacc_refreshed":378.1719392306 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15489.2619602904, - "Vacc_completed":2342.4314320637, - "Vacc_refreshed":382.1070985379 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15497.197059921, - "Vacc_completed":2351.5508059781, - "Vacc_refreshed":390.0131449372 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15506.8997820546, - "Vacc_completed":2354.7951207515, - "Vacc_refreshed":397.4755552416 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15514.6356932026, - "Vacc_completed":2359.4543858263, - "Vacc_refreshed":405.5265192328 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15517.1065215082, - "Vacc_completed":2362.3705119741, - "Vacc_refreshed":406.2503084488 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15526.1890623234, - "Vacc_completed":2369.2123027947, - "Vacc_refreshed":407.9863557734 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15529.1257916241, - "Vacc_completed":2371.0230854052, - "Vacc_refreshed":415.4330021443 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15534.1422800755, - "Vacc_completed":2376.4314141852, - "Vacc_refreshed":417.8710629027 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15536.9779956012, - "Vacc_completed":2380.9412020655, - "Vacc_refreshed":418.6065556413 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15542.623117778, - "Vacc_completed":2383.2295524317, - "Vacc_refreshed":425.5318613018 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15545.7349127212, - "Vacc_completed":2388.7438112703, - "Vacc_refreshed":435.2708995295 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15552.7663039717, - "Vacc_completed":2398.7179519564, - "Vacc_refreshed":436.7806978293 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15553.9038494269, - "Vacc_completed":2401.9470135031, - "Vacc_refreshed":445.294989416 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15563.5219522465, - "Vacc_completed":2408.3277109489, - "Vacc_refreshed":449.1868908695 + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14093.5670993244, + "Vacc_completed": 1058.2133302677, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14094.6780758432, + "Vacc_completed": 1058.2386490178, + "Vacc_refreshed": 3.9480185817, + "Vacc_refreshed_2": 1.97400929085 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14102.3458622773, + "Vacc_completed": 1063.1811826304, + "Vacc_refreshed": 7.8235846725, + "Vacc_refreshed_2": 3.91179233625 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14106.0158477852, + "Vacc_completed": 1071.0829580916, + "Vacc_refreshed": 13.0365435255, + "Vacc_refreshed_2": 6.51827176275 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14115.8958402416, + "Vacc_completed": 1072.5136218055, + "Vacc_refreshed": 15.4582843201, + "Vacc_refreshed_2": 7.72914216005 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14116.0603009948, + "Vacc_completed": 1080.8706574256, + "Vacc_refreshed": 22.3037298829, + "Vacc_refreshed_2": 11.15186494145 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14124.4849162097, + "Vacc_completed": 1087.4957123195, + "Vacc_refreshed": 27.7666004775, + "Vacc_refreshed_2": 13.88330023875 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14132.812800891, + "Vacc_completed": 1094.2936630058, + "Vacc_refreshed": 29.4212640594, + "Vacc_refreshed_2": 14.7106320297 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14139.2772895404, + "Vacc_completed": 1100.1665827188, + "Vacc_refreshed": 29.4568827793, + "Vacc_refreshed_2": 14.72844138965 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14145.4868397119, + "Vacc_completed": 1105.3345419667, + "Vacc_refreshed": 34.7217238502, + "Vacc_refreshed_2": 17.3608619251 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14147.7480966959, + "Vacc_completed": 1111.2289166538, + "Vacc_refreshed": 34.771310214, + "Vacc_refreshed_2": 17.385655107 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14154.5204084505, + "Vacc_completed": 1114.7870563855, + "Vacc_refreshed": 41.8898823514, + "Vacc_refreshed_2": 20.9449411757 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14155.4472543415, + "Vacc_completed": 1124.6385432496, + "Vacc_refreshed": 48.6348857735, + "Vacc_refreshed_2": 24.31744288675 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14162.2764203336, + "Vacc_completed": 1128.54825128, + "Vacc_refreshed": 48.7694054724, + "Vacc_refreshed_2": 24.3847027362 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14163.6229511244, + "Vacc_completed": 1128.7143765883, + "Vacc_refreshed": 53.2059941772, + "Vacc_refreshed_2": 26.6029970886 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14170.704731349, + "Vacc_completed": 1138.0466956792, + "Vacc_refreshed": 59.0394633797, + "Vacc_refreshed_2": 29.51973168985 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14177.9754226866, + "Vacc_completed": 1144.8391611423, + "Vacc_refreshed": 68.7607294969, + "Vacc_refreshed_2": 34.38036474845 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14180.6917277285, + "Vacc_completed": 1145.8477444825, + "Vacc_refreshed": 68.9221667424, + "Vacc_refreshed_2": 34.4610833712 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14183.6510488722, + "Vacc_completed": 1148.5261706572, + "Vacc_refreshed": 74.1781085786, + "Vacc_refreshed_2": 37.0890542893 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14187.685478561, + "Vacc_completed": 1156.317724845, + "Vacc_refreshed": 82.4605426733, + "Vacc_refreshed_2": 41.23027133665 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14190.8756861073, + "Vacc_completed": 1158.3230049846, + "Vacc_refreshed": 85.9686058349, + "Vacc_refreshed_2": 42.98430291745 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14194.7125443701, + "Vacc_completed": 1162.8869701267, + "Vacc_refreshed": 86.9745448839, + "Vacc_refreshed_2": 43.48727244195 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14198.1736788429, + "Vacc_completed": 1172.5122981568, + "Vacc_refreshed": 87.3520867387, + "Vacc_refreshed_2": 43.67604336935 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14200.0337444888, + "Vacc_completed": 1173.9022323601, + "Vacc_refreshed": 96.1323881978, + "Vacc_refreshed_2": 48.0661940989 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14209.9091251899, + "Vacc_completed": 1180.4819879148, + "Vacc_refreshed": 102.8081520102, + "Vacc_refreshed_2": 51.4040760051 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14215.7510791988, + "Vacc_completed": 1187.6749019896, + "Vacc_refreshed": 111.0676626302, + "Vacc_refreshed_2": 55.5338313151 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14216.891975169, + "Vacc_completed": 1194.8246181318, + "Vacc_refreshed": 112.2172983632, + "Vacc_refreshed_2": 56.1086491816 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14226.1128719795, + "Vacc_completed": 1199.3288757923, + "Vacc_refreshed": 115.0035825103, + "Vacc_refreshed_2": 57.50179125515 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14234.2678640476, + "Vacc_completed": 1200.3667784603, + "Vacc_refreshed": 122.2552339507, + "Vacc_refreshed_2": 61.12761697535 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14236.1003192184, + "Vacc_completed": 1204.1967603181, + "Vacc_refreshed": 127.0429292216, + "Vacc_refreshed_2": 63.5214646108 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14242.538633822, + "Vacc_completed": 1212.5454877324, + "Vacc_refreshed": 134.6939665016, + "Vacc_refreshed_2": 67.3469832508 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14244.3387278104, + "Vacc_completed": 1213.6034702862, + "Vacc_refreshed": 136.0920891424, + "Vacc_refreshed_2": 68.0460445712 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14251.4120506037, + "Vacc_completed": 1216.4725302456, + "Vacc_refreshed": 140.2813449601, + "Vacc_refreshed_2": 70.14067248005 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14260.7111088561, + "Vacc_completed": 1223.9349650326, + "Vacc_refreshed": 144.4607939662, + "Vacc_refreshed_2": 72.2303969831 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.4310619138, + "Vacc_completed": 1230.2964929538, + "Vacc_refreshed": 149.281965675, + "Vacc_refreshed_2": 74.6409828375 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.8430243455, + "Vacc_completed": 1233.791799902, + "Vacc_refreshed": 152.843700775, + "Vacc_refreshed_2": 76.4218503875 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14270.6723528208, + "Vacc_completed": 1235.7852283109, + "Vacc_refreshed": 158.6087157945, + "Vacc_refreshed_2": 79.30435789725 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14276.398217781, + "Vacc_completed": 1244.1189399585, + "Vacc_refreshed": 161.780101215, + "Vacc_refreshed_2": 80.8900506075 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14282.7632141243, + "Vacc_completed": 1252.4246776385, + "Vacc_refreshed": 164.4087953839, + "Vacc_refreshed_2": 82.20439769195 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14285.2172118541, + "Vacc_completed": 1253.0967186007, + "Vacc_refreshed": 165.7333648079, + "Vacc_refreshed_2": 82.86668240395 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14288.3981413127, + "Vacc_completed": 1261.2285273698, + "Vacc_refreshed": 175.6751183454, + "Vacc_refreshed_2": 87.8375591727 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14296.6990830234, + "Vacc_completed": 1261.8928424603, + "Vacc_refreshed": 181.3746988194, + "Vacc_refreshed_2": 90.6873494097 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14304.9324135674, + "Vacc_completed": 1268.1858225933, + "Vacc_refreshed": 182.8207287588, + "Vacc_refreshed_2": 91.4103643794 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14312.7990335985, + "Vacc_completed": 1270.8693167453, + "Vacc_refreshed": 192.6352794711, + "Vacc_refreshed_2": 96.31763973555 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14316.0317804647, + "Vacc_completed": 1276.8328604136, + "Vacc_refreshed": 199.109084232, + "Vacc_refreshed_2": 99.554542116 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14317.8224126817, + "Vacc_completed": 1285.9345839202, + "Vacc_refreshed": 204.9564534429, + "Vacc_refreshed_2": 102.47822672145 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14319.969225103, + "Vacc_completed": 1292.0814432843, + "Vacc_refreshed": 209.3116185701, + "Vacc_refreshed_2": 104.65580928505 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14325.5010146205, + "Vacc_completed": 1296.8562638588, + "Vacc_refreshed": 214.164106287, + "Vacc_refreshed_2": 107.0820531435 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14334.64723979, + "Vacc_completed": 1299.2846390455, + "Vacc_refreshed": 215.8187786169, + "Vacc_refreshed_2": 107.90938930845 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14341.3416549169, + "Vacc_completed": 1307.3997120401, + "Vacc_refreshed": 220.1718442512, + "Vacc_refreshed_2": 110.0859221256 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14349.3146443239, + "Vacc_completed": 1309.8026404332, + "Vacc_refreshed": 222.9315364644, + "Vacc_refreshed_2": 111.4657682322 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14359.2839765392, + "Vacc_completed": 1313.6592234511, + "Vacc_refreshed": 226.6469703335, + "Vacc_refreshed_2": 113.32348516675 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14365.2176903694, + "Vacc_completed": 1319.2137305156, + "Vacc_refreshed": 227.7079880211, + "Vacc_refreshed_2": 113.85399401055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14372.2949635005, + "Vacc_completed": 1325.3928078641, + "Vacc_refreshed": 234.0214496372, + "Vacc_refreshed_2": 117.0107248186 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14377.1100641854, + "Vacc_completed": 1326.7384263101, + "Vacc_refreshed": 242.1400638609, + "Vacc_refreshed_2": 121.07003193045 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14381.7559278649, + "Vacc_completed": 1329.4413693873, + "Vacc_refreshed": 246.2374710913, + "Vacc_refreshed_2": 123.11873554565 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14385.7162526455, + "Vacc_completed": 1338.1839321545, + "Vacc_refreshed": 252.0149200475, + "Vacc_refreshed_2": 126.00746002375 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14389.4326934411, + "Vacc_completed": 1345.9094675595, + "Vacc_refreshed": 256.9046042339, + "Vacc_refreshed_2": 128.45230211695 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14391.2007554132, + "Vacc_completed": 1348.71606757, + "Vacc_refreshed": 258.1776032516, + "Vacc_refreshed_2": 129.0888016258 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14394.8621297613, + "Vacc_completed": 1354.2416050796, + "Vacc_refreshed": 267.8589065036, + "Vacc_refreshed_2": 133.9294532518 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.3456243909, + "Vacc_completed": 1359.868800934, + "Vacc_refreshed": 270.9855298163, + "Vacc_refreshed_2": 135.49276490815 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.4645205246, + "Vacc_completed": 1363.0538159145, + "Vacc_refreshed": 275.840425604, + "Vacc_refreshed_2": 137.920212802 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14399.1657319944, + "Vacc_completed": 1365.5993182323, + "Vacc_refreshed": 277.5856365007, + "Vacc_refreshed_2": 138.79281825035 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14402.7230837573, + "Vacc_completed": 1368.6201543223, + "Vacc_refreshed": 286.3361695339, + "Vacc_refreshed_2": 143.16808476695 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14403.1500082752, + "Vacc_completed": 1371.4419603277, + "Vacc_refreshed": 291.9429549926, + "Vacc_refreshed_2": 145.9714774963 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14409.601025491, + "Vacc_completed": 1375.0385110041, + "Vacc_refreshed": 294.4838831323, + "Vacc_refreshed_2": 147.24194156615 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.5992098988, + "Vacc_completed": 1379.7282797993, + "Vacc_refreshed": 304.3709721295, + "Vacc_refreshed_2": 152.18548606475 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.7379664054, + "Vacc_completed": 1388.4437755617, + "Vacc_refreshed": 310.9469195789, + "Vacc_refreshed_2": 155.47345978945 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14413.0256783966, + "Vacc_completed": 1395.0228908154, + "Vacc_refreshed": 316.1322991564, + "Vacc_refreshed_2": 158.0661495782 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14418.5923400284, + "Vacc_completed": 1395.4421160716, + "Vacc_refreshed": 324.326203234, + "Vacc_refreshed_2": 162.163101617 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14427.1006875636, + "Vacc_completed": 1400.9550416303, + "Vacc_refreshed": 326.1675291407, + "Vacc_refreshed_2": 163.08376457035 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14428.1259159444, + "Vacc_completed": 1401.6589165675, + "Vacc_refreshed": 336.1473853823, + "Vacc_refreshed_2": 168.07369269115 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14429.6710322591, + "Vacc_completed": 1406.4316961423, + "Vacc_refreshed": 338.7341080527, + "Vacc_refreshed_2": 169.36705402635 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14435.5405186058, + "Vacc_completed": 1406.8193757343, + "Vacc_refreshed": 348.5515447081, + "Vacc_refreshed_2": 174.27577235405 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14440.6128511884, + "Vacc_completed": 1406.8790930463, + "Vacc_refreshed": 349.9224707035, + "Vacc_refreshed_2": 174.96123535175 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14448.1553470558, + "Vacc_completed": 1407.8576900416, + "Vacc_refreshed": 354.7521313753, + "Vacc_refreshed_2": 177.37606568765 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14456.4196110425, + "Vacc_completed": 1411.7530351787, + "Vacc_refreshed": 361.5526839017, + "Vacc_refreshed_2": 180.77634195085 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14466.1757833279, + "Vacc_completed": 1412.4941157515, + "Vacc_refreshed": 364.0766791828, + "Vacc_refreshed_2": 182.0383395914 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14472.9152722164, + "Vacc_completed": 1421.7399661156, + "Vacc_refreshed": 371.2418954122, + "Vacc_refreshed_2": 185.6209477061 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14474.3971159945, + "Vacc_completed": 1423.8796012137, + "Vacc_refreshed": 378.3445685688, + "Vacc_refreshed_2": 189.1722842844 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14482.9259977884, + "Vacc_completed": 1428.8212618966, + "Vacc_refreshed": 382.6712538747, + "Vacc_refreshed_2": 191.33562693735 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14491.6837567491, + "Vacc_completed": 1430.1481016913, + "Vacc_refreshed": 392.5489632959, + "Vacc_refreshed_2": 196.27448164795 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14499.5728298642, + "Vacc_completed": 1439.468906008, + "Vacc_refreshed": 397.6649554861, + "Vacc_refreshed_2": 198.83247774305 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14500.4884339857, + "Vacc_completed": 1447.6074532094, + "Vacc_refreshed": 404.4236802991, + "Vacc_refreshed_2": 202.21184014955 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14508.6628209678, + "Vacc_completed": 1449.1955087396, + "Vacc_refreshed": 413.1290507873, + "Vacc_refreshed_2": 206.56452539365 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14509.0177335192, + "Vacc_completed": 1457.0313439789, + "Vacc_refreshed": 418.6984801264, + "Vacc_refreshed_2": 209.3492400632 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14518.7925361684, + "Vacc_completed": 1462.4055060107, + "Vacc_refreshed": 419.6070699812, + "Vacc_refreshed_2": 209.8035349906 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14522.121758092, + "Vacc_completed": 1468.1811367429, + "Vacc_refreshed": 425.9772045183, + "Vacc_refreshed_2": 212.98860225915 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14528.5474917037, + "Vacc_completed": 1473.5164593205, + "Vacc_refreshed": 435.7810319021, + "Vacc_refreshed_2": 217.89051595105 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14536.5601109176, + "Vacc_completed": 1481.2704120463, + "Vacc_refreshed": 438.2410199432, + "Vacc_refreshed_2": 219.1205099716 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14542.1473955627, + "Vacc_completed": 1482.7064631605, + "Vacc_refreshed": 445.3488141502, + "Vacc_refreshed_2": 222.6744070751 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14544.5952478081, + "Vacc_completed": 1486.0552178086, + "Vacc_refreshed": 446.1812966093, + "Vacc_refreshed_2": 223.09064830465 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10765.9941189788, + "Vacc_completed": 1603.3500569399, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.3717745702, + "Vacc_completed": 1605.3068408797, + "Vacc_refreshed": 3.6283182226, + "Vacc_refreshed_2": 1.8141591113 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.4956401429, + "Vacc_completed": 1610.6119068185, + "Vacc_refreshed": 6.1967396209, + "Vacc_refreshed_2": 3.09836981045 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10774.4184508751, + "Vacc_completed": 1613.016161978, + "Vacc_refreshed": 15.7069691534, + "Vacc_refreshed_2": 7.8534845767 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10780.8073818373, + "Vacc_completed": 1622.1917795654, + "Vacc_refreshed": 20.1697274397, + "Vacc_refreshed_2": 10.08486371985 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10785.5287460006, + "Vacc_completed": 1625.0602525893, + "Vacc_refreshed": 22.4671684217, + "Vacc_refreshed_2": 11.23358421085 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10790.1084610651, + "Vacc_completed": 1627.3787523231, + "Vacc_refreshed": 28.5217462646, + "Vacc_refreshed_2": 14.2608731323 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10796.2300309, + "Vacc_completed": 1630.4363483664, + "Vacc_refreshed": 35.3070676184, + "Vacc_refreshed_2": 17.6535338092 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10801.7222904172, + "Vacc_completed": 1638.725087864, + "Vacc_refreshed": 43.7679344272, + "Vacc_refreshed_2": 21.8839672136 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10804.7724722766, + "Vacc_completed": 1646.4905335365, + "Vacc_refreshed": 44.1718542676, + "Vacc_refreshed_2": 22.0859271338 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10814.3453353804, + "Vacc_completed": 1650.9992837124, + "Vacc_refreshed": 49.5204655539, + "Vacc_refreshed_2": 24.76023277695 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10821.6255112157, + "Vacc_completed": 1656.4335840831, + "Vacc_refreshed": 52.7009855172, + "Vacc_refreshed_2": 26.3504927586 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10830.9379325639, + "Vacc_completed": 1657.186187271, + "Vacc_refreshed": 56.5428649986, + "Vacc_refreshed_2": 28.2714324993 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10838.202902864, + "Vacc_completed": 1662.1470499364, + "Vacc_refreshed": 58.6277824858, + "Vacc_refreshed_2": 29.3138912429 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10840.8786753296, + "Vacc_completed": 1670.6860254071, + "Vacc_refreshed": 58.7593924743, + "Vacc_refreshed_2": 29.37969623715 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10843.7453960183, + "Vacc_completed": 1673.6372365137, + "Vacc_refreshed": 61.8595630166, + "Vacc_refreshed_2": 30.9297815083 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10849.1151892515, + "Vacc_completed": 1675.1066023109, + "Vacc_refreshed": 64.6020615007, + "Vacc_refreshed_2": 32.30103075035 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10850.9329685403, + "Vacc_completed": 1679.1505675366, + "Vacc_refreshed": 72.0237510859, + "Vacc_refreshed_2": 36.01187554295 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10854.4610677614, + "Vacc_completed": 1681.5473018047, + "Vacc_refreshed": 75.0145349272, + "Vacc_refreshed_2": 37.5072674636 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10858.0662824418, + "Vacc_completed": 1688.7179113019, + "Vacc_refreshed": 82.7641475111, + "Vacc_refreshed_2": 41.38207375555 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10867.8357803799, + "Vacc_completed": 1688.741478882, + "Vacc_refreshed": 92.1411476813, + "Vacc_refreshed_2": 46.07057384065 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10877.245759177, + "Vacc_completed": 1696.3354153291, + "Vacc_refreshed": 93.5350586202, + "Vacc_refreshed_2": 46.7675293101 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10878.9277486403, + "Vacc_completed": 1704.5169058825, + "Vacc_refreshed": 99.9257252117, + "Vacc_refreshed_2": 49.96286260585 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10881.5163902637, + "Vacc_completed": 1704.5184844203, + "Vacc_refreshed": 104.0563799981, + "Vacc_refreshed_2": 52.02818999905 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10882.0628121233, + "Vacc_completed": 1710.1811092467, + "Vacc_refreshed": 110.998904559, + "Vacc_refreshed_2": 55.4994522795 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10884.1868939764, + "Vacc_completed": 1711.6669667815, + "Vacc_refreshed": 119.5835613879, + "Vacc_refreshed_2": 59.79178069395 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10890.26315895, + "Vacc_completed": 1712.8219244738, + "Vacc_refreshed": 126.203975023, + "Vacc_refreshed_2": 63.1019875115 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10894.6858788747, + "Vacc_completed": 1721.7467435031, + "Vacc_refreshed": 135.9649739788, + "Vacc_refreshed_2": 67.9824869894 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10897.5575288795, + "Vacc_completed": 1721.7787127468, + "Vacc_refreshed": 145.614673399, + "Vacc_refreshed_2": 72.8073366995 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10903.1231721286, + "Vacc_completed": 1724.7269587992, + "Vacc_refreshed": 149.6717929743, + "Vacc_refreshed_2": 74.83589648715 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10911.1763853993, + "Vacc_completed": 1726.3071857535, + "Vacc_refreshed": 158.0496522084, + "Vacc_refreshed_2": 79.0248261042 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10919.5582023277, + "Vacc_completed": 1727.9236223535, + "Vacc_refreshed": 160.5751263702, + "Vacc_refreshed_2": 80.2875631851 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10920.4962369047, + "Vacc_completed": 1730.7211296321, + "Vacc_refreshed": 162.2038531114, + "Vacc_refreshed_2": 81.1019265557 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10930.0062994591, + "Vacc_completed": 1733.2273616859, + "Vacc_refreshed": 164.6178844659, + "Vacc_refreshed_2": 82.30894223295 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10931.0781786076, + "Vacc_completed": 1743.0639116966, + "Vacc_refreshed": 171.6949336111, + "Vacc_refreshed_2": 85.84746680555 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10936.2371584575, + "Vacc_completed": 1743.4973637943, + "Vacc_refreshed": 173.1954991423, + "Vacc_refreshed_2": 86.59774957115 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10937.1969149599, + "Vacc_completed": 1752.0043206175, + "Vacc_refreshed": 173.4521249531, + "Vacc_refreshed_2": 86.72606247655 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10942.5829785849, + "Vacc_completed": 1758.5438162851, + "Vacc_refreshed": 175.0971428389, + "Vacc_refreshed_2": 87.54857141945 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10945.8458051779, + "Vacc_completed": 1765.593119461, + "Vacc_refreshed": 184.781293552, + "Vacc_refreshed_2": 92.390646776 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10955.2619609788, + "Vacc_completed": 1766.7516696253, + "Vacc_refreshed": 194.3279051811, + "Vacc_refreshed_2": 97.16395259055 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0529992794, + "Vacc_completed": 1774.4096958807, + "Vacc_refreshed": 199.3585168564, + "Vacc_refreshed_2": 99.6792584282 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0740456643, + "Vacc_completed": 1776.7353479155, + "Vacc_refreshed": 200.2783085421, + "Vacc_refreshed_2": 100.13915427105 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7647446192, + "Vacc_completed": 1786.1838226639, + "Vacc_refreshed": 202.522841172, + "Vacc_refreshed_2": 101.261420586 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7950553291, + "Vacc_completed": 1788.5013884886, + "Vacc_refreshed": 205.1107008609, + "Vacc_refreshed_2": 102.55535043045 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10973.1049316279, + "Vacc_completed": 1790.2712267193, + "Vacc_refreshed": 214.0688577867, + "Vacc_refreshed_2": 107.03442889335 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10976.2696576646, + "Vacc_completed": 1797.8582422894, + "Vacc_refreshed": 219.0460187772, + "Vacc_refreshed_2": 109.5230093886 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10984.9161656634, + "Vacc_completed": 1801.5924446935, + "Vacc_refreshed": 227.656626047, + "Vacc_refreshed_2": 113.8283130235 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10994.063273181, + "Vacc_completed": 1802.6817444812, + "Vacc_refreshed": 235.6032823069, + "Vacc_refreshed_2": 117.80164115345 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10996.8771305673, + "Vacc_completed": 1802.9071097171, + "Vacc_refreshed": 237.7242073629, + "Vacc_refreshed_2": 118.86210368145 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11002.0527900673, + "Vacc_completed": 1809.5395950318, + "Vacc_refreshed": 241.3631599251, + "Vacc_refreshed_2": 120.68157996255 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11007.1528572096, + "Vacc_completed": 1813.9025489723, + "Vacc_refreshed": 245.5305344153, + "Vacc_refreshed_2": 122.76526720765 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11013.1337350258, + "Vacc_completed": 1821.5275057931, + "Vacc_refreshed": 250.3168579858, + "Vacc_refreshed_2": 125.1584289929 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11015.6696905796, + "Vacc_completed": 1822.9598630397, + "Vacc_refreshed": 255.6335351411, + "Vacc_refreshed_2": 127.81676757055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11023.4754023371, + "Vacc_completed": 1827.2471461973, + "Vacc_refreshed": 265.5951098299, + "Vacc_refreshed_2": 132.79755491495 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11032.8284479669, + "Vacc_completed": 1827.5539031975, + "Vacc_refreshed": 267.3513136054, + "Vacc_refreshed_2": 133.6756568027 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.3845078238, + "Vacc_completed": 1828.9970028031, + "Vacc_refreshed": 270.5903250252, + "Vacc_refreshed_2": 135.2951625126 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.693720803, + "Vacc_completed": 1836.2049019351, + "Vacc_refreshed": 272.0758803579, + "Vacc_refreshed_2": 136.03794017895 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11047.8242120991, + "Vacc_completed": 1837.1027842122, + "Vacc_refreshed": 275.2277393803, + "Vacc_refreshed_2": 137.61386969015 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11053.900379851, + "Vacc_completed": 1838.273599421, + "Vacc_refreshed": 282.2344875735, + "Vacc_refreshed_2": 141.11724378675 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11059.6633767419, + "Vacc_completed": 1845.0089267377, + "Vacc_refreshed": 284.3140546038, + "Vacc_refreshed_2": 142.1570273019 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11068.9288674107, + "Vacc_completed": 1852.7615624634, + "Vacc_refreshed": 287.0304142153, + "Vacc_refreshed_2": 143.51520710765 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11072.6595101177, + "Vacc_completed": 1857.871819743, + "Vacc_refreshed": 289.2733395979, + "Vacc_refreshed_2": 144.63666979895 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11082.5784142097, + "Vacc_completed": 1865.7647392626, + "Vacc_refreshed": 291.3426551576, + "Vacc_refreshed_2": 145.6713275788 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11089.5185616411, + "Vacc_completed": 1869.3958231852, + "Vacc_refreshed": 299.8179962185, + "Vacc_refreshed_2": 149.90899810925 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11097.3087770941, + "Vacc_completed": 1878.7026117675, + "Vacc_refreshed": 306.1608208876, + "Vacc_refreshed_2": 153.0804104438 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11101.8508357142, + "Vacc_completed": 1879.7270518854, + "Vacc_refreshed": 308.0716738039, + "Vacc_refreshed_2": 154.03583690195 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11103.0915214706, + "Vacc_completed": 1883.5574266434, + "Vacc_refreshed": 311.2801806804, + "Vacc_refreshed_2": 155.6400903402 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11111.9334619087, + "Vacc_completed": 1887.7967037043, + "Vacc_refreshed": 320.2156677375, + "Vacc_refreshed_2": 160.10783386875 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11118.8667730664, + "Vacc_completed": 1896.6793284207, + "Vacc_refreshed": 321.8561637233, + "Vacc_refreshed_2": 160.92808186165 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11123.0290736537, + "Vacc_completed": 1902.1985445903, + "Vacc_refreshed": 328.4656069808, + "Vacc_refreshed_2": 164.2328034904 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11129.3471714321, + "Vacc_completed": 1902.2057666507, + "Vacc_refreshed": 334.8734059386, + "Vacc_refreshed_2": 167.4367029693 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11137.9949570833, + "Vacc_completed": 1907.7915885083, + "Vacc_refreshed": 339.9783670978, + "Vacc_refreshed_2": 169.9891835489 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11139.4617826874, + "Vacc_completed": 1910.6126501167, + "Vacc_refreshed": 342.8472462544, + "Vacc_refreshed_2": 171.4236231272 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11144.4191917936, + "Vacc_completed": 1917.8558172992, + "Vacc_refreshed": 351.3104814196, + "Vacc_refreshed_2": 175.6552407098 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11153.423123173, + "Vacc_completed": 1927.8115362669, + "Vacc_refreshed": 359.1887782128, + "Vacc_refreshed_2": 179.5943891064 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11155.4646855253, + "Vacc_completed": 1931.0938823989, + "Vacc_refreshed": 363.4217582407, + "Vacc_refreshed_2": 181.71087912035 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11164.8755655095, + "Vacc_completed": 1932.0922021433, + "Vacc_refreshed": 369.5881371093, + "Vacc_refreshed_2": 184.79406855465 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11168.2127634861, + "Vacc_completed": 1937.8864562316, + "Vacc_refreshed": 371.2850357688, + "Vacc_refreshed_2": 185.6425178844 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11170.3919325879, + "Vacc_completed": 1943.9625258254, + "Vacc_refreshed": 372.564368772, + "Vacc_refreshed_2": 186.282184386 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11178.2156716034, + "Vacc_completed": 1946.3680545291, + "Vacc_refreshed": 377.1791450411, + "Vacc_refreshed_2": 188.58957252055 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11187.7206334256, + "Vacc_completed": 1950.3408321869, + "Vacc_refreshed": 385.28114877, + "Vacc_refreshed_2": 192.640574385 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11189.2295548943, + "Vacc_completed": 1952.7801877326, + "Vacc_refreshed": 386.4768386941, + "Vacc_refreshed_2": 193.23841934705 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11193.8090943925, + "Vacc_completed": 1960.5337079214, + "Vacc_refreshed": 395.6463777137, + "Vacc_refreshed_2": 197.82318885685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11198.0758128722, + "Vacc_completed": 1964.4220756604, + "Vacc_refreshed": 404.4005517293, + "Vacc_refreshed_2": 202.20027586465 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11200.1395546734, + "Vacc_completed": 1974.1843879258, + "Vacc_refreshed": 410.4354615606, + "Vacc_refreshed_2": 205.2177307803 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.0858861212, + "Vacc_completed": 1978.0710124849, + "Vacc_refreshed": 414.2205337181, + "Vacc_refreshed_2": 207.11026685905 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.5521637654, + "Vacc_completed": 1981.3589179628, + "Vacc_refreshed": 419.5840242501, + "Vacc_refreshed_2": 209.79201212505 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11211.6562498266, + "Vacc_completed": 1989.6665585254, + "Vacc_refreshed": 426.6154672823, + "Vacc_refreshed_2": 213.30773364115 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11219.1926870115, + "Vacc_completed": 1996.1459430488, + "Vacc_refreshed": 430.16915603, + "Vacc_refreshed_2": 215.084578015 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11221.4656474699, + "Vacc_completed": 2001.4601213853, + "Vacc_refreshed": 430.8770850788, + "Vacc_refreshed_2": 215.4385425394 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11224.2379660032, + "Vacc_completed": 2006.2961081678, + "Vacc_refreshed": 433.8074021391, + "Vacc_refreshed_2": 216.90370106955 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11229.137503588, + "Vacc_completed": 2013.2392255015, + "Vacc_refreshed": 441.1218403265, + "Vacc_refreshed_2": 220.56092016325 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15118.5419446559, + "Vacc_completed": 1046.4766182565, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15127.0441726861, + "Vacc_completed": 1051.8189573454, + "Vacc_refreshed": 4.7668817312, + "Vacc_refreshed_2": 2.3834408656 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15134.2198668737, + "Vacc_completed": 1051.8898550539, + "Vacc_refreshed": 6.8954841457, + "Vacc_refreshed_2": 3.44774207285 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15138.5012633389, + "Vacc_completed": 1054.1938291422, + "Vacc_refreshed": 12.8850967826, + "Vacc_refreshed_2": 6.4425483913 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15140.019297286, + "Vacc_completed": 1057.2812920036, + "Vacc_refreshed": 15.610006044, + "Vacc_refreshed_2": 7.805003022 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15141.0655653453, + "Vacc_completed": 1061.1873607435, + "Vacc_refreshed": 18.0052067519, + "Vacc_refreshed_2": 9.00260337595 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15146.6047446953, + "Vacc_completed": 1067.3953196211, + "Vacc_refreshed": 27.5155266211, + "Vacc_refreshed_2": 13.75776331055 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15150.2459378898, + "Vacc_completed": 1077.315397207, + "Vacc_refreshed": 28.0742687581, + "Vacc_refreshed_2": 14.03713437905 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15153.3836683973, + "Vacc_completed": 1082.8237823387, + "Vacc_refreshed": 32.6629347887, + "Vacc_refreshed_2": 16.33146739435 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15155.2486658897, + "Vacc_completed": 1087.8721865368, + "Vacc_refreshed": 42.082807235, + "Vacc_refreshed_2": 21.0414036175 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15157.4630323429, + "Vacc_completed": 1090.0916620904, + "Vacc_refreshed": 43.8436800298, + "Vacc_refreshed_2": 21.9218400149 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15158.7941750828, + "Vacc_completed": 1091.8322828475, + "Vacc_refreshed": 44.7371311455, + "Vacc_refreshed_2": 22.36856557275 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15159.4697179186, + "Vacc_completed": 1097.9581123146, + "Vacc_refreshed": 52.5410403094, + "Vacc_refreshed_2": 26.2705201547 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15166.8797207146, + "Vacc_completed": 1103.4838023049, + "Vacc_refreshed": 58.4482610787, + "Vacc_refreshed_2": 29.22413053935 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.177591783, + "Vacc_completed": 1107.529236183, + "Vacc_refreshed": 61.868532741, + "Vacc_refreshed_2": 30.9342663705 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.3473624207, + "Vacc_completed": 1108.0854442406, + "Vacc_refreshed": 64.122741794, + "Vacc_refreshed_2": 32.061370897 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15176.6656703161, + "Vacc_completed": 1114.7623442184, + "Vacc_refreshed": 73.3909194547, + "Vacc_refreshed_2": 36.69545972735 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15182.6538662202, + "Vacc_completed": 1121.0967139584, + "Vacc_refreshed": 78.4108273222, + "Vacc_refreshed_2": 39.2054136611 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15191.0826029366, + "Vacc_completed": 1124.8733122731, + "Vacc_refreshed": 88.1249123157, + "Vacc_refreshed_2": 44.06245615785 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15195.1567917247, + "Vacc_completed": 1133.1683853487, + "Vacc_refreshed": 94.0586819047, + "Vacc_refreshed_2": 47.02934095235 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15197.6523517992, + "Vacc_completed": 1140.1742056487, + "Vacc_refreshed": 97.7116921077, + "Vacc_refreshed_2": 48.85584605385 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15202.8832794911, + "Vacc_completed": 1140.4207518542, + "Vacc_refreshed": 101.0390519368, + "Vacc_refreshed_2": 50.5195259684 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15209.502983548, + "Vacc_completed": 1144.1138351675, + "Vacc_refreshed": 104.5568369595, + "Vacc_refreshed_2": 52.27841847975 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15218.5591667959, + "Vacc_completed": 1153.0110444013, + "Vacc_refreshed": 111.8121115483, + "Vacc_refreshed_2": 55.90605577415 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15223.6275127037, + "Vacc_completed": 1157.3585549388, + "Vacc_refreshed": 113.9066704897, + "Vacc_refreshed_2": 56.95333524485 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.4100349304, + "Vacc_completed": 1162.1581378525, + "Vacc_refreshed": 116.416758139, + "Vacc_refreshed_2": 58.2083790695 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.7888080253, + "Vacc_completed": 1166.5300160643, + "Vacc_refreshed": 119.2414894864, + "Vacc_refreshed_2": 59.6207447432 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15235.240974732, + "Vacc_completed": 1171.76423914, + "Vacc_refreshed": 129.0137217302, + "Vacc_refreshed_2": 64.5068608651 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15236.252829019, + "Vacc_completed": 1174.1820893055, + "Vacc_refreshed": 130.8298102316, + "Vacc_refreshed_2": 65.4149051158 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15244.5996289271, + "Vacc_completed": 1181.3457343202, + "Vacc_refreshed": 138.0198133972, + "Vacc_refreshed_2": 69.0099066986 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15247.7688417561, + "Vacc_completed": 1186.4632437534, + "Vacc_refreshed": 147.549469044, + "Vacc_refreshed_2": 73.774734522 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15254.8324409461, + "Vacc_completed": 1196.0640695451, + "Vacc_refreshed": 148.035813332, + "Vacc_refreshed_2": 74.017906666 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15263.9056700401, + "Vacc_completed": 1202.0195228295, + "Vacc_refreshed": 152.9647063671, + "Vacc_refreshed_2": 76.48235318355 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15271.3608079113, + "Vacc_completed": 1205.9189472233, + "Vacc_refreshed": 159.4326071199, + "Vacc_refreshed_2": 79.71630355995 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15274.5391192733, + "Vacc_completed": 1209.5333389579, + "Vacc_refreshed": 165.8197711746, + "Vacc_refreshed_2": 82.9098855873 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15279.9252173752, + "Vacc_completed": 1217.5022918804, + "Vacc_refreshed": 170.1668415009, + "Vacc_refreshed_2": 85.08342075045 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15289.6429605219, + "Vacc_completed": 1218.0921627258, + "Vacc_refreshed": 176.8858359396, + "Vacc_refreshed_2": 88.4429179698 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15297.4452269777, + "Vacc_completed": 1218.4916546179, + "Vacc_refreshed": 177.0224757358, + "Vacc_refreshed_2": 88.5112378679 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15304.6068820067, + "Vacc_completed": 1221.1648349639, + "Vacc_refreshed": 182.8363512803, + "Vacc_refreshed_2": 91.41817564015 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15308.4472782837, + "Vacc_completed": 1221.3254317254, + "Vacc_refreshed": 188.4124431026, + "Vacc_refreshed_2": 94.2062215513 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15313.3535420035, + "Vacc_completed": 1228.797689569, + "Vacc_refreshed": 197.4958413402, + "Vacc_refreshed_2": 98.7479206701 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15319.6989570363, + "Vacc_completed": 1230.5766158569, + "Vacc_refreshed": 207.1280776834, + "Vacc_refreshed_2": 103.5640388417 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15329.2757609065, + "Vacc_completed": 1232.5532561558, + "Vacc_refreshed": 216.6030971785, + "Vacc_refreshed_2": 108.30154858925 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15331.3854251166, + "Vacc_completed": 1240.7858568563, + "Vacc_refreshed": 224.0947128601, + "Vacc_refreshed_2": 112.04735643005 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15335.6254694555, + "Vacc_completed": 1248.7648628072, + "Vacc_refreshed": 228.3914917972, + "Vacc_refreshed_2": 114.1957458986 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15342.4956408139, + "Vacc_completed": 1253.345700271, + "Vacc_refreshed": 237.7873655386, + "Vacc_refreshed_2": 118.8936827693 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15349.2985100866, + "Vacc_completed": 1254.923228178, + "Vacc_refreshed": 243.7398150729, + "Vacc_refreshed_2": 121.86990753645 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.0642849231, + "Vacc_completed": 1256.1247258557, + "Vacc_refreshed": 246.0998008594, + "Vacc_refreshed_2": 123.0499004297 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.3098206871, + "Vacc_completed": 1258.7673082658, + "Vacc_refreshed": 255.4830156808, + "Vacc_refreshed_2": 127.7415078404 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.8477668821, + "Vacc_completed": 1261.8739088788, + "Vacc_refreshed": 262.4150374381, + "Vacc_refreshed_2": 131.20751871905 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15355.0053188609, + "Vacc_completed": 1268.7063064011, + "Vacc_refreshed": 268.0354130392, + "Vacc_refreshed_2": 134.0177065196 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15356.8245202899, + "Vacc_completed": 1275.6335562552, + "Vacc_refreshed": 272.2800844077, + "Vacc_refreshed_2": 136.14004220385 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15357.7799420851, + "Vacc_completed": 1276.6526923528, + "Vacc_refreshed": 272.4509982396, + "Vacc_refreshed_2": 136.2254991198 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15360.090059624, + "Vacc_completed": 1286.3717718947, + "Vacc_refreshed": 276.5108897334, + "Vacc_refreshed_2": 138.2554448667 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15368.9251730685, + "Vacc_completed": 1289.9608638772, + "Vacc_refreshed": 286.1598516049, + "Vacc_refreshed_2": 143.07992580245 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15374.4348532349, + "Vacc_completed": 1292.7431692071, + "Vacc_refreshed": 286.9834989324, + "Vacc_refreshed_2": 143.4917494662 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15375.2266568732, + "Vacc_completed": 1293.6118841564, + "Vacc_refreshed": 287.1997495191, + "Vacc_refreshed_2": 143.59987475955 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15378.8167187789, + "Vacc_completed": 1294.2472234682, + "Vacc_refreshed": 293.7465776915, + "Vacc_refreshed_2": 146.87328884575 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15381.8183566081, + "Vacc_completed": 1296.5074589754, + "Vacc_refreshed": 294.394169978, + "Vacc_refreshed_2": 147.197084989 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15390.3384592829, + "Vacc_completed": 1298.1144038724, + "Vacc_refreshed": 295.3508481166, + "Vacc_refreshed_2": 147.6754240583 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15397.4841102393, + "Vacc_completed": 1301.7744150574, + "Vacc_refreshed": 295.636121459, + "Vacc_refreshed_2": 147.8180607295 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15406.9128765942, + "Vacc_completed": 1306.3546732411, + "Vacc_refreshed": 299.2176949608, + "Vacc_refreshed_2": 149.6088474804 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15412.9312961067, + "Vacc_completed": 1313.4112918553, + "Vacc_refreshed": 304.1283567048, + "Vacc_refreshed_2": 152.0641783524 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15413.8396565369, + "Vacc_completed": 1323.1872711778, + "Vacc_refreshed": 309.3767578057, + "Vacc_refreshed_2": 154.68837890285 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15417.5353933956, + "Vacc_completed": 1332.5570169907, + "Vacc_refreshed": 310.9982936972, + "Vacc_refreshed_2": 155.4991468486 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15418.826072466, + "Vacc_completed": 1333.4298810326, + "Vacc_refreshed": 318.8191964614, + "Vacc_refreshed_2": 159.4095982307 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15428.6081802722, + "Vacc_completed": 1335.4576305614, + "Vacc_refreshed": 322.681425219, + "Vacc_refreshed_2": 161.3407126095 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15434.4342053135, + "Vacc_completed": 1341.8151001107, + "Vacc_refreshed": 328.87826872, + "Vacc_refreshed_2": 164.43913436 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15442.7494739491, + "Vacc_completed": 1342.4758295952, + "Vacc_refreshed": 336.8125605002, + "Vacc_refreshed_2": 168.4062802501 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15451.9615776405, + "Vacc_completed": 1343.8595431355, + "Vacc_refreshed": 340.6379428895, + "Vacc_refreshed_2": 170.31897144475 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15461.0343740586, + "Vacc_completed": 1352.0217149096, + "Vacc_refreshed": 342.4652609374, + "Vacc_refreshed_2": 171.2326304687 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15467.8869999547, + "Vacc_completed": 1353.9994636638, + "Vacc_refreshed": 343.6202751504, + "Vacc_refreshed_2": 171.8101375752 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15474.9129704383, + "Vacc_completed": 1363.3653927841, + "Vacc_refreshed": 345.0578595323, + "Vacc_refreshed_2": 172.52892976615 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15483.483328834, + "Vacc_completed": 1372.0348541584, + "Vacc_refreshed": 348.4131919851, + "Vacc_refreshed_2": 174.20659599255 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15489.3942653446, + "Vacc_completed": 1377.4077406314, + "Vacc_refreshed": 355.6717942515, + "Vacc_refreshed_2": 177.83589712575 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15494.2503612359, + "Vacc_completed": 1377.4290090401, + "Vacc_refreshed": 358.9820312389, + "Vacc_refreshed_2": 179.49101561945 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15495.3394152185, + "Vacc_completed": 1378.0321848221, + "Vacc_refreshed": 364.7453207897, + "Vacc_refreshed_2": 182.37266039485 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15497.7000250685, + "Vacc_completed": 1378.1938721933, + "Vacc_refreshed": 367.9820639836, + "Vacc_refreshed_2": 183.9910319918 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15498.7689863883, + "Vacc_completed": 1381.0445655705, + "Vacc_refreshed": 371.501202086, + "Vacc_refreshed_2": 185.750601043 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15501.5446144083, + "Vacc_completed": 1383.5660020007, + "Vacc_refreshed": 378.7475176563, + "Vacc_refreshed_2": 189.37375882815 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15509.8230148672, + "Vacc_completed": 1390.2361319678, + "Vacc_refreshed": 382.7365149116, + "Vacc_refreshed_2": 191.3682574558 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15516.8607244434, + "Vacc_completed": 1391.5356833196, + "Vacc_refreshed": 387.0287274101, + "Vacc_refreshed_2": 193.51436370505 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15525.4621417067, + "Vacc_completed": 1391.7538408053, + "Vacc_refreshed": 394.832505058, + "Vacc_refreshed_2": 197.416252529 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15530.1412323442, + "Vacc_completed": 1393.5856974411, + "Vacc_refreshed": 402.9766589833, + "Vacc_refreshed_2": 201.48832949165 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15538.5266345599, + "Vacc_completed": 1394.0860887346, + "Vacc_refreshed": 409.427624651, + "Vacc_refreshed_2": 204.7138123255 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15545.1857152555, + "Vacc_completed": 1400.9009375981, + "Vacc_refreshed": 414.8161834543, + "Vacc_refreshed_2": 207.40809172715 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15550.0113840393, + "Vacc_completed": 1405.1190388135, + "Vacc_refreshed": 423.1492506703, + "Vacc_refreshed_2": 211.57462533515 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15557.7502728646, + "Vacc_completed": 1412.7232837907, + "Vacc_refreshed": 429.51858195, + "Vacc_refreshed_2": 214.759290975 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15558.6635273277, + "Vacc_completed": 1416.4367765358, + "Vacc_refreshed": 433.7574702422, + "Vacc_refreshed_2": 216.8787351211 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15567.8923476818, + "Vacc_completed": 1417.419547185, + "Vacc_refreshed": 436.3988331827, + "Vacc_refreshed_2": 218.19941659135 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15572.0110691064, + "Vacc_completed": 1422.1291332179, + "Vacc_refreshed": 444.7065625402, + "Vacc_refreshed_2": 222.3532812701 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15580.056372857, + "Vacc_completed": 1429.5241883626, + "Vacc_refreshed": 445.9185645116, + "Vacc_refreshed_2": 222.9592822558 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14604.162091487, + "Vacc_completed": 1396.5367205842, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14608.6011110978, + "Vacc_completed": 1403.0638750962, + "Vacc_refreshed": 0.4818747518, + "Vacc_refreshed_2": 0.2409373759 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14617.4016613244, + "Vacc_completed": 1412.4617013546, + "Vacc_refreshed": 2.8841327921, + "Vacc_refreshed_2": 1.44206639605 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14626.8147148128, + "Vacc_completed": 1413.5937989207, + "Vacc_refreshed": 4.347225901, + "Vacc_refreshed_2": 2.1736129505 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14636.7930742671, + "Vacc_completed": 1416.5445655325, + "Vacc_refreshed": 10.9126558661, + "Vacc_refreshed_2": 5.45632793305 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14639.261920851, + "Vacc_completed": 1419.7526675766, + "Vacc_refreshed": 12.1285186735, + "Vacc_refreshed_2": 6.06425933675 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14646.6246553828, + "Vacc_completed": 1429.1501916355, + "Vacc_refreshed": 14.2999622979, + "Vacc_refreshed_2": 7.14998114895 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14655.9228453283, + "Vacc_completed": 1433.2061319495, + "Vacc_refreshed": 18.6765331159, + "Vacc_refreshed_2": 9.33826655795 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.6905295279, + "Vacc_completed": 1437.4319338048, + "Vacc_refreshed": 19.3435044237, + "Vacc_refreshed_2": 9.67175221185 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.8883385186, + "Vacc_completed": 1446.7135497598, + "Vacc_refreshed": 28.359576628, + "Vacc_refreshed_2": 14.179788314 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14660.5634553543, + "Vacc_completed": 1450.9111526521, + "Vacc_refreshed": 38.3056947196, + "Vacc_refreshed_2": 19.1528473598 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14667.0822550267, + "Vacc_completed": 1458.1473384005, + "Vacc_refreshed": 38.8316353015, + "Vacc_refreshed_2": 19.41581765075 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14668.0361388154, + "Vacc_completed": 1464.9440155832, + "Vacc_refreshed": 44.1485629725, + "Vacc_refreshed_2": 22.07428148625 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14669.4679031112, + "Vacc_completed": 1470.1284856322, + "Vacc_refreshed": 47.7639888511, + "Vacc_refreshed_2": 23.88199442555 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.2618994679, + "Vacc_completed": 1476.9344530457, + "Vacc_refreshed": 56.361748961, + "Vacc_refreshed_2": 28.1808744805 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.3447644481, + "Vacc_completed": 1477.2393580763, + "Vacc_refreshed": 57.2273767339, + "Vacc_refreshed_2": 28.61368836695 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14684.0130216555, + "Vacc_completed": 1484.3234594705, + "Vacc_refreshed": 63.4497732245, + "Vacc_refreshed_2": 31.72488661225 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14691.8154699011, + "Vacc_completed": 1492.8513113216, + "Vacc_refreshed": 71.1720264341, + "Vacc_refreshed_2": 35.58601321705 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14697.5036031252, + "Vacc_completed": 1493.7450842417, + "Vacc_refreshed": 77.3635307257, + "Vacc_refreshed_2": 38.68176536285 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14702.599106658, + "Vacc_completed": 1503.4641107157, + "Vacc_refreshed": 82.0575571669, + "Vacc_refreshed_2": 41.02877858345 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14706.3806325115, + "Vacc_completed": 1509.7236994586, + "Vacc_refreshed": 82.4020129882, + "Vacc_refreshed_2": 41.2010064941 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14711.1723860607, + "Vacc_completed": 1510.3801441147, + "Vacc_refreshed": 89.5249618369, + "Vacc_refreshed_2": 44.76248091845 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14720.0093085987, + "Vacc_completed": 1517.7733661353, + "Vacc_refreshed": 99.2211580734, + "Vacc_refreshed_2": 49.6105790367 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14727.6474505495, + "Vacc_completed": 1519.2060691793, + "Vacc_refreshed": 104.7140344902, + "Vacc_refreshed_2": 52.3570172451 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14737.2025033477, + "Vacc_completed": 1520.8147599339, + "Vacc_refreshed": 111.7829864033, + "Vacc_refreshed_2": 55.89149320165 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14739.5787007901, + "Vacc_completed": 1526.8277919335, + "Vacc_refreshed": 118.2526435067, + "Vacc_refreshed_2": 59.12632175335 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14740.2622466128, + "Vacc_completed": 1533.9654672239, + "Vacc_refreshed": 121.0872593022, + "Vacc_refreshed_2": 60.5436296511 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.3105527103, + "Vacc_completed": 1534.5209202615, + "Vacc_refreshed": 130.3683956867, + "Vacc_refreshed_2": 65.18419784335 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.4386233429, + "Vacc_completed": 1534.652607589, + "Vacc_refreshed": 131.8609814668, + "Vacc_refreshed_2": 65.9304907334 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14750.7660084012, + "Vacc_completed": 1541.7255942491, + "Vacc_refreshed": 135.0718914562, + "Vacc_refreshed_2": 67.5359457281 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14754.5460710197, + "Vacc_completed": 1550.2608445951, + "Vacc_refreshed": 143.3620456295, + "Vacc_refreshed_2": 71.68102281475 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14759.0944017155, + "Vacc_completed": 1555.0005459425, + "Vacc_refreshed": 149.1268404613, + "Vacc_refreshed_2": 74.56342023065 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14765.0469016605, + "Vacc_completed": 1561.0596836707, + "Vacc_refreshed": 156.632878281, + "Vacc_refreshed_2": 78.3164391405 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14767.8747922121, + "Vacc_completed": 1562.2055298685, + "Vacc_refreshed": 158.7846499619, + "Vacc_refreshed_2": 79.39232498095 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14770.6956031505, + "Vacc_completed": 1564.0912014269, + "Vacc_refreshed": 160.2235512232, + "Vacc_refreshed_2": 80.1117756116 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14771.8405767953, + "Vacc_completed": 1569.1767284097, + "Vacc_refreshed": 163.0960075253, + "Vacc_refreshed_2": 81.54800376265 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14772.2052559189, + "Vacc_completed": 1577.0342160583, + "Vacc_refreshed": 171.338237261, + "Vacc_refreshed_2": 85.6691186305 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14775.8209952029, + "Vacc_completed": 1582.4601331483, + "Vacc_refreshed": 171.7811634642, + "Vacc_refreshed_2": 85.8905817321 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14783.195452278, + "Vacc_completed": 1590.5417141678, + "Vacc_refreshed": 180.3921690168, + "Vacc_refreshed_2": 90.1960845084 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14789.7908493035, + "Vacc_completed": 1599.1828252755, + "Vacc_refreshed": 184.3843375412, + "Vacc_refreshed_2": 92.1921687706 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14799.5061304555, + "Vacc_completed": 1604.6353429891, + "Vacc_refreshed": 186.9160630046, + "Vacc_refreshed_2": 93.4580315023 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14800.1953862328, + "Vacc_completed": 1607.3418569739, + "Vacc_refreshed": 194.8977352638, + "Vacc_refreshed_2": 97.4488676319 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14804.6194220955, + "Vacc_completed": 1610.8601925588, + "Vacc_refreshed": 198.1360514295, + "Vacc_refreshed_2": 99.06802571475 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14807.6135970058, + "Vacc_completed": 1620.4676732545, + "Vacc_refreshed": 199.7756827366, + "Vacc_refreshed_2": 99.8878413683 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14812.6404573806, + "Vacc_completed": 1625.8005590907, + "Vacc_refreshed": 208.9834954342, + "Vacc_refreshed_2": 104.4917477171 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14821.7780993542, + "Vacc_completed": 1634.2191287828, + "Vacc_refreshed": 218.0082295343, + "Vacc_refreshed_2": 109.00411476715 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14826.4757459809, + "Vacc_completed": 1642.5529482935, + "Vacc_refreshed": 225.0524176739, + "Vacc_refreshed_2": 112.52620883695 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14831.5528263871, + "Vacc_completed": 1649.3317542887, + "Vacc_refreshed": 229.0729255762, + "Vacc_refreshed_2": 114.5364627881 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14835.4543265309, + "Vacc_completed": 1656.6375918093, + "Vacc_refreshed": 230.6069957275, + "Vacc_refreshed_2": 115.30349786375 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14843.0829401722, + "Vacc_completed": 1661.236165662, + "Vacc_refreshed": 240.090987042, + "Vacc_refreshed_2": 120.045493521 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14846.441543514, + "Vacc_completed": 1663.7621214807, + "Vacc_refreshed": 242.6005891297, + "Vacc_refreshed_2": 121.30029456485 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14852.8592673291, + "Vacc_completed": 1670.5438763585, + "Vacc_refreshed": 243.1550853514, + "Vacc_refreshed_2": 121.5775426757 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14859.7577792484, + "Vacc_completed": 1671.9654195564, + "Vacc_refreshed": 252.4226950148, + "Vacc_refreshed_2": 126.2113475074 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14860.9361402439, + "Vacc_completed": 1673.0063955744, + "Vacc_refreshed": 254.9337371613, + "Vacc_refreshed_2": 127.46686858065 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14866.4446359141, + "Vacc_completed": 1680.8225588341, + "Vacc_refreshed": 260.3047312661, + "Vacc_refreshed_2": 130.15236563305 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14873.2607186268, + "Vacc_completed": 1689.7385811283, + "Vacc_refreshed": 267.8936320344, + "Vacc_refreshed_2": 133.9468160172 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14880.5922770798, + "Vacc_completed": 1689.9651236491, + "Vacc_refreshed": 275.7764918768, + "Vacc_refreshed_2": 137.8882459384 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14887.440916863, + "Vacc_completed": 1696.5525450807, + "Vacc_refreshed": 283.5225421273, + "Vacc_refreshed_2": 141.76127106365 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14888.0132355705, + "Vacc_completed": 1703.9968022938, + "Vacc_refreshed": 284.1554601622, + "Vacc_refreshed_2": 142.0777300811 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14897.4895745985, + "Vacc_completed": 1707.7124979313, + "Vacc_refreshed": 293.9654633907, + "Vacc_refreshed_2": 146.98273169535 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14900.9132287675, + "Vacc_completed": 1714.1256328363, + "Vacc_refreshed": 300.1498047442, + "Vacc_refreshed_2": 150.0749023721 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14907.9968139113, + "Vacc_completed": 1717.9722882107, + "Vacc_refreshed": 303.8260258963, + "Vacc_refreshed_2": 151.91301294815 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14914.3000727157, + "Vacc_completed": 1723.7459149842, + "Vacc_refreshed": 310.6001358466, + "Vacc_refreshed_2": 155.3000679233 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14915.2709520902, + "Vacc_completed": 1725.3728171833, + "Vacc_refreshed": 311.7419250413, + "Vacc_refreshed_2": 155.87096252065 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14924.9251049714, + "Vacc_completed": 1730.3968331067, + "Vacc_refreshed": 318.9914066325, + "Vacc_refreshed_2": 159.49570331625 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14929.9737051543, + "Vacc_completed": 1735.419819131, + "Vacc_refreshed": 327.2769475594, + "Vacc_refreshed_2": 163.6384737797 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.0867908297, + "Vacc_completed": 1735.4531164502, + "Vacc_refreshed": 333.9507530528, + "Vacc_refreshed_2": 166.9753765264 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.1585043075, + "Vacc_completed": 1744.7112606784, + "Vacc_refreshed": 337.8096837232, + "Vacc_refreshed_2": 168.9048418616 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14939.2420152133, + "Vacc_completed": 1745.8678859662, + "Vacc_refreshed": 344.4742142552, + "Vacc_refreshed_2": 172.2371071276 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14940.9708787633, + "Vacc_completed": 1748.1937727819, + "Vacc_refreshed": 352.7895987096, + "Vacc_refreshed_2": 176.3947993548 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14950.0282400838, + "Vacc_completed": 1750.2751748343, + "Vacc_refreshed": 354.0652893483, + "Vacc_refreshed_2": 177.03264467415 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14956.5498846765, + "Vacc_completed": 1758.7641351746, + "Vacc_refreshed": 361.0736440858, + "Vacc_refreshed_2": 180.5368220429 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14957.5908121778, + "Vacc_completed": 1763.4528309235, + "Vacc_refreshed": 364.3501912771, + "Vacc_refreshed_2": 182.17509563855 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14960.7281563782, + "Vacc_completed": 1772.006809538, + "Vacc_refreshed": 364.6804469838, + "Vacc_refreshed_2": 182.3402234919 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14969.2457673746, + "Vacc_completed": 1776.5678522654, + "Vacc_refreshed": 374.4882812856, + "Vacc_refreshed_2": 187.2441406428 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14974.8615073088, + "Vacc_completed": 1779.9556763371, + "Vacc_refreshed": 377.4421123342, + "Vacc_refreshed_2": 188.7210561671 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14984.5914886251, + "Vacc_completed": 1782.6146675026, + "Vacc_refreshed": 381.2082916917, + "Vacc_refreshed_2": 190.60414584585 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14987.5876984189, + "Vacc_completed": 1791.1028428437, + "Vacc_refreshed": 385.3294438436, + "Vacc_refreshed_2": 192.6647219218 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.58002825, + "Vacc_completed": 1793.9473770292, + "Vacc_refreshed": 388.9073184565, + "Vacc_refreshed_2": 194.45365922825 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.8771499871, + "Vacc_completed": 1796.0612762347, + "Vacc_refreshed": 390.0186176392, + "Vacc_refreshed_2": 195.0093088196 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14993.5505864267, + "Vacc_completed": 1798.6017730753, + "Vacc_refreshed": 390.5734438836, + "Vacc_refreshed_2": 195.2867219418 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14998.158414122, + "Vacc_completed": 1802.0655230464, + "Vacc_refreshed": 391.8649823662, + "Vacc_refreshed_2": 195.9324911831 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.4313521872, + "Vacc_completed": 1804.413054883, + "Vacc_refreshed": 395.3533451537, + "Vacc_refreshed_2": 197.67667257685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.7989985243, + "Vacc_completed": 1812.4490035114, + "Vacc_refreshed": 401.8191046925, + "Vacc_refreshed_2": 200.90955234625 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15002.2088852954, + "Vacc_completed": 1814.4865305652, + "Vacc_refreshed": 409.5825438963, + "Vacc_refreshed_2": 204.79127194815 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15008.2705384657, + "Vacc_completed": 1823.0023861142, + "Vacc_refreshed": 411.4567502649, + "Vacc_refreshed_2": 205.72837513245 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15013.4515790087, + "Vacc_completed": 1830.5873803301, + "Vacc_refreshed": 417.6053918266, + "Vacc_refreshed_2": 208.8026959133 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15022.965858679, + "Vacc_completed": 1833.2575088513, + "Vacc_refreshed": 421.7562400513, + "Vacc_refreshed_2": 210.87812002565 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15024.3362350043, + "Vacc_completed": 1839.0848659035, + "Vacc_refreshed": 429.2321579029, + "Vacc_refreshed_2": 214.61607895145 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15025.0436784182, + "Vacc_completed": 1840.7238800201, + "Vacc_refreshed": 434.1256619822, + "Vacc_refreshed_2": 217.0628309911 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15026.1929816575, + "Vacc_completed": 1848.4826094697, + "Vacc_refreshed": 436.1767563509, + "Vacc_refreshed_2": 218.08837817545 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15028.1115762872, + "Vacc_completed": 1851.353962867, + "Vacc_refreshed": 439.6190575403, + "Vacc_refreshed_2": 219.80952877015 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12940.2728292563, + "Vacc_completed": 1761.2082450081, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12944.552426313, + "Vacc_completed": 1763.9916052944, + "Vacc_refreshed": 5.8453121761, + "Vacc_refreshed_2": 2.92265608805 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12946.2293033065, + "Vacc_completed": 1764.8651614651, + "Vacc_refreshed": 11.3614134516, + "Vacc_refreshed_2": 5.6807067258 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12954.4553975676, + "Vacc_completed": 1773.9720915654, + "Vacc_refreshed": 19.8633846559, + "Vacc_refreshed_2": 9.93169232795 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12962.1675537316, + "Vacc_completed": 1776.6871749169, + "Vacc_refreshed": 23.5340750877, + "Vacc_refreshed_2": 11.76703754385 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12970.2114807284, + "Vacc_completed": 1779.4482697767, + "Vacc_refreshed": 32.7047145334, + "Vacc_refreshed_2": 16.3523572667 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12971.1155781651, + "Vacc_completed": 1787.6912361171, + "Vacc_refreshed": 41.3859214133, + "Vacc_refreshed_2": 20.69296070665 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12976.1479148685, + "Vacc_completed": 1796.0609011819, + "Vacc_refreshed": 49.2224218631, + "Vacc_refreshed_2": 24.61121093155 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12985.389251021, + "Vacc_completed": 1806.0439647379, + "Vacc_refreshed": 58.4565372826, + "Vacc_refreshed_2": 29.2282686413 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12987.6528992192, + "Vacc_completed": 1814.2136648594, + "Vacc_refreshed": 68.4133404236, + "Vacc_refreshed_2": 34.2066702118 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12988.8953336446, + "Vacc_completed": 1820.4740554862, + "Vacc_refreshed": 69.4164203636, + "Vacc_refreshed_2": 34.7082101818 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12989.930788247, + "Vacc_completed": 1825.1779692151, + "Vacc_refreshed": 71.594311523, + "Vacc_refreshed_2": 35.7971557615 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12993.9481590439, + "Vacc_completed": 1834.4690603586, + "Vacc_refreshed": 75.4387792504, + "Vacc_refreshed_2": 37.7193896252 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12997.41102572, + "Vacc_completed": 1836.6145856268, + "Vacc_refreshed": 81.7875242048, + "Vacc_refreshed_2": 40.8937621024 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12999.5337504327, + "Vacc_completed": 1839.9662175544, + "Vacc_refreshed": 87.9455065083, + "Vacc_refreshed_2": 43.97275325415 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13007.2251436977, + "Vacc_completed": 1842.6498922014, + "Vacc_refreshed": 93.1900542901, + "Vacc_refreshed_2": 46.59502714505 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13012.0856312446, + "Vacc_completed": 1844.701996872, + "Vacc_refreshed": 99.712698674, + "Vacc_refreshed_2": 49.856349337 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13021.33252246, + "Vacc_completed": 1849.3061445307, + "Vacc_refreshed": 102.5319545699, + "Vacc_refreshed_2": 51.26597728495 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13027.1500152398, + "Vacc_completed": 1850.8078304213, + "Vacc_refreshed": 105.0259857828, + "Vacc_refreshed_2": 52.5129928914 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13035.650988116, + "Vacc_completed": 1851.8577100095, + "Vacc_refreshed": 110.1445342625, + "Vacc_refreshed_2": 55.07226713125 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13042.2123284129, + "Vacc_completed": 1856.2056162281, + "Vacc_refreshed": 113.6459186876, + "Vacc_refreshed_2": 56.8229593438 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13048.5274669921, + "Vacc_completed": 1856.9596604869, + "Vacc_refreshed": 119.7006093985, + "Vacc_refreshed_2": 59.85030469925 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13056.4261041722, + "Vacc_completed": 1859.9946313318, + "Vacc_refreshed": 128.4930741519, + "Vacc_refreshed_2": 64.24653707595 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13061.2580735831, + "Vacc_completed": 1864.4241013454, + "Vacc_refreshed": 129.4122729818, + "Vacc_refreshed_2": 64.7061364909 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13069.8769575412, + "Vacc_completed": 1870.828968765, + "Vacc_refreshed": 133.5606697443, + "Vacc_refreshed_2": 66.78033487215 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13074.4847352314, + "Vacc_completed": 1873.0576602324, + "Vacc_refreshed": 142.5189975609, + "Vacc_refreshed_2": 71.25949878045 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13077.43910001, + "Vacc_completed": 1881.1763507471, + "Vacc_refreshed": 143.4948395736, + "Vacc_refreshed_2": 71.7474197868 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13082.3470601758, + "Vacc_completed": 1888.5808588713, + "Vacc_refreshed": 149.0381282873, + "Vacc_refreshed_2": 74.51906414365 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13091.0962170402, + "Vacc_completed": 1894.9989493108, + "Vacc_refreshed": 149.7527355276, + "Vacc_refreshed_2": 74.8763677638 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13097.0655225667, + "Vacc_completed": 1904.9660517959, + "Vacc_refreshed": 155.7716165644, + "Vacc_refreshed_2": 77.8858082822 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13105.8431803144, + "Vacc_completed": 1907.1233275333, + "Vacc_refreshed": 162.7399373626, + "Vacc_refreshed_2": 81.3699686813 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13110.9052745957, + "Vacc_completed": 1915.3369502585, + "Vacc_refreshed": 166.1686970271, + "Vacc_refreshed_2": 83.08434851355 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13120.2888484357, + "Vacc_completed": 1924.594235894, + "Vacc_refreshed": 174.1871820852, + "Vacc_refreshed_2": 87.0935910426 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13122.2684309305, + "Vacc_completed": 1926.8954039089, + "Vacc_refreshed": 179.1800373951, + "Vacc_refreshed_2": 89.59001869755 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13129.679389954, + "Vacc_completed": 1929.8687720822, + "Vacc_refreshed": 186.5609898946, + "Vacc_refreshed_2": 93.2804949473 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13136.2121968271, + "Vacc_completed": 1930.5419008182, + "Vacc_refreshed": 190.3285119819, + "Vacc_refreshed_2": 95.16425599095 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13140.8693305096, + "Vacc_completed": 1933.1368513989, + "Vacc_refreshed": 199.5045342081, + "Vacc_refreshed_2": 99.75226710405 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13141.6505152789, + "Vacc_completed": 1938.3539275062, + "Vacc_refreshed": 199.9231054484, + "Vacc_refreshed_2": 99.9615527242 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13146.3819720109, + "Vacc_completed": 1943.0787615053, + "Vacc_refreshed": 203.5617342411, + "Vacc_refreshed_2": 101.78086712055 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.5833925737, + "Vacc_completed": 1944.8505615419, + "Vacc_refreshed": 206.5254255239, + "Vacc_refreshed_2": 103.26271276195 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.8864321418, + "Vacc_completed": 1946.7574709443, + "Vacc_refreshed": 208.0171497057, + "Vacc_refreshed_2": 104.00857485285 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13160.8319905342, + "Vacc_completed": 1949.6926878806, + "Vacc_refreshed": 213.0797703475, + "Vacc_refreshed_2": 106.53988517375 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13165.109826694, + "Vacc_completed": 1955.2468047197, + "Vacc_refreshed": 222.6760329578, + "Vacc_refreshed_2": 111.3380164789 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13168.7847714036, + "Vacc_completed": 1956.1809363506, + "Vacc_refreshed": 231.6808966253, + "Vacc_refreshed_2": 115.84044831265 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13176.0869758252, + "Vacc_completed": 1960.8024990411, + "Vacc_refreshed": 233.4328765098, + "Vacc_refreshed_2": 116.7164382549 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13180.123104626, + "Vacc_completed": 1969.8047949709, + "Vacc_refreshed": 241.5696524948, + "Vacc_refreshed_2": 120.7848262474 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13184.6423078124, + "Vacc_completed": 1974.8566545144, + "Vacc_refreshed": 250.4550885677, + "Vacc_refreshed_2": 125.22754428385 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13190.9452560841, + "Vacc_completed": 1975.9346724558, + "Vacc_refreshed": 252.799671753, + "Vacc_refreshed_2": 126.3998358765 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13194.9586490897, + "Vacc_completed": 1984.1998929758, + "Vacc_refreshed": 256.8657355625, + "Vacc_refreshed_2": 128.43286778125 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13203.1981501018, + "Vacc_completed": 1992.2264996957, + "Vacc_refreshed": 262.7110996677, + "Vacc_refreshed_2": 131.35554983385 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13210.570704838, + "Vacc_completed": 2000.1284432323, + "Vacc_refreshed": 268.7466273707, + "Vacc_refreshed_2": 134.37331368535 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13217.6966464936, + "Vacc_completed": 2001.108779963, + "Vacc_refreshed": 270.063420564, + "Vacc_refreshed_2": 135.031710282 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13222.8454105611, + "Vacc_completed": 2006.445790007, + "Vacc_refreshed": 272.306211944, + "Vacc_refreshed_2": 136.153105972 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13231.9459038211, + "Vacc_completed": 2014.1245558198, + "Vacc_refreshed": 274.2682102675, + "Vacc_refreshed_2": 137.13410513375 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.4430744102, + "Vacc_completed": 2021.01783734, + "Vacc_refreshed": 283.272422859, + "Vacc_refreshed_2": 141.6362114295 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.9880313892, + "Vacc_completed": 2021.3278488109, + "Vacc_refreshed": 288.8833613171, + "Vacc_refreshed_2": 144.44168065855 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13244.1020800967, + "Vacc_completed": 2028.5342497408, + "Vacc_refreshed": 295.5476346222, + "Vacc_refreshed_2": 147.7738173111 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13246.2035006005, + "Vacc_completed": 2034.7337820973, + "Vacc_refreshed": 295.8527619766, + "Vacc_refreshed_2": 147.9263809883 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13250.3034672718, + "Vacc_completed": 2040.4526371692, + "Vacc_refreshed": 297.6289642024, + "Vacc_refreshed_2": 148.8144821012 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13258.1309651863, + "Vacc_completed": 2043.9166550693, + "Vacc_refreshed": 307.2590005259, + "Vacc_refreshed_2": 153.62950026295 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13264.00554028, + "Vacc_completed": 2046.5596745193, + "Vacc_refreshed": 309.1250398792, + "Vacc_refreshed_2": 154.5625199396 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.4212557374, + "Vacc_completed": 2049.7116443058, + "Vacc_refreshed": 314.0515587013, + "Vacc_refreshed_2": 157.02577935065 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.7885616679, + "Vacc_completed": 2051.2982177338, + "Vacc_refreshed": 320.3832182075, + "Vacc_refreshed_2": 160.19160910375 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13274.2264538665, + "Vacc_completed": 2058.2989667129, + "Vacc_refreshed": 323.7063680074, + "Vacc_refreshed_2": 161.8531840037 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13281.9141553951, + "Vacc_completed": 2063.8206751836, + "Vacc_refreshed": 326.9158074422, + "Vacc_refreshed_2": 163.4579037211 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13290.64171309, + "Vacc_completed": 2064.3110765988, + "Vacc_refreshed": 336.7710359746, + "Vacc_refreshed_2": 168.3855179873 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.1885069646, + "Vacc_completed": 2072.8766922561, + "Vacc_refreshed": 344.574816718, + "Vacc_refreshed_2": 172.287408359 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.7117921559, + "Vacc_completed": 2081.2889195134, + "Vacc_refreshed": 352.6791052892, + "Vacc_refreshed_2": 176.3395526446 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13295.741331211, + "Vacc_completed": 2082.371745109, + "Vacc_refreshed": 358.7062427923, + "Vacc_refreshed_2": 179.35312139615 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13303.8543248793, + "Vacc_completed": 2084.7970217381, + "Vacc_refreshed": 363.3629273081, + "Vacc_refreshed_2": 181.68146365405 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13305.910901253, + "Vacc_completed": 2089.496376583, + "Vacc_refreshed": 364.4184919111, + "Vacc_refreshed_2": 182.20924595555 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13310.1770755649, + "Vacc_completed": 2091.8877772854, + "Vacc_refreshed": 373.8861441424, + "Vacc_refreshed_2": 186.9430720712 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13318.5822731817, + "Vacc_completed": 2100.0656871327, + "Vacc_refreshed": 380.7622590612, + "Vacc_refreshed_2": 190.3811295306 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13326.848015265, + "Vacc_completed": 2103.7807367097, + "Vacc_refreshed": 383.494468406, + "Vacc_refreshed_2": 191.747234203 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13329.8351558424, + "Vacc_completed": 2106.3811743673, + "Vacc_refreshed": 385.7094999088, + "Vacc_refreshed_2": 192.8547499544 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13334.0243800891, + "Vacc_completed": 2110.0143078684, + "Vacc_refreshed": 387.028737638, + "Vacc_refreshed_2": 193.514368819 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13340.0473805148, + "Vacc_completed": 2114.17877764, + "Vacc_refreshed": 390.7872507231, + "Vacc_refreshed_2": 195.39362536155 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13342.4710995253, + "Vacc_completed": 2117.5584807218, + "Vacc_refreshed": 394.4459716696, + "Vacc_refreshed_2": 197.2229858348 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13345.9586603577, + "Vacc_completed": 2124.6343373595, + "Vacc_refreshed": 401.3739608899, + "Vacc_refreshed_2": 200.68698044495 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13354.1694340722, + "Vacc_completed": 2132.584533812, + "Vacc_refreshed": 404.149558168, + "Vacc_refreshed_2": 202.074779084 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13360.0480186273, + "Vacc_completed": 2135.2279773256, + "Vacc_refreshed": 407.0589420913, + "Vacc_refreshed_2": 203.52947104565 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13362.9287822042, + "Vacc_completed": 2135.7661733179, + "Vacc_refreshed": 412.3495727781, + "Vacc_refreshed_2": 206.17478638905 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13365.9702033874, + "Vacc_completed": 2140.0801351424, + "Vacc_refreshed": 414.1173144704, + "Vacc_refreshed_2": 207.0586572352 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13375.8578305813, + "Vacc_completed": 2147.1687721976, + "Vacc_refreshed": 416.1274613074, + "Vacc_refreshed_2": 208.0637306537 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.3434411484, + "Vacc_completed": 2149.6360498231, + "Vacc_refreshed": 422.5420941028, + "Vacc_refreshed_2": 211.2710470514 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.8386238776, + "Vacc_completed": 2156.2105881723, + "Vacc_refreshed": 428.2913369026, + "Vacc_refreshed_2": 214.1456684513 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13388.7750604929, + "Vacc_completed": 2160.929719286, + "Vacc_refreshed": 437.0909930573, + "Vacc_refreshed_2": 218.54549652865 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13397.0959920005, + "Vacc_completed": 2169.0772334568, + "Vacc_refreshed": 438.0782576038, + "Vacc_refreshed_2": 219.0391288019 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13406.1913483212, + "Vacc_completed": 2172.8397968306, + "Vacc_refreshed": 445.0079409299, + "Vacc_refreshed_2": 222.50397046495 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13410.1064630998, + "Vacc_completed": 2179.4067803849, + "Vacc_refreshed": 453.2550919609, + "Vacc_refreshed_2": 226.62754598045 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.2872479216, + "Vacc_completed": 2183.7956163614, + "Vacc_refreshed": 462.0847473084, + "Vacc_refreshed_2": 231.0423736542 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.7274837683, + "Vacc_completed": 2186.2625889833, + "Vacc_refreshed": 470.3671533805, + "Vacc_refreshed_2": 235.18357669025 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15108.1816487494, + "Vacc_completed": 1951.3500240632, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15112.0388992614, + "Vacc_completed": 1956.8484422205, + "Vacc_refreshed": 4.7764537598, + "Vacc_refreshed_2": 2.3882268799 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15115.1174991099, + "Vacc_completed": 1961.6166149519, + "Vacc_refreshed": 11.6778924479, + "Vacc_refreshed_2": 5.83894622395 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15121.0352670933, + "Vacc_completed": 1969.039883077, + "Vacc_refreshed": 19.464449507, + "Vacc_refreshed_2": 9.7322247535 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15130.8297777562, + "Vacc_completed": 1970.7344191294, + "Vacc_refreshed": 28.0813773392, + "Vacc_refreshed_2": 14.0406886696 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15139.7963570637, + "Vacc_completed": 1971.420038313, + "Vacc_refreshed": 34.2304461363, + "Vacc_refreshed_2": 17.11522306815 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15149.3578353885, + "Vacc_completed": 1977.7986093705, + "Vacc_refreshed": 42.9385547047, + "Vacc_refreshed_2": 21.46927735235 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15150.8906121637, + "Vacc_completed": 1981.6633590428, + "Vacc_refreshed": 46.0030569507, + "Vacc_refreshed_2": 23.00152847535 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15153.3987479409, + "Vacc_completed": 1986.7151251441, + "Vacc_refreshed": 54.9967129669, + "Vacc_refreshed_2": 27.49835648345 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15155.2112066, + "Vacc_completed": 1993.3668502516, + "Vacc_refreshed": 59.2446234015, + "Vacc_refreshed_2": 29.62231170075 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15157.213160056, + "Vacc_completed": 2000.1282773775, + "Vacc_refreshed": 61.576334937, + "Vacc_refreshed_2": 30.7881674685 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15159.7206353696, + "Vacc_completed": 2000.5786646957, + "Vacc_refreshed": 62.4328961844, + "Vacc_refreshed_2": 31.2164480922 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15165.6048851908, + "Vacc_completed": 2000.600816545, + "Vacc_refreshed": 70.2254449832, + "Vacc_refreshed_2": 35.1127224916 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15175.5401574577, + "Vacc_completed": 2003.6984716795, + "Vacc_refreshed": 80.0202808521, + "Vacc_refreshed_2": 40.01014042605 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15178.2193352397, + "Vacc_completed": 2010.5259174304, + "Vacc_refreshed": 80.5289834705, + "Vacc_refreshed_2": 40.26449173525 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15186.1911779287, + "Vacc_completed": 2020.3094769054, + "Vacc_refreshed": 88.939485925, + "Vacc_refreshed_2": 44.4697429625 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15192.9408650715, + "Vacc_completed": 2027.102138126, + "Vacc_refreshed": 93.403990271, + "Vacc_refreshed_2": 46.7019951355 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15197.2522804828, + "Vacc_completed": 2033.1768424672, + "Vacc_refreshed": 103.3495680716, + "Vacc_refreshed_2": 51.6747840358 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15201.4718571012, + "Vacc_completed": 2041.9289374755, + "Vacc_refreshed": 107.0046191576, + "Vacc_refreshed_2": 53.5023095788 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15203.6899934618, + "Vacc_completed": 2042.5550193085, + "Vacc_refreshed": 108.1692912263, + "Vacc_refreshed_2": 54.08464561315 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15210.5751055, + "Vacc_completed": 2049.1508387429, + "Vacc_refreshed": 115.4885047404, + "Vacc_refreshed_2": 57.7442523702 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15216.3570734734, + "Vacc_completed": 2052.3213561982, + "Vacc_refreshed": 119.2061326333, + "Vacc_refreshed_2": 59.60306631665 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15225.8779749457, + "Vacc_completed": 2057.4663468474, + "Vacc_refreshed": 126.226397743, + "Vacc_refreshed_2": 63.1131988715 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15230.8206176005, + "Vacc_completed": 2064.8586744443, + "Vacc_refreshed": 133.0501812916, + "Vacc_refreshed_2": 66.5250906458 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15231.8828151205, + "Vacc_completed": 2068.2097593649, + "Vacc_refreshed": 142.0174284746, + "Vacc_refreshed_2": 71.0087142373 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15238.2426035555, + "Vacc_completed": 2071.8714182096, + "Vacc_refreshed": 148.7355853512, + "Vacc_refreshed_2": 74.3677926756 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15247.7928253295, + "Vacc_completed": 2078.7188555952, + "Vacc_refreshed": 156.2462830057, + "Vacc_refreshed_2": 78.12314150285 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15257.1929610505, + "Vacc_completed": 2083.6123346127, + "Vacc_refreshed": 163.8060000189, + "Vacc_refreshed_2": 81.90300000945 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15261.4225446127, + "Vacc_completed": 2092.4315663384, + "Vacc_refreshed": 165.098643188, + "Vacc_refreshed_2": 82.549321594 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15264.9230201438, + "Vacc_completed": 2098.3647861992, + "Vacc_refreshed": 173.1581071885, + "Vacc_refreshed_2": 86.57905359425 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15274.2090277291, + "Vacc_completed": 2098.6684198619, + "Vacc_refreshed": 179.3045017397, + "Vacc_refreshed_2": 89.65225086985 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15275.4881156514, + "Vacc_completed": 2104.7296501443, + "Vacc_refreshed": 184.3873991738, + "Vacc_refreshed_2": 92.1936995869 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.4296689803, + "Vacc_completed": 2109.0258070133, + "Vacc_refreshed": 190.3361011534, + "Vacc_refreshed_2": 95.1680505767 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.7641225132, + "Vacc_completed": 2111.2503398848, + "Vacc_refreshed": 196.3057900505, + "Vacc_refreshed_2": 98.15289502525 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15280.5288668271, + "Vacc_completed": 2120.2846622436, + "Vacc_refreshed": 201.8816019943, + "Vacc_refreshed_2": 100.94080099715 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15286.6794056665, + "Vacc_completed": 2127.5294418815, + "Vacc_refreshed": 205.8247713924, + "Vacc_refreshed_2": 102.9123856962 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15287.919376399, + "Vacc_completed": 2127.7213986428, + "Vacc_refreshed": 207.0848824799, + "Vacc_refreshed_2": 103.54244123995 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15288.8972252423, + "Vacc_completed": 2131.7043154907, + "Vacc_refreshed": 214.6605013946, + "Vacc_refreshed_2": 107.3302506973 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15295.1676694583, + "Vacc_completed": 2141.6853776317, + "Vacc_refreshed": 217.321705385, + "Vacc_refreshed_2": 108.6608526925 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.8279320379, + "Vacc_completed": 2150.6081907236, + "Vacc_refreshed": 224.1814306469, + "Vacc_refreshed_2": 112.09071532345 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.9502690873, + "Vacc_completed": 2150.8297260642, + "Vacc_refreshed": 224.2857175024, + "Vacc_refreshed_2": 112.1428587512 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15305.4629063272, + "Vacc_completed": 2159.4075137345, + "Vacc_refreshed": 226.4536786248, + "Vacc_refreshed_2": 113.2268393124 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15313.0091699117, + "Vacc_completed": 2160.0885470064, + "Vacc_refreshed": 232.5677391068, + "Vacc_refreshed_2": 116.2838695534 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15316.6742133238, + "Vacc_completed": 2163.6640679748, + "Vacc_refreshed": 242.4458167027, + "Vacc_refreshed_2": 121.22290835135 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15325.7736410299, + "Vacc_completed": 2171.6222500116, + "Vacc_refreshed": 251.5591803171, + "Vacc_refreshed_2": 125.77959015855 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15333.3685319398, + "Vacc_completed": 2174.4162160121, + "Vacc_refreshed": 254.1541702573, + "Vacc_refreshed_2": 127.07708512865 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15337.5758896556, + "Vacc_completed": 2180.7560110181, + "Vacc_refreshed": 255.4491825287, + "Vacc_refreshed_2": 127.72459126435 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15346.8261947795, + "Vacc_completed": 2184.562660479, + "Vacc_refreshed": 256.0794667401, + "Vacc_refreshed_2": 128.03973337005 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15347.5063487999, + "Vacc_completed": 2192.7053918922, + "Vacc_refreshed": 264.8657432896, + "Vacc_refreshed_2": 132.4328716448 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15355.2915215882, + "Vacc_completed": 2197.3639423288, + "Vacc_refreshed": 266.2003474583, + "Vacc_refreshed_2": 133.10017372915 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15357.0291297717, + "Vacc_completed": 2203.5668703416, + "Vacc_refreshed": 266.2591235692, + "Vacc_refreshed_2": 133.1295617846 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15363.7351300479, + "Vacc_completed": 2212.51470716, + "Vacc_refreshed": 268.1554009506, + "Vacc_refreshed_2": 134.0777004753 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15366.2054877706, + "Vacc_completed": 2220.7805776981, + "Vacc_refreshed": 270.2429125628, + "Vacc_refreshed_2": 135.1214562814 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15374.7828886007, + "Vacc_completed": 2223.4779151007, + "Vacc_refreshed": 271.3258668517, + "Vacc_refreshed_2": 135.66293342585 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15375.8644766411, + "Vacc_completed": 2223.902202818, + "Vacc_refreshed": 277.3418287874, + "Vacc_refreshed_2": 138.6709143937 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15384.0103684975, + "Vacc_completed": 2233.2600148125, + "Vacc_refreshed": 286.2795142721, + "Vacc_refreshed_2": 143.13975713605 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15388.2433647335, + "Vacc_completed": 2242.2405085188, + "Vacc_refreshed": 295.9058348626, + "Vacc_refreshed_2": 147.9529174313 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15395.874552707, + "Vacc_completed": 2242.5126967683, + "Vacc_refreshed": 297.0217883024, + "Vacc_refreshed_2": 148.5108941512 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15399.399317417, + "Vacc_completed": 2250.19318626, + "Vacc_refreshed": 297.4497074595, + "Vacc_refreshed_2": 148.72485372975 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15407.4994879004, + "Vacc_completed": 2258.8146667712, + "Vacc_refreshed": 302.8025504676, + "Vacc_refreshed_2": 151.4012752338 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15410.1346998553, + "Vacc_completed": 2259.5361618465, + "Vacc_refreshed": 305.0699464575, + "Vacc_refreshed_2": 152.53497322875 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15415.5662938607, + "Vacc_completed": 2266.2419298528, + "Vacc_refreshed": 306.5583985118, + "Vacc_refreshed_2": 153.2791992559 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15424.362408066, + "Vacc_completed": 2270.6973906417, + "Vacc_refreshed": 307.7300944183, + "Vacc_refreshed_2": 153.86504720915 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15427.4641661532, + "Vacc_completed": 2273.4475287465, + "Vacc_refreshed": 315.9257071161, + "Vacc_refreshed_2": 157.96285355805 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15430.3003374401, + "Vacc_completed": 2280.4953549554, + "Vacc_refreshed": 320.4057109928, + "Vacc_refreshed_2": 160.2028554964 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15434.7161891817, + "Vacc_completed": 2283.6641990131, + "Vacc_refreshed": 329.6425079267, + "Vacc_refreshed_2": 164.82125396335 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15439.6389263804, + "Vacc_completed": 2286.269595866, + "Vacc_refreshed": 336.6032551175, + "Vacc_refreshed_2": 168.30162755875 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.607595077, + "Vacc_completed": 2292.1795115763, + "Vacc_refreshed": 339.4752869467, + "Vacc_refreshed_2": 169.73764347335 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.7317234732, + "Vacc_completed": 2299.0428376394, + "Vacc_refreshed": 342.2213588852, + "Vacc_refreshed_2": 171.1106794426 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15448.8137925508, + "Vacc_completed": 2303.3104194582, + "Vacc_refreshed": 346.3780017598, + "Vacc_refreshed_2": 173.1890008799 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15449.4812178935, + "Vacc_completed": 2311.9261799324, + "Vacc_refreshed": 351.1765190663, + "Vacc_refreshed_2": 175.58825953315 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9089483618, + "Vacc_completed": 2315.5711542884, + "Vacc_refreshed": 352.532745084, + "Vacc_refreshed_2": 176.266372542 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9943266817, + "Vacc_completed": 2322.1716179078, + "Vacc_refreshed": 355.0774800773, + "Vacc_refreshed_2": 177.53874003865 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15459.7074068986, + "Vacc_completed": 2323.3027059178, + "Vacc_refreshed": 364.5645466744, + "Vacc_refreshed_2": 182.2822733372 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15465.686171573, + "Vacc_completed": 2325.8040208828, + "Vacc_refreshed": 365.9637341301, + "Vacc_refreshed_2": 182.98186706505 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15466.2025927257, + "Vacc_completed": 2332.7537065257, + "Vacc_refreshed": 366.2841969775, + "Vacc_refreshed_2": 183.14209848875 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15471.0643499093, + "Vacc_completed": 2333.7718947218, + "Vacc_refreshed": 370.7174701468, + "Vacc_refreshed_2": 185.3587350734 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15480.1820736709, + "Vacc_completed": 2336.425519339, + "Vacc_refreshed": 378.1719392306, + "Vacc_refreshed_2": 189.0859696153 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15489.2619602904, + "Vacc_completed": 2342.4314320637, + "Vacc_refreshed": 382.1070985379, + "Vacc_refreshed_2": 191.05354926895 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15497.197059921, + "Vacc_completed": 2351.5508059781, + "Vacc_refreshed": 390.0131449372, + "Vacc_refreshed_2": 195.0065724686 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15506.8997820546, + "Vacc_completed": 2354.7951207515, + "Vacc_refreshed": 397.4755552416, + "Vacc_refreshed_2": 198.7377776208 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15514.6356932026, + "Vacc_completed": 2359.4543858263, + "Vacc_refreshed": 405.5265192328, + "Vacc_refreshed_2": 202.7632596164 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15517.1065215082, + "Vacc_completed": 2362.3705119741, + "Vacc_refreshed": 406.2503084488, + "Vacc_refreshed_2": 203.1251542244 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15526.1890623234, + "Vacc_completed": 2369.2123027947, + "Vacc_refreshed": 407.9863557734, + "Vacc_refreshed_2": 203.9931778867 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15529.1257916241, + "Vacc_completed": 2371.0230854052, + "Vacc_refreshed": 415.4330021443, + "Vacc_refreshed_2": 207.71650107215 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15534.1422800755, + "Vacc_completed": 2376.4314141852, + "Vacc_refreshed": 417.8710629027, + "Vacc_refreshed_2": 208.93553145135 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15536.9779956012, + "Vacc_completed": 2380.9412020655, + "Vacc_refreshed": 418.6065556413, + "Vacc_refreshed_2": 209.30327782065 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15542.623117778, + "Vacc_completed": 2383.2295524317, + "Vacc_refreshed": 425.5318613018, + "Vacc_refreshed_2": 212.7659306509 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15545.7349127212, + "Vacc_completed": 2388.7438112703, + "Vacc_refreshed": 435.2708995295, + "Vacc_refreshed_2": 217.63544976475 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15552.7663039717, + "Vacc_completed": 2398.7179519564, + "Vacc_refreshed": 436.7806978293, + "Vacc_refreshed_2": 218.39034891465 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15553.9038494269, + "Vacc_completed": 2401.9470135031, + "Vacc_refreshed": 445.294989416, + "Vacc_refreshed_2": 222.647494708 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15563.5219522465, + "Vacc_completed": 2408.3277109489, + "Vacc_refreshed": 449.1868908695, + "Vacc_refreshed_2": 224.59344543475 } -] +] \ No newline at end of file diff --git a/cpp/tests/data/vacc_county_ageinf_ma7.json b/cpp/tests/data/vacc_county_ageinf_ma7.json index 38ba2a8c95..0716826088 100644 --- a/cpp/tests/data/vacc_county_ageinf_ma7.json +++ b/cpp/tests/data/vacc_county_ageinf_ma7.json @@ -1,4418 +1,4970 @@ [ { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14093.5670993244, - "Vacc_completed":1058.2133302677, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14094.6780758432, - "Vacc_completed":1058.2386490178, - "Vacc_refreshed":3.9480185817 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14102.3458622773, - "Vacc_completed":1063.1811826304, - "Vacc_refreshed":7.8235846725 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14106.0158477852, - "Vacc_completed":1071.0829580916, - "Vacc_refreshed":13.0365435255 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14115.8958402416, - "Vacc_completed":1072.5136218055, - "Vacc_refreshed":15.4582843201 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14116.0603009948, - "Vacc_completed":1080.8706574256, - "Vacc_refreshed":22.3037298829 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14124.4849162097, - "Vacc_completed":1087.4957123195, - "Vacc_refreshed":27.7666004775 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14132.812800891, - "Vacc_completed":1094.2936630058, - "Vacc_refreshed":29.4212640594 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14139.2772895404, - "Vacc_completed":1100.1665827188, - "Vacc_refreshed":29.4568827793 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14145.4868397119, - "Vacc_completed":1105.3345419667, - "Vacc_refreshed":34.7217238502 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14147.7480966959, - "Vacc_completed":1111.2289166538, - "Vacc_refreshed":34.771310214 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14154.5204084505, - "Vacc_completed":1114.7870563855, - "Vacc_refreshed":41.8898823514 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14155.4472543415, - "Vacc_completed":1124.6385432496, - "Vacc_refreshed":48.6348857735 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14162.2764203336, - "Vacc_completed":1128.54825128, - "Vacc_refreshed":48.7694054724 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14163.6229511244, - "Vacc_completed":1128.7143765883, - "Vacc_refreshed":53.2059941772 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14170.704731349, - "Vacc_completed":1138.0466956792, - "Vacc_refreshed":59.0394633797 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14177.9754226866, - "Vacc_completed":1144.8391611423, - "Vacc_refreshed":68.7607294969 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14180.6917277285, - "Vacc_completed":1145.8477444825, - "Vacc_refreshed":68.9221667424 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14183.6510488722, - "Vacc_completed":1148.5261706572, - "Vacc_refreshed":74.1781085786 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14187.685478561, - "Vacc_completed":1156.317724845, - "Vacc_refreshed":82.4605426733 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14190.8756861073, - "Vacc_completed":1158.3230049846, - "Vacc_refreshed":85.9686058349 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14194.7125443701, - "Vacc_completed":1162.8869701267, - "Vacc_refreshed":86.9745448839 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14198.1736788429, - "Vacc_completed":1172.5122981568, - "Vacc_refreshed":87.3520867387 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14200.0337444888, - "Vacc_completed":1173.9022323601, - "Vacc_refreshed":96.1323881978 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14209.9091251899, - "Vacc_completed":1180.4819879148, - "Vacc_refreshed":102.8081520102 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14215.7510791988, - "Vacc_completed":1187.6749019896, - "Vacc_refreshed":111.0676626302 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14216.891975169, - "Vacc_completed":1194.8246181318, - "Vacc_refreshed":112.2172983632 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14226.1128719795, - "Vacc_completed":1199.3288757923, - "Vacc_refreshed":115.0035825103 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14234.2678640476, - "Vacc_completed":1200.3667784603, - "Vacc_refreshed":122.2552339507 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14236.1003192184, - "Vacc_completed":1204.1967603181, - "Vacc_refreshed":127.0429292216 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14242.538633822, - "Vacc_completed":1212.5454877324, - "Vacc_refreshed":134.6939665016 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14244.3387278104, - "Vacc_completed":1213.6034702862, - "Vacc_refreshed":136.0920891424 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14251.4120506037, - "Vacc_completed":1216.4725302456, - "Vacc_refreshed":140.2813449601 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14260.7111088561, - "Vacc_completed":1223.9349650326, - "Vacc_refreshed":144.4607939662 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.4310619138, - "Vacc_completed":1230.2964929538, - "Vacc_refreshed":149.281965675 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.8430243455, - "Vacc_completed":1233.791799902, - "Vacc_refreshed":152.843700775 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14270.6723528208, - "Vacc_completed":1235.7852283109, - "Vacc_refreshed":158.6087157945 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14276.398217781, - "Vacc_completed":1244.1189399585, - "Vacc_refreshed":161.780101215 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14282.7632141243, - "Vacc_completed":1252.4246776385, - "Vacc_refreshed":164.4087953839 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14285.2172118541, - "Vacc_completed":1253.0967186007, - "Vacc_refreshed":165.7333648079 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14288.3981413127, - "Vacc_completed":1261.2285273698, - "Vacc_refreshed":175.6751183454 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14296.6990830234, - "Vacc_completed":1261.8928424603, - "Vacc_refreshed":181.3746988194 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14304.9324135674, - "Vacc_completed":1268.1858225933, - "Vacc_refreshed":182.8207287588 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14312.7990335985, - "Vacc_completed":1270.8693167453, - "Vacc_refreshed":192.6352794711 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14316.0317804647, - "Vacc_completed":1276.8328604136, - "Vacc_refreshed":199.109084232 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14317.8224126817, - "Vacc_completed":1285.9345839202, - "Vacc_refreshed":204.9564534429 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14319.969225103, - "Vacc_completed":1292.0814432843, - "Vacc_refreshed":209.3116185701 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14325.5010146205, - "Vacc_completed":1296.8562638588, - "Vacc_refreshed":214.164106287 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14334.64723979, - "Vacc_completed":1299.2846390455, - "Vacc_refreshed":215.8187786169 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14341.3416549169, - "Vacc_completed":1307.3997120401, - "Vacc_refreshed":220.1718442512 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14349.3146443239, - "Vacc_completed":1309.8026404332, - "Vacc_refreshed":222.9315364644 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14359.2839765392, - "Vacc_completed":1313.6592234511, - "Vacc_refreshed":226.6469703335 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14365.2176903694, - "Vacc_completed":1319.2137305156, - "Vacc_refreshed":227.7079880211 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14372.2949635005, - "Vacc_completed":1325.3928078641, - "Vacc_refreshed":234.0214496372 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14377.1100641854, - "Vacc_completed":1326.7384263101, - "Vacc_refreshed":242.1400638609 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14381.7559278649, - "Vacc_completed":1329.4413693873, - "Vacc_refreshed":246.2374710913 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14385.7162526455, - "Vacc_completed":1338.1839321545, - "Vacc_refreshed":252.0149200475 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14389.4326934411, - "Vacc_completed":1345.9094675595, - "Vacc_refreshed":256.9046042339 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14391.2007554132, - "Vacc_completed":1348.71606757, - "Vacc_refreshed":258.1776032516 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14394.8621297613, - "Vacc_completed":1354.2416050796, - "Vacc_refreshed":267.8589065036 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.3456243909, - "Vacc_completed":1359.868800934, - "Vacc_refreshed":270.9855298163 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.4645205246, - "Vacc_completed":1363.0538159145, - "Vacc_refreshed":275.840425604 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14399.1657319944, - "Vacc_completed":1365.5993182323, - "Vacc_refreshed":277.5856365007 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14402.7230837573, - "Vacc_completed":1368.6201543223, - "Vacc_refreshed":286.3361695339 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14403.1500082752, - "Vacc_completed":1371.4419603277, - "Vacc_refreshed":291.9429549926 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14409.601025491, - "Vacc_completed":1375.0385110041, - "Vacc_refreshed":294.4838831323 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.5992098988, - "Vacc_completed":1379.7282797993, - "Vacc_refreshed":304.3709721295 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.7379664054, - "Vacc_completed":1388.4437755617, - "Vacc_refreshed":310.9469195789 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14413.0256783966, - "Vacc_completed":1395.0228908154, - "Vacc_refreshed":316.1322991564 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14418.5923400284, - "Vacc_completed":1395.4421160716, - "Vacc_refreshed":324.326203234 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14427.1006875636, - "Vacc_completed":1400.9550416303, - "Vacc_refreshed":326.1675291407 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14428.1259159444, - "Vacc_completed":1401.6589165675, - "Vacc_refreshed":336.1473853823 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14429.6710322591, - "Vacc_completed":1406.4316961423, - "Vacc_refreshed":338.7341080527 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14435.5405186058, - "Vacc_completed":1406.8193757343, - "Vacc_refreshed":348.5515447081 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14440.6128511884, - "Vacc_completed":1406.8790930463, - "Vacc_refreshed":349.9224707035 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14448.1553470558, - "Vacc_completed":1407.8576900416, - "Vacc_refreshed":354.7521313753 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14456.4196110425, - "Vacc_completed":1411.7530351787, - "Vacc_refreshed":361.5526839017 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14466.1757833279, - "Vacc_completed":1412.4941157515, - "Vacc_refreshed":364.0766791828 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14472.9152722164, - "Vacc_completed":1421.7399661156, - "Vacc_refreshed":371.2418954122 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14474.3971159945, - "Vacc_completed":1423.8796012137, - "Vacc_refreshed":378.3445685688 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14482.9259977884, - "Vacc_completed":1428.8212618966, - "Vacc_refreshed":382.6712538747 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14491.6837567491, - "Vacc_completed":1430.1481016913, - "Vacc_refreshed":392.5489632959 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14499.5728298642, - "Vacc_completed":1439.468906008, - "Vacc_refreshed":397.6649554861 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14500.4884339857, - "Vacc_completed":1447.6074532094, - "Vacc_refreshed":404.4236802991 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14508.6628209678, - "Vacc_completed":1449.1955087396, - "Vacc_refreshed":413.1290507873 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14509.0177335192, - "Vacc_completed":1457.0313439789, - "Vacc_refreshed":418.6984801264 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14518.7925361684, - "Vacc_completed":1462.4055060107, - "Vacc_refreshed":419.6070699812 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14522.121758092, - "Vacc_completed":1468.1811367429, - "Vacc_refreshed":425.9772045183 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14528.5474917037, - "Vacc_completed":1473.5164593205, - "Vacc_refreshed":435.7810319021 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14536.5601109176, - "Vacc_completed":1481.2704120463, - "Vacc_refreshed":438.2410199432 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14542.1473955627, - "Vacc_completed":1482.7064631605, - "Vacc_refreshed":445.3488141502 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14544.5952478081, - "Vacc_completed":1486.0552178086, - "Vacc_refreshed":446.1812966093 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10765.9941189788, - "Vacc_completed":1603.3500569399, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.3717745702, - "Vacc_completed":1605.3068408797, - "Vacc_refreshed":3.6283182226 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.4956401429, - "Vacc_completed":1610.6119068185, - "Vacc_refreshed":6.1967396209 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10774.4184508751, - "Vacc_completed":1613.016161978, - "Vacc_refreshed":15.7069691534 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10780.8073818373, - "Vacc_completed":1622.1917795654, - "Vacc_refreshed":20.1697274397 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10785.5287460006, - "Vacc_completed":1625.0602525893, - "Vacc_refreshed":22.4671684217 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10790.1084610651, - "Vacc_completed":1627.3787523231, - "Vacc_refreshed":28.5217462646 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10796.2300309, - "Vacc_completed":1630.4363483664, - "Vacc_refreshed":35.3070676184 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10801.7222904172, - "Vacc_completed":1638.725087864, - "Vacc_refreshed":43.7679344272 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10804.7724722766, - "Vacc_completed":1646.4905335365, - "Vacc_refreshed":44.1718542676 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10814.3453353804, - "Vacc_completed":1650.9992837124, - "Vacc_refreshed":49.5204655539 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10821.6255112157, - "Vacc_completed":1656.4335840831, - "Vacc_refreshed":52.7009855172 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10830.9379325639, - "Vacc_completed":1657.186187271, - "Vacc_refreshed":56.5428649986 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10838.202902864, - "Vacc_completed":1662.1470499364, - "Vacc_refreshed":58.6277824858 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10840.8786753296, - "Vacc_completed":1670.6860254071, - "Vacc_refreshed":58.7593924743 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10843.7453960183, - "Vacc_completed":1673.6372365137, - "Vacc_refreshed":61.8595630166 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10849.1151892515, - "Vacc_completed":1675.1066023109, - "Vacc_refreshed":64.6020615007 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10850.9329685403, - "Vacc_completed":1679.1505675366, - "Vacc_refreshed":72.0237510859 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10854.4610677614, - "Vacc_completed":1681.5473018047, - "Vacc_refreshed":75.0145349272 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10858.0662824418, - "Vacc_completed":1688.7179113019, - "Vacc_refreshed":82.7641475111 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10867.8357803799, - "Vacc_completed":1688.741478882, - "Vacc_refreshed":92.1411476813 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10877.245759177, - "Vacc_completed":1696.3354153291, - "Vacc_refreshed":93.5350586202 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10878.9277486403, - "Vacc_completed":1704.5169058825, - "Vacc_refreshed":99.9257252117 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10881.5163902637, - "Vacc_completed":1704.5184844203, - "Vacc_refreshed":104.0563799981 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10882.0628121233, - "Vacc_completed":1710.1811092467, - "Vacc_refreshed":110.998904559 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10884.1868939764, - "Vacc_completed":1711.6669667815, - "Vacc_refreshed":119.5835613879 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10890.26315895, - "Vacc_completed":1712.8219244738, - "Vacc_refreshed":126.203975023 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10894.6858788747, - "Vacc_completed":1721.7467435031, - "Vacc_refreshed":135.9649739788 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10897.5575288795, - "Vacc_completed":1721.7787127468, - "Vacc_refreshed":145.614673399 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10903.1231721286, - "Vacc_completed":1724.7269587992, - "Vacc_refreshed":149.6717929743 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10911.1763853993, - "Vacc_completed":1726.3071857535, - "Vacc_refreshed":158.0496522084 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10919.5582023277, - "Vacc_completed":1727.9236223535, - "Vacc_refreshed":160.5751263702 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10920.4962369047, - "Vacc_completed":1730.7211296321, - "Vacc_refreshed":162.2038531114 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10930.0062994591, - "Vacc_completed":1733.2273616859, - "Vacc_refreshed":164.6178844659 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10931.0781786076, - "Vacc_completed":1743.0639116966, - "Vacc_refreshed":171.6949336111 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10936.2371584575, - "Vacc_completed":1743.4973637943, - "Vacc_refreshed":173.1954991423 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10937.1969149599, - "Vacc_completed":1752.0043206175, - "Vacc_refreshed":173.4521249531 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10942.5829785849, - "Vacc_completed":1758.5438162851, - "Vacc_refreshed":175.0971428389 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10945.8458051779, - "Vacc_completed":1765.593119461, - "Vacc_refreshed":184.781293552 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10955.2619609788, - "Vacc_completed":1766.7516696253, - "Vacc_refreshed":194.3279051811 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0529992794, - "Vacc_completed":1774.4096958807, - "Vacc_refreshed":199.3585168564 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0740456643, - "Vacc_completed":1776.7353479155, - "Vacc_refreshed":200.2783085421 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7647446192, - "Vacc_completed":1786.1838226639, - "Vacc_refreshed":202.522841172 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7950553291, - "Vacc_completed":1788.5013884886, - "Vacc_refreshed":205.1107008609 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10973.1049316279, - "Vacc_completed":1790.2712267193, - "Vacc_refreshed":214.0688577867 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10976.2696576646, - "Vacc_completed":1797.8582422894, - "Vacc_refreshed":219.0460187772 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10984.9161656634, - "Vacc_completed":1801.5924446935, - "Vacc_refreshed":227.656626047 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10994.063273181, - "Vacc_completed":1802.6817444812, - "Vacc_refreshed":235.6032823069 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10996.8771305673, - "Vacc_completed":1802.9071097171, - "Vacc_refreshed":237.7242073629 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11002.0527900673, - "Vacc_completed":1809.5395950318, - "Vacc_refreshed":241.3631599251 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11007.1528572096, - "Vacc_completed":1813.9025489723, - "Vacc_refreshed":245.5305344153 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11013.1337350258, - "Vacc_completed":1821.5275057931, - "Vacc_refreshed":250.3168579858 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11015.6696905796, - "Vacc_completed":1822.9598630397, - "Vacc_refreshed":255.6335351411 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11023.4754023371, - "Vacc_completed":1827.2471461973, - "Vacc_refreshed":265.5951098299 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11032.8284479669, - "Vacc_completed":1827.5539031975, - "Vacc_refreshed":267.3513136054 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.3845078238, - "Vacc_completed":1828.9970028031, - "Vacc_refreshed":270.5903250252 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.693720803, - "Vacc_completed":1836.2049019351, - "Vacc_refreshed":272.0758803579 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11047.8242120991, - "Vacc_completed":1837.1027842122, - "Vacc_refreshed":275.2277393803 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11053.900379851, - "Vacc_completed":1838.273599421, - "Vacc_refreshed":282.2344875735 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11059.6633767419, - "Vacc_completed":1845.0089267377, - "Vacc_refreshed":284.3140546038 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11068.9288674107, - "Vacc_completed":1852.7615624634, - "Vacc_refreshed":287.0304142153 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11072.6595101177, - "Vacc_completed":1857.871819743, - "Vacc_refreshed":289.2733395979 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11082.5784142097, - "Vacc_completed":1865.7647392626, - "Vacc_refreshed":291.3426551576 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11089.5185616411, - "Vacc_completed":1869.3958231852, - "Vacc_refreshed":299.8179962185 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11097.3087770941, - "Vacc_completed":1878.7026117675, - "Vacc_refreshed":306.1608208876 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11101.8508357142, - "Vacc_completed":1879.7270518854, - "Vacc_refreshed":308.0716738039 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11103.0915214706, - "Vacc_completed":1883.5574266434, - "Vacc_refreshed":311.2801806804 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11111.9334619087, - "Vacc_completed":1887.7967037043, - "Vacc_refreshed":320.2156677375 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11118.8667730664, - "Vacc_completed":1896.6793284207, - "Vacc_refreshed":321.8561637233 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11123.0290736537, - "Vacc_completed":1902.1985445903, - "Vacc_refreshed":328.4656069808 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11129.3471714321, - "Vacc_completed":1902.2057666507, - "Vacc_refreshed":334.8734059386 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11137.9949570833, - "Vacc_completed":1907.7915885083, - "Vacc_refreshed":339.9783670978 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11139.4617826874, - "Vacc_completed":1910.6126501167, - "Vacc_refreshed":342.8472462544 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11144.4191917936, - "Vacc_completed":1917.8558172992, - "Vacc_refreshed":351.3104814196 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11153.423123173, - "Vacc_completed":1927.8115362669, - "Vacc_refreshed":359.1887782128 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11155.4646855253, - "Vacc_completed":1931.0938823989, - "Vacc_refreshed":363.4217582407 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11164.8755655095, - "Vacc_completed":1932.0922021433, - "Vacc_refreshed":369.5881371093 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11168.2127634861, - "Vacc_completed":1937.8864562316, - "Vacc_refreshed":371.2850357688 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11170.3919325879, - "Vacc_completed":1943.9625258254, - "Vacc_refreshed":372.564368772 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11178.2156716034, - "Vacc_completed":1946.3680545291, - "Vacc_refreshed":377.1791450411 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11187.7206334256, - "Vacc_completed":1950.3408321869, - "Vacc_refreshed":385.28114877 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11189.2295548943, - "Vacc_completed":1952.7801877326, - "Vacc_refreshed":386.4768386941 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11193.8090943925, - "Vacc_completed":1960.5337079214, - "Vacc_refreshed":395.6463777137 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11198.0758128722, - "Vacc_completed":1964.4220756604, - "Vacc_refreshed":404.4005517293 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11200.1395546734, - "Vacc_completed":1974.1843879258, - "Vacc_refreshed":410.4354615606 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.0858861212, - "Vacc_completed":1978.0710124849, - "Vacc_refreshed":414.2205337181 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.5521637654, - "Vacc_completed":1981.3589179628, - "Vacc_refreshed":419.5840242501 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11211.6562498266, - "Vacc_completed":1989.6665585254, - "Vacc_refreshed":426.6154672823 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11219.1926870115, - "Vacc_completed":1996.1459430488, - "Vacc_refreshed":430.16915603 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11221.4656474699, - "Vacc_completed":2001.4601213853, - "Vacc_refreshed":430.8770850788 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11224.2379660032, - "Vacc_completed":2006.2961081678, - "Vacc_refreshed":433.8074021391 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11229.137503588, - "Vacc_completed":2013.2392255015, - "Vacc_refreshed":441.1218403265 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15118.5419446559, - "Vacc_completed":1046.4766182565, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15127.0441726861, - "Vacc_completed":1051.8189573454, - "Vacc_refreshed":4.7668817312 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15134.2198668737, - "Vacc_completed":1051.8898550539, - "Vacc_refreshed":6.8954841457 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15138.5012633389, - "Vacc_completed":1054.1938291422, - "Vacc_refreshed":12.8850967826 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15140.019297286, - "Vacc_completed":1057.2812920036, - "Vacc_refreshed":15.610006044 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15141.0655653453, - "Vacc_completed":1061.1873607435, - "Vacc_refreshed":18.0052067519 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15146.6047446953, - "Vacc_completed":1067.3953196211, - "Vacc_refreshed":27.5155266211 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15150.2459378898, - "Vacc_completed":1077.315397207, - "Vacc_refreshed":28.0742687581 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15153.3836683973, - "Vacc_completed":1082.8237823387, - "Vacc_refreshed":32.6629347887 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15155.2486658897, - "Vacc_completed":1087.8721865368, - "Vacc_refreshed":42.082807235 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15157.4630323429, - "Vacc_completed":1090.0916620904, - "Vacc_refreshed":43.8436800298 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15158.7941750828, - "Vacc_completed":1091.8322828475, - "Vacc_refreshed":44.7371311455 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15159.4697179186, - "Vacc_completed":1097.9581123146, - "Vacc_refreshed":52.5410403094 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15166.8797207146, - "Vacc_completed":1103.4838023049, - "Vacc_refreshed":58.4482610787 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.177591783, - "Vacc_completed":1107.529236183, - "Vacc_refreshed":61.868532741 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.3473624207, - "Vacc_completed":1108.0854442406, - "Vacc_refreshed":64.122741794 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15176.6656703161, - "Vacc_completed":1114.7623442184, - "Vacc_refreshed":73.3909194547 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15182.6538662202, - "Vacc_completed":1121.0967139584, - "Vacc_refreshed":78.4108273222 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15191.0826029366, - "Vacc_completed":1124.8733122731, - "Vacc_refreshed":88.1249123157 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15195.1567917247, - "Vacc_completed":1133.1683853487, - "Vacc_refreshed":94.0586819047 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15197.6523517992, - "Vacc_completed":1140.1742056487, - "Vacc_refreshed":97.7116921077 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15202.8832794911, - "Vacc_completed":1140.4207518542, - "Vacc_refreshed":101.0390519368 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15209.502983548, - "Vacc_completed":1144.1138351675, - "Vacc_refreshed":104.5568369595 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15218.5591667959, - "Vacc_completed":1153.0110444013, - "Vacc_refreshed":111.8121115483 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15223.6275127037, - "Vacc_completed":1157.3585549388, - "Vacc_refreshed":113.9066704897 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.4100349304, - "Vacc_completed":1162.1581378525, - "Vacc_refreshed":116.416758139 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.7888080253, - "Vacc_completed":1166.5300160643, - "Vacc_refreshed":119.2414894864 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15235.240974732, - "Vacc_completed":1171.76423914, - "Vacc_refreshed":129.0137217302 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15236.252829019, - "Vacc_completed":1174.1820893055, - "Vacc_refreshed":130.8298102316 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15244.5996289271, - "Vacc_completed":1181.3457343202, - "Vacc_refreshed":138.0198133972 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15247.7688417561, - "Vacc_completed":1186.4632437534, - "Vacc_refreshed":147.549469044 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15254.8324409461, - "Vacc_completed":1196.0640695451, - "Vacc_refreshed":148.035813332 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15263.9056700401, - "Vacc_completed":1202.0195228295, - "Vacc_refreshed":152.9647063671 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15271.3608079113, - "Vacc_completed":1205.9189472233, - "Vacc_refreshed":159.4326071199 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15274.5391192733, - "Vacc_completed":1209.5333389579, - "Vacc_refreshed":165.8197711746 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15279.9252173752, - "Vacc_completed":1217.5022918804, - "Vacc_refreshed":170.1668415009 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15289.6429605219, - "Vacc_completed":1218.0921627258, - "Vacc_refreshed":176.8858359396 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15297.4452269777, - "Vacc_completed":1218.4916546179, - "Vacc_refreshed":177.0224757358 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15304.6068820067, - "Vacc_completed":1221.1648349639, - "Vacc_refreshed":182.8363512803 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15308.4472782837, - "Vacc_completed":1221.3254317254, - "Vacc_refreshed":188.4124431026 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15313.3535420035, - "Vacc_completed":1228.797689569, - "Vacc_refreshed":197.4958413402 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15319.6989570363, - "Vacc_completed":1230.5766158569, - "Vacc_refreshed":207.1280776834 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15329.2757609065, - "Vacc_completed":1232.5532561558, - "Vacc_refreshed":216.6030971785 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15331.3854251166, - "Vacc_completed":1240.7858568563, - "Vacc_refreshed":224.0947128601 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15335.6254694555, - "Vacc_completed":1248.7648628072, - "Vacc_refreshed":228.3914917972 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15342.4956408139, - "Vacc_completed":1253.345700271, - "Vacc_refreshed":237.7873655386 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15349.2985100866, - "Vacc_completed":1254.923228178, - "Vacc_refreshed":243.7398150729 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.0642849231, - "Vacc_completed":1256.1247258557, - "Vacc_refreshed":246.0998008594 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.3098206871, - "Vacc_completed":1258.7673082658, - "Vacc_refreshed":255.4830156808 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.8477668821, - "Vacc_completed":1261.8739088788, - "Vacc_refreshed":262.4150374381 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15355.0053188609, - "Vacc_completed":1268.7063064011, - "Vacc_refreshed":268.0354130392 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15356.8245202899, - "Vacc_completed":1275.6335562552, - "Vacc_refreshed":272.2800844077 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15357.7799420851, - "Vacc_completed":1276.6526923528, - "Vacc_refreshed":272.4509982396 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15360.090059624, - "Vacc_completed":1286.3717718947, - "Vacc_refreshed":276.5108897334 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15368.9251730685, - "Vacc_completed":1289.9608638772, - "Vacc_refreshed":286.1598516049 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15374.4348532349, - "Vacc_completed":1292.7431692071, - "Vacc_refreshed":286.9834989324 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15375.2266568732, - "Vacc_completed":1293.6118841564, - "Vacc_refreshed":287.1997495191 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15378.8167187789, - "Vacc_completed":1294.2472234682, - "Vacc_refreshed":293.7465776915 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15381.8183566081, - "Vacc_completed":1296.5074589754, - "Vacc_refreshed":294.394169978 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15390.3384592829, - "Vacc_completed":1298.1144038724, - "Vacc_refreshed":295.3508481166 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15397.4841102393, - "Vacc_completed":1301.7744150574, - "Vacc_refreshed":295.636121459 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15406.9128765942, - "Vacc_completed":1306.3546732411, - "Vacc_refreshed":299.2176949608 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15412.9312961067, - "Vacc_completed":1313.4112918553, - "Vacc_refreshed":304.1283567048 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15413.8396565369, - "Vacc_completed":1323.1872711778, - "Vacc_refreshed":309.3767578057 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15417.5353933956, - "Vacc_completed":1332.5570169907, - "Vacc_refreshed":310.9982936972 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15418.826072466, - "Vacc_completed":1333.4298810326, - "Vacc_refreshed":318.8191964614 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15428.6081802722, - "Vacc_completed":1335.4576305614, - "Vacc_refreshed":322.681425219 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15434.4342053135, - "Vacc_completed":1341.8151001107, - "Vacc_refreshed":328.87826872 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15442.7494739491, - "Vacc_completed":1342.4758295952, - "Vacc_refreshed":336.8125605002 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15451.9615776405, - "Vacc_completed":1343.8595431355, - "Vacc_refreshed":340.6379428895 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15461.0343740586, - "Vacc_completed":1352.0217149096, - "Vacc_refreshed":342.4652609374 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15467.8869999547, - "Vacc_completed":1353.9994636638, - "Vacc_refreshed":343.6202751504 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15474.9129704383, - "Vacc_completed":1363.3653927841, - "Vacc_refreshed":345.0578595323 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15483.483328834, - "Vacc_completed":1372.0348541584, - "Vacc_refreshed":348.4131919851 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15489.3942653446, - "Vacc_completed":1377.4077406314, - "Vacc_refreshed":355.6717942515 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15494.2503612359, - "Vacc_completed":1377.4290090401, - "Vacc_refreshed":358.9820312389 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15495.3394152185, - "Vacc_completed":1378.0321848221, - "Vacc_refreshed":364.7453207897 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15497.7000250685, - "Vacc_completed":1378.1938721933, - "Vacc_refreshed":367.9820639836 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15498.7689863883, - "Vacc_completed":1381.0445655705, - "Vacc_refreshed":371.501202086 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15501.5446144083, - "Vacc_completed":1383.5660020007, - "Vacc_refreshed":378.7475176563 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15509.8230148672, - "Vacc_completed":1390.2361319678, - "Vacc_refreshed":382.7365149116 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15516.8607244434, - "Vacc_completed":1391.5356833196, - "Vacc_refreshed":387.0287274101 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15525.4621417067, - "Vacc_completed":1391.7538408053, - "Vacc_refreshed":394.832505058 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15530.1412323442, - "Vacc_completed":1393.5856974411, - "Vacc_refreshed":402.9766589833 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15538.5266345599, - "Vacc_completed":1394.0860887346, - "Vacc_refreshed":409.427624651 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15545.1857152555, - "Vacc_completed":1400.9009375981, - "Vacc_refreshed":414.8161834543 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15550.0113840393, - "Vacc_completed":1405.1190388135, - "Vacc_refreshed":423.1492506703 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15557.7502728646, - "Vacc_completed":1412.7232837907, - "Vacc_refreshed":429.51858195 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15558.6635273277, - "Vacc_completed":1416.4367765358, - "Vacc_refreshed":433.7574702422 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15567.8923476818, - "Vacc_completed":1417.419547185, - "Vacc_refreshed":436.3988331827 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15572.0110691064, - "Vacc_completed":1422.1291332179, - "Vacc_refreshed":444.7065625402 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15580.056372857, - "Vacc_completed":1429.5241883626, - "Vacc_refreshed":445.9185645116 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14604.162091487, - "Vacc_completed":1396.5367205842, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14608.6011110978, - "Vacc_completed":1403.0638750962, - "Vacc_refreshed":0.4818747518 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14617.4016613244, - "Vacc_completed":1412.4617013546, - "Vacc_refreshed":2.8841327921 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14626.8147148128, - "Vacc_completed":1413.5937989207, - "Vacc_refreshed":4.347225901 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14636.7930742671, - "Vacc_completed":1416.5445655325, - "Vacc_refreshed":10.9126558661 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14639.261920851, - "Vacc_completed":1419.7526675766, - "Vacc_refreshed":12.1285186735 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14646.6246553828, - "Vacc_completed":1429.1501916355, - "Vacc_refreshed":14.2999622979 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14655.9228453283, - "Vacc_completed":1433.2061319495, - "Vacc_refreshed":18.6765331159 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.6905295279, - "Vacc_completed":1437.4319338048, - "Vacc_refreshed":19.3435044237 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.8883385186, - "Vacc_completed":1446.7135497598, - "Vacc_refreshed":28.359576628 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14660.5634553543, - "Vacc_completed":1450.9111526521, - "Vacc_refreshed":38.3056947196 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14667.0822550267, - "Vacc_completed":1458.1473384005, - "Vacc_refreshed":38.8316353015 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14668.0361388154, - "Vacc_completed":1464.9440155832, - "Vacc_refreshed":44.1485629725 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14669.4679031112, - "Vacc_completed":1470.1284856322, - "Vacc_refreshed":47.7639888511 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.2618994679, - "Vacc_completed":1476.9344530457, - "Vacc_refreshed":56.361748961 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.3447644481, - "Vacc_completed":1477.2393580763, - "Vacc_refreshed":57.2273767339 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14684.0130216555, - "Vacc_completed":1484.3234594705, - "Vacc_refreshed":63.4497732245 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14691.8154699011, - "Vacc_completed":1492.8513113216, - "Vacc_refreshed":71.1720264341 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14697.5036031252, - "Vacc_completed":1493.7450842417, - "Vacc_refreshed":77.3635307257 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14702.599106658, - "Vacc_completed":1503.4641107157, - "Vacc_refreshed":82.0575571669 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14706.3806325115, - "Vacc_completed":1509.7236994586, - "Vacc_refreshed":82.4020129882 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14711.1723860607, - "Vacc_completed":1510.3801441147, - "Vacc_refreshed":89.5249618369 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14720.0093085987, - "Vacc_completed":1517.7733661353, - "Vacc_refreshed":99.2211580734 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14727.6474505495, - "Vacc_completed":1519.2060691793, - "Vacc_refreshed":104.7140344902 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14737.2025033477, - "Vacc_completed":1520.8147599339, - "Vacc_refreshed":111.7829864033 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14739.5787007901, - "Vacc_completed":1526.8277919335, - "Vacc_refreshed":118.2526435067 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14740.2622466128, - "Vacc_completed":1533.9654672239, - "Vacc_refreshed":121.0872593022 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.3105527103, - "Vacc_completed":1534.5209202615, - "Vacc_refreshed":130.3683956867 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.4386233429, - "Vacc_completed":1534.652607589, - "Vacc_refreshed":131.8609814668 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14750.7660084012, - "Vacc_completed":1541.7255942491, - "Vacc_refreshed":135.0718914562 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14754.5460710197, - "Vacc_completed":1550.2608445951, - "Vacc_refreshed":143.3620456295 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14759.0944017155, - "Vacc_completed":1555.0005459425, - "Vacc_refreshed":149.1268404613 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14765.0469016605, - "Vacc_completed":1561.0596836707, - "Vacc_refreshed":156.632878281 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14767.8747922121, - "Vacc_completed":1562.2055298685, - "Vacc_refreshed":158.7846499619 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14770.6956031505, - "Vacc_completed":1564.0912014269, - "Vacc_refreshed":160.2235512232 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14771.8405767953, - "Vacc_completed":1569.1767284097, - "Vacc_refreshed":163.0960075253 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14772.2052559189, - "Vacc_completed":1577.0342160583, - "Vacc_refreshed":171.338237261 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14775.8209952029, - "Vacc_completed":1582.4601331483, - "Vacc_refreshed":171.7811634642 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14783.195452278, - "Vacc_completed":1590.5417141678, - "Vacc_refreshed":180.3921690168 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14789.7908493035, - "Vacc_completed":1599.1828252755, - "Vacc_refreshed":184.3843375412 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14799.5061304555, - "Vacc_completed":1604.6353429891, - "Vacc_refreshed":186.9160630046 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14800.1953862328, - "Vacc_completed":1607.3418569739, - "Vacc_refreshed":194.8977352638 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14804.6194220955, - "Vacc_completed":1610.8601925588, - "Vacc_refreshed":198.1360514295 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14807.6135970058, - "Vacc_completed":1620.4676732545, - "Vacc_refreshed":199.7756827366 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14812.6404573806, - "Vacc_completed":1625.8005590907, - "Vacc_refreshed":208.9834954342 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14821.7780993542, - "Vacc_completed":1634.2191287828, - "Vacc_refreshed":218.0082295343 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14826.4757459809, - "Vacc_completed":1642.5529482935, - "Vacc_refreshed":225.0524176739 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14831.5528263871, - "Vacc_completed":1649.3317542887, - "Vacc_refreshed":229.0729255762 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14835.4543265309, - "Vacc_completed":1656.6375918093, - "Vacc_refreshed":230.6069957275 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14843.0829401722, - "Vacc_completed":1661.236165662, - "Vacc_refreshed":240.090987042 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14846.441543514, - "Vacc_completed":1663.7621214807, - "Vacc_refreshed":242.6005891297 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14852.8592673291, - "Vacc_completed":1670.5438763585, - "Vacc_refreshed":243.1550853514 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14859.7577792484, - "Vacc_completed":1671.9654195564, - "Vacc_refreshed":252.4226950148 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14860.9361402439, - "Vacc_completed":1673.0063955744, - "Vacc_refreshed":254.9337371613 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14866.4446359141, - "Vacc_completed":1680.8225588341, - "Vacc_refreshed":260.3047312661 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14873.2607186268, - "Vacc_completed":1689.7385811283, - "Vacc_refreshed":267.8936320344 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14880.5922770798, - "Vacc_completed":1689.9651236491, - "Vacc_refreshed":275.7764918768 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14887.440916863, - "Vacc_completed":1696.5525450807, - "Vacc_refreshed":283.5225421273 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14888.0132355705, - "Vacc_completed":1703.9968022938, - "Vacc_refreshed":284.1554601622 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14897.4895745985, - "Vacc_completed":1707.7124979313, - "Vacc_refreshed":293.9654633907 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14900.9132287675, - "Vacc_completed":1714.1256328363, - "Vacc_refreshed":300.1498047442 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14907.9968139113, - "Vacc_completed":1717.9722882107, - "Vacc_refreshed":303.8260258963 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14914.3000727157, - "Vacc_completed":1723.7459149842, - "Vacc_refreshed":310.6001358466 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14915.2709520902, - "Vacc_completed":1725.3728171833, - "Vacc_refreshed":311.7419250413 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14924.9251049714, - "Vacc_completed":1730.3968331067, - "Vacc_refreshed":318.9914066325 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14929.9737051543, - "Vacc_completed":1735.419819131, - "Vacc_refreshed":327.2769475594 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.0867908297, - "Vacc_completed":1735.4531164502, - "Vacc_refreshed":333.9507530528 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.1585043075, - "Vacc_completed":1744.7112606784, - "Vacc_refreshed":337.8096837232 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14939.2420152133, - "Vacc_completed":1745.8678859662, - "Vacc_refreshed":344.4742142552 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14940.9708787633, - "Vacc_completed":1748.1937727819, - "Vacc_refreshed":352.7895987096 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14950.0282400838, - "Vacc_completed":1750.2751748343, - "Vacc_refreshed":354.0652893483 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14956.5498846765, - "Vacc_completed":1758.7641351746, - "Vacc_refreshed":361.0736440858 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14957.5908121778, - "Vacc_completed":1763.4528309235, - "Vacc_refreshed":364.3501912771 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14960.7281563782, - "Vacc_completed":1772.006809538, - "Vacc_refreshed":364.6804469838 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14969.2457673746, - "Vacc_completed":1776.5678522654, - "Vacc_refreshed":374.4882812856 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14974.8615073088, - "Vacc_completed":1779.9556763371, - "Vacc_refreshed":377.4421123342 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14984.5914886251, - "Vacc_completed":1782.6146675026, - "Vacc_refreshed":381.2082916917 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14987.5876984189, - "Vacc_completed":1791.1028428437, - "Vacc_refreshed":385.3294438436 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.58002825, - "Vacc_completed":1793.9473770292, - "Vacc_refreshed":388.9073184565 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.8771499871, - "Vacc_completed":1796.0612762347, - "Vacc_refreshed":390.0186176392 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14993.5505864267, - "Vacc_completed":1798.6017730753, - "Vacc_refreshed":390.5734438836 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14998.158414122, - "Vacc_completed":1802.0655230464, - "Vacc_refreshed":391.8649823662 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.4313521872, - "Vacc_completed":1804.413054883, - "Vacc_refreshed":395.3533451537 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.7989985243, - "Vacc_completed":1812.4490035114, - "Vacc_refreshed":401.8191046925 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15002.2088852954, - "Vacc_completed":1814.4865305652, - "Vacc_refreshed":409.5825438963 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15008.2705384657, - "Vacc_completed":1823.0023861142, - "Vacc_refreshed":411.4567502649 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15013.4515790087, - "Vacc_completed":1830.5873803301, - "Vacc_refreshed":417.6053918266 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15022.965858679, - "Vacc_completed":1833.2575088513, - "Vacc_refreshed":421.7562400513 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15024.3362350043, - "Vacc_completed":1839.0848659035, - "Vacc_refreshed":429.2321579029 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15025.0436784182, - "Vacc_completed":1840.7238800201, - "Vacc_refreshed":434.1256619822 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15026.1929816575, - "Vacc_completed":1848.4826094697, - "Vacc_refreshed":436.1767563509 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15028.1115762872, - "Vacc_completed":1851.353962867, - "Vacc_refreshed":439.6190575403 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12940.2728292563, - "Vacc_completed":1761.2082450081, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12944.552426313, - "Vacc_completed":1763.9916052944, - "Vacc_refreshed":5.8453121761 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12946.2293033065, - "Vacc_completed":1764.8651614651, - "Vacc_refreshed":11.3614134516 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12954.4553975676, - "Vacc_completed":1773.9720915654, - "Vacc_refreshed":19.8633846559 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12962.1675537316, - "Vacc_completed":1776.6871749169, - "Vacc_refreshed":23.5340750877 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12970.2114807284, - "Vacc_completed":1779.4482697767, - "Vacc_refreshed":32.7047145334 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12971.1155781651, - "Vacc_completed":1787.6912361171, - "Vacc_refreshed":41.3859214133 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12976.1479148685, - "Vacc_completed":1796.0609011819, - "Vacc_refreshed":49.2224218631 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12985.389251021, - "Vacc_completed":1806.0439647379, - "Vacc_refreshed":58.4565372826 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12987.6528992192, - "Vacc_completed":1814.2136648594, - "Vacc_refreshed":68.4133404236 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12988.8953336446, - "Vacc_completed":1820.4740554862, - "Vacc_refreshed":69.4164203636 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12989.930788247, - "Vacc_completed":1825.1779692151, - "Vacc_refreshed":71.594311523 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12993.9481590439, - "Vacc_completed":1834.4690603586, - "Vacc_refreshed":75.4387792504 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12997.41102572, - "Vacc_completed":1836.6145856268, - "Vacc_refreshed":81.7875242048 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12999.5337504327, - "Vacc_completed":1839.9662175544, - "Vacc_refreshed":87.9455065083 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13007.2251436977, - "Vacc_completed":1842.6498922014, - "Vacc_refreshed":93.1900542901 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13012.0856312446, - "Vacc_completed":1844.701996872, - "Vacc_refreshed":99.712698674 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13021.33252246, - "Vacc_completed":1849.3061445307, - "Vacc_refreshed":102.5319545699 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13027.1500152398, - "Vacc_completed":1850.8078304213, - "Vacc_refreshed":105.0259857828 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13035.650988116, - "Vacc_completed":1851.8577100095, - "Vacc_refreshed":110.1445342625 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13042.2123284129, - "Vacc_completed":1856.2056162281, - "Vacc_refreshed":113.6459186876 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13048.5274669921, - "Vacc_completed":1856.9596604869, - "Vacc_refreshed":119.7006093985 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13056.4261041722, - "Vacc_completed":1859.9946313318, - "Vacc_refreshed":128.4930741519 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13061.2580735831, - "Vacc_completed":1864.4241013454, - "Vacc_refreshed":129.4122729818 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13069.8769575412, - "Vacc_completed":1870.828968765, - "Vacc_refreshed":133.5606697443 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13074.4847352314, - "Vacc_completed":1873.0576602324, - "Vacc_refreshed":142.5189975609 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13077.43910001, - "Vacc_completed":1881.1763507471, - "Vacc_refreshed":143.4948395736 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13082.3470601758, - "Vacc_completed":1888.5808588713, - "Vacc_refreshed":149.0381282873 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13091.0962170402, - "Vacc_completed":1894.9989493108, - "Vacc_refreshed":149.7527355276 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13097.0655225667, - "Vacc_completed":1904.9660517959, - "Vacc_refreshed":155.7716165644 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13105.8431803144, - "Vacc_completed":1907.1233275333, - "Vacc_refreshed":162.7399373626 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13110.9052745957, - "Vacc_completed":1915.3369502585, - "Vacc_refreshed":166.1686970271 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13120.2888484357, - "Vacc_completed":1924.594235894, - "Vacc_refreshed":174.1871820852 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13122.2684309305, - "Vacc_completed":1926.8954039089, - "Vacc_refreshed":179.1800373951 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13129.679389954, - "Vacc_completed":1929.8687720822, - "Vacc_refreshed":186.5609898946 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13136.2121968271, - "Vacc_completed":1930.5419008182, - "Vacc_refreshed":190.3285119819 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13140.8693305096, - "Vacc_completed":1933.1368513989, - "Vacc_refreshed":199.5045342081 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13141.6505152789, - "Vacc_completed":1938.3539275062, - "Vacc_refreshed":199.9231054484 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13146.3819720109, - "Vacc_completed":1943.0787615053, - "Vacc_refreshed":203.5617342411 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.5833925737, - "Vacc_completed":1944.8505615419, - "Vacc_refreshed":206.5254255239 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.8864321418, - "Vacc_completed":1946.7574709443, - "Vacc_refreshed":208.0171497057 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13160.8319905342, - "Vacc_completed":1949.6926878806, - "Vacc_refreshed":213.0797703475 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13165.109826694, - "Vacc_completed":1955.2468047197, - "Vacc_refreshed":222.6760329578 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13168.7847714036, - "Vacc_completed":1956.1809363506, - "Vacc_refreshed":231.6808966253 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13176.0869758252, - "Vacc_completed":1960.8024990411, - "Vacc_refreshed":233.4328765098 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13180.123104626, - "Vacc_completed":1969.8047949709, - "Vacc_refreshed":241.5696524948 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13184.6423078124, - "Vacc_completed":1974.8566545144, - "Vacc_refreshed":250.4550885677 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13190.9452560841, - "Vacc_completed":1975.9346724558, - "Vacc_refreshed":252.799671753 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13194.9586490897, - "Vacc_completed":1984.1998929758, - "Vacc_refreshed":256.8657355625 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13203.1981501018, - "Vacc_completed":1992.2264996957, - "Vacc_refreshed":262.7110996677 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13210.570704838, - "Vacc_completed":2000.1284432323, - "Vacc_refreshed":268.7466273707 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13217.6966464936, - "Vacc_completed":2001.108779963, - "Vacc_refreshed":270.063420564 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13222.8454105611, - "Vacc_completed":2006.445790007, - "Vacc_refreshed":272.306211944 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13231.9459038211, - "Vacc_completed":2014.1245558198, - "Vacc_refreshed":274.2682102675 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.4430744102, - "Vacc_completed":2021.01783734, - "Vacc_refreshed":283.272422859 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.9880313892, - "Vacc_completed":2021.3278488109, - "Vacc_refreshed":288.8833613171 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13244.1020800967, - "Vacc_completed":2028.5342497408, - "Vacc_refreshed":295.5476346222 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13246.2035006005, - "Vacc_completed":2034.7337820973, - "Vacc_refreshed":295.8527619766 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13250.3034672718, - "Vacc_completed":2040.4526371692, - "Vacc_refreshed":297.6289642024 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13258.1309651863, - "Vacc_completed":2043.9166550693, - "Vacc_refreshed":307.2590005259 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13264.00554028, - "Vacc_completed":2046.5596745193, - "Vacc_refreshed":309.1250398792 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.4212557374, - "Vacc_completed":2049.7116443058, - "Vacc_refreshed":314.0515587013 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.7885616679, - "Vacc_completed":2051.2982177338, - "Vacc_refreshed":320.3832182075 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13274.2264538665, - "Vacc_completed":2058.2989667129, - "Vacc_refreshed":323.7063680074 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13281.9141553951, - "Vacc_completed":2063.8206751836, - "Vacc_refreshed":326.9158074422 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13290.64171309, - "Vacc_completed":2064.3110765988, - "Vacc_refreshed":336.7710359746 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.1885069646, - "Vacc_completed":2072.8766922561, - "Vacc_refreshed":344.574816718 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.7117921559, - "Vacc_completed":2081.2889195134, - "Vacc_refreshed":352.6791052892 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13295.741331211, - "Vacc_completed":2082.371745109, - "Vacc_refreshed":358.7062427923 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13303.8543248793, - "Vacc_completed":2084.7970217381, - "Vacc_refreshed":363.3629273081 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13305.910901253, - "Vacc_completed":2089.496376583, - "Vacc_refreshed":364.4184919111 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13310.1770755649, - "Vacc_completed":2091.8877772854, - "Vacc_refreshed":373.8861441424 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13318.5822731817, - "Vacc_completed":2100.0656871327, - "Vacc_refreshed":380.7622590612 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13326.848015265, - "Vacc_completed":2103.7807367097, - "Vacc_refreshed":383.494468406 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13329.8351558424, - "Vacc_completed":2106.3811743673, - "Vacc_refreshed":385.7094999088 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13334.0243800891, - "Vacc_completed":2110.0143078684, - "Vacc_refreshed":387.028737638 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13340.0473805148, - "Vacc_completed":2114.17877764, - "Vacc_refreshed":390.7872507231 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13342.4710995253, - "Vacc_completed":2117.5584807218, - "Vacc_refreshed":394.4459716696 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13345.9586603577, - "Vacc_completed":2124.6343373595, - "Vacc_refreshed":401.3739608899 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13354.1694340722, - "Vacc_completed":2132.584533812, - "Vacc_refreshed":404.149558168 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13360.0480186273, - "Vacc_completed":2135.2279773256, - "Vacc_refreshed":407.0589420913 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13362.9287822042, - "Vacc_completed":2135.7661733179, - "Vacc_refreshed":412.3495727781 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13365.9702033874, - "Vacc_completed":2140.0801351424, - "Vacc_refreshed":414.1173144704 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13375.8578305813, - "Vacc_completed":2147.1687721976, - "Vacc_refreshed":416.1274613074 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.3434411484, - "Vacc_completed":2149.6360498231, - "Vacc_refreshed":422.5420941028 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.8386238776, - "Vacc_completed":2156.2105881723, - "Vacc_refreshed":428.2913369026 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13388.7750604929, - "Vacc_completed":2160.929719286, - "Vacc_refreshed":437.0909930573 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13397.0959920005, - "Vacc_completed":2169.0772334568, - "Vacc_refreshed":438.0782576038 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13406.1913483212, - "Vacc_completed":2172.8397968306, - "Vacc_refreshed":445.0079409299 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13410.1064630998, - "Vacc_completed":2179.4067803849, - "Vacc_refreshed":453.2550919609 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.2872479216, - "Vacc_completed":2183.7956163614, - "Vacc_refreshed":462.0847473084 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.7274837683, - "Vacc_completed":2186.2625889833, - "Vacc_refreshed":470.3671533805 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15108.1816487494, - "Vacc_completed":1951.3500240632, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15112.0388992614, - "Vacc_completed":1956.8484422205, - "Vacc_refreshed":4.7764537598 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15115.1174991099, - "Vacc_completed":1961.6166149519, - "Vacc_refreshed":11.6778924479 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15121.0352670933, - "Vacc_completed":1969.039883077, - "Vacc_refreshed":19.464449507 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15130.8297777562, - "Vacc_completed":1970.7344191294, - "Vacc_refreshed":28.0813773392 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15139.7963570637, - "Vacc_completed":1971.420038313, - "Vacc_refreshed":34.2304461363 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15149.3578353885, - "Vacc_completed":1977.7986093705, - "Vacc_refreshed":42.9385547047 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15150.8906121637, - "Vacc_completed":1981.6633590428, - "Vacc_refreshed":46.0030569507 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15153.3987479409, - "Vacc_completed":1986.7151251441, - "Vacc_refreshed":54.9967129669 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15155.2112066, - "Vacc_completed":1993.3668502516, - "Vacc_refreshed":59.2446234015 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15157.213160056, - "Vacc_completed":2000.1282773775, - "Vacc_refreshed":61.576334937 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15159.7206353696, - "Vacc_completed":2000.5786646957, - "Vacc_refreshed":62.4328961844 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15165.6048851908, - "Vacc_completed":2000.600816545, - "Vacc_refreshed":70.2254449832 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15175.5401574577, - "Vacc_completed":2003.6984716795, - "Vacc_refreshed":80.0202808521 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15178.2193352397, - "Vacc_completed":2010.5259174304, - "Vacc_refreshed":80.5289834705 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15186.1911779287, - "Vacc_completed":2020.3094769054, - "Vacc_refreshed":88.939485925 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15192.9408650715, - "Vacc_completed":2027.102138126, - "Vacc_refreshed":93.403990271 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15197.2522804828, - "Vacc_completed":2033.1768424672, - "Vacc_refreshed":103.3495680716 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15201.4718571012, - "Vacc_completed":2041.9289374755, - "Vacc_refreshed":107.0046191576 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15203.6899934618, - "Vacc_completed":2042.5550193085, - "Vacc_refreshed":108.1692912263 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15210.5751055, - "Vacc_completed":2049.1508387429, - "Vacc_refreshed":115.4885047404 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15216.3570734734, - "Vacc_completed":2052.3213561982, - "Vacc_refreshed":119.2061326333 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15225.8779749457, - "Vacc_completed":2057.4663468474, - "Vacc_refreshed":126.226397743 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15230.8206176005, - "Vacc_completed":2064.8586744443, - "Vacc_refreshed":133.0501812916 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15231.8828151205, - "Vacc_completed":2068.2097593649, - "Vacc_refreshed":142.0174284746 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15238.2426035555, - "Vacc_completed":2071.8714182096, - "Vacc_refreshed":148.7355853512 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15247.7928253295, - "Vacc_completed":2078.7188555952, - "Vacc_refreshed":156.2462830057 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15257.1929610505, - "Vacc_completed":2083.6123346127, - "Vacc_refreshed":163.8060000189 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15261.4225446127, - "Vacc_completed":2092.4315663384, - "Vacc_refreshed":165.098643188 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15264.9230201438, - "Vacc_completed":2098.3647861992, - "Vacc_refreshed":173.1581071885 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15274.2090277291, - "Vacc_completed":2098.6684198619, - "Vacc_refreshed":179.3045017397 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15275.4881156514, - "Vacc_completed":2104.7296501443, - "Vacc_refreshed":184.3873991738 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.4296689803, - "Vacc_completed":2109.0258070133, - "Vacc_refreshed":190.3361011534 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.7641225132, - "Vacc_completed":2111.2503398848, - "Vacc_refreshed":196.3057900505 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15280.5288668271, - "Vacc_completed":2120.2846622436, - "Vacc_refreshed":201.8816019943 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15286.6794056665, - "Vacc_completed":2127.5294418815, - "Vacc_refreshed":205.8247713924 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15287.919376399, - "Vacc_completed":2127.7213986428, - "Vacc_refreshed":207.0848824799 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15288.8972252423, - "Vacc_completed":2131.7043154907, - "Vacc_refreshed":214.6605013946 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15295.1676694583, - "Vacc_completed":2141.6853776317, - "Vacc_refreshed":217.321705385 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.8279320379, - "Vacc_completed":2150.6081907236, - "Vacc_refreshed":224.1814306469 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.9502690873, - "Vacc_completed":2150.8297260642, - "Vacc_refreshed":224.2857175024 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15305.4629063272, - "Vacc_completed":2159.4075137345, - "Vacc_refreshed":226.4536786248 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15313.0091699117, - "Vacc_completed":2160.0885470064, - "Vacc_refreshed":232.5677391068 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15316.6742133238, - "Vacc_completed":2163.6640679748, - "Vacc_refreshed":242.4458167027 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15325.7736410299, - "Vacc_completed":2171.6222500116, - "Vacc_refreshed":251.5591803171 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15333.3685319398, - "Vacc_completed":2174.4162160121, - "Vacc_refreshed":254.1541702573 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15337.5758896556, - "Vacc_completed":2180.7560110181, - "Vacc_refreshed":255.4491825287 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15346.8261947795, - "Vacc_completed":2184.562660479, - "Vacc_refreshed":256.0794667401 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15347.5063487999, - "Vacc_completed":2192.7053918922, - "Vacc_refreshed":264.8657432896 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15355.2915215882, - "Vacc_completed":2197.3639423288, - "Vacc_refreshed":266.2003474583 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15357.0291297717, - "Vacc_completed":2203.5668703416, - "Vacc_refreshed":266.2591235692 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15363.7351300479, - "Vacc_completed":2212.51470716, - "Vacc_refreshed":268.1554009506 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15366.2054877706, - "Vacc_completed":2220.7805776981, - "Vacc_refreshed":270.2429125628 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15374.7828886007, - "Vacc_completed":2223.4779151007, - "Vacc_refreshed":271.3258668517 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15375.8644766411, - "Vacc_completed":2223.902202818, - "Vacc_refreshed":277.3418287874 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15384.0103684975, - "Vacc_completed":2233.2600148125, - "Vacc_refreshed":286.2795142721 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15388.2433647335, - "Vacc_completed":2242.2405085188, - "Vacc_refreshed":295.9058348626 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15395.874552707, - "Vacc_completed":2242.5126967683, - "Vacc_refreshed":297.0217883024 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15399.399317417, - "Vacc_completed":2250.19318626, - "Vacc_refreshed":297.4497074595 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15407.4994879004, - "Vacc_completed":2258.8146667712, - "Vacc_refreshed":302.8025504676 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15410.1346998553, - "Vacc_completed":2259.5361618465, - "Vacc_refreshed":305.0699464575 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15415.5662938607, - "Vacc_completed":2266.2419298528, - "Vacc_refreshed":306.5583985118 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15424.362408066, - "Vacc_completed":2270.6973906417, - "Vacc_refreshed":307.7300944183 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15427.4641661532, - "Vacc_completed":2273.4475287465, - "Vacc_refreshed":315.9257071161 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15430.3003374401, - "Vacc_completed":2280.4953549554, - "Vacc_refreshed":320.4057109928 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15434.7161891817, - "Vacc_completed":2283.6641990131, - "Vacc_refreshed":329.6425079267 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15439.6389263804, - "Vacc_completed":2286.269595866, - "Vacc_refreshed":336.6032551175 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.607595077, - "Vacc_completed":2292.1795115763, - "Vacc_refreshed":339.4752869467 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.7317234732, - "Vacc_completed":2299.0428376394, - "Vacc_refreshed":342.2213588852 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15448.8137925508, - "Vacc_completed":2303.3104194582, - "Vacc_refreshed":346.3780017598 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15449.4812178935, - "Vacc_completed":2311.9261799324, - "Vacc_refreshed":351.1765190663 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9089483618, - "Vacc_completed":2315.5711542884, - "Vacc_refreshed":352.532745084 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9943266817, - "Vacc_completed":2322.1716179078, - "Vacc_refreshed":355.0774800773 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15459.7074068986, - "Vacc_completed":2323.3027059178, - "Vacc_refreshed":364.5645466744 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15465.686171573, - "Vacc_completed":2325.8040208828, - "Vacc_refreshed":365.9637341301 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15466.2025927257, - "Vacc_completed":2332.7537065257, - "Vacc_refreshed":366.2841969775 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15471.0643499093, - "Vacc_completed":2333.7718947218, - "Vacc_refreshed":370.7174701468 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15480.1820736709, - "Vacc_completed":2336.425519339, - "Vacc_refreshed":378.1719392306 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15489.2619602904, - "Vacc_completed":2342.4314320637, - "Vacc_refreshed":382.1070985379 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15497.197059921, - "Vacc_completed":2351.5508059781, - "Vacc_refreshed":390.0131449372 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15506.8997820546, - "Vacc_completed":2354.7951207515, - "Vacc_refreshed":397.4755552416 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15514.6356932026, - "Vacc_completed":2359.4543858263, - "Vacc_refreshed":405.5265192328 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15517.1065215082, - "Vacc_completed":2362.3705119741, - "Vacc_refreshed":406.2503084488 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15526.1890623234, - "Vacc_completed":2369.2123027947, - "Vacc_refreshed":407.9863557734 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15529.1257916241, - "Vacc_completed":2371.0230854052, - "Vacc_refreshed":415.4330021443 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15534.1422800755, - "Vacc_completed":2376.4314141852, - "Vacc_refreshed":417.8710629027 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15536.9779956012, - "Vacc_completed":2380.9412020655, - "Vacc_refreshed":418.6065556413 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15542.623117778, - "Vacc_completed":2383.2295524317, - "Vacc_refreshed":425.5318613018 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15545.7349127212, - "Vacc_completed":2388.7438112703, - "Vacc_refreshed":435.2708995295 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15552.7663039717, - "Vacc_completed":2398.7179519564, - "Vacc_refreshed":436.7806978293 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15553.9038494269, - "Vacc_completed":2401.9470135031, - "Vacc_refreshed":445.294989416 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15563.5219522465, - "Vacc_completed":2408.3277109489, - "Vacc_refreshed":449.1868908695 + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14093.5670993244, + "Vacc_completed": 1058.2133302677, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14094.6780758432, + "Vacc_completed": 1058.2386490178, + "Vacc_refreshed": 3.9480185817, + "Vacc_refreshed_2": 1.97400929085 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14102.3458622773, + "Vacc_completed": 1063.1811826304, + "Vacc_refreshed": 7.8235846725, + "Vacc_refreshed_2": 3.91179233625 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14106.0158477852, + "Vacc_completed": 1071.0829580916, + "Vacc_refreshed": 13.0365435255, + "Vacc_refreshed_2": 6.51827176275 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14115.8958402416, + "Vacc_completed": 1072.5136218055, + "Vacc_refreshed": 15.4582843201, + "Vacc_refreshed_2": 7.72914216005 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14116.0603009948, + "Vacc_completed": 1080.8706574256, + "Vacc_refreshed": 22.3037298829, + "Vacc_refreshed_2": 11.15186494145 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14124.4849162097, + "Vacc_completed": 1087.4957123195, + "Vacc_refreshed": 27.7666004775, + "Vacc_refreshed_2": 13.88330023875 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14132.812800891, + "Vacc_completed": 1094.2936630058, + "Vacc_refreshed": 29.4212640594, + "Vacc_refreshed_2": 14.7106320297 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14139.2772895404, + "Vacc_completed": 1100.1665827188, + "Vacc_refreshed": 29.4568827793, + "Vacc_refreshed_2": 14.72844138965 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14145.4868397119, + "Vacc_completed": 1105.3345419667, + "Vacc_refreshed": 34.7217238502, + "Vacc_refreshed_2": 17.3608619251 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14147.7480966959, + "Vacc_completed": 1111.2289166538, + "Vacc_refreshed": 34.771310214, + "Vacc_refreshed_2": 17.385655107 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14154.5204084505, + "Vacc_completed": 1114.7870563855, + "Vacc_refreshed": 41.8898823514, + "Vacc_refreshed_2": 20.9449411757 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14155.4472543415, + "Vacc_completed": 1124.6385432496, + "Vacc_refreshed": 48.6348857735, + "Vacc_refreshed_2": 24.31744288675 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14162.2764203336, + "Vacc_completed": 1128.54825128, + "Vacc_refreshed": 48.7694054724, + "Vacc_refreshed_2": 24.3847027362 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14163.6229511244, + "Vacc_completed": 1128.7143765883, + "Vacc_refreshed": 53.2059941772, + "Vacc_refreshed_2": 26.6029970886 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14170.704731349, + "Vacc_completed": 1138.0466956792, + "Vacc_refreshed": 59.0394633797, + "Vacc_refreshed_2": 29.51973168985 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14177.9754226866, + "Vacc_completed": 1144.8391611423, + "Vacc_refreshed": 68.7607294969, + "Vacc_refreshed_2": 34.38036474845 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14180.6917277285, + "Vacc_completed": 1145.8477444825, + "Vacc_refreshed": 68.9221667424, + "Vacc_refreshed_2": 34.4610833712 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14183.6510488722, + "Vacc_completed": 1148.5261706572, + "Vacc_refreshed": 74.1781085786, + "Vacc_refreshed_2": 37.0890542893 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14187.685478561, + "Vacc_completed": 1156.317724845, + "Vacc_refreshed": 82.4605426733, + "Vacc_refreshed_2": 41.23027133665 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14190.8756861073, + "Vacc_completed": 1158.3230049846, + "Vacc_refreshed": 85.9686058349, + "Vacc_refreshed_2": 42.98430291745 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14194.7125443701, + "Vacc_completed": 1162.8869701267, + "Vacc_refreshed": 86.9745448839, + "Vacc_refreshed_2": 43.48727244195 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14198.1736788429, + "Vacc_completed": 1172.5122981568, + "Vacc_refreshed": 87.3520867387, + "Vacc_refreshed_2": 43.67604336935 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14200.0337444888, + "Vacc_completed": 1173.9022323601, + "Vacc_refreshed": 96.1323881978, + "Vacc_refreshed_2": 48.0661940989 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14209.9091251899, + "Vacc_completed": 1180.4819879148, + "Vacc_refreshed": 102.8081520102, + "Vacc_refreshed_2": 51.4040760051 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14215.7510791988, + "Vacc_completed": 1187.6749019896, + "Vacc_refreshed": 111.0676626302, + "Vacc_refreshed_2": 55.5338313151 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14216.891975169, + "Vacc_completed": 1194.8246181318, + "Vacc_refreshed": 112.2172983632, + "Vacc_refreshed_2": 56.1086491816 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14226.1128719795, + "Vacc_completed": 1199.3288757923, + "Vacc_refreshed": 115.0035825103, + "Vacc_refreshed_2": 57.50179125515 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14234.2678640476, + "Vacc_completed": 1200.3667784603, + "Vacc_refreshed": 122.2552339507, + "Vacc_refreshed_2": 61.12761697535 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14236.1003192184, + "Vacc_completed": 1204.1967603181, + "Vacc_refreshed": 127.0429292216, + "Vacc_refreshed_2": 63.5214646108 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14242.538633822, + "Vacc_completed": 1212.5454877324, + "Vacc_refreshed": 134.6939665016, + "Vacc_refreshed_2": 67.3469832508 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14244.3387278104, + "Vacc_completed": 1213.6034702862, + "Vacc_refreshed": 136.0920891424, + "Vacc_refreshed_2": 68.0460445712 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14251.4120506037, + "Vacc_completed": 1216.4725302456, + "Vacc_refreshed": 140.2813449601, + "Vacc_refreshed_2": 70.14067248005 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14260.7111088561, + "Vacc_completed": 1223.9349650326, + "Vacc_refreshed": 144.4607939662, + "Vacc_refreshed_2": 72.2303969831 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.4310619138, + "Vacc_completed": 1230.2964929538, + "Vacc_refreshed": 149.281965675, + "Vacc_refreshed_2": 74.6409828375 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.8430243455, + "Vacc_completed": 1233.791799902, + "Vacc_refreshed": 152.843700775, + "Vacc_refreshed_2": 76.4218503875 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14270.6723528208, + "Vacc_completed": 1235.7852283109, + "Vacc_refreshed": 158.6087157945, + "Vacc_refreshed_2": 79.30435789725 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14276.398217781, + "Vacc_completed": 1244.1189399585, + "Vacc_refreshed": 161.780101215, + "Vacc_refreshed_2": 80.8900506075 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14282.7632141243, + "Vacc_completed": 1252.4246776385, + "Vacc_refreshed": 164.4087953839, + "Vacc_refreshed_2": 82.20439769195 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14285.2172118541, + "Vacc_completed": 1253.0967186007, + "Vacc_refreshed": 165.7333648079, + "Vacc_refreshed_2": 82.86668240395 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14288.3981413127, + "Vacc_completed": 1261.2285273698, + "Vacc_refreshed": 175.6751183454, + "Vacc_refreshed_2": 87.8375591727 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14296.6990830234, + "Vacc_completed": 1261.8928424603, + "Vacc_refreshed": 181.3746988194, + "Vacc_refreshed_2": 90.6873494097 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14304.9324135674, + "Vacc_completed": 1268.1858225933, + "Vacc_refreshed": 182.8207287588, + "Vacc_refreshed_2": 91.4103643794 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14312.7990335985, + "Vacc_completed": 1270.8693167453, + "Vacc_refreshed": 192.6352794711, + "Vacc_refreshed_2": 96.31763973555 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14316.0317804647, + "Vacc_completed": 1276.8328604136, + "Vacc_refreshed": 199.109084232, + "Vacc_refreshed_2": 99.554542116 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14317.8224126817, + "Vacc_completed": 1285.9345839202, + "Vacc_refreshed": 204.9564534429, + "Vacc_refreshed_2": 102.47822672145 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14319.969225103, + "Vacc_completed": 1292.0814432843, + "Vacc_refreshed": 209.3116185701, + "Vacc_refreshed_2": 104.65580928505 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14325.5010146205, + "Vacc_completed": 1296.8562638588, + "Vacc_refreshed": 214.164106287, + "Vacc_refreshed_2": 107.0820531435 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14334.64723979, + "Vacc_completed": 1299.2846390455, + "Vacc_refreshed": 215.8187786169, + "Vacc_refreshed_2": 107.90938930845 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14341.3416549169, + "Vacc_completed": 1307.3997120401, + "Vacc_refreshed": 220.1718442512, + "Vacc_refreshed_2": 110.0859221256 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14349.3146443239, + "Vacc_completed": 1309.8026404332, + "Vacc_refreshed": 222.9315364644, + "Vacc_refreshed_2": 111.4657682322 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14359.2839765392, + "Vacc_completed": 1313.6592234511, + "Vacc_refreshed": 226.6469703335, + "Vacc_refreshed_2": 113.32348516675 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14365.2176903694, + "Vacc_completed": 1319.2137305156, + "Vacc_refreshed": 227.7079880211, + "Vacc_refreshed_2": 113.85399401055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14372.2949635005, + "Vacc_completed": 1325.3928078641, + "Vacc_refreshed": 234.0214496372, + "Vacc_refreshed_2": 117.0107248186 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14377.1100641854, + "Vacc_completed": 1326.7384263101, + "Vacc_refreshed": 242.1400638609, + "Vacc_refreshed_2": 121.07003193045 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14381.7559278649, + "Vacc_completed": 1329.4413693873, + "Vacc_refreshed": 246.2374710913, + "Vacc_refreshed_2": 123.11873554565 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14385.7162526455, + "Vacc_completed": 1338.1839321545, + "Vacc_refreshed": 252.0149200475, + "Vacc_refreshed_2": 126.00746002375 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14389.4326934411, + "Vacc_completed": 1345.9094675595, + "Vacc_refreshed": 256.9046042339, + "Vacc_refreshed_2": 128.45230211695 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14391.2007554132, + "Vacc_completed": 1348.71606757, + "Vacc_refreshed": 258.1776032516, + "Vacc_refreshed_2": 129.0888016258 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14394.8621297613, + "Vacc_completed": 1354.2416050796, + "Vacc_refreshed": 267.8589065036, + "Vacc_refreshed_2": 133.9294532518 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.3456243909, + "Vacc_completed": 1359.868800934, + "Vacc_refreshed": 270.9855298163, + "Vacc_refreshed_2": 135.49276490815 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.4645205246, + "Vacc_completed": 1363.0538159145, + "Vacc_refreshed": 275.840425604, + "Vacc_refreshed_2": 137.920212802 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14399.1657319944, + "Vacc_completed": 1365.5993182323, + "Vacc_refreshed": 277.5856365007, + "Vacc_refreshed_2": 138.79281825035 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14402.7230837573, + "Vacc_completed": 1368.6201543223, + "Vacc_refreshed": 286.3361695339, + "Vacc_refreshed_2": 143.16808476695 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14403.1500082752, + "Vacc_completed": 1371.4419603277, + "Vacc_refreshed": 291.9429549926, + "Vacc_refreshed_2": 145.9714774963 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14409.601025491, + "Vacc_completed": 1375.0385110041, + "Vacc_refreshed": 294.4838831323, + "Vacc_refreshed_2": 147.24194156615 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.5992098988, + "Vacc_completed": 1379.7282797993, + "Vacc_refreshed": 304.3709721295, + "Vacc_refreshed_2": 152.18548606475 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.7379664054, + "Vacc_completed": 1388.4437755617, + "Vacc_refreshed": 310.9469195789, + "Vacc_refreshed_2": 155.47345978945 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14413.0256783966, + "Vacc_completed": 1395.0228908154, + "Vacc_refreshed": 316.1322991564, + "Vacc_refreshed_2": 158.0661495782 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14418.5923400284, + "Vacc_completed": 1395.4421160716, + "Vacc_refreshed": 324.326203234, + "Vacc_refreshed_2": 162.163101617 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14427.1006875636, + "Vacc_completed": 1400.9550416303, + "Vacc_refreshed": 326.1675291407, + "Vacc_refreshed_2": 163.08376457035 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14428.1259159444, + "Vacc_completed": 1401.6589165675, + "Vacc_refreshed": 336.1473853823, + "Vacc_refreshed_2": 168.07369269115 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14429.6710322591, + "Vacc_completed": 1406.4316961423, + "Vacc_refreshed": 338.7341080527, + "Vacc_refreshed_2": 169.36705402635 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14435.5405186058, + "Vacc_completed": 1406.8193757343, + "Vacc_refreshed": 348.5515447081, + "Vacc_refreshed_2": 174.27577235405 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14440.6128511884, + "Vacc_completed": 1406.8790930463, + "Vacc_refreshed": 349.9224707035, + "Vacc_refreshed_2": 174.96123535175 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14448.1553470558, + "Vacc_completed": 1407.8576900416, + "Vacc_refreshed": 354.7521313753, + "Vacc_refreshed_2": 177.37606568765 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14456.4196110425, + "Vacc_completed": 1411.7530351787, + "Vacc_refreshed": 361.5526839017, + "Vacc_refreshed_2": 180.77634195085 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14466.1757833279, + "Vacc_completed": 1412.4941157515, + "Vacc_refreshed": 364.0766791828, + "Vacc_refreshed_2": 182.0383395914 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14472.9152722164, + "Vacc_completed": 1421.7399661156, + "Vacc_refreshed": 371.2418954122, + "Vacc_refreshed_2": 185.6209477061 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14474.3971159945, + "Vacc_completed": 1423.8796012137, + "Vacc_refreshed": 378.3445685688, + "Vacc_refreshed_2": 189.1722842844 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14482.9259977884, + "Vacc_completed": 1428.8212618966, + "Vacc_refreshed": 382.6712538747, + "Vacc_refreshed_2": 191.33562693735 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14491.6837567491, + "Vacc_completed": 1430.1481016913, + "Vacc_refreshed": 392.5489632959, + "Vacc_refreshed_2": 196.27448164795 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14499.5728298642, + "Vacc_completed": 1439.468906008, + "Vacc_refreshed": 397.6649554861, + "Vacc_refreshed_2": 198.83247774305 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14500.4884339857, + "Vacc_completed": 1447.6074532094, + "Vacc_refreshed": 404.4236802991, + "Vacc_refreshed_2": 202.21184014955 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14508.6628209678, + "Vacc_completed": 1449.1955087396, + "Vacc_refreshed": 413.1290507873, + "Vacc_refreshed_2": 206.56452539365 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14509.0177335192, + "Vacc_completed": 1457.0313439789, + "Vacc_refreshed": 418.6984801264, + "Vacc_refreshed_2": 209.3492400632 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14518.7925361684, + "Vacc_completed": 1462.4055060107, + "Vacc_refreshed": 419.6070699812, + "Vacc_refreshed_2": 209.8035349906 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14522.121758092, + "Vacc_completed": 1468.1811367429, + "Vacc_refreshed": 425.9772045183, + "Vacc_refreshed_2": 212.98860225915 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14528.5474917037, + "Vacc_completed": 1473.5164593205, + "Vacc_refreshed": 435.7810319021, + "Vacc_refreshed_2": 217.89051595105 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14536.5601109176, + "Vacc_completed": 1481.2704120463, + "Vacc_refreshed": 438.2410199432, + "Vacc_refreshed_2": 219.1205099716 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14542.1473955627, + "Vacc_completed": 1482.7064631605, + "Vacc_refreshed": 445.3488141502, + "Vacc_refreshed_2": 222.6744070751 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14544.5952478081, + "Vacc_completed": 1486.0552178086, + "Vacc_refreshed": 446.1812966093, + "Vacc_refreshed_2": 223.09064830465 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10765.9941189788, + "Vacc_completed": 1603.3500569399, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.3717745702, + "Vacc_completed": 1605.3068408797, + "Vacc_refreshed": 3.6283182226, + "Vacc_refreshed_2": 1.8141591113 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.4956401429, + "Vacc_completed": 1610.6119068185, + "Vacc_refreshed": 6.1967396209, + "Vacc_refreshed_2": 3.09836981045 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10774.4184508751, + "Vacc_completed": 1613.016161978, + "Vacc_refreshed": 15.7069691534, + "Vacc_refreshed_2": 7.8534845767 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10780.8073818373, + "Vacc_completed": 1622.1917795654, + "Vacc_refreshed": 20.1697274397, + "Vacc_refreshed_2": 10.08486371985 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10785.5287460006, + "Vacc_completed": 1625.0602525893, + "Vacc_refreshed": 22.4671684217, + "Vacc_refreshed_2": 11.23358421085 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10790.1084610651, + "Vacc_completed": 1627.3787523231, + "Vacc_refreshed": 28.5217462646, + "Vacc_refreshed_2": 14.2608731323 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10796.2300309, + "Vacc_completed": 1630.4363483664, + "Vacc_refreshed": 35.3070676184, + "Vacc_refreshed_2": 17.6535338092 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10801.7222904172, + "Vacc_completed": 1638.725087864, + "Vacc_refreshed": 43.7679344272, + "Vacc_refreshed_2": 21.8839672136 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10804.7724722766, + "Vacc_completed": 1646.4905335365, + "Vacc_refreshed": 44.1718542676, + "Vacc_refreshed_2": 22.0859271338 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10814.3453353804, + "Vacc_completed": 1650.9992837124, + "Vacc_refreshed": 49.5204655539, + "Vacc_refreshed_2": 24.76023277695 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10821.6255112157, + "Vacc_completed": 1656.4335840831, + "Vacc_refreshed": 52.7009855172, + "Vacc_refreshed_2": 26.3504927586 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10830.9379325639, + "Vacc_completed": 1657.186187271, + "Vacc_refreshed": 56.5428649986, + "Vacc_refreshed_2": 28.2714324993 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10838.202902864, + "Vacc_completed": 1662.1470499364, + "Vacc_refreshed": 58.6277824858, + "Vacc_refreshed_2": 29.3138912429 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10840.8786753296, + "Vacc_completed": 1670.6860254071, + "Vacc_refreshed": 58.7593924743, + "Vacc_refreshed_2": 29.37969623715 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10843.7453960183, + "Vacc_completed": 1673.6372365137, + "Vacc_refreshed": 61.8595630166, + "Vacc_refreshed_2": 30.9297815083 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10849.1151892515, + "Vacc_completed": 1675.1066023109, + "Vacc_refreshed": 64.6020615007, + "Vacc_refreshed_2": 32.30103075035 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10850.9329685403, + "Vacc_completed": 1679.1505675366, + "Vacc_refreshed": 72.0237510859, + "Vacc_refreshed_2": 36.01187554295 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10854.4610677614, + "Vacc_completed": 1681.5473018047, + "Vacc_refreshed": 75.0145349272, + "Vacc_refreshed_2": 37.5072674636 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10858.0662824418, + "Vacc_completed": 1688.7179113019, + "Vacc_refreshed": 82.7641475111, + "Vacc_refreshed_2": 41.38207375555 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10867.8357803799, + "Vacc_completed": 1688.741478882, + "Vacc_refreshed": 92.1411476813, + "Vacc_refreshed_2": 46.07057384065 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10877.245759177, + "Vacc_completed": 1696.3354153291, + "Vacc_refreshed": 93.5350586202, + "Vacc_refreshed_2": 46.7675293101 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10878.9277486403, + "Vacc_completed": 1704.5169058825, + "Vacc_refreshed": 99.9257252117, + "Vacc_refreshed_2": 49.96286260585 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10881.5163902637, + "Vacc_completed": 1704.5184844203, + "Vacc_refreshed": 104.0563799981, + "Vacc_refreshed_2": 52.02818999905 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10882.0628121233, + "Vacc_completed": 1710.1811092467, + "Vacc_refreshed": 110.998904559, + "Vacc_refreshed_2": 55.4994522795 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10884.1868939764, + "Vacc_completed": 1711.6669667815, + "Vacc_refreshed": 119.5835613879, + "Vacc_refreshed_2": 59.79178069395 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10890.26315895, + "Vacc_completed": 1712.8219244738, + "Vacc_refreshed": 126.203975023, + "Vacc_refreshed_2": 63.1019875115 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10894.6858788747, + "Vacc_completed": 1721.7467435031, + "Vacc_refreshed": 135.9649739788, + "Vacc_refreshed_2": 67.9824869894 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10897.5575288795, + "Vacc_completed": 1721.7787127468, + "Vacc_refreshed": 145.614673399, + "Vacc_refreshed_2": 72.8073366995 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10903.1231721286, + "Vacc_completed": 1724.7269587992, + "Vacc_refreshed": 149.6717929743, + "Vacc_refreshed_2": 74.83589648715 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10911.1763853993, + "Vacc_completed": 1726.3071857535, + "Vacc_refreshed": 158.0496522084, + "Vacc_refreshed_2": 79.0248261042 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10919.5582023277, + "Vacc_completed": 1727.9236223535, + "Vacc_refreshed": 160.5751263702, + "Vacc_refreshed_2": 80.2875631851 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10920.4962369047, + "Vacc_completed": 1730.7211296321, + "Vacc_refreshed": 162.2038531114, + "Vacc_refreshed_2": 81.1019265557 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10930.0062994591, + "Vacc_completed": 1733.2273616859, + "Vacc_refreshed": 164.6178844659, + "Vacc_refreshed_2": 82.30894223295 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10931.0781786076, + "Vacc_completed": 1743.0639116966, + "Vacc_refreshed": 171.6949336111, + "Vacc_refreshed_2": 85.84746680555 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10936.2371584575, + "Vacc_completed": 1743.4973637943, + "Vacc_refreshed": 173.1954991423, + "Vacc_refreshed_2": 86.59774957115 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10937.1969149599, + "Vacc_completed": 1752.0043206175, + "Vacc_refreshed": 173.4521249531, + "Vacc_refreshed_2": 86.72606247655 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10942.5829785849, + "Vacc_completed": 1758.5438162851, + "Vacc_refreshed": 175.0971428389, + "Vacc_refreshed_2": 87.54857141945 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10945.8458051779, + "Vacc_completed": 1765.593119461, + "Vacc_refreshed": 184.781293552, + "Vacc_refreshed_2": 92.390646776 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10955.2619609788, + "Vacc_completed": 1766.7516696253, + "Vacc_refreshed": 194.3279051811, + "Vacc_refreshed_2": 97.16395259055 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0529992794, + "Vacc_completed": 1774.4096958807, + "Vacc_refreshed": 199.3585168564, + "Vacc_refreshed_2": 99.6792584282 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0740456643, + "Vacc_completed": 1776.7353479155, + "Vacc_refreshed": 200.2783085421, + "Vacc_refreshed_2": 100.13915427105 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7647446192, + "Vacc_completed": 1786.1838226639, + "Vacc_refreshed": 202.522841172, + "Vacc_refreshed_2": 101.261420586 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7950553291, + "Vacc_completed": 1788.5013884886, + "Vacc_refreshed": 205.1107008609, + "Vacc_refreshed_2": 102.55535043045 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10973.1049316279, + "Vacc_completed": 1790.2712267193, + "Vacc_refreshed": 214.0688577867, + "Vacc_refreshed_2": 107.03442889335 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10976.2696576646, + "Vacc_completed": 1797.8582422894, + "Vacc_refreshed": 219.0460187772, + "Vacc_refreshed_2": 109.5230093886 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10984.9161656634, + "Vacc_completed": 1801.5924446935, + "Vacc_refreshed": 227.656626047, + "Vacc_refreshed_2": 113.8283130235 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10994.063273181, + "Vacc_completed": 1802.6817444812, + "Vacc_refreshed": 235.6032823069, + "Vacc_refreshed_2": 117.80164115345 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10996.8771305673, + "Vacc_completed": 1802.9071097171, + "Vacc_refreshed": 237.7242073629, + "Vacc_refreshed_2": 118.86210368145 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11002.0527900673, + "Vacc_completed": 1809.5395950318, + "Vacc_refreshed": 241.3631599251, + "Vacc_refreshed_2": 120.68157996255 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11007.1528572096, + "Vacc_completed": 1813.9025489723, + "Vacc_refreshed": 245.5305344153, + "Vacc_refreshed_2": 122.76526720765 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11013.1337350258, + "Vacc_completed": 1821.5275057931, + "Vacc_refreshed": 250.3168579858, + "Vacc_refreshed_2": 125.1584289929 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11015.6696905796, + "Vacc_completed": 1822.9598630397, + "Vacc_refreshed": 255.6335351411, + "Vacc_refreshed_2": 127.81676757055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11023.4754023371, + "Vacc_completed": 1827.2471461973, + "Vacc_refreshed": 265.5951098299, + "Vacc_refreshed_2": 132.79755491495 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11032.8284479669, + "Vacc_completed": 1827.5539031975, + "Vacc_refreshed": 267.3513136054, + "Vacc_refreshed_2": 133.6756568027 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.3845078238, + "Vacc_completed": 1828.9970028031, + "Vacc_refreshed": 270.5903250252, + "Vacc_refreshed_2": 135.2951625126 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.693720803, + "Vacc_completed": 1836.2049019351, + "Vacc_refreshed": 272.0758803579, + "Vacc_refreshed_2": 136.03794017895 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11047.8242120991, + "Vacc_completed": 1837.1027842122, + "Vacc_refreshed": 275.2277393803, + "Vacc_refreshed_2": 137.61386969015 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11053.900379851, + "Vacc_completed": 1838.273599421, + "Vacc_refreshed": 282.2344875735, + "Vacc_refreshed_2": 141.11724378675 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11059.6633767419, + "Vacc_completed": 1845.0089267377, + "Vacc_refreshed": 284.3140546038, + "Vacc_refreshed_2": 142.1570273019 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11068.9288674107, + "Vacc_completed": 1852.7615624634, + "Vacc_refreshed": 287.0304142153, + "Vacc_refreshed_2": 143.51520710765 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11072.6595101177, + "Vacc_completed": 1857.871819743, + "Vacc_refreshed": 289.2733395979, + "Vacc_refreshed_2": 144.63666979895 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11082.5784142097, + "Vacc_completed": 1865.7647392626, + "Vacc_refreshed": 291.3426551576, + "Vacc_refreshed_2": 145.6713275788 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11089.5185616411, + "Vacc_completed": 1869.3958231852, + "Vacc_refreshed": 299.8179962185, + "Vacc_refreshed_2": 149.90899810925 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11097.3087770941, + "Vacc_completed": 1878.7026117675, + "Vacc_refreshed": 306.1608208876, + "Vacc_refreshed_2": 153.0804104438 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11101.8508357142, + "Vacc_completed": 1879.7270518854, + "Vacc_refreshed": 308.0716738039, + "Vacc_refreshed_2": 154.03583690195 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11103.0915214706, + "Vacc_completed": 1883.5574266434, + "Vacc_refreshed": 311.2801806804, + "Vacc_refreshed_2": 155.6400903402 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11111.9334619087, + "Vacc_completed": 1887.7967037043, + "Vacc_refreshed": 320.2156677375, + "Vacc_refreshed_2": 160.10783386875 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11118.8667730664, + "Vacc_completed": 1896.6793284207, + "Vacc_refreshed": 321.8561637233, + "Vacc_refreshed_2": 160.92808186165 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11123.0290736537, + "Vacc_completed": 1902.1985445903, + "Vacc_refreshed": 328.4656069808, + "Vacc_refreshed_2": 164.2328034904 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11129.3471714321, + "Vacc_completed": 1902.2057666507, + "Vacc_refreshed": 334.8734059386, + "Vacc_refreshed_2": 167.4367029693 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11137.9949570833, + "Vacc_completed": 1907.7915885083, + "Vacc_refreshed": 339.9783670978, + "Vacc_refreshed_2": 169.9891835489 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11139.4617826874, + "Vacc_completed": 1910.6126501167, + "Vacc_refreshed": 342.8472462544, + "Vacc_refreshed_2": 171.4236231272 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11144.4191917936, + "Vacc_completed": 1917.8558172992, + "Vacc_refreshed": 351.3104814196, + "Vacc_refreshed_2": 175.6552407098 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11153.423123173, + "Vacc_completed": 1927.8115362669, + "Vacc_refreshed": 359.1887782128, + "Vacc_refreshed_2": 179.5943891064 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11155.4646855253, + "Vacc_completed": 1931.0938823989, + "Vacc_refreshed": 363.4217582407, + "Vacc_refreshed_2": 181.71087912035 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11164.8755655095, + "Vacc_completed": 1932.0922021433, + "Vacc_refreshed": 369.5881371093, + "Vacc_refreshed_2": 184.79406855465 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11168.2127634861, + "Vacc_completed": 1937.8864562316, + "Vacc_refreshed": 371.2850357688, + "Vacc_refreshed_2": 185.6425178844 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11170.3919325879, + "Vacc_completed": 1943.9625258254, + "Vacc_refreshed": 372.564368772, + "Vacc_refreshed_2": 186.282184386 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11178.2156716034, + "Vacc_completed": 1946.3680545291, + "Vacc_refreshed": 377.1791450411, + "Vacc_refreshed_2": 188.58957252055 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11187.7206334256, + "Vacc_completed": 1950.3408321869, + "Vacc_refreshed": 385.28114877, + "Vacc_refreshed_2": 192.640574385 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11189.2295548943, + "Vacc_completed": 1952.7801877326, + "Vacc_refreshed": 386.4768386941, + "Vacc_refreshed_2": 193.23841934705 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11193.8090943925, + "Vacc_completed": 1960.5337079214, + "Vacc_refreshed": 395.6463777137, + "Vacc_refreshed_2": 197.82318885685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11198.0758128722, + "Vacc_completed": 1964.4220756604, + "Vacc_refreshed": 404.4005517293, + "Vacc_refreshed_2": 202.20027586465 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11200.1395546734, + "Vacc_completed": 1974.1843879258, + "Vacc_refreshed": 410.4354615606, + "Vacc_refreshed_2": 205.2177307803 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.0858861212, + "Vacc_completed": 1978.0710124849, + "Vacc_refreshed": 414.2205337181, + "Vacc_refreshed_2": 207.11026685905 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.5521637654, + "Vacc_completed": 1981.3589179628, + "Vacc_refreshed": 419.5840242501, + "Vacc_refreshed_2": 209.79201212505 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11211.6562498266, + "Vacc_completed": 1989.6665585254, + "Vacc_refreshed": 426.6154672823, + "Vacc_refreshed_2": 213.30773364115 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11219.1926870115, + "Vacc_completed": 1996.1459430488, + "Vacc_refreshed": 430.16915603, + "Vacc_refreshed_2": 215.084578015 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11221.4656474699, + "Vacc_completed": 2001.4601213853, + "Vacc_refreshed": 430.8770850788, + "Vacc_refreshed_2": 215.4385425394 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11224.2379660032, + "Vacc_completed": 2006.2961081678, + "Vacc_refreshed": 433.8074021391, + "Vacc_refreshed_2": 216.90370106955 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11229.137503588, + "Vacc_completed": 2013.2392255015, + "Vacc_refreshed": 441.1218403265, + "Vacc_refreshed_2": 220.56092016325 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15118.5419446559, + "Vacc_completed": 1046.4766182565, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15127.0441726861, + "Vacc_completed": 1051.8189573454, + "Vacc_refreshed": 4.7668817312, + "Vacc_refreshed_2": 2.3834408656 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15134.2198668737, + "Vacc_completed": 1051.8898550539, + "Vacc_refreshed": 6.8954841457, + "Vacc_refreshed_2": 3.44774207285 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15138.5012633389, + "Vacc_completed": 1054.1938291422, + "Vacc_refreshed": 12.8850967826, + "Vacc_refreshed_2": 6.4425483913 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15140.019297286, + "Vacc_completed": 1057.2812920036, + "Vacc_refreshed": 15.610006044, + "Vacc_refreshed_2": 7.805003022 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15141.0655653453, + "Vacc_completed": 1061.1873607435, + "Vacc_refreshed": 18.0052067519, + "Vacc_refreshed_2": 9.00260337595 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15146.6047446953, + "Vacc_completed": 1067.3953196211, + "Vacc_refreshed": 27.5155266211, + "Vacc_refreshed_2": 13.75776331055 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15150.2459378898, + "Vacc_completed": 1077.315397207, + "Vacc_refreshed": 28.0742687581, + "Vacc_refreshed_2": 14.03713437905 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15153.3836683973, + "Vacc_completed": 1082.8237823387, + "Vacc_refreshed": 32.6629347887, + "Vacc_refreshed_2": 16.33146739435 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15155.2486658897, + "Vacc_completed": 1087.8721865368, + "Vacc_refreshed": 42.082807235, + "Vacc_refreshed_2": 21.0414036175 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15157.4630323429, + "Vacc_completed": 1090.0916620904, + "Vacc_refreshed": 43.8436800298, + "Vacc_refreshed_2": 21.9218400149 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15158.7941750828, + "Vacc_completed": 1091.8322828475, + "Vacc_refreshed": 44.7371311455, + "Vacc_refreshed_2": 22.36856557275 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15159.4697179186, + "Vacc_completed": 1097.9581123146, + "Vacc_refreshed": 52.5410403094, + "Vacc_refreshed_2": 26.2705201547 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15166.8797207146, + "Vacc_completed": 1103.4838023049, + "Vacc_refreshed": 58.4482610787, + "Vacc_refreshed_2": 29.22413053935 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.177591783, + "Vacc_completed": 1107.529236183, + "Vacc_refreshed": 61.868532741, + "Vacc_refreshed_2": 30.9342663705 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.3473624207, + "Vacc_completed": 1108.0854442406, + "Vacc_refreshed": 64.122741794, + "Vacc_refreshed_2": 32.061370897 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15176.6656703161, + "Vacc_completed": 1114.7623442184, + "Vacc_refreshed": 73.3909194547, + "Vacc_refreshed_2": 36.69545972735 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15182.6538662202, + "Vacc_completed": 1121.0967139584, + "Vacc_refreshed": 78.4108273222, + "Vacc_refreshed_2": 39.2054136611 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15191.0826029366, + "Vacc_completed": 1124.8733122731, + "Vacc_refreshed": 88.1249123157, + "Vacc_refreshed_2": 44.06245615785 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15195.1567917247, + "Vacc_completed": 1133.1683853487, + "Vacc_refreshed": 94.0586819047, + "Vacc_refreshed_2": 47.02934095235 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15197.6523517992, + "Vacc_completed": 1140.1742056487, + "Vacc_refreshed": 97.7116921077, + "Vacc_refreshed_2": 48.85584605385 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15202.8832794911, + "Vacc_completed": 1140.4207518542, + "Vacc_refreshed": 101.0390519368, + "Vacc_refreshed_2": 50.5195259684 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15209.502983548, + "Vacc_completed": 1144.1138351675, + "Vacc_refreshed": 104.5568369595, + "Vacc_refreshed_2": 52.27841847975 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15218.5591667959, + "Vacc_completed": 1153.0110444013, + "Vacc_refreshed": 111.8121115483, + "Vacc_refreshed_2": 55.90605577415 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15223.6275127037, + "Vacc_completed": 1157.3585549388, + "Vacc_refreshed": 113.9066704897, + "Vacc_refreshed_2": 56.95333524485 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.4100349304, + "Vacc_completed": 1162.1581378525, + "Vacc_refreshed": 116.416758139, + "Vacc_refreshed_2": 58.2083790695 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.7888080253, + "Vacc_completed": 1166.5300160643, + "Vacc_refreshed": 119.2414894864, + "Vacc_refreshed_2": 59.6207447432 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15235.240974732, + "Vacc_completed": 1171.76423914, + "Vacc_refreshed": 129.0137217302, + "Vacc_refreshed_2": 64.5068608651 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15236.252829019, + "Vacc_completed": 1174.1820893055, + "Vacc_refreshed": 130.8298102316, + "Vacc_refreshed_2": 65.4149051158 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15244.5996289271, + "Vacc_completed": 1181.3457343202, + "Vacc_refreshed": 138.0198133972, + "Vacc_refreshed_2": 69.0099066986 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15247.7688417561, + "Vacc_completed": 1186.4632437534, + "Vacc_refreshed": 147.549469044, + "Vacc_refreshed_2": 73.774734522 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15254.8324409461, + "Vacc_completed": 1196.0640695451, + "Vacc_refreshed": 148.035813332, + "Vacc_refreshed_2": 74.017906666 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15263.9056700401, + "Vacc_completed": 1202.0195228295, + "Vacc_refreshed": 152.9647063671, + "Vacc_refreshed_2": 76.48235318355 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15271.3608079113, + "Vacc_completed": 1205.9189472233, + "Vacc_refreshed": 159.4326071199, + "Vacc_refreshed_2": 79.71630355995 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15274.5391192733, + "Vacc_completed": 1209.5333389579, + "Vacc_refreshed": 165.8197711746, + "Vacc_refreshed_2": 82.9098855873 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15279.9252173752, + "Vacc_completed": 1217.5022918804, + "Vacc_refreshed": 170.1668415009, + "Vacc_refreshed_2": 85.08342075045 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15289.6429605219, + "Vacc_completed": 1218.0921627258, + "Vacc_refreshed": 176.8858359396, + "Vacc_refreshed_2": 88.4429179698 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15297.4452269777, + "Vacc_completed": 1218.4916546179, + "Vacc_refreshed": 177.0224757358, + "Vacc_refreshed_2": 88.5112378679 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15304.6068820067, + "Vacc_completed": 1221.1648349639, + "Vacc_refreshed": 182.8363512803, + "Vacc_refreshed_2": 91.41817564015 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15308.4472782837, + "Vacc_completed": 1221.3254317254, + "Vacc_refreshed": 188.4124431026, + "Vacc_refreshed_2": 94.2062215513 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15313.3535420035, + "Vacc_completed": 1228.797689569, + "Vacc_refreshed": 197.4958413402, + "Vacc_refreshed_2": 98.7479206701 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15319.6989570363, + "Vacc_completed": 1230.5766158569, + "Vacc_refreshed": 207.1280776834, + "Vacc_refreshed_2": 103.5640388417 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15329.2757609065, + "Vacc_completed": 1232.5532561558, + "Vacc_refreshed": 216.6030971785, + "Vacc_refreshed_2": 108.30154858925 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15331.3854251166, + "Vacc_completed": 1240.7858568563, + "Vacc_refreshed": 224.0947128601, + "Vacc_refreshed_2": 112.04735643005 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15335.6254694555, + "Vacc_completed": 1248.7648628072, + "Vacc_refreshed": 228.3914917972, + "Vacc_refreshed_2": 114.1957458986 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15342.4956408139, + "Vacc_completed": 1253.345700271, + "Vacc_refreshed": 237.7873655386, + "Vacc_refreshed_2": 118.8936827693 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15349.2985100866, + "Vacc_completed": 1254.923228178, + "Vacc_refreshed": 243.7398150729, + "Vacc_refreshed_2": 121.86990753645 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.0642849231, + "Vacc_completed": 1256.1247258557, + "Vacc_refreshed": 246.0998008594, + "Vacc_refreshed_2": 123.0499004297 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.3098206871, + "Vacc_completed": 1258.7673082658, + "Vacc_refreshed": 255.4830156808, + "Vacc_refreshed_2": 127.7415078404 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.8477668821, + "Vacc_completed": 1261.8739088788, + "Vacc_refreshed": 262.4150374381, + "Vacc_refreshed_2": 131.20751871905 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15355.0053188609, + "Vacc_completed": 1268.7063064011, + "Vacc_refreshed": 268.0354130392, + "Vacc_refreshed_2": 134.0177065196 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15356.8245202899, + "Vacc_completed": 1275.6335562552, + "Vacc_refreshed": 272.2800844077, + "Vacc_refreshed_2": 136.14004220385 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15357.7799420851, + "Vacc_completed": 1276.6526923528, + "Vacc_refreshed": 272.4509982396, + "Vacc_refreshed_2": 136.2254991198 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15360.090059624, + "Vacc_completed": 1286.3717718947, + "Vacc_refreshed": 276.5108897334, + "Vacc_refreshed_2": 138.2554448667 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15368.9251730685, + "Vacc_completed": 1289.9608638772, + "Vacc_refreshed": 286.1598516049, + "Vacc_refreshed_2": 143.07992580245 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15374.4348532349, + "Vacc_completed": 1292.7431692071, + "Vacc_refreshed": 286.9834989324, + "Vacc_refreshed_2": 143.4917494662 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15375.2266568732, + "Vacc_completed": 1293.6118841564, + "Vacc_refreshed": 287.1997495191, + "Vacc_refreshed_2": 143.59987475955 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15378.8167187789, + "Vacc_completed": 1294.2472234682, + "Vacc_refreshed": 293.7465776915, + "Vacc_refreshed_2": 146.87328884575 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15381.8183566081, + "Vacc_completed": 1296.5074589754, + "Vacc_refreshed": 294.394169978, + "Vacc_refreshed_2": 147.197084989 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15390.3384592829, + "Vacc_completed": 1298.1144038724, + "Vacc_refreshed": 295.3508481166, + "Vacc_refreshed_2": 147.6754240583 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15397.4841102393, + "Vacc_completed": 1301.7744150574, + "Vacc_refreshed": 295.636121459, + "Vacc_refreshed_2": 147.8180607295 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15406.9128765942, + "Vacc_completed": 1306.3546732411, + "Vacc_refreshed": 299.2176949608, + "Vacc_refreshed_2": 149.6088474804 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15412.9312961067, + "Vacc_completed": 1313.4112918553, + "Vacc_refreshed": 304.1283567048, + "Vacc_refreshed_2": 152.0641783524 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15413.8396565369, + "Vacc_completed": 1323.1872711778, + "Vacc_refreshed": 309.3767578057, + "Vacc_refreshed_2": 154.68837890285 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15417.5353933956, + "Vacc_completed": 1332.5570169907, + "Vacc_refreshed": 310.9982936972, + "Vacc_refreshed_2": 155.4991468486 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15418.826072466, + "Vacc_completed": 1333.4298810326, + "Vacc_refreshed": 318.8191964614, + "Vacc_refreshed_2": 159.4095982307 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15428.6081802722, + "Vacc_completed": 1335.4576305614, + "Vacc_refreshed": 322.681425219, + "Vacc_refreshed_2": 161.3407126095 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15434.4342053135, + "Vacc_completed": 1341.8151001107, + "Vacc_refreshed": 328.87826872, + "Vacc_refreshed_2": 164.43913436 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15442.7494739491, + "Vacc_completed": 1342.4758295952, + "Vacc_refreshed": 336.8125605002, + "Vacc_refreshed_2": 168.4062802501 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15451.9615776405, + "Vacc_completed": 1343.8595431355, + "Vacc_refreshed": 340.6379428895, + "Vacc_refreshed_2": 170.31897144475 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15461.0343740586, + "Vacc_completed": 1352.0217149096, + "Vacc_refreshed": 342.4652609374, + "Vacc_refreshed_2": 171.2326304687 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15467.8869999547, + "Vacc_completed": 1353.9994636638, + "Vacc_refreshed": 343.6202751504, + "Vacc_refreshed_2": 171.8101375752 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15474.9129704383, + "Vacc_completed": 1363.3653927841, + "Vacc_refreshed": 345.0578595323, + "Vacc_refreshed_2": 172.52892976615 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15483.483328834, + "Vacc_completed": 1372.0348541584, + "Vacc_refreshed": 348.4131919851, + "Vacc_refreshed_2": 174.20659599255 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15489.3942653446, + "Vacc_completed": 1377.4077406314, + "Vacc_refreshed": 355.6717942515, + "Vacc_refreshed_2": 177.83589712575 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15494.2503612359, + "Vacc_completed": 1377.4290090401, + "Vacc_refreshed": 358.9820312389, + "Vacc_refreshed_2": 179.49101561945 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15495.3394152185, + "Vacc_completed": 1378.0321848221, + "Vacc_refreshed": 364.7453207897, + "Vacc_refreshed_2": 182.37266039485 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15497.7000250685, + "Vacc_completed": 1378.1938721933, + "Vacc_refreshed": 367.9820639836, + "Vacc_refreshed_2": 183.9910319918 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15498.7689863883, + "Vacc_completed": 1381.0445655705, + "Vacc_refreshed": 371.501202086, + "Vacc_refreshed_2": 185.750601043 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15501.5446144083, + "Vacc_completed": 1383.5660020007, + "Vacc_refreshed": 378.7475176563, + "Vacc_refreshed_2": 189.37375882815 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15509.8230148672, + "Vacc_completed": 1390.2361319678, + "Vacc_refreshed": 382.7365149116, + "Vacc_refreshed_2": 191.3682574558 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15516.8607244434, + "Vacc_completed": 1391.5356833196, + "Vacc_refreshed": 387.0287274101, + "Vacc_refreshed_2": 193.51436370505 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15525.4621417067, + "Vacc_completed": 1391.7538408053, + "Vacc_refreshed": 394.832505058, + "Vacc_refreshed_2": 197.416252529 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15530.1412323442, + "Vacc_completed": 1393.5856974411, + "Vacc_refreshed": 402.9766589833, + "Vacc_refreshed_2": 201.48832949165 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15538.5266345599, + "Vacc_completed": 1394.0860887346, + "Vacc_refreshed": 409.427624651, + "Vacc_refreshed_2": 204.7138123255 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15545.1857152555, + "Vacc_completed": 1400.9009375981, + "Vacc_refreshed": 414.8161834543, + "Vacc_refreshed_2": 207.40809172715 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15550.0113840393, + "Vacc_completed": 1405.1190388135, + "Vacc_refreshed": 423.1492506703, + "Vacc_refreshed_2": 211.57462533515 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15557.7502728646, + "Vacc_completed": 1412.7232837907, + "Vacc_refreshed": 429.51858195, + "Vacc_refreshed_2": 214.759290975 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15558.6635273277, + "Vacc_completed": 1416.4367765358, + "Vacc_refreshed": 433.7574702422, + "Vacc_refreshed_2": 216.8787351211 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15567.8923476818, + "Vacc_completed": 1417.419547185, + "Vacc_refreshed": 436.3988331827, + "Vacc_refreshed_2": 218.19941659135 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15572.0110691064, + "Vacc_completed": 1422.1291332179, + "Vacc_refreshed": 444.7065625402, + "Vacc_refreshed_2": 222.3532812701 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15580.056372857, + "Vacc_completed": 1429.5241883626, + "Vacc_refreshed": 445.9185645116, + "Vacc_refreshed_2": 222.9592822558 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14604.162091487, + "Vacc_completed": 1396.5367205842, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14608.6011110978, + "Vacc_completed": 1403.0638750962, + "Vacc_refreshed": 0.4818747518, + "Vacc_refreshed_2": 0.2409373759 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14617.4016613244, + "Vacc_completed": 1412.4617013546, + "Vacc_refreshed": 2.8841327921, + "Vacc_refreshed_2": 1.44206639605 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14626.8147148128, + "Vacc_completed": 1413.5937989207, + "Vacc_refreshed": 4.347225901, + "Vacc_refreshed_2": 2.1736129505 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14636.7930742671, + "Vacc_completed": 1416.5445655325, + "Vacc_refreshed": 10.9126558661, + "Vacc_refreshed_2": 5.45632793305 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14639.261920851, + "Vacc_completed": 1419.7526675766, + "Vacc_refreshed": 12.1285186735, + "Vacc_refreshed_2": 6.06425933675 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14646.6246553828, + "Vacc_completed": 1429.1501916355, + "Vacc_refreshed": 14.2999622979, + "Vacc_refreshed_2": 7.14998114895 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14655.9228453283, + "Vacc_completed": 1433.2061319495, + "Vacc_refreshed": 18.6765331159, + "Vacc_refreshed_2": 9.33826655795 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.6905295279, + "Vacc_completed": 1437.4319338048, + "Vacc_refreshed": 19.3435044237, + "Vacc_refreshed_2": 9.67175221185 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.8883385186, + "Vacc_completed": 1446.7135497598, + "Vacc_refreshed": 28.359576628, + "Vacc_refreshed_2": 14.179788314 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14660.5634553543, + "Vacc_completed": 1450.9111526521, + "Vacc_refreshed": 38.3056947196, + "Vacc_refreshed_2": 19.1528473598 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14667.0822550267, + "Vacc_completed": 1458.1473384005, + "Vacc_refreshed": 38.8316353015, + "Vacc_refreshed_2": 19.41581765075 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14668.0361388154, + "Vacc_completed": 1464.9440155832, + "Vacc_refreshed": 44.1485629725, + "Vacc_refreshed_2": 22.07428148625 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14669.4679031112, + "Vacc_completed": 1470.1284856322, + "Vacc_refreshed": 47.7639888511, + "Vacc_refreshed_2": 23.88199442555 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.2618994679, + "Vacc_completed": 1476.9344530457, + "Vacc_refreshed": 56.361748961, + "Vacc_refreshed_2": 28.1808744805 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.3447644481, + "Vacc_completed": 1477.2393580763, + "Vacc_refreshed": 57.2273767339, + "Vacc_refreshed_2": 28.61368836695 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14684.0130216555, + "Vacc_completed": 1484.3234594705, + "Vacc_refreshed": 63.4497732245, + "Vacc_refreshed_2": 31.72488661225 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14691.8154699011, + "Vacc_completed": 1492.8513113216, + "Vacc_refreshed": 71.1720264341, + "Vacc_refreshed_2": 35.58601321705 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14697.5036031252, + "Vacc_completed": 1493.7450842417, + "Vacc_refreshed": 77.3635307257, + "Vacc_refreshed_2": 38.68176536285 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14702.599106658, + "Vacc_completed": 1503.4641107157, + "Vacc_refreshed": 82.0575571669, + "Vacc_refreshed_2": 41.02877858345 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14706.3806325115, + "Vacc_completed": 1509.7236994586, + "Vacc_refreshed": 82.4020129882, + "Vacc_refreshed_2": 41.2010064941 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14711.1723860607, + "Vacc_completed": 1510.3801441147, + "Vacc_refreshed": 89.5249618369, + "Vacc_refreshed_2": 44.76248091845 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14720.0093085987, + "Vacc_completed": 1517.7733661353, + "Vacc_refreshed": 99.2211580734, + "Vacc_refreshed_2": 49.6105790367 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14727.6474505495, + "Vacc_completed": 1519.2060691793, + "Vacc_refreshed": 104.7140344902, + "Vacc_refreshed_2": 52.3570172451 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14737.2025033477, + "Vacc_completed": 1520.8147599339, + "Vacc_refreshed": 111.7829864033, + "Vacc_refreshed_2": 55.89149320165 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14739.5787007901, + "Vacc_completed": 1526.8277919335, + "Vacc_refreshed": 118.2526435067, + "Vacc_refreshed_2": 59.12632175335 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14740.2622466128, + "Vacc_completed": 1533.9654672239, + "Vacc_refreshed": 121.0872593022, + "Vacc_refreshed_2": 60.5436296511 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.3105527103, + "Vacc_completed": 1534.5209202615, + "Vacc_refreshed": 130.3683956867, + "Vacc_refreshed_2": 65.18419784335 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.4386233429, + "Vacc_completed": 1534.652607589, + "Vacc_refreshed": 131.8609814668, + "Vacc_refreshed_2": 65.9304907334 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14750.7660084012, + "Vacc_completed": 1541.7255942491, + "Vacc_refreshed": 135.0718914562, + "Vacc_refreshed_2": 67.5359457281 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14754.5460710197, + "Vacc_completed": 1550.2608445951, + "Vacc_refreshed": 143.3620456295, + "Vacc_refreshed_2": 71.68102281475 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14759.0944017155, + "Vacc_completed": 1555.0005459425, + "Vacc_refreshed": 149.1268404613, + "Vacc_refreshed_2": 74.56342023065 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14765.0469016605, + "Vacc_completed": 1561.0596836707, + "Vacc_refreshed": 156.632878281, + "Vacc_refreshed_2": 78.3164391405 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14767.8747922121, + "Vacc_completed": 1562.2055298685, + "Vacc_refreshed": 158.7846499619, + "Vacc_refreshed_2": 79.39232498095 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14770.6956031505, + "Vacc_completed": 1564.0912014269, + "Vacc_refreshed": 160.2235512232, + "Vacc_refreshed_2": 80.1117756116 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14771.8405767953, + "Vacc_completed": 1569.1767284097, + "Vacc_refreshed": 163.0960075253, + "Vacc_refreshed_2": 81.54800376265 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14772.2052559189, + "Vacc_completed": 1577.0342160583, + "Vacc_refreshed": 171.338237261, + "Vacc_refreshed_2": 85.6691186305 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14775.8209952029, + "Vacc_completed": 1582.4601331483, + "Vacc_refreshed": 171.7811634642, + "Vacc_refreshed_2": 85.8905817321 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14783.195452278, + "Vacc_completed": 1590.5417141678, + "Vacc_refreshed": 180.3921690168, + "Vacc_refreshed_2": 90.1960845084 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14789.7908493035, + "Vacc_completed": 1599.1828252755, + "Vacc_refreshed": 184.3843375412, + "Vacc_refreshed_2": 92.1921687706 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14799.5061304555, + "Vacc_completed": 1604.6353429891, + "Vacc_refreshed": 186.9160630046, + "Vacc_refreshed_2": 93.4580315023 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14800.1953862328, + "Vacc_completed": 1607.3418569739, + "Vacc_refreshed": 194.8977352638, + "Vacc_refreshed_2": 97.4488676319 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14804.6194220955, + "Vacc_completed": 1610.8601925588, + "Vacc_refreshed": 198.1360514295, + "Vacc_refreshed_2": 99.06802571475 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14807.6135970058, + "Vacc_completed": 1620.4676732545, + "Vacc_refreshed": 199.7756827366, + "Vacc_refreshed_2": 99.8878413683 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14812.6404573806, + "Vacc_completed": 1625.8005590907, + "Vacc_refreshed": 208.9834954342, + "Vacc_refreshed_2": 104.4917477171 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14821.7780993542, + "Vacc_completed": 1634.2191287828, + "Vacc_refreshed": 218.0082295343, + "Vacc_refreshed_2": 109.00411476715 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14826.4757459809, + "Vacc_completed": 1642.5529482935, + "Vacc_refreshed": 225.0524176739, + "Vacc_refreshed_2": 112.52620883695 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14831.5528263871, + "Vacc_completed": 1649.3317542887, + "Vacc_refreshed": 229.0729255762, + "Vacc_refreshed_2": 114.5364627881 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14835.4543265309, + "Vacc_completed": 1656.6375918093, + "Vacc_refreshed": 230.6069957275, + "Vacc_refreshed_2": 115.30349786375 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14843.0829401722, + "Vacc_completed": 1661.236165662, + "Vacc_refreshed": 240.090987042, + "Vacc_refreshed_2": 120.045493521 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14846.441543514, + "Vacc_completed": 1663.7621214807, + "Vacc_refreshed": 242.6005891297, + "Vacc_refreshed_2": 121.30029456485 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14852.8592673291, + "Vacc_completed": 1670.5438763585, + "Vacc_refreshed": 243.1550853514, + "Vacc_refreshed_2": 121.5775426757 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14859.7577792484, + "Vacc_completed": 1671.9654195564, + "Vacc_refreshed": 252.4226950148, + "Vacc_refreshed_2": 126.2113475074 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14860.9361402439, + "Vacc_completed": 1673.0063955744, + "Vacc_refreshed": 254.9337371613, + "Vacc_refreshed_2": 127.46686858065 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14866.4446359141, + "Vacc_completed": 1680.8225588341, + "Vacc_refreshed": 260.3047312661, + "Vacc_refreshed_2": 130.15236563305 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14873.2607186268, + "Vacc_completed": 1689.7385811283, + "Vacc_refreshed": 267.8936320344, + "Vacc_refreshed_2": 133.9468160172 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14880.5922770798, + "Vacc_completed": 1689.9651236491, + "Vacc_refreshed": 275.7764918768, + "Vacc_refreshed_2": 137.8882459384 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14887.440916863, + "Vacc_completed": 1696.5525450807, + "Vacc_refreshed": 283.5225421273, + "Vacc_refreshed_2": 141.76127106365 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14888.0132355705, + "Vacc_completed": 1703.9968022938, + "Vacc_refreshed": 284.1554601622, + "Vacc_refreshed_2": 142.0777300811 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14897.4895745985, + "Vacc_completed": 1707.7124979313, + "Vacc_refreshed": 293.9654633907, + "Vacc_refreshed_2": 146.98273169535 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14900.9132287675, + "Vacc_completed": 1714.1256328363, + "Vacc_refreshed": 300.1498047442, + "Vacc_refreshed_2": 150.0749023721 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14907.9968139113, + "Vacc_completed": 1717.9722882107, + "Vacc_refreshed": 303.8260258963, + "Vacc_refreshed_2": 151.91301294815 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14914.3000727157, + "Vacc_completed": 1723.7459149842, + "Vacc_refreshed": 310.6001358466, + "Vacc_refreshed_2": 155.3000679233 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14915.2709520902, + "Vacc_completed": 1725.3728171833, + "Vacc_refreshed": 311.7419250413, + "Vacc_refreshed_2": 155.87096252065 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14924.9251049714, + "Vacc_completed": 1730.3968331067, + "Vacc_refreshed": 318.9914066325, + "Vacc_refreshed_2": 159.49570331625 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14929.9737051543, + "Vacc_completed": 1735.419819131, + "Vacc_refreshed": 327.2769475594, + "Vacc_refreshed_2": 163.6384737797 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.0867908297, + "Vacc_completed": 1735.4531164502, + "Vacc_refreshed": 333.9507530528, + "Vacc_refreshed_2": 166.9753765264 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.1585043075, + "Vacc_completed": 1744.7112606784, + "Vacc_refreshed": 337.8096837232, + "Vacc_refreshed_2": 168.9048418616 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14939.2420152133, + "Vacc_completed": 1745.8678859662, + "Vacc_refreshed": 344.4742142552, + "Vacc_refreshed_2": 172.2371071276 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14940.9708787633, + "Vacc_completed": 1748.1937727819, + "Vacc_refreshed": 352.7895987096, + "Vacc_refreshed_2": 176.3947993548 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14950.0282400838, + "Vacc_completed": 1750.2751748343, + "Vacc_refreshed": 354.0652893483, + "Vacc_refreshed_2": 177.03264467415 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14956.5498846765, + "Vacc_completed": 1758.7641351746, + "Vacc_refreshed": 361.0736440858, + "Vacc_refreshed_2": 180.5368220429 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14957.5908121778, + "Vacc_completed": 1763.4528309235, + "Vacc_refreshed": 364.3501912771, + "Vacc_refreshed_2": 182.17509563855 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14960.7281563782, + "Vacc_completed": 1772.006809538, + "Vacc_refreshed": 364.6804469838, + "Vacc_refreshed_2": 182.3402234919 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14969.2457673746, + "Vacc_completed": 1776.5678522654, + "Vacc_refreshed": 374.4882812856, + "Vacc_refreshed_2": 187.2441406428 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14974.8615073088, + "Vacc_completed": 1779.9556763371, + "Vacc_refreshed": 377.4421123342, + "Vacc_refreshed_2": 188.7210561671 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14984.5914886251, + "Vacc_completed": 1782.6146675026, + "Vacc_refreshed": 381.2082916917, + "Vacc_refreshed_2": 190.60414584585 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14987.5876984189, + "Vacc_completed": 1791.1028428437, + "Vacc_refreshed": 385.3294438436, + "Vacc_refreshed_2": 192.6647219218 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.58002825, + "Vacc_completed": 1793.9473770292, + "Vacc_refreshed": 388.9073184565, + "Vacc_refreshed_2": 194.45365922825 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.8771499871, + "Vacc_completed": 1796.0612762347, + "Vacc_refreshed": 390.0186176392, + "Vacc_refreshed_2": 195.0093088196 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14993.5505864267, + "Vacc_completed": 1798.6017730753, + "Vacc_refreshed": 390.5734438836, + "Vacc_refreshed_2": 195.2867219418 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14998.158414122, + "Vacc_completed": 1802.0655230464, + "Vacc_refreshed": 391.8649823662, + "Vacc_refreshed_2": 195.9324911831 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.4313521872, + "Vacc_completed": 1804.413054883, + "Vacc_refreshed": 395.3533451537, + "Vacc_refreshed_2": 197.67667257685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.7989985243, + "Vacc_completed": 1812.4490035114, + "Vacc_refreshed": 401.8191046925, + "Vacc_refreshed_2": 200.90955234625 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15002.2088852954, + "Vacc_completed": 1814.4865305652, + "Vacc_refreshed": 409.5825438963, + "Vacc_refreshed_2": 204.79127194815 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15008.2705384657, + "Vacc_completed": 1823.0023861142, + "Vacc_refreshed": 411.4567502649, + "Vacc_refreshed_2": 205.72837513245 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15013.4515790087, + "Vacc_completed": 1830.5873803301, + "Vacc_refreshed": 417.6053918266, + "Vacc_refreshed_2": 208.8026959133 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15022.965858679, + "Vacc_completed": 1833.2575088513, + "Vacc_refreshed": 421.7562400513, + "Vacc_refreshed_2": 210.87812002565 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15024.3362350043, + "Vacc_completed": 1839.0848659035, + "Vacc_refreshed": 429.2321579029, + "Vacc_refreshed_2": 214.61607895145 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15025.0436784182, + "Vacc_completed": 1840.7238800201, + "Vacc_refreshed": 434.1256619822, + "Vacc_refreshed_2": 217.0628309911 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15026.1929816575, + "Vacc_completed": 1848.4826094697, + "Vacc_refreshed": 436.1767563509, + "Vacc_refreshed_2": 218.08837817545 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15028.1115762872, + "Vacc_completed": 1851.353962867, + "Vacc_refreshed": 439.6190575403, + "Vacc_refreshed_2": 219.80952877015 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12940.2728292563, + "Vacc_completed": 1761.2082450081, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12944.552426313, + "Vacc_completed": 1763.9916052944, + "Vacc_refreshed": 5.8453121761, + "Vacc_refreshed_2": 2.92265608805 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12946.2293033065, + "Vacc_completed": 1764.8651614651, + "Vacc_refreshed": 11.3614134516, + "Vacc_refreshed_2": 5.6807067258 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12954.4553975676, + "Vacc_completed": 1773.9720915654, + "Vacc_refreshed": 19.8633846559, + "Vacc_refreshed_2": 9.93169232795 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12962.1675537316, + "Vacc_completed": 1776.6871749169, + "Vacc_refreshed": 23.5340750877, + "Vacc_refreshed_2": 11.76703754385 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12970.2114807284, + "Vacc_completed": 1779.4482697767, + "Vacc_refreshed": 32.7047145334, + "Vacc_refreshed_2": 16.3523572667 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12971.1155781651, + "Vacc_completed": 1787.6912361171, + "Vacc_refreshed": 41.3859214133, + "Vacc_refreshed_2": 20.69296070665 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12976.1479148685, + "Vacc_completed": 1796.0609011819, + "Vacc_refreshed": 49.2224218631, + "Vacc_refreshed_2": 24.61121093155 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12985.389251021, + "Vacc_completed": 1806.0439647379, + "Vacc_refreshed": 58.4565372826, + "Vacc_refreshed_2": 29.2282686413 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12987.6528992192, + "Vacc_completed": 1814.2136648594, + "Vacc_refreshed": 68.4133404236, + "Vacc_refreshed_2": 34.2066702118 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12988.8953336446, + "Vacc_completed": 1820.4740554862, + "Vacc_refreshed": 69.4164203636, + "Vacc_refreshed_2": 34.7082101818 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12989.930788247, + "Vacc_completed": 1825.1779692151, + "Vacc_refreshed": 71.594311523, + "Vacc_refreshed_2": 35.7971557615 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12993.9481590439, + "Vacc_completed": 1834.4690603586, + "Vacc_refreshed": 75.4387792504, + "Vacc_refreshed_2": 37.7193896252 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12997.41102572, + "Vacc_completed": 1836.6145856268, + "Vacc_refreshed": 81.7875242048, + "Vacc_refreshed_2": 40.8937621024 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12999.5337504327, + "Vacc_completed": 1839.9662175544, + "Vacc_refreshed": 87.9455065083, + "Vacc_refreshed_2": 43.97275325415 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13007.2251436977, + "Vacc_completed": 1842.6498922014, + "Vacc_refreshed": 93.1900542901, + "Vacc_refreshed_2": 46.59502714505 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13012.0856312446, + "Vacc_completed": 1844.701996872, + "Vacc_refreshed": 99.712698674, + "Vacc_refreshed_2": 49.856349337 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13021.33252246, + "Vacc_completed": 1849.3061445307, + "Vacc_refreshed": 102.5319545699, + "Vacc_refreshed_2": 51.26597728495 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13027.1500152398, + "Vacc_completed": 1850.8078304213, + "Vacc_refreshed": 105.0259857828, + "Vacc_refreshed_2": 52.5129928914 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13035.650988116, + "Vacc_completed": 1851.8577100095, + "Vacc_refreshed": 110.1445342625, + "Vacc_refreshed_2": 55.07226713125 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13042.2123284129, + "Vacc_completed": 1856.2056162281, + "Vacc_refreshed": 113.6459186876, + "Vacc_refreshed_2": 56.8229593438 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13048.5274669921, + "Vacc_completed": 1856.9596604869, + "Vacc_refreshed": 119.7006093985, + "Vacc_refreshed_2": 59.85030469925 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13056.4261041722, + "Vacc_completed": 1859.9946313318, + "Vacc_refreshed": 128.4930741519, + "Vacc_refreshed_2": 64.24653707595 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13061.2580735831, + "Vacc_completed": 1864.4241013454, + "Vacc_refreshed": 129.4122729818, + "Vacc_refreshed_2": 64.7061364909 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13069.8769575412, + "Vacc_completed": 1870.828968765, + "Vacc_refreshed": 133.5606697443, + "Vacc_refreshed_2": 66.78033487215 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13074.4847352314, + "Vacc_completed": 1873.0576602324, + "Vacc_refreshed": 142.5189975609, + "Vacc_refreshed_2": 71.25949878045 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13077.43910001, + "Vacc_completed": 1881.1763507471, + "Vacc_refreshed": 143.4948395736, + "Vacc_refreshed_2": 71.7474197868 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13082.3470601758, + "Vacc_completed": 1888.5808588713, + "Vacc_refreshed": 149.0381282873, + "Vacc_refreshed_2": 74.51906414365 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13091.0962170402, + "Vacc_completed": 1894.9989493108, + "Vacc_refreshed": 149.7527355276, + "Vacc_refreshed_2": 74.8763677638 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13097.0655225667, + "Vacc_completed": 1904.9660517959, + "Vacc_refreshed": 155.7716165644, + "Vacc_refreshed_2": 77.8858082822 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13105.8431803144, + "Vacc_completed": 1907.1233275333, + "Vacc_refreshed": 162.7399373626, + "Vacc_refreshed_2": 81.3699686813 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13110.9052745957, + "Vacc_completed": 1915.3369502585, + "Vacc_refreshed": 166.1686970271, + "Vacc_refreshed_2": 83.08434851355 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13120.2888484357, + "Vacc_completed": 1924.594235894, + "Vacc_refreshed": 174.1871820852, + "Vacc_refreshed_2": 87.0935910426 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13122.2684309305, + "Vacc_completed": 1926.8954039089, + "Vacc_refreshed": 179.1800373951, + "Vacc_refreshed_2": 89.59001869755 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13129.679389954, + "Vacc_completed": 1929.8687720822, + "Vacc_refreshed": 186.5609898946, + "Vacc_refreshed_2": 93.2804949473 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13136.2121968271, + "Vacc_completed": 1930.5419008182, + "Vacc_refreshed": 190.3285119819, + "Vacc_refreshed_2": 95.16425599095 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13140.8693305096, + "Vacc_completed": 1933.1368513989, + "Vacc_refreshed": 199.5045342081, + "Vacc_refreshed_2": 99.75226710405 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13141.6505152789, + "Vacc_completed": 1938.3539275062, + "Vacc_refreshed": 199.9231054484, + "Vacc_refreshed_2": 99.9615527242 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13146.3819720109, + "Vacc_completed": 1943.0787615053, + "Vacc_refreshed": 203.5617342411, + "Vacc_refreshed_2": 101.78086712055 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.5833925737, + "Vacc_completed": 1944.8505615419, + "Vacc_refreshed": 206.5254255239, + "Vacc_refreshed_2": 103.26271276195 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.8864321418, + "Vacc_completed": 1946.7574709443, + "Vacc_refreshed": 208.0171497057, + "Vacc_refreshed_2": 104.00857485285 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13160.8319905342, + "Vacc_completed": 1949.6926878806, + "Vacc_refreshed": 213.0797703475, + "Vacc_refreshed_2": 106.53988517375 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13165.109826694, + "Vacc_completed": 1955.2468047197, + "Vacc_refreshed": 222.6760329578, + "Vacc_refreshed_2": 111.3380164789 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13168.7847714036, + "Vacc_completed": 1956.1809363506, + "Vacc_refreshed": 231.6808966253, + "Vacc_refreshed_2": 115.84044831265 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13176.0869758252, + "Vacc_completed": 1960.8024990411, + "Vacc_refreshed": 233.4328765098, + "Vacc_refreshed_2": 116.7164382549 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13180.123104626, + "Vacc_completed": 1969.8047949709, + "Vacc_refreshed": 241.5696524948, + "Vacc_refreshed_2": 120.7848262474 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13184.6423078124, + "Vacc_completed": 1974.8566545144, + "Vacc_refreshed": 250.4550885677, + "Vacc_refreshed_2": 125.22754428385 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13190.9452560841, + "Vacc_completed": 1975.9346724558, + "Vacc_refreshed": 252.799671753, + "Vacc_refreshed_2": 126.3998358765 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13194.9586490897, + "Vacc_completed": 1984.1998929758, + "Vacc_refreshed": 256.8657355625, + "Vacc_refreshed_2": 128.43286778125 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13203.1981501018, + "Vacc_completed": 1992.2264996957, + "Vacc_refreshed": 262.7110996677, + "Vacc_refreshed_2": 131.35554983385 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13210.570704838, + "Vacc_completed": 2000.1284432323, + "Vacc_refreshed": 268.7466273707, + "Vacc_refreshed_2": 134.37331368535 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13217.6966464936, + "Vacc_completed": 2001.108779963, + "Vacc_refreshed": 270.063420564, + "Vacc_refreshed_2": 135.031710282 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13222.8454105611, + "Vacc_completed": 2006.445790007, + "Vacc_refreshed": 272.306211944, + "Vacc_refreshed_2": 136.153105972 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13231.9459038211, + "Vacc_completed": 2014.1245558198, + "Vacc_refreshed": 274.2682102675, + "Vacc_refreshed_2": 137.13410513375 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.4430744102, + "Vacc_completed": 2021.01783734, + "Vacc_refreshed": 283.272422859, + "Vacc_refreshed_2": 141.6362114295 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.9880313892, + "Vacc_completed": 2021.3278488109, + "Vacc_refreshed": 288.8833613171, + "Vacc_refreshed_2": 144.44168065855 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13244.1020800967, + "Vacc_completed": 2028.5342497408, + "Vacc_refreshed": 295.5476346222, + "Vacc_refreshed_2": 147.7738173111 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13246.2035006005, + "Vacc_completed": 2034.7337820973, + "Vacc_refreshed": 295.8527619766, + "Vacc_refreshed_2": 147.9263809883 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13250.3034672718, + "Vacc_completed": 2040.4526371692, + "Vacc_refreshed": 297.6289642024, + "Vacc_refreshed_2": 148.8144821012 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13258.1309651863, + "Vacc_completed": 2043.9166550693, + "Vacc_refreshed": 307.2590005259, + "Vacc_refreshed_2": 153.62950026295 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13264.00554028, + "Vacc_completed": 2046.5596745193, + "Vacc_refreshed": 309.1250398792, + "Vacc_refreshed_2": 154.5625199396 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.4212557374, + "Vacc_completed": 2049.7116443058, + "Vacc_refreshed": 314.0515587013, + "Vacc_refreshed_2": 157.02577935065 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.7885616679, + "Vacc_completed": 2051.2982177338, + "Vacc_refreshed": 320.3832182075, + "Vacc_refreshed_2": 160.19160910375 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13274.2264538665, + "Vacc_completed": 2058.2989667129, + "Vacc_refreshed": 323.7063680074, + "Vacc_refreshed_2": 161.8531840037 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13281.9141553951, + "Vacc_completed": 2063.8206751836, + "Vacc_refreshed": 326.9158074422, + "Vacc_refreshed_2": 163.4579037211 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13290.64171309, + "Vacc_completed": 2064.3110765988, + "Vacc_refreshed": 336.7710359746, + "Vacc_refreshed_2": 168.3855179873 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.1885069646, + "Vacc_completed": 2072.8766922561, + "Vacc_refreshed": 344.574816718, + "Vacc_refreshed_2": 172.287408359 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.7117921559, + "Vacc_completed": 2081.2889195134, + "Vacc_refreshed": 352.6791052892, + "Vacc_refreshed_2": 176.3395526446 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13295.741331211, + "Vacc_completed": 2082.371745109, + "Vacc_refreshed": 358.7062427923, + "Vacc_refreshed_2": 179.35312139615 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13303.8543248793, + "Vacc_completed": 2084.7970217381, + "Vacc_refreshed": 363.3629273081, + "Vacc_refreshed_2": 181.68146365405 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13305.910901253, + "Vacc_completed": 2089.496376583, + "Vacc_refreshed": 364.4184919111, + "Vacc_refreshed_2": 182.20924595555 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13310.1770755649, + "Vacc_completed": 2091.8877772854, + "Vacc_refreshed": 373.8861441424, + "Vacc_refreshed_2": 186.9430720712 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13318.5822731817, + "Vacc_completed": 2100.0656871327, + "Vacc_refreshed": 380.7622590612, + "Vacc_refreshed_2": 190.3811295306 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13326.848015265, + "Vacc_completed": 2103.7807367097, + "Vacc_refreshed": 383.494468406, + "Vacc_refreshed_2": 191.747234203 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13329.8351558424, + "Vacc_completed": 2106.3811743673, + "Vacc_refreshed": 385.7094999088, + "Vacc_refreshed_2": 192.8547499544 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13334.0243800891, + "Vacc_completed": 2110.0143078684, + "Vacc_refreshed": 387.028737638, + "Vacc_refreshed_2": 193.514368819 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13340.0473805148, + "Vacc_completed": 2114.17877764, + "Vacc_refreshed": 390.7872507231, + "Vacc_refreshed_2": 195.39362536155 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13342.4710995253, + "Vacc_completed": 2117.5584807218, + "Vacc_refreshed": 394.4459716696, + "Vacc_refreshed_2": 197.2229858348 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13345.9586603577, + "Vacc_completed": 2124.6343373595, + "Vacc_refreshed": 401.3739608899, + "Vacc_refreshed_2": 200.68698044495 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13354.1694340722, + "Vacc_completed": 2132.584533812, + "Vacc_refreshed": 404.149558168, + "Vacc_refreshed_2": 202.074779084 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13360.0480186273, + "Vacc_completed": 2135.2279773256, + "Vacc_refreshed": 407.0589420913, + "Vacc_refreshed_2": 203.52947104565 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13362.9287822042, + "Vacc_completed": 2135.7661733179, + "Vacc_refreshed": 412.3495727781, + "Vacc_refreshed_2": 206.17478638905 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13365.9702033874, + "Vacc_completed": 2140.0801351424, + "Vacc_refreshed": 414.1173144704, + "Vacc_refreshed_2": 207.0586572352 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13375.8578305813, + "Vacc_completed": 2147.1687721976, + "Vacc_refreshed": 416.1274613074, + "Vacc_refreshed_2": 208.0637306537 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.3434411484, + "Vacc_completed": 2149.6360498231, + "Vacc_refreshed": 422.5420941028, + "Vacc_refreshed_2": 211.2710470514 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.8386238776, + "Vacc_completed": 2156.2105881723, + "Vacc_refreshed": 428.2913369026, + "Vacc_refreshed_2": 214.1456684513 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13388.7750604929, + "Vacc_completed": 2160.929719286, + "Vacc_refreshed": 437.0909930573, + "Vacc_refreshed_2": 218.54549652865 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13397.0959920005, + "Vacc_completed": 2169.0772334568, + "Vacc_refreshed": 438.0782576038, + "Vacc_refreshed_2": 219.0391288019 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13406.1913483212, + "Vacc_completed": 2172.8397968306, + "Vacc_refreshed": 445.0079409299, + "Vacc_refreshed_2": 222.50397046495 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13410.1064630998, + "Vacc_completed": 2179.4067803849, + "Vacc_refreshed": 453.2550919609, + "Vacc_refreshed_2": 226.62754598045 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.2872479216, + "Vacc_completed": 2183.7956163614, + "Vacc_refreshed": 462.0847473084, + "Vacc_refreshed_2": 231.0423736542 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.7274837683, + "Vacc_completed": 2186.2625889833, + "Vacc_refreshed": 470.3671533805, + "Vacc_refreshed_2": 235.18357669025 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15108.1816487494, + "Vacc_completed": 1951.3500240632, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15112.0388992614, + "Vacc_completed": 1956.8484422205, + "Vacc_refreshed": 4.7764537598, + "Vacc_refreshed_2": 2.3882268799 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15115.1174991099, + "Vacc_completed": 1961.6166149519, + "Vacc_refreshed": 11.6778924479, + "Vacc_refreshed_2": 5.83894622395 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15121.0352670933, + "Vacc_completed": 1969.039883077, + "Vacc_refreshed": 19.464449507, + "Vacc_refreshed_2": 9.7322247535 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15130.8297777562, + "Vacc_completed": 1970.7344191294, + "Vacc_refreshed": 28.0813773392, + "Vacc_refreshed_2": 14.0406886696 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15139.7963570637, + "Vacc_completed": 1971.420038313, + "Vacc_refreshed": 34.2304461363, + "Vacc_refreshed_2": 17.11522306815 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15149.3578353885, + "Vacc_completed": 1977.7986093705, + "Vacc_refreshed": 42.9385547047, + "Vacc_refreshed_2": 21.46927735235 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15150.8906121637, + "Vacc_completed": 1981.6633590428, + "Vacc_refreshed": 46.0030569507, + "Vacc_refreshed_2": 23.00152847535 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15153.3987479409, + "Vacc_completed": 1986.7151251441, + "Vacc_refreshed": 54.9967129669, + "Vacc_refreshed_2": 27.49835648345 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15155.2112066, + "Vacc_completed": 1993.3668502516, + "Vacc_refreshed": 59.2446234015, + "Vacc_refreshed_2": 29.62231170075 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15157.213160056, + "Vacc_completed": 2000.1282773775, + "Vacc_refreshed": 61.576334937, + "Vacc_refreshed_2": 30.7881674685 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15159.7206353696, + "Vacc_completed": 2000.5786646957, + "Vacc_refreshed": 62.4328961844, + "Vacc_refreshed_2": 31.2164480922 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15165.6048851908, + "Vacc_completed": 2000.600816545, + "Vacc_refreshed": 70.2254449832, + "Vacc_refreshed_2": 35.1127224916 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15175.5401574577, + "Vacc_completed": 2003.6984716795, + "Vacc_refreshed": 80.0202808521, + "Vacc_refreshed_2": 40.01014042605 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15178.2193352397, + "Vacc_completed": 2010.5259174304, + "Vacc_refreshed": 80.5289834705, + "Vacc_refreshed_2": 40.26449173525 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15186.1911779287, + "Vacc_completed": 2020.3094769054, + "Vacc_refreshed": 88.939485925, + "Vacc_refreshed_2": 44.4697429625 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15192.9408650715, + "Vacc_completed": 2027.102138126, + "Vacc_refreshed": 93.403990271, + "Vacc_refreshed_2": 46.7019951355 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15197.2522804828, + "Vacc_completed": 2033.1768424672, + "Vacc_refreshed": 103.3495680716, + "Vacc_refreshed_2": 51.6747840358 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15201.4718571012, + "Vacc_completed": 2041.9289374755, + "Vacc_refreshed": 107.0046191576, + "Vacc_refreshed_2": 53.5023095788 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15203.6899934618, + "Vacc_completed": 2042.5550193085, + "Vacc_refreshed": 108.1692912263, + "Vacc_refreshed_2": 54.08464561315 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15210.5751055, + "Vacc_completed": 2049.1508387429, + "Vacc_refreshed": 115.4885047404, + "Vacc_refreshed_2": 57.7442523702 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15216.3570734734, + "Vacc_completed": 2052.3213561982, + "Vacc_refreshed": 119.2061326333, + "Vacc_refreshed_2": 59.60306631665 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15225.8779749457, + "Vacc_completed": 2057.4663468474, + "Vacc_refreshed": 126.226397743, + "Vacc_refreshed_2": 63.1131988715 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15230.8206176005, + "Vacc_completed": 2064.8586744443, + "Vacc_refreshed": 133.0501812916, + "Vacc_refreshed_2": 66.5250906458 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15231.8828151205, + "Vacc_completed": 2068.2097593649, + "Vacc_refreshed": 142.0174284746, + "Vacc_refreshed_2": 71.0087142373 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15238.2426035555, + "Vacc_completed": 2071.8714182096, + "Vacc_refreshed": 148.7355853512, + "Vacc_refreshed_2": 74.3677926756 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15247.7928253295, + "Vacc_completed": 2078.7188555952, + "Vacc_refreshed": 156.2462830057, + "Vacc_refreshed_2": 78.12314150285 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15257.1929610505, + "Vacc_completed": 2083.6123346127, + "Vacc_refreshed": 163.8060000189, + "Vacc_refreshed_2": 81.90300000945 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15261.4225446127, + "Vacc_completed": 2092.4315663384, + "Vacc_refreshed": 165.098643188, + "Vacc_refreshed_2": 82.549321594 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15264.9230201438, + "Vacc_completed": 2098.3647861992, + "Vacc_refreshed": 173.1581071885, + "Vacc_refreshed_2": 86.57905359425 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15274.2090277291, + "Vacc_completed": 2098.6684198619, + "Vacc_refreshed": 179.3045017397, + "Vacc_refreshed_2": 89.65225086985 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15275.4881156514, + "Vacc_completed": 2104.7296501443, + "Vacc_refreshed": 184.3873991738, + "Vacc_refreshed_2": 92.1936995869 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.4296689803, + "Vacc_completed": 2109.0258070133, + "Vacc_refreshed": 190.3361011534, + "Vacc_refreshed_2": 95.1680505767 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.7641225132, + "Vacc_completed": 2111.2503398848, + "Vacc_refreshed": 196.3057900505, + "Vacc_refreshed_2": 98.15289502525 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15280.5288668271, + "Vacc_completed": 2120.2846622436, + "Vacc_refreshed": 201.8816019943, + "Vacc_refreshed_2": 100.94080099715 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15286.6794056665, + "Vacc_completed": 2127.5294418815, + "Vacc_refreshed": 205.8247713924, + "Vacc_refreshed_2": 102.9123856962 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15287.919376399, + "Vacc_completed": 2127.7213986428, + "Vacc_refreshed": 207.0848824799, + "Vacc_refreshed_2": 103.54244123995 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15288.8972252423, + "Vacc_completed": 2131.7043154907, + "Vacc_refreshed": 214.6605013946, + "Vacc_refreshed_2": 107.3302506973 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15295.1676694583, + "Vacc_completed": 2141.6853776317, + "Vacc_refreshed": 217.321705385, + "Vacc_refreshed_2": 108.6608526925 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.8279320379, + "Vacc_completed": 2150.6081907236, + "Vacc_refreshed": 224.1814306469, + "Vacc_refreshed_2": 112.09071532345 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.9502690873, + "Vacc_completed": 2150.8297260642, + "Vacc_refreshed": 224.2857175024, + "Vacc_refreshed_2": 112.1428587512 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15305.4629063272, + "Vacc_completed": 2159.4075137345, + "Vacc_refreshed": 226.4536786248, + "Vacc_refreshed_2": 113.2268393124 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15313.0091699117, + "Vacc_completed": 2160.0885470064, + "Vacc_refreshed": 232.5677391068, + "Vacc_refreshed_2": 116.2838695534 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15316.6742133238, + "Vacc_completed": 2163.6640679748, + "Vacc_refreshed": 242.4458167027, + "Vacc_refreshed_2": 121.22290835135 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15325.7736410299, + "Vacc_completed": 2171.6222500116, + "Vacc_refreshed": 251.5591803171, + "Vacc_refreshed_2": 125.77959015855 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15333.3685319398, + "Vacc_completed": 2174.4162160121, + "Vacc_refreshed": 254.1541702573, + "Vacc_refreshed_2": 127.07708512865 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15337.5758896556, + "Vacc_completed": 2180.7560110181, + "Vacc_refreshed": 255.4491825287, + "Vacc_refreshed_2": 127.72459126435 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15346.8261947795, + "Vacc_completed": 2184.562660479, + "Vacc_refreshed": 256.0794667401, + "Vacc_refreshed_2": 128.03973337005 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15347.5063487999, + "Vacc_completed": 2192.7053918922, + "Vacc_refreshed": 264.8657432896, + "Vacc_refreshed_2": 132.4328716448 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15355.2915215882, + "Vacc_completed": 2197.3639423288, + "Vacc_refreshed": 266.2003474583, + "Vacc_refreshed_2": 133.10017372915 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15357.0291297717, + "Vacc_completed": 2203.5668703416, + "Vacc_refreshed": 266.2591235692, + "Vacc_refreshed_2": 133.1295617846 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15363.7351300479, + "Vacc_completed": 2212.51470716, + "Vacc_refreshed": 268.1554009506, + "Vacc_refreshed_2": 134.0777004753 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15366.2054877706, + "Vacc_completed": 2220.7805776981, + "Vacc_refreshed": 270.2429125628, + "Vacc_refreshed_2": 135.1214562814 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15374.7828886007, + "Vacc_completed": 2223.4779151007, + "Vacc_refreshed": 271.3258668517, + "Vacc_refreshed_2": 135.66293342585 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15375.8644766411, + "Vacc_completed": 2223.902202818, + "Vacc_refreshed": 277.3418287874, + "Vacc_refreshed_2": 138.6709143937 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15384.0103684975, + "Vacc_completed": 2233.2600148125, + "Vacc_refreshed": 286.2795142721, + "Vacc_refreshed_2": 143.13975713605 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15388.2433647335, + "Vacc_completed": 2242.2405085188, + "Vacc_refreshed": 295.9058348626, + "Vacc_refreshed_2": 147.9529174313 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15395.874552707, + "Vacc_completed": 2242.5126967683, + "Vacc_refreshed": 297.0217883024, + "Vacc_refreshed_2": 148.5108941512 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15399.399317417, + "Vacc_completed": 2250.19318626, + "Vacc_refreshed": 297.4497074595, + "Vacc_refreshed_2": 148.72485372975 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15407.4994879004, + "Vacc_completed": 2258.8146667712, + "Vacc_refreshed": 302.8025504676, + "Vacc_refreshed_2": 151.4012752338 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15410.1346998553, + "Vacc_completed": 2259.5361618465, + "Vacc_refreshed": 305.0699464575, + "Vacc_refreshed_2": 152.53497322875 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15415.5662938607, + "Vacc_completed": 2266.2419298528, + "Vacc_refreshed": 306.5583985118, + "Vacc_refreshed_2": 153.2791992559 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15424.362408066, + "Vacc_completed": 2270.6973906417, + "Vacc_refreshed": 307.7300944183, + "Vacc_refreshed_2": 153.86504720915 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15427.4641661532, + "Vacc_completed": 2273.4475287465, + "Vacc_refreshed": 315.9257071161, + "Vacc_refreshed_2": 157.96285355805 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15430.3003374401, + "Vacc_completed": 2280.4953549554, + "Vacc_refreshed": 320.4057109928, + "Vacc_refreshed_2": 160.2028554964 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15434.7161891817, + "Vacc_completed": 2283.6641990131, + "Vacc_refreshed": 329.6425079267, + "Vacc_refreshed_2": 164.82125396335 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15439.6389263804, + "Vacc_completed": 2286.269595866, + "Vacc_refreshed": 336.6032551175, + "Vacc_refreshed_2": 168.30162755875 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.607595077, + "Vacc_completed": 2292.1795115763, + "Vacc_refreshed": 339.4752869467, + "Vacc_refreshed_2": 169.73764347335 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.7317234732, + "Vacc_completed": 2299.0428376394, + "Vacc_refreshed": 342.2213588852, + "Vacc_refreshed_2": 171.1106794426 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15448.8137925508, + "Vacc_completed": 2303.3104194582, + "Vacc_refreshed": 346.3780017598, + "Vacc_refreshed_2": 173.1890008799 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15449.4812178935, + "Vacc_completed": 2311.9261799324, + "Vacc_refreshed": 351.1765190663, + "Vacc_refreshed_2": 175.58825953315 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9089483618, + "Vacc_completed": 2315.5711542884, + "Vacc_refreshed": 352.532745084, + "Vacc_refreshed_2": 176.266372542 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9943266817, + "Vacc_completed": 2322.1716179078, + "Vacc_refreshed": 355.0774800773, + "Vacc_refreshed_2": 177.53874003865 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15459.7074068986, + "Vacc_completed": 2323.3027059178, + "Vacc_refreshed": 364.5645466744, + "Vacc_refreshed_2": 182.2822733372 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15465.686171573, + "Vacc_completed": 2325.8040208828, + "Vacc_refreshed": 365.9637341301, + "Vacc_refreshed_2": 182.98186706505 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15466.2025927257, + "Vacc_completed": 2332.7537065257, + "Vacc_refreshed": 366.2841969775, + "Vacc_refreshed_2": 183.14209848875 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15471.0643499093, + "Vacc_completed": 2333.7718947218, + "Vacc_refreshed": 370.7174701468, + "Vacc_refreshed_2": 185.3587350734 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15480.1820736709, + "Vacc_completed": 2336.425519339, + "Vacc_refreshed": 378.1719392306, + "Vacc_refreshed_2": 189.0859696153 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15489.2619602904, + "Vacc_completed": 2342.4314320637, + "Vacc_refreshed": 382.1070985379, + "Vacc_refreshed_2": 191.05354926895 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15497.197059921, + "Vacc_completed": 2351.5508059781, + "Vacc_refreshed": 390.0131449372, + "Vacc_refreshed_2": 195.0065724686 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15506.8997820546, + "Vacc_completed": 2354.7951207515, + "Vacc_refreshed": 397.4755552416, + "Vacc_refreshed_2": 198.7377776208 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15514.6356932026, + "Vacc_completed": 2359.4543858263, + "Vacc_refreshed": 405.5265192328, + "Vacc_refreshed_2": 202.7632596164 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15517.1065215082, + "Vacc_completed": 2362.3705119741, + "Vacc_refreshed": 406.2503084488, + "Vacc_refreshed_2": 203.1251542244 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15526.1890623234, + "Vacc_completed": 2369.2123027947, + "Vacc_refreshed": 407.9863557734, + "Vacc_refreshed_2": 203.9931778867 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15529.1257916241, + "Vacc_completed": 2371.0230854052, + "Vacc_refreshed": 415.4330021443, + "Vacc_refreshed_2": 207.71650107215 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15534.1422800755, + "Vacc_completed": 2376.4314141852, + "Vacc_refreshed": 417.8710629027, + "Vacc_refreshed_2": 208.93553145135 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15536.9779956012, + "Vacc_completed": 2380.9412020655, + "Vacc_refreshed": 418.6065556413, + "Vacc_refreshed_2": 209.30327782065 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15542.623117778, + "Vacc_completed": 2383.2295524317, + "Vacc_refreshed": 425.5318613018, + "Vacc_refreshed_2": 212.7659306509 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15545.7349127212, + "Vacc_completed": 2388.7438112703, + "Vacc_refreshed": 435.2708995295, + "Vacc_refreshed_2": 217.63544976475 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15552.7663039717, + "Vacc_completed": 2398.7179519564, + "Vacc_refreshed": 436.7806978293, + "Vacc_refreshed_2": 218.39034891465 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15553.9038494269, + "Vacc_completed": 2401.9470135031, + "Vacc_refreshed": 445.294989416, + "Vacc_refreshed_2": 222.647494708 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15563.5219522465, + "Vacc_completed": 2408.3277109489, + "Vacc_refreshed": 449.1868908695, + "Vacc_refreshed_2": 224.59344543475 } -] +] \ No newline at end of file diff --git a/cpp/tests/data/vaccination_data.json b/cpp/tests/data/vaccination_data.json index 38ba2a8c95..0716826088 100644 --- a/cpp/tests/data/vaccination_data.json +++ b/cpp/tests/data/vaccination_data.json @@ -1,4418 +1,4970 @@ [ { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14093.5670993244, - "Vacc_completed":1058.2133302677, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14094.6780758432, - "Vacc_completed":1058.2386490178, - "Vacc_refreshed":3.9480185817 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14102.3458622773, - "Vacc_completed":1063.1811826304, - "Vacc_refreshed":7.8235846725 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14106.0158477852, - "Vacc_completed":1071.0829580916, - "Vacc_refreshed":13.0365435255 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14115.8958402416, - "Vacc_completed":1072.5136218055, - "Vacc_refreshed":15.4582843201 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14116.0603009948, - "Vacc_completed":1080.8706574256, - "Vacc_refreshed":22.3037298829 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14124.4849162097, - "Vacc_completed":1087.4957123195, - "Vacc_refreshed":27.7666004775 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14132.812800891, - "Vacc_completed":1094.2936630058, - "Vacc_refreshed":29.4212640594 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14139.2772895404, - "Vacc_completed":1100.1665827188, - "Vacc_refreshed":29.4568827793 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14145.4868397119, - "Vacc_completed":1105.3345419667, - "Vacc_refreshed":34.7217238502 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14147.7480966959, - "Vacc_completed":1111.2289166538, - "Vacc_refreshed":34.771310214 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14154.5204084505, - "Vacc_completed":1114.7870563855, - "Vacc_refreshed":41.8898823514 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14155.4472543415, - "Vacc_completed":1124.6385432496, - "Vacc_refreshed":48.6348857735 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14162.2764203336, - "Vacc_completed":1128.54825128, - "Vacc_refreshed":48.7694054724 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14163.6229511244, - "Vacc_completed":1128.7143765883, - "Vacc_refreshed":53.2059941772 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14170.704731349, - "Vacc_completed":1138.0466956792, - "Vacc_refreshed":59.0394633797 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14177.9754226866, - "Vacc_completed":1144.8391611423, - "Vacc_refreshed":68.7607294969 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14180.6917277285, - "Vacc_completed":1145.8477444825, - "Vacc_refreshed":68.9221667424 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14183.6510488722, - "Vacc_completed":1148.5261706572, - "Vacc_refreshed":74.1781085786 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14187.685478561, - "Vacc_completed":1156.317724845, - "Vacc_refreshed":82.4605426733 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14190.8756861073, - "Vacc_completed":1158.3230049846, - "Vacc_refreshed":85.9686058349 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14194.7125443701, - "Vacc_completed":1162.8869701267, - "Vacc_refreshed":86.9745448839 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14198.1736788429, - "Vacc_completed":1172.5122981568, - "Vacc_refreshed":87.3520867387 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14200.0337444888, - "Vacc_completed":1173.9022323601, - "Vacc_refreshed":96.1323881978 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14209.9091251899, - "Vacc_completed":1180.4819879148, - "Vacc_refreshed":102.8081520102 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14215.7510791988, - "Vacc_completed":1187.6749019896, - "Vacc_refreshed":111.0676626302 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14216.891975169, - "Vacc_completed":1194.8246181318, - "Vacc_refreshed":112.2172983632 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14226.1128719795, - "Vacc_completed":1199.3288757923, - "Vacc_refreshed":115.0035825103 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14234.2678640476, - "Vacc_completed":1200.3667784603, - "Vacc_refreshed":122.2552339507 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14236.1003192184, - "Vacc_completed":1204.1967603181, - "Vacc_refreshed":127.0429292216 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14242.538633822, - "Vacc_completed":1212.5454877324, - "Vacc_refreshed":134.6939665016 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14244.3387278104, - "Vacc_completed":1213.6034702862, - "Vacc_refreshed":136.0920891424 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14251.4120506037, - "Vacc_completed":1216.4725302456, - "Vacc_refreshed":140.2813449601 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14260.7111088561, - "Vacc_completed":1223.9349650326, - "Vacc_refreshed":144.4607939662 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.4310619138, - "Vacc_completed":1230.2964929538, - "Vacc_refreshed":149.281965675 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14264.8430243455, - "Vacc_completed":1233.791799902, - "Vacc_refreshed":152.843700775 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14270.6723528208, - "Vacc_completed":1235.7852283109, - "Vacc_refreshed":158.6087157945 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14276.398217781, - "Vacc_completed":1244.1189399585, - "Vacc_refreshed":161.780101215 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14282.7632141243, - "Vacc_completed":1252.4246776385, - "Vacc_refreshed":164.4087953839 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14285.2172118541, - "Vacc_completed":1253.0967186007, - "Vacc_refreshed":165.7333648079 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14288.3981413127, - "Vacc_completed":1261.2285273698, - "Vacc_refreshed":175.6751183454 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14296.6990830234, - "Vacc_completed":1261.8928424603, - "Vacc_refreshed":181.3746988194 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14304.9324135674, - "Vacc_completed":1268.1858225933, - "Vacc_refreshed":182.8207287588 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14312.7990335985, - "Vacc_completed":1270.8693167453, - "Vacc_refreshed":192.6352794711 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14316.0317804647, - "Vacc_completed":1276.8328604136, - "Vacc_refreshed":199.109084232 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14317.8224126817, - "Vacc_completed":1285.9345839202, - "Vacc_refreshed":204.9564534429 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14319.969225103, - "Vacc_completed":1292.0814432843, - "Vacc_refreshed":209.3116185701 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14325.5010146205, - "Vacc_completed":1296.8562638588, - "Vacc_refreshed":214.164106287 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14334.64723979, - "Vacc_completed":1299.2846390455, - "Vacc_refreshed":215.8187786169 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14341.3416549169, - "Vacc_completed":1307.3997120401, - "Vacc_refreshed":220.1718442512 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14349.3146443239, - "Vacc_completed":1309.8026404332, - "Vacc_refreshed":222.9315364644 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14359.2839765392, - "Vacc_completed":1313.6592234511, - "Vacc_refreshed":226.6469703335 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14365.2176903694, - "Vacc_completed":1319.2137305156, - "Vacc_refreshed":227.7079880211 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14372.2949635005, - "Vacc_completed":1325.3928078641, - "Vacc_refreshed":234.0214496372 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14377.1100641854, - "Vacc_completed":1326.7384263101, - "Vacc_refreshed":242.1400638609 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14381.7559278649, - "Vacc_completed":1329.4413693873, - "Vacc_refreshed":246.2374710913 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14385.7162526455, - "Vacc_completed":1338.1839321545, - "Vacc_refreshed":252.0149200475 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14389.4326934411, - "Vacc_completed":1345.9094675595, - "Vacc_refreshed":256.9046042339 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14391.2007554132, - "Vacc_completed":1348.71606757, - "Vacc_refreshed":258.1776032516 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14394.8621297613, - "Vacc_completed":1354.2416050796, - "Vacc_refreshed":267.8589065036 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.3456243909, - "Vacc_completed":1359.868800934, - "Vacc_refreshed":270.9855298163 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14398.4645205246, - "Vacc_completed":1363.0538159145, - "Vacc_refreshed":275.840425604 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14399.1657319944, - "Vacc_completed":1365.5993182323, - "Vacc_refreshed":277.5856365007 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14402.7230837573, - "Vacc_completed":1368.6201543223, - "Vacc_refreshed":286.3361695339 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14403.1500082752, - "Vacc_completed":1371.4419603277, - "Vacc_refreshed":291.9429549926 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14409.601025491, - "Vacc_completed":1375.0385110041, - "Vacc_refreshed":294.4838831323 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.5992098988, - "Vacc_completed":1379.7282797993, - "Vacc_refreshed":304.3709721295 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14412.7379664054, - "Vacc_completed":1388.4437755617, - "Vacc_refreshed":310.9469195789 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14413.0256783966, - "Vacc_completed":1395.0228908154, - "Vacc_refreshed":316.1322991564 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14418.5923400284, - "Vacc_completed":1395.4421160716, - "Vacc_refreshed":324.326203234 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14427.1006875636, - "Vacc_completed":1400.9550416303, - "Vacc_refreshed":326.1675291407 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14428.1259159444, - "Vacc_completed":1401.6589165675, - "Vacc_refreshed":336.1473853823 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14429.6710322591, - "Vacc_completed":1406.4316961423, - "Vacc_refreshed":338.7341080527 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14435.5405186058, - "Vacc_completed":1406.8193757343, - "Vacc_refreshed":348.5515447081 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14440.6128511884, - "Vacc_completed":1406.8790930463, - "Vacc_refreshed":349.9224707035 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14448.1553470558, - "Vacc_completed":1407.8576900416, - "Vacc_refreshed":354.7521313753 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14456.4196110425, - "Vacc_completed":1411.7530351787, - "Vacc_refreshed":361.5526839017 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14466.1757833279, - "Vacc_completed":1412.4941157515, - "Vacc_refreshed":364.0766791828 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14472.9152722164, - "Vacc_completed":1421.7399661156, - "Vacc_refreshed":371.2418954122 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14474.3971159945, - "Vacc_completed":1423.8796012137, - "Vacc_refreshed":378.3445685688 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14482.9259977884, - "Vacc_completed":1428.8212618966, - "Vacc_refreshed":382.6712538747 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14491.6837567491, - "Vacc_completed":1430.1481016913, - "Vacc_refreshed":392.5489632959 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14499.5728298642, - "Vacc_completed":1439.468906008, - "Vacc_refreshed":397.6649554861 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14500.4884339857, - "Vacc_completed":1447.6074532094, - "Vacc_refreshed":404.4236802991 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14508.6628209678, - "Vacc_completed":1449.1955087396, - "Vacc_refreshed":413.1290507873 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14509.0177335192, - "Vacc_completed":1457.0313439789, - "Vacc_refreshed":418.6984801264 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14518.7925361684, - "Vacc_completed":1462.4055060107, - "Vacc_refreshed":419.6070699812 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14522.121758092, - "Vacc_completed":1468.1811367429, - "Vacc_refreshed":425.9772045183 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14528.5474917037, - "Vacc_completed":1473.5164593205, - "Vacc_refreshed":435.7810319021 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14536.5601109176, - "Vacc_completed":1481.2704120463, - "Vacc_refreshed":438.2410199432 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14542.1473955627, - "Vacc_completed":1482.7064631605, - "Vacc_refreshed":445.3488141502 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"0-4", - "Vacc_partially":14544.5952478081, - "Vacc_completed":1486.0552178086, - "Vacc_refreshed":446.1812966093 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10765.9941189788, - "Vacc_completed":1603.3500569399, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.3717745702, - "Vacc_completed":1605.3068408797, - "Vacc_refreshed":3.6283182226 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10773.4956401429, - "Vacc_completed":1610.6119068185, - "Vacc_refreshed":6.1967396209 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10774.4184508751, - "Vacc_completed":1613.016161978, - "Vacc_refreshed":15.7069691534 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10780.8073818373, - "Vacc_completed":1622.1917795654, - "Vacc_refreshed":20.1697274397 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10785.5287460006, - "Vacc_completed":1625.0602525893, - "Vacc_refreshed":22.4671684217 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10790.1084610651, - "Vacc_completed":1627.3787523231, - "Vacc_refreshed":28.5217462646 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10796.2300309, - "Vacc_completed":1630.4363483664, - "Vacc_refreshed":35.3070676184 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10801.7222904172, - "Vacc_completed":1638.725087864, - "Vacc_refreshed":43.7679344272 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10804.7724722766, - "Vacc_completed":1646.4905335365, - "Vacc_refreshed":44.1718542676 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10814.3453353804, - "Vacc_completed":1650.9992837124, - "Vacc_refreshed":49.5204655539 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10821.6255112157, - "Vacc_completed":1656.4335840831, - "Vacc_refreshed":52.7009855172 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10830.9379325639, - "Vacc_completed":1657.186187271, - "Vacc_refreshed":56.5428649986 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10838.202902864, - "Vacc_completed":1662.1470499364, - "Vacc_refreshed":58.6277824858 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10840.8786753296, - "Vacc_completed":1670.6860254071, - "Vacc_refreshed":58.7593924743 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10843.7453960183, - "Vacc_completed":1673.6372365137, - "Vacc_refreshed":61.8595630166 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10849.1151892515, - "Vacc_completed":1675.1066023109, - "Vacc_refreshed":64.6020615007 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10850.9329685403, - "Vacc_completed":1679.1505675366, - "Vacc_refreshed":72.0237510859 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10854.4610677614, - "Vacc_completed":1681.5473018047, - "Vacc_refreshed":75.0145349272 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10858.0662824418, - "Vacc_completed":1688.7179113019, - "Vacc_refreshed":82.7641475111 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10867.8357803799, - "Vacc_completed":1688.741478882, - "Vacc_refreshed":92.1411476813 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10877.245759177, - "Vacc_completed":1696.3354153291, - "Vacc_refreshed":93.5350586202 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10878.9277486403, - "Vacc_completed":1704.5169058825, - "Vacc_refreshed":99.9257252117 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10881.5163902637, - "Vacc_completed":1704.5184844203, - "Vacc_refreshed":104.0563799981 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10882.0628121233, - "Vacc_completed":1710.1811092467, - "Vacc_refreshed":110.998904559 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10884.1868939764, - "Vacc_completed":1711.6669667815, - "Vacc_refreshed":119.5835613879 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10890.26315895, - "Vacc_completed":1712.8219244738, - "Vacc_refreshed":126.203975023 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10894.6858788747, - "Vacc_completed":1721.7467435031, - "Vacc_refreshed":135.9649739788 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10897.5575288795, - "Vacc_completed":1721.7787127468, - "Vacc_refreshed":145.614673399 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10903.1231721286, - "Vacc_completed":1724.7269587992, - "Vacc_refreshed":149.6717929743 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10911.1763853993, - "Vacc_completed":1726.3071857535, - "Vacc_refreshed":158.0496522084 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10919.5582023277, - "Vacc_completed":1727.9236223535, - "Vacc_refreshed":160.5751263702 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10920.4962369047, - "Vacc_completed":1730.7211296321, - "Vacc_refreshed":162.2038531114 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10930.0062994591, - "Vacc_completed":1733.2273616859, - "Vacc_refreshed":164.6178844659 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10931.0781786076, - "Vacc_completed":1743.0639116966, - "Vacc_refreshed":171.6949336111 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10936.2371584575, - "Vacc_completed":1743.4973637943, - "Vacc_refreshed":173.1954991423 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10937.1969149599, - "Vacc_completed":1752.0043206175, - "Vacc_refreshed":173.4521249531 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10942.5829785849, - "Vacc_completed":1758.5438162851, - "Vacc_refreshed":175.0971428389 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10945.8458051779, - "Vacc_completed":1765.593119461, - "Vacc_refreshed":184.781293552 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10955.2619609788, - "Vacc_completed":1766.7516696253, - "Vacc_refreshed":194.3279051811 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0529992794, - "Vacc_completed":1774.4096958807, - "Vacc_refreshed":199.3585168564 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10963.0740456643, - "Vacc_completed":1776.7353479155, - "Vacc_refreshed":200.2783085421 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7647446192, - "Vacc_completed":1786.1838226639, - "Vacc_refreshed":202.522841172 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10972.7950553291, - "Vacc_completed":1788.5013884886, - "Vacc_refreshed":205.1107008609 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10973.1049316279, - "Vacc_completed":1790.2712267193, - "Vacc_refreshed":214.0688577867 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10976.2696576646, - "Vacc_completed":1797.8582422894, - "Vacc_refreshed":219.0460187772 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10984.9161656634, - "Vacc_completed":1801.5924446935, - "Vacc_refreshed":227.656626047 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10994.063273181, - "Vacc_completed":1802.6817444812, - "Vacc_refreshed":235.6032823069 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":10996.8771305673, - "Vacc_completed":1802.9071097171, - "Vacc_refreshed":237.7242073629 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11002.0527900673, - "Vacc_completed":1809.5395950318, - "Vacc_refreshed":241.3631599251 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11007.1528572096, - "Vacc_completed":1813.9025489723, - "Vacc_refreshed":245.5305344153 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11013.1337350258, - "Vacc_completed":1821.5275057931, - "Vacc_refreshed":250.3168579858 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11015.6696905796, - "Vacc_completed":1822.9598630397, - "Vacc_refreshed":255.6335351411 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11023.4754023371, - "Vacc_completed":1827.2471461973, - "Vacc_refreshed":265.5951098299 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11032.8284479669, - "Vacc_completed":1827.5539031975, - "Vacc_refreshed":267.3513136054 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.3845078238, - "Vacc_completed":1828.9970028031, - "Vacc_refreshed":270.5903250252 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11039.693720803, - "Vacc_completed":1836.2049019351, - "Vacc_refreshed":272.0758803579 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11047.8242120991, - "Vacc_completed":1837.1027842122, - "Vacc_refreshed":275.2277393803 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11053.900379851, - "Vacc_completed":1838.273599421, - "Vacc_refreshed":282.2344875735 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11059.6633767419, - "Vacc_completed":1845.0089267377, - "Vacc_refreshed":284.3140546038 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11068.9288674107, - "Vacc_completed":1852.7615624634, - "Vacc_refreshed":287.0304142153 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11072.6595101177, - "Vacc_completed":1857.871819743, - "Vacc_refreshed":289.2733395979 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11082.5784142097, - "Vacc_completed":1865.7647392626, - "Vacc_refreshed":291.3426551576 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11089.5185616411, - "Vacc_completed":1869.3958231852, - "Vacc_refreshed":299.8179962185 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11097.3087770941, - "Vacc_completed":1878.7026117675, - "Vacc_refreshed":306.1608208876 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11101.8508357142, - "Vacc_completed":1879.7270518854, - "Vacc_refreshed":308.0716738039 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11103.0915214706, - "Vacc_completed":1883.5574266434, - "Vacc_refreshed":311.2801806804 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11111.9334619087, - "Vacc_completed":1887.7967037043, - "Vacc_refreshed":320.2156677375 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11118.8667730664, - "Vacc_completed":1896.6793284207, - "Vacc_refreshed":321.8561637233 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11123.0290736537, - "Vacc_completed":1902.1985445903, - "Vacc_refreshed":328.4656069808 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11129.3471714321, - "Vacc_completed":1902.2057666507, - "Vacc_refreshed":334.8734059386 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11137.9949570833, - "Vacc_completed":1907.7915885083, - "Vacc_refreshed":339.9783670978 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11139.4617826874, - "Vacc_completed":1910.6126501167, - "Vacc_refreshed":342.8472462544 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11144.4191917936, - "Vacc_completed":1917.8558172992, - "Vacc_refreshed":351.3104814196 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11153.423123173, - "Vacc_completed":1927.8115362669, - "Vacc_refreshed":359.1887782128 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11155.4646855253, - "Vacc_completed":1931.0938823989, - "Vacc_refreshed":363.4217582407 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11164.8755655095, - "Vacc_completed":1932.0922021433, - "Vacc_refreshed":369.5881371093 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11168.2127634861, - "Vacc_completed":1937.8864562316, - "Vacc_refreshed":371.2850357688 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11170.3919325879, - "Vacc_completed":1943.9625258254, - "Vacc_refreshed":372.564368772 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11178.2156716034, - "Vacc_completed":1946.3680545291, - "Vacc_refreshed":377.1791450411 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11187.7206334256, - "Vacc_completed":1950.3408321869, - "Vacc_refreshed":385.28114877 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11189.2295548943, - "Vacc_completed":1952.7801877326, - "Vacc_refreshed":386.4768386941 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11193.8090943925, - "Vacc_completed":1960.5337079214, - "Vacc_refreshed":395.6463777137 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11198.0758128722, - "Vacc_completed":1964.4220756604, - "Vacc_refreshed":404.4005517293 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11200.1395546734, - "Vacc_completed":1974.1843879258, - "Vacc_refreshed":410.4354615606 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.0858861212, - "Vacc_completed":1978.0710124849, - "Vacc_refreshed":414.2205337181 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11203.5521637654, - "Vacc_completed":1981.3589179628, - "Vacc_refreshed":419.5840242501 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11211.6562498266, - "Vacc_completed":1989.6665585254, - "Vacc_refreshed":426.6154672823 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11219.1926870115, - "Vacc_completed":1996.1459430488, - "Vacc_refreshed":430.16915603 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11221.4656474699, - "Vacc_completed":2001.4601213853, - "Vacc_refreshed":430.8770850788 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11224.2379660032, - "Vacc_completed":2006.2961081678, - "Vacc_refreshed":433.8074021391 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"5-14", - "Vacc_partially":11229.137503588, - "Vacc_completed":2013.2392255015, - "Vacc_refreshed":441.1218403265 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15118.5419446559, - "Vacc_completed":1046.4766182565, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15127.0441726861, - "Vacc_completed":1051.8189573454, - "Vacc_refreshed":4.7668817312 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15134.2198668737, - "Vacc_completed":1051.8898550539, - "Vacc_refreshed":6.8954841457 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15138.5012633389, - "Vacc_completed":1054.1938291422, - "Vacc_refreshed":12.8850967826 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15140.019297286, - "Vacc_completed":1057.2812920036, - "Vacc_refreshed":15.610006044 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15141.0655653453, - "Vacc_completed":1061.1873607435, - "Vacc_refreshed":18.0052067519 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15146.6047446953, - "Vacc_completed":1067.3953196211, - "Vacc_refreshed":27.5155266211 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15150.2459378898, - "Vacc_completed":1077.315397207, - "Vacc_refreshed":28.0742687581 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15153.3836683973, - "Vacc_completed":1082.8237823387, - "Vacc_refreshed":32.6629347887 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15155.2486658897, - "Vacc_completed":1087.8721865368, - "Vacc_refreshed":42.082807235 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15157.4630323429, - "Vacc_completed":1090.0916620904, - "Vacc_refreshed":43.8436800298 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15158.7941750828, - "Vacc_completed":1091.8322828475, - "Vacc_refreshed":44.7371311455 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15159.4697179186, - "Vacc_completed":1097.9581123146, - "Vacc_refreshed":52.5410403094 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15166.8797207146, - "Vacc_completed":1103.4838023049, - "Vacc_refreshed":58.4482610787 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.177591783, - "Vacc_completed":1107.529236183, - "Vacc_refreshed":61.868532741 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15171.3473624207, - "Vacc_completed":1108.0854442406, - "Vacc_refreshed":64.122741794 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15176.6656703161, - "Vacc_completed":1114.7623442184, - "Vacc_refreshed":73.3909194547 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15182.6538662202, - "Vacc_completed":1121.0967139584, - "Vacc_refreshed":78.4108273222 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15191.0826029366, - "Vacc_completed":1124.8733122731, - "Vacc_refreshed":88.1249123157 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15195.1567917247, - "Vacc_completed":1133.1683853487, - "Vacc_refreshed":94.0586819047 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15197.6523517992, - "Vacc_completed":1140.1742056487, - "Vacc_refreshed":97.7116921077 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15202.8832794911, - "Vacc_completed":1140.4207518542, - "Vacc_refreshed":101.0390519368 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15209.502983548, - "Vacc_completed":1144.1138351675, - "Vacc_refreshed":104.5568369595 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15218.5591667959, - "Vacc_completed":1153.0110444013, - "Vacc_refreshed":111.8121115483 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15223.6275127037, - "Vacc_completed":1157.3585549388, - "Vacc_refreshed":113.9066704897 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.4100349304, - "Vacc_completed":1162.1581378525, - "Vacc_refreshed":116.416758139 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15225.7888080253, - "Vacc_completed":1166.5300160643, - "Vacc_refreshed":119.2414894864 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15235.240974732, - "Vacc_completed":1171.76423914, - "Vacc_refreshed":129.0137217302 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15236.252829019, - "Vacc_completed":1174.1820893055, - "Vacc_refreshed":130.8298102316 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15244.5996289271, - "Vacc_completed":1181.3457343202, - "Vacc_refreshed":138.0198133972 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15247.7688417561, - "Vacc_completed":1186.4632437534, - "Vacc_refreshed":147.549469044 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15254.8324409461, - "Vacc_completed":1196.0640695451, - "Vacc_refreshed":148.035813332 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15263.9056700401, - "Vacc_completed":1202.0195228295, - "Vacc_refreshed":152.9647063671 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15271.3608079113, - "Vacc_completed":1205.9189472233, - "Vacc_refreshed":159.4326071199 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15274.5391192733, - "Vacc_completed":1209.5333389579, - "Vacc_refreshed":165.8197711746 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15279.9252173752, - "Vacc_completed":1217.5022918804, - "Vacc_refreshed":170.1668415009 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15289.6429605219, - "Vacc_completed":1218.0921627258, - "Vacc_refreshed":176.8858359396 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15297.4452269777, - "Vacc_completed":1218.4916546179, - "Vacc_refreshed":177.0224757358 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15304.6068820067, - "Vacc_completed":1221.1648349639, - "Vacc_refreshed":182.8363512803 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15308.4472782837, - "Vacc_completed":1221.3254317254, - "Vacc_refreshed":188.4124431026 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15313.3535420035, - "Vacc_completed":1228.797689569, - "Vacc_refreshed":197.4958413402 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15319.6989570363, - "Vacc_completed":1230.5766158569, - "Vacc_refreshed":207.1280776834 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15329.2757609065, - "Vacc_completed":1232.5532561558, - "Vacc_refreshed":216.6030971785 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15331.3854251166, - "Vacc_completed":1240.7858568563, - "Vacc_refreshed":224.0947128601 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15335.6254694555, - "Vacc_completed":1248.7648628072, - "Vacc_refreshed":228.3914917972 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15342.4956408139, - "Vacc_completed":1253.345700271, - "Vacc_refreshed":237.7873655386 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15349.2985100866, - "Vacc_completed":1254.923228178, - "Vacc_refreshed":243.7398150729 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.0642849231, - "Vacc_completed":1256.1247258557, - "Vacc_refreshed":246.0998008594 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.3098206871, - "Vacc_completed":1258.7673082658, - "Vacc_refreshed":255.4830156808 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15350.8477668821, - "Vacc_completed":1261.8739088788, - "Vacc_refreshed":262.4150374381 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15355.0053188609, - "Vacc_completed":1268.7063064011, - "Vacc_refreshed":268.0354130392 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15356.8245202899, - "Vacc_completed":1275.6335562552, - "Vacc_refreshed":272.2800844077 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15357.7799420851, - "Vacc_completed":1276.6526923528, - "Vacc_refreshed":272.4509982396 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15360.090059624, - "Vacc_completed":1286.3717718947, - "Vacc_refreshed":276.5108897334 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15368.9251730685, - "Vacc_completed":1289.9608638772, - "Vacc_refreshed":286.1598516049 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15374.4348532349, - "Vacc_completed":1292.7431692071, - "Vacc_refreshed":286.9834989324 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15375.2266568732, - "Vacc_completed":1293.6118841564, - "Vacc_refreshed":287.1997495191 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15378.8167187789, - "Vacc_completed":1294.2472234682, - "Vacc_refreshed":293.7465776915 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15381.8183566081, - "Vacc_completed":1296.5074589754, - "Vacc_refreshed":294.394169978 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15390.3384592829, - "Vacc_completed":1298.1144038724, - "Vacc_refreshed":295.3508481166 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15397.4841102393, - "Vacc_completed":1301.7744150574, - "Vacc_refreshed":295.636121459 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15406.9128765942, - "Vacc_completed":1306.3546732411, - "Vacc_refreshed":299.2176949608 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15412.9312961067, - "Vacc_completed":1313.4112918553, - "Vacc_refreshed":304.1283567048 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15413.8396565369, - "Vacc_completed":1323.1872711778, - "Vacc_refreshed":309.3767578057 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15417.5353933956, - "Vacc_completed":1332.5570169907, - "Vacc_refreshed":310.9982936972 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15418.826072466, - "Vacc_completed":1333.4298810326, - "Vacc_refreshed":318.8191964614 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15428.6081802722, - "Vacc_completed":1335.4576305614, - "Vacc_refreshed":322.681425219 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15434.4342053135, - "Vacc_completed":1341.8151001107, - "Vacc_refreshed":328.87826872 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15442.7494739491, - "Vacc_completed":1342.4758295952, - "Vacc_refreshed":336.8125605002 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15451.9615776405, - "Vacc_completed":1343.8595431355, - "Vacc_refreshed":340.6379428895 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15461.0343740586, - "Vacc_completed":1352.0217149096, - "Vacc_refreshed":342.4652609374 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15467.8869999547, - "Vacc_completed":1353.9994636638, - "Vacc_refreshed":343.6202751504 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15474.9129704383, - "Vacc_completed":1363.3653927841, - "Vacc_refreshed":345.0578595323 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15483.483328834, - "Vacc_completed":1372.0348541584, - "Vacc_refreshed":348.4131919851 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15489.3942653446, - "Vacc_completed":1377.4077406314, - "Vacc_refreshed":355.6717942515 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15494.2503612359, - "Vacc_completed":1377.4290090401, - "Vacc_refreshed":358.9820312389 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15495.3394152185, - "Vacc_completed":1378.0321848221, - "Vacc_refreshed":364.7453207897 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15497.7000250685, - "Vacc_completed":1378.1938721933, - "Vacc_refreshed":367.9820639836 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15498.7689863883, - "Vacc_completed":1381.0445655705, - "Vacc_refreshed":371.501202086 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15501.5446144083, - "Vacc_completed":1383.5660020007, - "Vacc_refreshed":378.7475176563 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15509.8230148672, - "Vacc_completed":1390.2361319678, - "Vacc_refreshed":382.7365149116 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15516.8607244434, - "Vacc_completed":1391.5356833196, - "Vacc_refreshed":387.0287274101 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15525.4621417067, - "Vacc_completed":1391.7538408053, - "Vacc_refreshed":394.832505058 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15530.1412323442, - "Vacc_completed":1393.5856974411, - "Vacc_refreshed":402.9766589833 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15538.5266345599, - "Vacc_completed":1394.0860887346, - "Vacc_refreshed":409.427624651 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15545.1857152555, - "Vacc_completed":1400.9009375981, - "Vacc_refreshed":414.8161834543 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15550.0113840393, - "Vacc_completed":1405.1190388135, - "Vacc_refreshed":423.1492506703 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15557.7502728646, - "Vacc_completed":1412.7232837907, - "Vacc_refreshed":429.51858195 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15558.6635273277, - "Vacc_completed":1416.4367765358, - "Vacc_refreshed":433.7574702422 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15567.8923476818, - "Vacc_completed":1417.419547185, - "Vacc_refreshed":436.3988331827 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15572.0110691064, - "Vacc_completed":1422.1291332179, - "Vacc_refreshed":444.7065625402 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"15-34", - "Vacc_partially":15580.056372857, - "Vacc_completed":1429.5241883626, - "Vacc_refreshed":445.9185645116 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14604.162091487, - "Vacc_completed":1396.5367205842, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14608.6011110978, - "Vacc_completed":1403.0638750962, - "Vacc_refreshed":0.4818747518 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14617.4016613244, - "Vacc_completed":1412.4617013546, - "Vacc_refreshed":2.8841327921 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14626.8147148128, - "Vacc_completed":1413.5937989207, - "Vacc_refreshed":4.347225901 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14636.7930742671, - "Vacc_completed":1416.5445655325, - "Vacc_refreshed":10.9126558661 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14639.261920851, - "Vacc_completed":1419.7526675766, - "Vacc_refreshed":12.1285186735 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14646.6246553828, - "Vacc_completed":1429.1501916355, - "Vacc_refreshed":14.2999622979 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14655.9228453283, - "Vacc_completed":1433.2061319495, - "Vacc_refreshed":18.6765331159 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.6905295279, - "Vacc_completed":1437.4319338048, - "Vacc_refreshed":19.3435044237 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14656.8883385186, - "Vacc_completed":1446.7135497598, - "Vacc_refreshed":28.359576628 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14660.5634553543, - "Vacc_completed":1450.9111526521, - "Vacc_refreshed":38.3056947196 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14667.0822550267, - "Vacc_completed":1458.1473384005, - "Vacc_refreshed":38.8316353015 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14668.0361388154, - "Vacc_completed":1464.9440155832, - "Vacc_refreshed":44.1485629725 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14669.4679031112, - "Vacc_completed":1470.1284856322, - "Vacc_refreshed":47.7639888511 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.2618994679, - "Vacc_completed":1476.9344530457, - "Vacc_refreshed":56.361748961 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14674.3447644481, - "Vacc_completed":1477.2393580763, - "Vacc_refreshed":57.2273767339 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14684.0130216555, - "Vacc_completed":1484.3234594705, - "Vacc_refreshed":63.4497732245 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14691.8154699011, - "Vacc_completed":1492.8513113216, - "Vacc_refreshed":71.1720264341 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14697.5036031252, - "Vacc_completed":1493.7450842417, - "Vacc_refreshed":77.3635307257 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14702.599106658, - "Vacc_completed":1503.4641107157, - "Vacc_refreshed":82.0575571669 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14706.3806325115, - "Vacc_completed":1509.7236994586, - "Vacc_refreshed":82.4020129882 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14711.1723860607, - "Vacc_completed":1510.3801441147, - "Vacc_refreshed":89.5249618369 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14720.0093085987, - "Vacc_completed":1517.7733661353, - "Vacc_refreshed":99.2211580734 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14727.6474505495, - "Vacc_completed":1519.2060691793, - "Vacc_refreshed":104.7140344902 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14737.2025033477, - "Vacc_completed":1520.8147599339, - "Vacc_refreshed":111.7829864033 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14739.5787007901, - "Vacc_completed":1526.8277919335, - "Vacc_refreshed":118.2526435067 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14740.2622466128, - "Vacc_completed":1533.9654672239, - "Vacc_refreshed":121.0872593022 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.3105527103, - "Vacc_completed":1534.5209202615, - "Vacc_refreshed":130.3683956867 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14749.4386233429, - "Vacc_completed":1534.652607589, - "Vacc_refreshed":131.8609814668 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14750.7660084012, - "Vacc_completed":1541.7255942491, - "Vacc_refreshed":135.0718914562 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14754.5460710197, - "Vacc_completed":1550.2608445951, - "Vacc_refreshed":143.3620456295 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14759.0944017155, - "Vacc_completed":1555.0005459425, - "Vacc_refreshed":149.1268404613 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14765.0469016605, - "Vacc_completed":1561.0596836707, - "Vacc_refreshed":156.632878281 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14767.8747922121, - "Vacc_completed":1562.2055298685, - "Vacc_refreshed":158.7846499619 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14770.6956031505, - "Vacc_completed":1564.0912014269, - "Vacc_refreshed":160.2235512232 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14771.8405767953, - "Vacc_completed":1569.1767284097, - "Vacc_refreshed":163.0960075253 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14772.2052559189, - "Vacc_completed":1577.0342160583, - "Vacc_refreshed":171.338237261 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14775.8209952029, - "Vacc_completed":1582.4601331483, - "Vacc_refreshed":171.7811634642 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14783.195452278, - "Vacc_completed":1590.5417141678, - "Vacc_refreshed":180.3921690168 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14789.7908493035, - "Vacc_completed":1599.1828252755, - "Vacc_refreshed":184.3843375412 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14799.5061304555, - "Vacc_completed":1604.6353429891, - "Vacc_refreshed":186.9160630046 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14800.1953862328, - "Vacc_completed":1607.3418569739, - "Vacc_refreshed":194.8977352638 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14804.6194220955, - "Vacc_completed":1610.8601925588, - "Vacc_refreshed":198.1360514295 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14807.6135970058, - "Vacc_completed":1620.4676732545, - "Vacc_refreshed":199.7756827366 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14812.6404573806, - "Vacc_completed":1625.8005590907, - "Vacc_refreshed":208.9834954342 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14821.7780993542, - "Vacc_completed":1634.2191287828, - "Vacc_refreshed":218.0082295343 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14826.4757459809, - "Vacc_completed":1642.5529482935, - "Vacc_refreshed":225.0524176739 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14831.5528263871, - "Vacc_completed":1649.3317542887, - "Vacc_refreshed":229.0729255762 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14835.4543265309, - "Vacc_completed":1656.6375918093, - "Vacc_refreshed":230.6069957275 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14843.0829401722, - "Vacc_completed":1661.236165662, - "Vacc_refreshed":240.090987042 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14846.441543514, - "Vacc_completed":1663.7621214807, - "Vacc_refreshed":242.6005891297 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14852.8592673291, - "Vacc_completed":1670.5438763585, - "Vacc_refreshed":243.1550853514 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14859.7577792484, - "Vacc_completed":1671.9654195564, - "Vacc_refreshed":252.4226950148 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14860.9361402439, - "Vacc_completed":1673.0063955744, - "Vacc_refreshed":254.9337371613 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14866.4446359141, - "Vacc_completed":1680.8225588341, - "Vacc_refreshed":260.3047312661 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14873.2607186268, - "Vacc_completed":1689.7385811283, - "Vacc_refreshed":267.8936320344 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14880.5922770798, - "Vacc_completed":1689.9651236491, - "Vacc_refreshed":275.7764918768 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14887.440916863, - "Vacc_completed":1696.5525450807, - "Vacc_refreshed":283.5225421273 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14888.0132355705, - "Vacc_completed":1703.9968022938, - "Vacc_refreshed":284.1554601622 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14897.4895745985, - "Vacc_completed":1707.7124979313, - "Vacc_refreshed":293.9654633907 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14900.9132287675, - "Vacc_completed":1714.1256328363, - "Vacc_refreshed":300.1498047442 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14907.9968139113, - "Vacc_completed":1717.9722882107, - "Vacc_refreshed":303.8260258963 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14914.3000727157, - "Vacc_completed":1723.7459149842, - "Vacc_refreshed":310.6001358466 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14915.2709520902, - "Vacc_completed":1725.3728171833, - "Vacc_refreshed":311.7419250413 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14924.9251049714, - "Vacc_completed":1730.3968331067, - "Vacc_refreshed":318.9914066325 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14929.9737051543, - "Vacc_completed":1735.419819131, - "Vacc_refreshed":327.2769475594 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.0867908297, - "Vacc_completed":1735.4531164502, - "Vacc_refreshed":333.9507530528 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14930.1585043075, - "Vacc_completed":1744.7112606784, - "Vacc_refreshed":337.8096837232 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14939.2420152133, - "Vacc_completed":1745.8678859662, - "Vacc_refreshed":344.4742142552 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14940.9708787633, - "Vacc_completed":1748.1937727819, - "Vacc_refreshed":352.7895987096 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14950.0282400838, - "Vacc_completed":1750.2751748343, - "Vacc_refreshed":354.0652893483 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14956.5498846765, - "Vacc_completed":1758.7641351746, - "Vacc_refreshed":361.0736440858 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14957.5908121778, - "Vacc_completed":1763.4528309235, - "Vacc_refreshed":364.3501912771 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14960.7281563782, - "Vacc_completed":1772.006809538, - "Vacc_refreshed":364.6804469838 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14969.2457673746, - "Vacc_completed":1776.5678522654, - "Vacc_refreshed":374.4882812856 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14974.8615073088, - "Vacc_completed":1779.9556763371, - "Vacc_refreshed":377.4421123342 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14984.5914886251, - "Vacc_completed":1782.6146675026, - "Vacc_refreshed":381.2082916917 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14987.5876984189, - "Vacc_completed":1791.1028428437, - "Vacc_refreshed":385.3294438436 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.58002825, - "Vacc_completed":1793.9473770292, - "Vacc_refreshed":388.9073184565 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14992.8771499871, - "Vacc_completed":1796.0612762347, - "Vacc_refreshed":390.0186176392 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14993.5505864267, - "Vacc_completed":1798.6017730753, - "Vacc_refreshed":390.5734438836 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":14998.158414122, - "Vacc_completed":1802.0655230464, - "Vacc_refreshed":391.8649823662 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.4313521872, - "Vacc_completed":1804.413054883, - "Vacc_refreshed":395.3533451537 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15001.7989985243, - "Vacc_completed":1812.4490035114, - "Vacc_refreshed":401.8191046925 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15002.2088852954, - "Vacc_completed":1814.4865305652, - "Vacc_refreshed":409.5825438963 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15008.2705384657, - "Vacc_completed":1823.0023861142, - "Vacc_refreshed":411.4567502649 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15013.4515790087, - "Vacc_completed":1830.5873803301, - "Vacc_refreshed":417.6053918266 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15022.965858679, - "Vacc_completed":1833.2575088513, - "Vacc_refreshed":421.7562400513 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15024.3362350043, - "Vacc_completed":1839.0848659035, - "Vacc_refreshed":429.2321579029 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15025.0436784182, - "Vacc_completed":1840.7238800201, - "Vacc_refreshed":434.1256619822 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15026.1929816575, - "Vacc_completed":1848.4826094697, - "Vacc_refreshed":436.1767563509 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"35-59", - "Vacc_partially":15028.1115762872, - "Vacc_completed":1851.353962867, - "Vacc_refreshed":439.6190575403 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12940.2728292563, - "Vacc_completed":1761.2082450081, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12944.552426313, - "Vacc_completed":1763.9916052944, - "Vacc_refreshed":5.8453121761 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12946.2293033065, - "Vacc_completed":1764.8651614651, - "Vacc_refreshed":11.3614134516 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12954.4553975676, - "Vacc_completed":1773.9720915654, - "Vacc_refreshed":19.8633846559 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12962.1675537316, - "Vacc_completed":1776.6871749169, - "Vacc_refreshed":23.5340750877 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12970.2114807284, - "Vacc_completed":1779.4482697767, - "Vacc_refreshed":32.7047145334 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12971.1155781651, - "Vacc_completed":1787.6912361171, - "Vacc_refreshed":41.3859214133 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12976.1479148685, - "Vacc_completed":1796.0609011819, - "Vacc_refreshed":49.2224218631 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12985.389251021, - "Vacc_completed":1806.0439647379, - "Vacc_refreshed":58.4565372826 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12987.6528992192, - "Vacc_completed":1814.2136648594, - "Vacc_refreshed":68.4133404236 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12988.8953336446, - "Vacc_completed":1820.4740554862, - "Vacc_refreshed":69.4164203636 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12989.930788247, - "Vacc_completed":1825.1779692151, - "Vacc_refreshed":71.594311523 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12993.9481590439, - "Vacc_completed":1834.4690603586, - "Vacc_refreshed":75.4387792504 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12997.41102572, - "Vacc_completed":1836.6145856268, - "Vacc_refreshed":81.7875242048 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":12999.5337504327, - "Vacc_completed":1839.9662175544, - "Vacc_refreshed":87.9455065083 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13007.2251436977, - "Vacc_completed":1842.6498922014, - "Vacc_refreshed":93.1900542901 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13012.0856312446, - "Vacc_completed":1844.701996872, - "Vacc_refreshed":99.712698674 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13021.33252246, - "Vacc_completed":1849.3061445307, - "Vacc_refreshed":102.5319545699 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13027.1500152398, - "Vacc_completed":1850.8078304213, - "Vacc_refreshed":105.0259857828 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13035.650988116, - "Vacc_completed":1851.8577100095, - "Vacc_refreshed":110.1445342625 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13042.2123284129, - "Vacc_completed":1856.2056162281, - "Vacc_refreshed":113.6459186876 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13048.5274669921, - "Vacc_completed":1856.9596604869, - "Vacc_refreshed":119.7006093985 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13056.4261041722, - "Vacc_completed":1859.9946313318, - "Vacc_refreshed":128.4930741519 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13061.2580735831, - "Vacc_completed":1864.4241013454, - "Vacc_refreshed":129.4122729818 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13069.8769575412, - "Vacc_completed":1870.828968765, - "Vacc_refreshed":133.5606697443 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13074.4847352314, - "Vacc_completed":1873.0576602324, - "Vacc_refreshed":142.5189975609 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13077.43910001, - "Vacc_completed":1881.1763507471, - "Vacc_refreshed":143.4948395736 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13082.3470601758, - "Vacc_completed":1888.5808588713, - "Vacc_refreshed":149.0381282873 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13091.0962170402, - "Vacc_completed":1894.9989493108, - "Vacc_refreshed":149.7527355276 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13097.0655225667, - "Vacc_completed":1904.9660517959, - "Vacc_refreshed":155.7716165644 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13105.8431803144, - "Vacc_completed":1907.1233275333, - "Vacc_refreshed":162.7399373626 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13110.9052745957, - "Vacc_completed":1915.3369502585, - "Vacc_refreshed":166.1686970271 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13120.2888484357, - "Vacc_completed":1924.594235894, - "Vacc_refreshed":174.1871820852 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13122.2684309305, - "Vacc_completed":1926.8954039089, - "Vacc_refreshed":179.1800373951 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13129.679389954, - "Vacc_completed":1929.8687720822, - "Vacc_refreshed":186.5609898946 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13136.2121968271, - "Vacc_completed":1930.5419008182, - "Vacc_refreshed":190.3285119819 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13140.8693305096, - "Vacc_completed":1933.1368513989, - "Vacc_refreshed":199.5045342081 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13141.6505152789, - "Vacc_completed":1938.3539275062, - "Vacc_refreshed":199.9231054484 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13146.3819720109, - "Vacc_completed":1943.0787615053, - "Vacc_refreshed":203.5617342411 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.5833925737, - "Vacc_completed":1944.8505615419, - "Vacc_refreshed":206.5254255239 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13155.8864321418, - "Vacc_completed":1946.7574709443, - "Vacc_refreshed":208.0171497057 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13160.8319905342, - "Vacc_completed":1949.6926878806, - "Vacc_refreshed":213.0797703475 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13165.109826694, - "Vacc_completed":1955.2468047197, - "Vacc_refreshed":222.6760329578 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13168.7847714036, - "Vacc_completed":1956.1809363506, - "Vacc_refreshed":231.6808966253 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13176.0869758252, - "Vacc_completed":1960.8024990411, - "Vacc_refreshed":233.4328765098 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13180.123104626, - "Vacc_completed":1969.8047949709, - "Vacc_refreshed":241.5696524948 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13184.6423078124, - "Vacc_completed":1974.8566545144, - "Vacc_refreshed":250.4550885677 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13190.9452560841, - "Vacc_completed":1975.9346724558, - "Vacc_refreshed":252.799671753 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13194.9586490897, - "Vacc_completed":1984.1998929758, - "Vacc_refreshed":256.8657355625 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13203.1981501018, - "Vacc_completed":1992.2264996957, - "Vacc_refreshed":262.7110996677 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13210.570704838, - "Vacc_completed":2000.1284432323, - "Vacc_refreshed":268.7466273707 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13217.6966464936, - "Vacc_completed":2001.108779963, - "Vacc_refreshed":270.063420564 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13222.8454105611, - "Vacc_completed":2006.445790007, - "Vacc_refreshed":272.306211944 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13231.9459038211, - "Vacc_completed":2014.1245558198, - "Vacc_refreshed":274.2682102675 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.4430744102, - "Vacc_completed":2021.01783734, - "Vacc_refreshed":283.272422859 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13234.9880313892, - "Vacc_completed":2021.3278488109, - "Vacc_refreshed":288.8833613171 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13244.1020800967, - "Vacc_completed":2028.5342497408, - "Vacc_refreshed":295.5476346222 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13246.2035006005, - "Vacc_completed":2034.7337820973, - "Vacc_refreshed":295.8527619766 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13250.3034672718, - "Vacc_completed":2040.4526371692, - "Vacc_refreshed":297.6289642024 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13258.1309651863, - "Vacc_completed":2043.9166550693, - "Vacc_refreshed":307.2590005259 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13264.00554028, - "Vacc_completed":2046.5596745193, - "Vacc_refreshed":309.1250398792 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.4212557374, - "Vacc_completed":2049.7116443058, - "Vacc_refreshed":314.0515587013 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13272.7885616679, - "Vacc_completed":2051.2982177338, - "Vacc_refreshed":320.3832182075 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13274.2264538665, - "Vacc_completed":2058.2989667129, - "Vacc_refreshed":323.7063680074 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13281.9141553951, - "Vacc_completed":2063.8206751836, - "Vacc_refreshed":326.9158074422 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13290.64171309, - "Vacc_completed":2064.3110765988, - "Vacc_refreshed":336.7710359746 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.1885069646, - "Vacc_completed":2072.8766922561, - "Vacc_refreshed":344.574816718 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13291.7117921559, - "Vacc_completed":2081.2889195134, - "Vacc_refreshed":352.6791052892 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13295.741331211, - "Vacc_completed":2082.371745109, - "Vacc_refreshed":358.7062427923 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13303.8543248793, - "Vacc_completed":2084.7970217381, - "Vacc_refreshed":363.3629273081 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13305.910901253, - "Vacc_completed":2089.496376583, - "Vacc_refreshed":364.4184919111 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13310.1770755649, - "Vacc_completed":2091.8877772854, - "Vacc_refreshed":373.8861441424 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13318.5822731817, - "Vacc_completed":2100.0656871327, - "Vacc_refreshed":380.7622590612 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13326.848015265, - "Vacc_completed":2103.7807367097, - "Vacc_refreshed":383.494468406 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13329.8351558424, - "Vacc_completed":2106.3811743673, - "Vacc_refreshed":385.7094999088 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13334.0243800891, - "Vacc_completed":2110.0143078684, - "Vacc_refreshed":387.028737638 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13340.0473805148, - "Vacc_completed":2114.17877764, - "Vacc_refreshed":390.7872507231 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13342.4710995253, - "Vacc_completed":2117.5584807218, - "Vacc_refreshed":394.4459716696 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13345.9586603577, - "Vacc_completed":2124.6343373595, - "Vacc_refreshed":401.3739608899 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13354.1694340722, - "Vacc_completed":2132.584533812, - "Vacc_refreshed":404.149558168 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13360.0480186273, - "Vacc_completed":2135.2279773256, - "Vacc_refreshed":407.0589420913 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13362.9287822042, - "Vacc_completed":2135.7661733179, - "Vacc_refreshed":412.3495727781 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13365.9702033874, - "Vacc_completed":2140.0801351424, - "Vacc_refreshed":414.1173144704 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13375.8578305813, - "Vacc_completed":2147.1687721976, - "Vacc_refreshed":416.1274613074 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.3434411484, - "Vacc_completed":2149.6360498231, - "Vacc_refreshed":422.5420941028 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13384.8386238776, - "Vacc_completed":2156.2105881723, - "Vacc_refreshed":428.2913369026 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13388.7750604929, - "Vacc_completed":2160.929719286, - "Vacc_refreshed":437.0909930573 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13397.0959920005, - "Vacc_completed":2169.0772334568, - "Vacc_refreshed":438.0782576038 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13406.1913483212, - "Vacc_completed":2172.8397968306, - "Vacc_refreshed":445.0079409299 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13410.1064630998, - "Vacc_completed":2179.4067803849, - "Vacc_refreshed":453.2550919609 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.2872479216, - "Vacc_completed":2183.7956163614, - "Vacc_refreshed":462.0847473084 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"60-79", - "Vacc_partially":13418.7274837683, - "Vacc_completed":2186.2625889833, - "Vacc_refreshed":470.3671533805 - }, - { - "Date":"2020-10-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15108.1816487494, - "Vacc_completed":1951.3500240632, - "Vacc_refreshed":0 - }, - { - "Date":"2020-10-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15112.0388992614, - "Vacc_completed":1956.8484422205, - "Vacc_refreshed":4.7764537598 - }, - { - "Date":"2020-10-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15115.1174991099, - "Vacc_completed":1961.6166149519, - "Vacc_refreshed":11.6778924479 - }, - { - "Date":"2020-10-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15121.0352670933, - "Vacc_completed":1969.039883077, - "Vacc_refreshed":19.464449507 - }, - { - "Date":"2020-10-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15130.8297777562, - "Vacc_completed":1970.7344191294, - "Vacc_refreshed":28.0813773392 - }, - { - "Date":"2020-10-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15139.7963570637, - "Vacc_completed":1971.420038313, - "Vacc_refreshed":34.2304461363 - }, - { - "Date":"2020-10-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15149.3578353885, - "Vacc_completed":1977.7986093705, - "Vacc_refreshed":42.9385547047 - }, - { - "Date":"2020-10-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15150.8906121637, - "Vacc_completed":1981.6633590428, - "Vacc_refreshed":46.0030569507 - }, - { - "Date":"2020-10-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15153.3987479409, - "Vacc_completed":1986.7151251441, - "Vacc_refreshed":54.9967129669 - }, - { - "Date":"2020-10-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15155.2112066, - "Vacc_completed":1993.3668502516, - "Vacc_refreshed":59.2446234015 - }, - { - "Date":"2020-10-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15157.213160056, - "Vacc_completed":2000.1282773775, - "Vacc_refreshed":61.576334937 - }, - { - "Date":"2020-10-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15159.7206353696, - "Vacc_completed":2000.5786646957, - "Vacc_refreshed":62.4328961844 - }, - { - "Date":"2020-10-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15165.6048851908, - "Vacc_completed":2000.600816545, - "Vacc_refreshed":70.2254449832 - }, - { - "Date":"2020-10-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15175.5401574577, - "Vacc_completed":2003.6984716795, - "Vacc_refreshed":80.0202808521 - }, - { - "Date":"2020-10-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15178.2193352397, - "Vacc_completed":2010.5259174304, - "Vacc_refreshed":80.5289834705 - }, - { - "Date":"2020-10-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15186.1911779287, - "Vacc_completed":2020.3094769054, - "Vacc_refreshed":88.939485925 - }, - { - "Date":"2020-10-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15192.9408650715, - "Vacc_completed":2027.102138126, - "Vacc_refreshed":93.403990271 - }, - { - "Date":"2020-10-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15197.2522804828, - "Vacc_completed":2033.1768424672, - "Vacc_refreshed":103.3495680716 - }, - { - "Date":"2020-10-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15201.4718571012, - "Vacc_completed":2041.9289374755, - "Vacc_refreshed":107.0046191576 - }, - { - "Date":"2020-10-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15203.6899934618, - "Vacc_completed":2042.5550193085, - "Vacc_refreshed":108.1692912263 - }, - { - "Date":"2020-10-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15210.5751055, - "Vacc_completed":2049.1508387429, - "Vacc_refreshed":115.4885047404 - }, - { - "Date":"2020-10-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15216.3570734734, - "Vacc_completed":2052.3213561982, - "Vacc_refreshed":119.2061326333 - }, - { - "Date":"2020-10-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15225.8779749457, - "Vacc_completed":2057.4663468474, - "Vacc_refreshed":126.226397743 - }, - { - "Date":"2020-10-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15230.8206176005, - "Vacc_completed":2064.8586744443, - "Vacc_refreshed":133.0501812916 - }, - { - "Date":"2020-10-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15231.8828151205, - "Vacc_completed":2068.2097593649, - "Vacc_refreshed":142.0174284746 - }, - { - "Date":"2020-10-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15238.2426035555, - "Vacc_completed":2071.8714182096, - "Vacc_refreshed":148.7355853512 - }, - { - "Date":"2020-10-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15247.7928253295, - "Vacc_completed":2078.7188555952, - "Vacc_refreshed":156.2462830057 - }, - { - "Date":"2020-10-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15257.1929610505, - "Vacc_completed":2083.6123346127, - "Vacc_refreshed":163.8060000189 - }, - { - "Date":"2020-10-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15261.4225446127, - "Vacc_completed":2092.4315663384, - "Vacc_refreshed":165.098643188 - }, - { - "Date":"2020-10-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15264.9230201438, - "Vacc_completed":2098.3647861992, - "Vacc_refreshed":173.1581071885 - }, - { - "Date":"2020-10-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15274.2090277291, - "Vacc_completed":2098.6684198619, - "Vacc_refreshed":179.3045017397 - }, - { - "Date":"2020-11-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15275.4881156514, - "Vacc_completed":2104.7296501443, - "Vacc_refreshed":184.3873991738 - }, - { - "Date":"2020-11-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.4296689803, - "Vacc_completed":2109.0258070133, - "Vacc_refreshed":190.3361011534 - }, - { - "Date":"2020-11-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15277.7641225132, - "Vacc_completed":2111.2503398848, - "Vacc_refreshed":196.3057900505 - }, - { - "Date":"2020-11-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15280.5288668271, - "Vacc_completed":2120.2846622436, - "Vacc_refreshed":201.8816019943 - }, - { - "Date":"2020-11-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15286.6794056665, - "Vacc_completed":2127.5294418815, - "Vacc_refreshed":205.8247713924 - }, - { - "Date":"2020-11-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15287.919376399, - "Vacc_completed":2127.7213986428, - "Vacc_refreshed":207.0848824799 - }, - { - "Date":"2020-11-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15288.8972252423, - "Vacc_completed":2131.7043154907, - "Vacc_refreshed":214.6605013946 - }, - { - "Date":"2020-11-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15295.1676694583, - "Vacc_completed":2141.6853776317, - "Vacc_refreshed":217.321705385 - }, - { - "Date":"2020-11-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.8279320379, - "Vacc_completed":2150.6081907236, - "Vacc_refreshed":224.1814306469 - }, - { - "Date":"2020-11-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15299.9502690873, - "Vacc_completed":2150.8297260642, - "Vacc_refreshed":224.2857175024 - }, - { - "Date":"2020-11-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15305.4629063272, - "Vacc_completed":2159.4075137345, - "Vacc_refreshed":226.4536786248 - }, - { - "Date":"2020-11-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15313.0091699117, - "Vacc_completed":2160.0885470064, - "Vacc_refreshed":232.5677391068 - }, - { - "Date":"2020-11-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15316.6742133238, - "Vacc_completed":2163.6640679748, - "Vacc_refreshed":242.4458167027 - }, - { - "Date":"2020-11-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15325.7736410299, - "Vacc_completed":2171.6222500116, - "Vacc_refreshed":251.5591803171 - }, - { - "Date":"2020-11-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15333.3685319398, - "Vacc_completed":2174.4162160121, - "Vacc_refreshed":254.1541702573 - }, - { - "Date":"2020-11-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15337.5758896556, - "Vacc_completed":2180.7560110181, - "Vacc_refreshed":255.4491825287 - }, - { - "Date":"2020-11-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15346.8261947795, - "Vacc_completed":2184.562660479, - "Vacc_refreshed":256.0794667401 - }, - { - "Date":"2020-11-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15347.5063487999, - "Vacc_completed":2192.7053918922, - "Vacc_refreshed":264.8657432896 - }, - { - "Date":"2020-11-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15355.2915215882, - "Vacc_completed":2197.3639423288, - "Vacc_refreshed":266.2003474583 - }, - { - "Date":"2020-11-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15357.0291297717, - "Vacc_completed":2203.5668703416, - "Vacc_refreshed":266.2591235692 - }, - { - "Date":"2020-11-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15363.7351300479, - "Vacc_completed":2212.51470716, - "Vacc_refreshed":268.1554009506 - }, - { - "Date":"2020-11-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15366.2054877706, - "Vacc_completed":2220.7805776981, - "Vacc_refreshed":270.2429125628 - }, - { - "Date":"2020-11-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15374.7828886007, - "Vacc_completed":2223.4779151007, - "Vacc_refreshed":271.3258668517 - }, - { - "Date":"2020-11-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15375.8644766411, - "Vacc_completed":2223.902202818, - "Vacc_refreshed":277.3418287874 - }, - { - "Date":"2020-11-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15384.0103684975, - "Vacc_completed":2233.2600148125, - "Vacc_refreshed":286.2795142721 - }, - { - "Date":"2020-11-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15388.2433647335, - "Vacc_completed":2242.2405085188, - "Vacc_refreshed":295.9058348626 - }, - { - "Date":"2020-11-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15395.874552707, - "Vacc_completed":2242.5126967683, - "Vacc_refreshed":297.0217883024 - }, - { - "Date":"2020-11-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15399.399317417, - "Vacc_completed":2250.19318626, - "Vacc_refreshed":297.4497074595 - }, - { - "Date":"2020-11-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15407.4994879004, - "Vacc_completed":2258.8146667712, - "Vacc_refreshed":302.8025504676 - }, - { - "Date":"2020-11-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15410.1346998553, - "Vacc_completed":2259.5361618465, - "Vacc_refreshed":305.0699464575 - }, - { - "Date":"2020-12-01", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15415.5662938607, - "Vacc_completed":2266.2419298528, - "Vacc_refreshed":306.5583985118 - }, - { - "Date":"2020-12-02", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15424.362408066, - "Vacc_completed":2270.6973906417, - "Vacc_refreshed":307.7300944183 - }, - { - "Date":"2020-12-03", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15427.4641661532, - "Vacc_completed":2273.4475287465, - "Vacc_refreshed":315.9257071161 - }, - { - "Date":"2020-12-04", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15430.3003374401, - "Vacc_completed":2280.4953549554, - "Vacc_refreshed":320.4057109928 - }, - { - "Date":"2020-12-05", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15434.7161891817, - "Vacc_completed":2283.6641990131, - "Vacc_refreshed":329.6425079267 - }, - { - "Date":"2020-12-06", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15439.6389263804, - "Vacc_completed":2286.269595866, - "Vacc_refreshed":336.6032551175 - }, - { - "Date":"2020-12-07", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.607595077, - "Vacc_completed":2292.1795115763, - "Vacc_refreshed":339.4752869467 - }, - { - "Date":"2020-12-08", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15445.7317234732, - "Vacc_completed":2299.0428376394, - "Vacc_refreshed":342.2213588852 - }, - { - "Date":"2020-12-09", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15448.8137925508, - "Vacc_completed":2303.3104194582, - "Vacc_refreshed":346.3780017598 - }, - { - "Date":"2020-12-10", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15449.4812178935, - "Vacc_completed":2311.9261799324, - "Vacc_refreshed":351.1765190663 - }, - { - "Date":"2020-12-11", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9089483618, - "Vacc_completed":2315.5711542884, - "Vacc_refreshed":352.532745084 - }, - { - "Date":"2020-12-12", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15457.9943266817, - "Vacc_completed":2322.1716179078, - "Vacc_refreshed":355.0774800773 - }, - { - "Date":"2020-12-13", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15459.7074068986, - "Vacc_completed":2323.3027059178, - "Vacc_refreshed":364.5645466744 - }, - { - "Date":"2020-12-14", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15465.686171573, - "Vacc_completed":2325.8040208828, - "Vacc_refreshed":365.9637341301 - }, - { - "Date":"2020-12-15", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15466.2025927257, - "Vacc_completed":2332.7537065257, - "Vacc_refreshed":366.2841969775 - }, - { - "Date":"2020-12-16", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15471.0643499093, - "Vacc_completed":2333.7718947218, - "Vacc_refreshed":370.7174701468 - }, - { - "Date":"2020-12-17", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15480.1820736709, - "Vacc_completed":2336.425519339, - "Vacc_refreshed":378.1719392306 - }, - { - "Date":"2020-12-18", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15489.2619602904, - "Vacc_completed":2342.4314320637, - "Vacc_refreshed":382.1070985379 - }, - { - "Date":"2020-12-19", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15497.197059921, - "Vacc_completed":2351.5508059781, - "Vacc_refreshed":390.0131449372 - }, - { - "Date":"2020-12-20", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15506.8997820546, - "Vacc_completed":2354.7951207515, - "Vacc_refreshed":397.4755552416 - }, - { - "Date":"2020-12-21", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15514.6356932026, - "Vacc_completed":2359.4543858263, - "Vacc_refreshed":405.5265192328 - }, - { - "Date":"2020-12-22", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15517.1065215082, - "Vacc_completed":2362.3705119741, - "Vacc_refreshed":406.2503084488 - }, - { - "Date":"2020-12-23", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15526.1890623234, - "Vacc_completed":2369.2123027947, - "Vacc_refreshed":407.9863557734 - }, - { - "Date":"2020-12-24", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15529.1257916241, - "Vacc_completed":2371.0230854052, - "Vacc_refreshed":415.4330021443 - }, - { - "Date":"2020-12-25", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15534.1422800755, - "Vacc_completed":2376.4314141852, - "Vacc_refreshed":417.8710629027 - }, - { - "Date":"2020-12-26", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15536.9779956012, - "Vacc_completed":2380.9412020655, - "Vacc_refreshed":418.6065556413 - }, - { - "Date":"2020-12-27", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15542.623117778, - "Vacc_completed":2383.2295524317, - "Vacc_refreshed":425.5318613018 - }, - { - "Date":"2020-12-28", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15545.7349127212, - "Vacc_completed":2388.7438112703, - "Vacc_refreshed":435.2708995295 - }, - { - "Date":"2020-12-29", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15552.7663039717, - "Vacc_completed":2398.7179519564, - "Vacc_refreshed":436.7806978293 - }, - { - "Date":"2020-12-30", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15553.9038494269, - "Vacc_completed":2401.9470135031, - "Vacc_refreshed":445.294989416 - }, - { - "Date":"2020-12-31", - "ID_County":1002, - "Age_RKI":"80-99", - "Vacc_partially":15563.5219522465, - "Vacc_completed":2408.3277109489, - "Vacc_refreshed":449.1868908695 + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14093.5670993244, + "Vacc_completed": 1058.2133302677, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14094.6780758432, + "Vacc_completed": 1058.2386490178, + "Vacc_refreshed": 3.9480185817, + "Vacc_refreshed_2": 1.97400929085 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14102.3458622773, + "Vacc_completed": 1063.1811826304, + "Vacc_refreshed": 7.8235846725, + "Vacc_refreshed_2": 3.91179233625 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14106.0158477852, + "Vacc_completed": 1071.0829580916, + "Vacc_refreshed": 13.0365435255, + "Vacc_refreshed_2": 6.51827176275 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14115.8958402416, + "Vacc_completed": 1072.5136218055, + "Vacc_refreshed": 15.4582843201, + "Vacc_refreshed_2": 7.72914216005 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14116.0603009948, + "Vacc_completed": 1080.8706574256, + "Vacc_refreshed": 22.3037298829, + "Vacc_refreshed_2": 11.15186494145 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14124.4849162097, + "Vacc_completed": 1087.4957123195, + "Vacc_refreshed": 27.7666004775, + "Vacc_refreshed_2": 13.88330023875 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14132.812800891, + "Vacc_completed": 1094.2936630058, + "Vacc_refreshed": 29.4212640594, + "Vacc_refreshed_2": 14.7106320297 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14139.2772895404, + "Vacc_completed": 1100.1665827188, + "Vacc_refreshed": 29.4568827793, + "Vacc_refreshed_2": 14.72844138965 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14145.4868397119, + "Vacc_completed": 1105.3345419667, + "Vacc_refreshed": 34.7217238502, + "Vacc_refreshed_2": 17.3608619251 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14147.7480966959, + "Vacc_completed": 1111.2289166538, + "Vacc_refreshed": 34.771310214, + "Vacc_refreshed_2": 17.385655107 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14154.5204084505, + "Vacc_completed": 1114.7870563855, + "Vacc_refreshed": 41.8898823514, + "Vacc_refreshed_2": 20.9449411757 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14155.4472543415, + "Vacc_completed": 1124.6385432496, + "Vacc_refreshed": 48.6348857735, + "Vacc_refreshed_2": 24.31744288675 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14162.2764203336, + "Vacc_completed": 1128.54825128, + "Vacc_refreshed": 48.7694054724, + "Vacc_refreshed_2": 24.3847027362 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14163.6229511244, + "Vacc_completed": 1128.7143765883, + "Vacc_refreshed": 53.2059941772, + "Vacc_refreshed_2": 26.6029970886 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14170.704731349, + "Vacc_completed": 1138.0466956792, + "Vacc_refreshed": 59.0394633797, + "Vacc_refreshed_2": 29.51973168985 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14177.9754226866, + "Vacc_completed": 1144.8391611423, + "Vacc_refreshed": 68.7607294969, + "Vacc_refreshed_2": 34.38036474845 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14180.6917277285, + "Vacc_completed": 1145.8477444825, + "Vacc_refreshed": 68.9221667424, + "Vacc_refreshed_2": 34.4610833712 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14183.6510488722, + "Vacc_completed": 1148.5261706572, + "Vacc_refreshed": 74.1781085786, + "Vacc_refreshed_2": 37.0890542893 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14187.685478561, + "Vacc_completed": 1156.317724845, + "Vacc_refreshed": 82.4605426733, + "Vacc_refreshed_2": 41.23027133665 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14190.8756861073, + "Vacc_completed": 1158.3230049846, + "Vacc_refreshed": 85.9686058349, + "Vacc_refreshed_2": 42.98430291745 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14194.7125443701, + "Vacc_completed": 1162.8869701267, + "Vacc_refreshed": 86.9745448839, + "Vacc_refreshed_2": 43.48727244195 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14198.1736788429, + "Vacc_completed": 1172.5122981568, + "Vacc_refreshed": 87.3520867387, + "Vacc_refreshed_2": 43.67604336935 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14200.0337444888, + "Vacc_completed": 1173.9022323601, + "Vacc_refreshed": 96.1323881978, + "Vacc_refreshed_2": 48.0661940989 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14209.9091251899, + "Vacc_completed": 1180.4819879148, + "Vacc_refreshed": 102.8081520102, + "Vacc_refreshed_2": 51.4040760051 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14215.7510791988, + "Vacc_completed": 1187.6749019896, + "Vacc_refreshed": 111.0676626302, + "Vacc_refreshed_2": 55.5338313151 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14216.891975169, + "Vacc_completed": 1194.8246181318, + "Vacc_refreshed": 112.2172983632, + "Vacc_refreshed_2": 56.1086491816 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14226.1128719795, + "Vacc_completed": 1199.3288757923, + "Vacc_refreshed": 115.0035825103, + "Vacc_refreshed_2": 57.50179125515 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14234.2678640476, + "Vacc_completed": 1200.3667784603, + "Vacc_refreshed": 122.2552339507, + "Vacc_refreshed_2": 61.12761697535 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14236.1003192184, + "Vacc_completed": 1204.1967603181, + "Vacc_refreshed": 127.0429292216, + "Vacc_refreshed_2": 63.5214646108 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14242.538633822, + "Vacc_completed": 1212.5454877324, + "Vacc_refreshed": 134.6939665016, + "Vacc_refreshed_2": 67.3469832508 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14244.3387278104, + "Vacc_completed": 1213.6034702862, + "Vacc_refreshed": 136.0920891424, + "Vacc_refreshed_2": 68.0460445712 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14251.4120506037, + "Vacc_completed": 1216.4725302456, + "Vacc_refreshed": 140.2813449601, + "Vacc_refreshed_2": 70.14067248005 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14260.7111088561, + "Vacc_completed": 1223.9349650326, + "Vacc_refreshed": 144.4607939662, + "Vacc_refreshed_2": 72.2303969831 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.4310619138, + "Vacc_completed": 1230.2964929538, + "Vacc_refreshed": 149.281965675, + "Vacc_refreshed_2": 74.6409828375 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.8430243455, + "Vacc_completed": 1233.791799902, + "Vacc_refreshed": 152.843700775, + "Vacc_refreshed_2": 76.4218503875 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14270.6723528208, + "Vacc_completed": 1235.7852283109, + "Vacc_refreshed": 158.6087157945, + "Vacc_refreshed_2": 79.30435789725 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14276.398217781, + "Vacc_completed": 1244.1189399585, + "Vacc_refreshed": 161.780101215, + "Vacc_refreshed_2": 80.8900506075 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14282.7632141243, + "Vacc_completed": 1252.4246776385, + "Vacc_refreshed": 164.4087953839, + "Vacc_refreshed_2": 82.20439769195 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14285.2172118541, + "Vacc_completed": 1253.0967186007, + "Vacc_refreshed": 165.7333648079, + "Vacc_refreshed_2": 82.86668240395 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14288.3981413127, + "Vacc_completed": 1261.2285273698, + "Vacc_refreshed": 175.6751183454, + "Vacc_refreshed_2": 87.8375591727 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14296.6990830234, + "Vacc_completed": 1261.8928424603, + "Vacc_refreshed": 181.3746988194, + "Vacc_refreshed_2": 90.6873494097 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14304.9324135674, + "Vacc_completed": 1268.1858225933, + "Vacc_refreshed": 182.8207287588, + "Vacc_refreshed_2": 91.4103643794 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14312.7990335985, + "Vacc_completed": 1270.8693167453, + "Vacc_refreshed": 192.6352794711, + "Vacc_refreshed_2": 96.31763973555 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14316.0317804647, + "Vacc_completed": 1276.8328604136, + "Vacc_refreshed": 199.109084232, + "Vacc_refreshed_2": 99.554542116 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14317.8224126817, + "Vacc_completed": 1285.9345839202, + "Vacc_refreshed": 204.9564534429, + "Vacc_refreshed_2": 102.47822672145 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14319.969225103, + "Vacc_completed": 1292.0814432843, + "Vacc_refreshed": 209.3116185701, + "Vacc_refreshed_2": 104.65580928505 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14325.5010146205, + "Vacc_completed": 1296.8562638588, + "Vacc_refreshed": 214.164106287, + "Vacc_refreshed_2": 107.0820531435 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14334.64723979, + "Vacc_completed": 1299.2846390455, + "Vacc_refreshed": 215.8187786169, + "Vacc_refreshed_2": 107.90938930845 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14341.3416549169, + "Vacc_completed": 1307.3997120401, + "Vacc_refreshed": 220.1718442512, + "Vacc_refreshed_2": 110.0859221256 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14349.3146443239, + "Vacc_completed": 1309.8026404332, + "Vacc_refreshed": 222.9315364644, + "Vacc_refreshed_2": 111.4657682322 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14359.2839765392, + "Vacc_completed": 1313.6592234511, + "Vacc_refreshed": 226.6469703335, + "Vacc_refreshed_2": 113.32348516675 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14365.2176903694, + "Vacc_completed": 1319.2137305156, + "Vacc_refreshed": 227.7079880211, + "Vacc_refreshed_2": 113.85399401055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14372.2949635005, + "Vacc_completed": 1325.3928078641, + "Vacc_refreshed": 234.0214496372, + "Vacc_refreshed_2": 117.0107248186 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14377.1100641854, + "Vacc_completed": 1326.7384263101, + "Vacc_refreshed": 242.1400638609, + "Vacc_refreshed_2": 121.07003193045 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14381.7559278649, + "Vacc_completed": 1329.4413693873, + "Vacc_refreshed": 246.2374710913, + "Vacc_refreshed_2": 123.11873554565 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14385.7162526455, + "Vacc_completed": 1338.1839321545, + "Vacc_refreshed": 252.0149200475, + "Vacc_refreshed_2": 126.00746002375 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14389.4326934411, + "Vacc_completed": 1345.9094675595, + "Vacc_refreshed": 256.9046042339, + "Vacc_refreshed_2": 128.45230211695 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14391.2007554132, + "Vacc_completed": 1348.71606757, + "Vacc_refreshed": 258.1776032516, + "Vacc_refreshed_2": 129.0888016258 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14394.8621297613, + "Vacc_completed": 1354.2416050796, + "Vacc_refreshed": 267.8589065036, + "Vacc_refreshed_2": 133.9294532518 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.3456243909, + "Vacc_completed": 1359.868800934, + "Vacc_refreshed": 270.9855298163, + "Vacc_refreshed_2": 135.49276490815 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.4645205246, + "Vacc_completed": 1363.0538159145, + "Vacc_refreshed": 275.840425604, + "Vacc_refreshed_2": 137.920212802 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14399.1657319944, + "Vacc_completed": 1365.5993182323, + "Vacc_refreshed": 277.5856365007, + "Vacc_refreshed_2": 138.79281825035 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14402.7230837573, + "Vacc_completed": 1368.6201543223, + "Vacc_refreshed": 286.3361695339, + "Vacc_refreshed_2": 143.16808476695 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14403.1500082752, + "Vacc_completed": 1371.4419603277, + "Vacc_refreshed": 291.9429549926, + "Vacc_refreshed_2": 145.9714774963 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14409.601025491, + "Vacc_completed": 1375.0385110041, + "Vacc_refreshed": 294.4838831323, + "Vacc_refreshed_2": 147.24194156615 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.5992098988, + "Vacc_completed": 1379.7282797993, + "Vacc_refreshed": 304.3709721295, + "Vacc_refreshed_2": 152.18548606475 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.7379664054, + "Vacc_completed": 1388.4437755617, + "Vacc_refreshed": 310.9469195789, + "Vacc_refreshed_2": 155.47345978945 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14413.0256783966, + "Vacc_completed": 1395.0228908154, + "Vacc_refreshed": 316.1322991564, + "Vacc_refreshed_2": 158.0661495782 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14418.5923400284, + "Vacc_completed": 1395.4421160716, + "Vacc_refreshed": 324.326203234, + "Vacc_refreshed_2": 162.163101617 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14427.1006875636, + "Vacc_completed": 1400.9550416303, + "Vacc_refreshed": 326.1675291407, + "Vacc_refreshed_2": 163.08376457035 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14428.1259159444, + "Vacc_completed": 1401.6589165675, + "Vacc_refreshed": 336.1473853823, + "Vacc_refreshed_2": 168.07369269115 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14429.6710322591, + "Vacc_completed": 1406.4316961423, + "Vacc_refreshed": 338.7341080527, + "Vacc_refreshed_2": 169.36705402635 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14435.5405186058, + "Vacc_completed": 1406.8193757343, + "Vacc_refreshed": 348.5515447081, + "Vacc_refreshed_2": 174.27577235405 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14440.6128511884, + "Vacc_completed": 1406.8790930463, + "Vacc_refreshed": 349.9224707035, + "Vacc_refreshed_2": 174.96123535175 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14448.1553470558, + "Vacc_completed": 1407.8576900416, + "Vacc_refreshed": 354.7521313753, + "Vacc_refreshed_2": 177.37606568765 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14456.4196110425, + "Vacc_completed": 1411.7530351787, + "Vacc_refreshed": 361.5526839017, + "Vacc_refreshed_2": 180.77634195085 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14466.1757833279, + "Vacc_completed": 1412.4941157515, + "Vacc_refreshed": 364.0766791828, + "Vacc_refreshed_2": 182.0383395914 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14472.9152722164, + "Vacc_completed": 1421.7399661156, + "Vacc_refreshed": 371.2418954122, + "Vacc_refreshed_2": 185.6209477061 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14474.3971159945, + "Vacc_completed": 1423.8796012137, + "Vacc_refreshed": 378.3445685688, + "Vacc_refreshed_2": 189.1722842844 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14482.9259977884, + "Vacc_completed": 1428.8212618966, + "Vacc_refreshed": 382.6712538747, + "Vacc_refreshed_2": 191.33562693735 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14491.6837567491, + "Vacc_completed": 1430.1481016913, + "Vacc_refreshed": 392.5489632959, + "Vacc_refreshed_2": 196.27448164795 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14499.5728298642, + "Vacc_completed": 1439.468906008, + "Vacc_refreshed": 397.6649554861, + "Vacc_refreshed_2": 198.83247774305 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14500.4884339857, + "Vacc_completed": 1447.6074532094, + "Vacc_refreshed": 404.4236802991, + "Vacc_refreshed_2": 202.21184014955 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14508.6628209678, + "Vacc_completed": 1449.1955087396, + "Vacc_refreshed": 413.1290507873, + "Vacc_refreshed_2": 206.56452539365 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14509.0177335192, + "Vacc_completed": 1457.0313439789, + "Vacc_refreshed": 418.6984801264, + "Vacc_refreshed_2": 209.3492400632 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14518.7925361684, + "Vacc_completed": 1462.4055060107, + "Vacc_refreshed": 419.6070699812, + "Vacc_refreshed_2": 209.8035349906 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14522.121758092, + "Vacc_completed": 1468.1811367429, + "Vacc_refreshed": 425.9772045183, + "Vacc_refreshed_2": 212.98860225915 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14528.5474917037, + "Vacc_completed": 1473.5164593205, + "Vacc_refreshed": 435.7810319021, + "Vacc_refreshed_2": 217.89051595105 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14536.5601109176, + "Vacc_completed": 1481.2704120463, + "Vacc_refreshed": 438.2410199432, + "Vacc_refreshed_2": 219.1205099716 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14542.1473955627, + "Vacc_completed": 1482.7064631605, + "Vacc_refreshed": 445.3488141502, + "Vacc_refreshed_2": 222.6744070751 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14544.5952478081, + "Vacc_completed": 1486.0552178086, + "Vacc_refreshed": 446.1812966093, + "Vacc_refreshed_2": 223.09064830465 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10765.9941189788, + "Vacc_completed": 1603.3500569399, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.3717745702, + "Vacc_completed": 1605.3068408797, + "Vacc_refreshed": 3.6283182226, + "Vacc_refreshed_2": 1.8141591113 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.4956401429, + "Vacc_completed": 1610.6119068185, + "Vacc_refreshed": 6.1967396209, + "Vacc_refreshed_2": 3.09836981045 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10774.4184508751, + "Vacc_completed": 1613.016161978, + "Vacc_refreshed": 15.7069691534, + "Vacc_refreshed_2": 7.8534845767 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10780.8073818373, + "Vacc_completed": 1622.1917795654, + "Vacc_refreshed": 20.1697274397, + "Vacc_refreshed_2": 10.08486371985 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10785.5287460006, + "Vacc_completed": 1625.0602525893, + "Vacc_refreshed": 22.4671684217, + "Vacc_refreshed_2": 11.23358421085 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10790.1084610651, + "Vacc_completed": 1627.3787523231, + "Vacc_refreshed": 28.5217462646, + "Vacc_refreshed_2": 14.2608731323 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10796.2300309, + "Vacc_completed": 1630.4363483664, + "Vacc_refreshed": 35.3070676184, + "Vacc_refreshed_2": 17.6535338092 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10801.7222904172, + "Vacc_completed": 1638.725087864, + "Vacc_refreshed": 43.7679344272, + "Vacc_refreshed_2": 21.8839672136 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10804.7724722766, + "Vacc_completed": 1646.4905335365, + "Vacc_refreshed": 44.1718542676, + "Vacc_refreshed_2": 22.0859271338 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10814.3453353804, + "Vacc_completed": 1650.9992837124, + "Vacc_refreshed": 49.5204655539, + "Vacc_refreshed_2": 24.76023277695 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10821.6255112157, + "Vacc_completed": 1656.4335840831, + "Vacc_refreshed": 52.7009855172, + "Vacc_refreshed_2": 26.3504927586 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10830.9379325639, + "Vacc_completed": 1657.186187271, + "Vacc_refreshed": 56.5428649986, + "Vacc_refreshed_2": 28.2714324993 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10838.202902864, + "Vacc_completed": 1662.1470499364, + "Vacc_refreshed": 58.6277824858, + "Vacc_refreshed_2": 29.3138912429 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10840.8786753296, + "Vacc_completed": 1670.6860254071, + "Vacc_refreshed": 58.7593924743, + "Vacc_refreshed_2": 29.37969623715 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10843.7453960183, + "Vacc_completed": 1673.6372365137, + "Vacc_refreshed": 61.8595630166, + "Vacc_refreshed_2": 30.9297815083 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10849.1151892515, + "Vacc_completed": 1675.1066023109, + "Vacc_refreshed": 64.6020615007, + "Vacc_refreshed_2": 32.30103075035 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10850.9329685403, + "Vacc_completed": 1679.1505675366, + "Vacc_refreshed": 72.0237510859, + "Vacc_refreshed_2": 36.01187554295 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10854.4610677614, + "Vacc_completed": 1681.5473018047, + "Vacc_refreshed": 75.0145349272, + "Vacc_refreshed_2": 37.5072674636 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10858.0662824418, + "Vacc_completed": 1688.7179113019, + "Vacc_refreshed": 82.7641475111, + "Vacc_refreshed_2": 41.38207375555 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10867.8357803799, + "Vacc_completed": 1688.741478882, + "Vacc_refreshed": 92.1411476813, + "Vacc_refreshed_2": 46.07057384065 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10877.245759177, + "Vacc_completed": 1696.3354153291, + "Vacc_refreshed": 93.5350586202, + "Vacc_refreshed_2": 46.7675293101 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10878.9277486403, + "Vacc_completed": 1704.5169058825, + "Vacc_refreshed": 99.9257252117, + "Vacc_refreshed_2": 49.96286260585 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10881.5163902637, + "Vacc_completed": 1704.5184844203, + "Vacc_refreshed": 104.0563799981, + "Vacc_refreshed_2": 52.02818999905 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10882.0628121233, + "Vacc_completed": 1710.1811092467, + "Vacc_refreshed": 110.998904559, + "Vacc_refreshed_2": 55.4994522795 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10884.1868939764, + "Vacc_completed": 1711.6669667815, + "Vacc_refreshed": 119.5835613879, + "Vacc_refreshed_2": 59.79178069395 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10890.26315895, + "Vacc_completed": 1712.8219244738, + "Vacc_refreshed": 126.203975023, + "Vacc_refreshed_2": 63.1019875115 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10894.6858788747, + "Vacc_completed": 1721.7467435031, + "Vacc_refreshed": 135.9649739788, + "Vacc_refreshed_2": 67.9824869894 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10897.5575288795, + "Vacc_completed": 1721.7787127468, + "Vacc_refreshed": 145.614673399, + "Vacc_refreshed_2": 72.8073366995 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10903.1231721286, + "Vacc_completed": 1724.7269587992, + "Vacc_refreshed": 149.6717929743, + "Vacc_refreshed_2": 74.83589648715 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10911.1763853993, + "Vacc_completed": 1726.3071857535, + "Vacc_refreshed": 158.0496522084, + "Vacc_refreshed_2": 79.0248261042 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10919.5582023277, + "Vacc_completed": 1727.9236223535, + "Vacc_refreshed": 160.5751263702, + "Vacc_refreshed_2": 80.2875631851 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10920.4962369047, + "Vacc_completed": 1730.7211296321, + "Vacc_refreshed": 162.2038531114, + "Vacc_refreshed_2": 81.1019265557 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10930.0062994591, + "Vacc_completed": 1733.2273616859, + "Vacc_refreshed": 164.6178844659, + "Vacc_refreshed_2": 82.30894223295 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10931.0781786076, + "Vacc_completed": 1743.0639116966, + "Vacc_refreshed": 171.6949336111, + "Vacc_refreshed_2": 85.84746680555 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10936.2371584575, + "Vacc_completed": 1743.4973637943, + "Vacc_refreshed": 173.1954991423, + "Vacc_refreshed_2": 86.59774957115 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10937.1969149599, + "Vacc_completed": 1752.0043206175, + "Vacc_refreshed": 173.4521249531, + "Vacc_refreshed_2": 86.72606247655 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10942.5829785849, + "Vacc_completed": 1758.5438162851, + "Vacc_refreshed": 175.0971428389, + "Vacc_refreshed_2": 87.54857141945 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10945.8458051779, + "Vacc_completed": 1765.593119461, + "Vacc_refreshed": 184.781293552, + "Vacc_refreshed_2": 92.390646776 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10955.2619609788, + "Vacc_completed": 1766.7516696253, + "Vacc_refreshed": 194.3279051811, + "Vacc_refreshed_2": 97.16395259055 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0529992794, + "Vacc_completed": 1774.4096958807, + "Vacc_refreshed": 199.3585168564, + "Vacc_refreshed_2": 99.6792584282 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0740456643, + "Vacc_completed": 1776.7353479155, + "Vacc_refreshed": 200.2783085421, + "Vacc_refreshed_2": 100.13915427105 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7647446192, + "Vacc_completed": 1786.1838226639, + "Vacc_refreshed": 202.522841172, + "Vacc_refreshed_2": 101.261420586 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7950553291, + "Vacc_completed": 1788.5013884886, + "Vacc_refreshed": 205.1107008609, + "Vacc_refreshed_2": 102.55535043045 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10973.1049316279, + "Vacc_completed": 1790.2712267193, + "Vacc_refreshed": 214.0688577867, + "Vacc_refreshed_2": 107.03442889335 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10976.2696576646, + "Vacc_completed": 1797.8582422894, + "Vacc_refreshed": 219.0460187772, + "Vacc_refreshed_2": 109.5230093886 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10984.9161656634, + "Vacc_completed": 1801.5924446935, + "Vacc_refreshed": 227.656626047, + "Vacc_refreshed_2": 113.8283130235 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10994.063273181, + "Vacc_completed": 1802.6817444812, + "Vacc_refreshed": 235.6032823069, + "Vacc_refreshed_2": 117.80164115345 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10996.8771305673, + "Vacc_completed": 1802.9071097171, + "Vacc_refreshed": 237.7242073629, + "Vacc_refreshed_2": 118.86210368145 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11002.0527900673, + "Vacc_completed": 1809.5395950318, + "Vacc_refreshed": 241.3631599251, + "Vacc_refreshed_2": 120.68157996255 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11007.1528572096, + "Vacc_completed": 1813.9025489723, + "Vacc_refreshed": 245.5305344153, + "Vacc_refreshed_2": 122.76526720765 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11013.1337350258, + "Vacc_completed": 1821.5275057931, + "Vacc_refreshed": 250.3168579858, + "Vacc_refreshed_2": 125.1584289929 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11015.6696905796, + "Vacc_completed": 1822.9598630397, + "Vacc_refreshed": 255.6335351411, + "Vacc_refreshed_2": 127.81676757055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11023.4754023371, + "Vacc_completed": 1827.2471461973, + "Vacc_refreshed": 265.5951098299, + "Vacc_refreshed_2": 132.79755491495 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11032.8284479669, + "Vacc_completed": 1827.5539031975, + "Vacc_refreshed": 267.3513136054, + "Vacc_refreshed_2": 133.6756568027 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.3845078238, + "Vacc_completed": 1828.9970028031, + "Vacc_refreshed": 270.5903250252, + "Vacc_refreshed_2": 135.2951625126 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11039.693720803, + "Vacc_completed": 1836.2049019351, + "Vacc_refreshed": 272.0758803579, + "Vacc_refreshed_2": 136.03794017895 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11047.8242120991, + "Vacc_completed": 1837.1027842122, + "Vacc_refreshed": 275.2277393803, + "Vacc_refreshed_2": 137.61386969015 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11053.900379851, + "Vacc_completed": 1838.273599421, + "Vacc_refreshed": 282.2344875735, + "Vacc_refreshed_2": 141.11724378675 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11059.6633767419, + "Vacc_completed": 1845.0089267377, + "Vacc_refreshed": 284.3140546038, + "Vacc_refreshed_2": 142.1570273019 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11068.9288674107, + "Vacc_completed": 1852.7615624634, + "Vacc_refreshed": 287.0304142153, + "Vacc_refreshed_2": 143.51520710765 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11072.6595101177, + "Vacc_completed": 1857.871819743, + "Vacc_refreshed": 289.2733395979, + "Vacc_refreshed_2": 144.63666979895 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11082.5784142097, + "Vacc_completed": 1865.7647392626, + "Vacc_refreshed": 291.3426551576, + "Vacc_refreshed_2": 145.6713275788 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11089.5185616411, + "Vacc_completed": 1869.3958231852, + "Vacc_refreshed": 299.8179962185, + "Vacc_refreshed_2": 149.90899810925 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11097.3087770941, + "Vacc_completed": 1878.7026117675, + "Vacc_refreshed": 306.1608208876, + "Vacc_refreshed_2": 153.0804104438 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11101.8508357142, + "Vacc_completed": 1879.7270518854, + "Vacc_refreshed": 308.0716738039, + "Vacc_refreshed_2": 154.03583690195 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11103.0915214706, + "Vacc_completed": 1883.5574266434, + "Vacc_refreshed": 311.2801806804, + "Vacc_refreshed_2": 155.6400903402 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11111.9334619087, + "Vacc_completed": 1887.7967037043, + "Vacc_refreshed": 320.2156677375, + "Vacc_refreshed_2": 160.10783386875 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11118.8667730664, + "Vacc_completed": 1896.6793284207, + "Vacc_refreshed": 321.8561637233, + "Vacc_refreshed_2": 160.92808186165 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11123.0290736537, + "Vacc_completed": 1902.1985445903, + "Vacc_refreshed": 328.4656069808, + "Vacc_refreshed_2": 164.2328034904 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11129.3471714321, + "Vacc_completed": 1902.2057666507, + "Vacc_refreshed": 334.8734059386, + "Vacc_refreshed_2": 167.4367029693 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11137.9949570833, + "Vacc_completed": 1907.7915885083, + "Vacc_refreshed": 339.9783670978, + "Vacc_refreshed_2": 169.9891835489 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11139.4617826874, + "Vacc_completed": 1910.6126501167, + "Vacc_refreshed": 342.8472462544, + "Vacc_refreshed_2": 171.4236231272 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11144.4191917936, + "Vacc_completed": 1917.8558172992, + "Vacc_refreshed": 351.3104814196, + "Vacc_refreshed_2": 175.6552407098 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11153.423123173, + "Vacc_completed": 1927.8115362669, + "Vacc_refreshed": 359.1887782128, + "Vacc_refreshed_2": 179.5943891064 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11155.4646855253, + "Vacc_completed": 1931.0938823989, + "Vacc_refreshed": 363.4217582407, + "Vacc_refreshed_2": 181.71087912035 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11164.8755655095, + "Vacc_completed": 1932.0922021433, + "Vacc_refreshed": 369.5881371093, + "Vacc_refreshed_2": 184.79406855465 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11168.2127634861, + "Vacc_completed": 1937.8864562316, + "Vacc_refreshed": 371.2850357688, + "Vacc_refreshed_2": 185.6425178844 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11170.3919325879, + "Vacc_completed": 1943.9625258254, + "Vacc_refreshed": 372.564368772, + "Vacc_refreshed_2": 186.282184386 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11178.2156716034, + "Vacc_completed": 1946.3680545291, + "Vacc_refreshed": 377.1791450411, + "Vacc_refreshed_2": 188.58957252055 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11187.7206334256, + "Vacc_completed": 1950.3408321869, + "Vacc_refreshed": 385.28114877, + "Vacc_refreshed_2": 192.640574385 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11189.2295548943, + "Vacc_completed": 1952.7801877326, + "Vacc_refreshed": 386.4768386941, + "Vacc_refreshed_2": 193.23841934705 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11193.8090943925, + "Vacc_completed": 1960.5337079214, + "Vacc_refreshed": 395.6463777137, + "Vacc_refreshed_2": 197.82318885685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11198.0758128722, + "Vacc_completed": 1964.4220756604, + "Vacc_refreshed": 404.4005517293, + "Vacc_refreshed_2": 202.20027586465 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11200.1395546734, + "Vacc_completed": 1974.1843879258, + "Vacc_refreshed": 410.4354615606, + "Vacc_refreshed_2": 205.2177307803 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.0858861212, + "Vacc_completed": 1978.0710124849, + "Vacc_refreshed": 414.2205337181, + "Vacc_refreshed_2": 207.11026685905 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11203.5521637654, + "Vacc_completed": 1981.3589179628, + "Vacc_refreshed": 419.5840242501, + "Vacc_refreshed_2": 209.79201212505 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11211.6562498266, + "Vacc_completed": 1989.6665585254, + "Vacc_refreshed": 426.6154672823, + "Vacc_refreshed_2": 213.30773364115 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11219.1926870115, + "Vacc_completed": 1996.1459430488, + "Vacc_refreshed": 430.16915603, + "Vacc_refreshed_2": 215.084578015 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11221.4656474699, + "Vacc_completed": 2001.4601213853, + "Vacc_refreshed": 430.8770850788, + "Vacc_refreshed_2": 215.4385425394 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11224.2379660032, + "Vacc_completed": 2006.2961081678, + "Vacc_refreshed": 433.8074021391, + "Vacc_refreshed_2": 216.90370106955 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11229.137503588, + "Vacc_completed": 2013.2392255015, + "Vacc_refreshed": 441.1218403265, + "Vacc_refreshed_2": 220.56092016325 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15118.5419446559, + "Vacc_completed": 1046.4766182565, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15127.0441726861, + "Vacc_completed": 1051.8189573454, + "Vacc_refreshed": 4.7668817312, + "Vacc_refreshed_2": 2.3834408656 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15134.2198668737, + "Vacc_completed": 1051.8898550539, + "Vacc_refreshed": 6.8954841457, + "Vacc_refreshed_2": 3.44774207285 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15138.5012633389, + "Vacc_completed": 1054.1938291422, + "Vacc_refreshed": 12.8850967826, + "Vacc_refreshed_2": 6.4425483913 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15140.019297286, + "Vacc_completed": 1057.2812920036, + "Vacc_refreshed": 15.610006044, + "Vacc_refreshed_2": 7.805003022 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15141.0655653453, + "Vacc_completed": 1061.1873607435, + "Vacc_refreshed": 18.0052067519, + "Vacc_refreshed_2": 9.00260337595 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15146.6047446953, + "Vacc_completed": 1067.3953196211, + "Vacc_refreshed": 27.5155266211, + "Vacc_refreshed_2": 13.75776331055 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15150.2459378898, + "Vacc_completed": 1077.315397207, + "Vacc_refreshed": 28.0742687581, + "Vacc_refreshed_2": 14.03713437905 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15153.3836683973, + "Vacc_completed": 1082.8237823387, + "Vacc_refreshed": 32.6629347887, + "Vacc_refreshed_2": 16.33146739435 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15155.2486658897, + "Vacc_completed": 1087.8721865368, + "Vacc_refreshed": 42.082807235, + "Vacc_refreshed_2": 21.0414036175 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15157.4630323429, + "Vacc_completed": 1090.0916620904, + "Vacc_refreshed": 43.8436800298, + "Vacc_refreshed_2": 21.9218400149 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15158.7941750828, + "Vacc_completed": 1091.8322828475, + "Vacc_refreshed": 44.7371311455, + "Vacc_refreshed_2": 22.36856557275 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15159.4697179186, + "Vacc_completed": 1097.9581123146, + "Vacc_refreshed": 52.5410403094, + "Vacc_refreshed_2": 26.2705201547 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15166.8797207146, + "Vacc_completed": 1103.4838023049, + "Vacc_refreshed": 58.4482610787, + "Vacc_refreshed_2": 29.22413053935 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.177591783, + "Vacc_completed": 1107.529236183, + "Vacc_refreshed": 61.868532741, + "Vacc_refreshed_2": 30.9342663705 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15171.3473624207, + "Vacc_completed": 1108.0854442406, + "Vacc_refreshed": 64.122741794, + "Vacc_refreshed_2": 32.061370897 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15176.6656703161, + "Vacc_completed": 1114.7623442184, + "Vacc_refreshed": 73.3909194547, + "Vacc_refreshed_2": 36.69545972735 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15182.6538662202, + "Vacc_completed": 1121.0967139584, + "Vacc_refreshed": 78.4108273222, + "Vacc_refreshed_2": 39.2054136611 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15191.0826029366, + "Vacc_completed": 1124.8733122731, + "Vacc_refreshed": 88.1249123157, + "Vacc_refreshed_2": 44.06245615785 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15195.1567917247, + "Vacc_completed": 1133.1683853487, + "Vacc_refreshed": 94.0586819047, + "Vacc_refreshed_2": 47.02934095235 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15197.6523517992, + "Vacc_completed": 1140.1742056487, + "Vacc_refreshed": 97.7116921077, + "Vacc_refreshed_2": 48.85584605385 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15202.8832794911, + "Vacc_completed": 1140.4207518542, + "Vacc_refreshed": 101.0390519368, + "Vacc_refreshed_2": 50.5195259684 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15209.502983548, + "Vacc_completed": 1144.1138351675, + "Vacc_refreshed": 104.5568369595, + "Vacc_refreshed_2": 52.27841847975 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15218.5591667959, + "Vacc_completed": 1153.0110444013, + "Vacc_refreshed": 111.8121115483, + "Vacc_refreshed_2": 55.90605577415 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15223.6275127037, + "Vacc_completed": 1157.3585549388, + "Vacc_refreshed": 113.9066704897, + "Vacc_refreshed_2": 56.95333524485 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.4100349304, + "Vacc_completed": 1162.1581378525, + "Vacc_refreshed": 116.416758139, + "Vacc_refreshed_2": 58.2083790695 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15225.7888080253, + "Vacc_completed": 1166.5300160643, + "Vacc_refreshed": 119.2414894864, + "Vacc_refreshed_2": 59.6207447432 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15235.240974732, + "Vacc_completed": 1171.76423914, + "Vacc_refreshed": 129.0137217302, + "Vacc_refreshed_2": 64.5068608651 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15236.252829019, + "Vacc_completed": 1174.1820893055, + "Vacc_refreshed": 130.8298102316, + "Vacc_refreshed_2": 65.4149051158 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15244.5996289271, + "Vacc_completed": 1181.3457343202, + "Vacc_refreshed": 138.0198133972, + "Vacc_refreshed_2": 69.0099066986 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15247.7688417561, + "Vacc_completed": 1186.4632437534, + "Vacc_refreshed": 147.549469044, + "Vacc_refreshed_2": 73.774734522 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15254.8324409461, + "Vacc_completed": 1196.0640695451, + "Vacc_refreshed": 148.035813332, + "Vacc_refreshed_2": 74.017906666 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15263.9056700401, + "Vacc_completed": 1202.0195228295, + "Vacc_refreshed": 152.9647063671, + "Vacc_refreshed_2": 76.48235318355 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15271.3608079113, + "Vacc_completed": 1205.9189472233, + "Vacc_refreshed": 159.4326071199, + "Vacc_refreshed_2": 79.71630355995 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15274.5391192733, + "Vacc_completed": 1209.5333389579, + "Vacc_refreshed": 165.8197711746, + "Vacc_refreshed_2": 82.9098855873 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15279.9252173752, + "Vacc_completed": 1217.5022918804, + "Vacc_refreshed": 170.1668415009, + "Vacc_refreshed_2": 85.08342075045 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15289.6429605219, + "Vacc_completed": 1218.0921627258, + "Vacc_refreshed": 176.8858359396, + "Vacc_refreshed_2": 88.4429179698 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15297.4452269777, + "Vacc_completed": 1218.4916546179, + "Vacc_refreshed": 177.0224757358, + "Vacc_refreshed_2": 88.5112378679 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15304.6068820067, + "Vacc_completed": 1221.1648349639, + "Vacc_refreshed": 182.8363512803, + "Vacc_refreshed_2": 91.41817564015 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15308.4472782837, + "Vacc_completed": 1221.3254317254, + "Vacc_refreshed": 188.4124431026, + "Vacc_refreshed_2": 94.2062215513 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15313.3535420035, + "Vacc_completed": 1228.797689569, + "Vacc_refreshed": 197.4958413402, + "Vacc_refreshed_2": 98.7479206701 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15319.6989570363, + "Vacc_completed": 1230.5766158569, + "Vacc_refreshed": 207.1280776834, + "Vacc_refreshed_2": 103.5640388417 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15329.2757609065, + "Vacc_completed": 1232.5532561558, + "Vacc_refreshed": 216.6030971785, + "Vacc_refreshed_2": 108.30154858925 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15331.3854251166, + "Vacc_completed": 1240.7858568563, + "Vacc_refreshed": 224.0947128601, + "Vacc_refreshed_2": 112.04735643005 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15335.6254694555, + "Vacc_completed": 1248.7648628072, + "Vacc_refreshed": 228.3914917972, + "Vacc_refreshed_2": 114.1957458986 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15342.4956408139, + "Vacc_completed": 1253.345700271, + "Vacc_refreshed": 237.7873655386, + "Vacc_refreshed_2": 118.8936827693 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15349.2985100866, + "Vacc_completed": 1254.923228178, + "Vacc_refreshed": 243.7398150729, + "Vacc_refreshed_2": 121.86990753645 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.0642849231, + "Vacc_completed": 1256.1247258557, + "Vacc_refreshed": 246.0998008594, + "Vacc_refreshed_2": 123.0499004297 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.3098206871, + "Vacc_completed": 1258.7673082658, + "Vacc_refreshed": 255.4830156808, + "Vacc_refreshed_2": 127.7415078404 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15350.8477668821, + "Vacc_completed": 1261.8739088788, + "Vacc_refreshed": 262.4150374381, + "Vacc_refreshed_2": 131.20751871905 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15355.0053188609, + "Vacc_completed": 1268.7063064011, + "Vacc_refreshed": 268.0354130392, + "Vacc_refreshed_2": 134.0177065196 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15356.8245202899, + "Vacc_completed": 1275.6335562552, + "Vacc_refreshed": 272.2800844077, + "Vacc_refreshed_2": 136.14004220385 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15357.7799420851, + "Vacc_completed": 1276.6526923528, + "Vacc_refreshed": 272.4509982396, + "Vacc_refreshed_2": 136.2254991198 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15360.090059624, + "Vacc_completed": 1286.3717718947, + "Vacc_refreshed": 276.5108897334, + "Vacc_refreshed_2": 138.2554448667 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15368.9251730685, + "Vacc_completed": 1289.9608638772, + "Vacc_refreshed": 286.1598516049, + "Vacc_refreshed_2": 143.07992580245 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15374.4348532349, + "Vacc_completed": 1292.7431692071, + "Vacc_refreshed": 286.9834989324, + "Vacc_refreshed_2": 143.4917494662 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15375.2266568732, + "Vacc_completed": 1293.6118841564, + "Vacc_refreshed": 287.1997495191, + "Vacc_refreshed_2": 143.59987475955 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15378.8167187789, + "Vacc_completed": 1294.2472234682, + "Vacc_refreshed": 293.7465776915, + "Vacc_refreshed_2": 146.87328884575 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15381.8183566081, + "Vacc_completed": 1296.5074589754, + "Vacc_refreshed": 294.394169978, + "Vacc_refreshed_2": 147.197084989 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15390.3384592829, + "Vacc_completed": 1298.1144038724, + "Vacc_refreshed": 295.3508481166, + "Vacc_refreshed_2": 147.6754240583 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15397.4841102393, + "Vacc_completed": 1301.7744150574, + "Vacc_refreshed": 295.636121459, + "Vacc_refreshed_2": 147.8180607295 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15406.9128765942, + "Vacc_completed": 1306.3546732411, + "Vacc_refreshed": 299.2176949608, + "Vacc_refreshed_2": 149.6088474804 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15412.9312961067, + "Vacc_completed": 1313.4112918553, + "Vacc_refreshed": 304.1283567048, + "Vacc_refreshed_2": 152.0641783524 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15413.8396565369, + "Vacc_completed": 1323.1872711778, + "Vacc_refreshed": 309.3767578057, + "Vacc_refreshed_2": 154.68837890285 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15417.5353933956, + "Vacc_completed": 1332.5570169907, + "Vacc_refreshed": 310.9982936972, + "Vacc_refreshed_2": 155.4991468486 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15418.826072466, + "Vacc_completed": 1333.4298810326, + "Vacc_refreshed": 318.8191964614, + "Vacc_refreshed_2": 159.4095982307 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15428.6081802722, + "Vacc_completed": 1335.4576305614, + "Vacc_refreshed": 322.681425219, + "Vacc_refreshed_2": 161.3407126095 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15434.4342053135, + "Vacc_completed": 1341.8151001107, + "Vacc_refreshed": 328.87826872, + "Vacc_refreshed_2": 164.43913436 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15442.7494739491, + "Vacc_completed": 1342.4758295952, + "Vacc_refreshed": 336.8125605002, + "Vacc_refreshed_2": 168.4062802501 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15451.9615776405, + "Vacc_completed": 1343.8595431355, + "Vacc_refreshed": 340.6379428895, + "Vacc_refreshed_2": 170.31897144475 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15461.0343740586, + "Vacc_completed": 1352.0217149096, + "Vacc_refreshed": 342.4652609374, + "Vacc_refreshed_2": 171.2326304687 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15467.8869999547, + "Vacc_completed": 1353.9994636638, + "Vacc_refreshed": 343.6202751504, + "Vacc_refreshed_2": 171.8101375752 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15474.9129704383, + "Vacc_completed": 1363.3653927841, + "Vacc_refreshed": 345.0578595323, + "Vacc_refreshed_2": 172.52892976615 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15483.483328834, + "Vacc_completed": 1372.0348541584, + "Vacc_refreshed": 348.4131919851, + "Vacc_refreshed_2": 174.20659599255 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15489.3942653446, + "Vacc_completed": 1377.4077406314, + "Vacc_refreshed": 355.6717942515, + "Vacc_refreshed_2": 177.83589712575 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15494.2503612359, + "Vacc_completed": 1377.4290090401, + "Vacc_refreshed": 358.9820312389, + "Vacc_refreshed_2": 179.49101561945 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15495.3394152185, + "Vacc_completed": 1378.0321848221, + "Vacc_refreshed": 364.7453207897, + "Vacc_refreshed_2": 182.37266039485 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15497.7000250685, + "Vacc_completed": 1378.1938721933, + "Vacc_refreshed": 367.9820639836, + "Vacc_refreshed_2": 183.9910319918 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15498.7689863883, + "Vacc_completed": 1381.0445655705, + "Vacc_refreshed": 371.501202086, + "Vacc_refreshed_2": 185.750601043 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15501.5446144083, + "Vacc_completed": 1383.5660020007, + "Vacc_refreshed": 378.7475176563, + "Vacc_refreshed_2": 189.37375882815 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15509.8230148672, + "Vacc_completed": 1390.2361319678, + "Vacc_refreshed": 382.7365149116, + "Vacc_refreshed_2": 191.3682574558 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15516.8607244434, + "Vacc_completed": 1391.5356833196, + "Vacc_refreshed": 387.0287274101, + "Vacc_refreshed_2": 193.51436370505 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15525.4621417067, + "Vacc_completed": 1391.7538408053, + "Vacc_refreshed": 394.832505058, + "Vacc_refreshed_2": 197.416252529 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15530.1412323442, + "Vacc_completed": 1393.5856974411, + "Vacc_refreshed": 402.9766589833, + "Vacc_refreshed_2": 201.48832949165 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15538.5266345599, + "Vacc_completed": 1394.0860887346, + "Vacc_refreshed": 409.427624651, + "Vacc_refreshed_2": 204.7138123255 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15545.1857152555, + "Vacc_completed": 1400.9009375981, + "Vacc_refreshed": 414.8161834543, + "Vacc_refreshed_2": 207.40809172715 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15550.0113840393, + "Vacc_completed": 1405.1190388135, + "Vacc_refreshed": 423.1492506703, + "Vacc_refreshed_2": 211.57462533515 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15557.7502728646, + "Vacc_completed": 1412.7232837907, + "Vacc_refreshed": 429.51858195, + "Vacc_refreshed_2": 214.759290975 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15558.6635273277, + "Vacc_completed": 1416.4367765358, + "Vacc_refreshed": 433.7574702422, + "Vacc_refreshed_2": 216.8787351211 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15567.8923476818, + "Vacc_completed": 1417.419547185, + "Vacc_refreshed": 436.3988331827, + "Vacc_refreshed_2": 218.19941659135 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15572.0110691064, + "Vacc_completed": 1422.1291332179, + "Vacc_refreshed": 444.7065625402, + "Vacc_refreshed_2": 222.3532812701 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "15-34", + "Vacc_partially": 15580.056372857, + "Vacc_completed": 1429.5241883626, + "Vacc_refreshed": 445.9185645116, + "Vacc_refreshed_2": 222.9592822558 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14604.162091487, + "Vacc_completed": 1396.5367205842, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14608.6011110978, + "Vacc_completed": 1403.0638750962, + "Vacc_refreshed": 0.4818747518, + "Vacc_refreshed_2": 0.2409373759 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14617.4016613244, + "Vacc_completed": 1412.4617013546, + "Vacc_refreshed": 2.8841327921, + "Vacc_refreshed_2": 1.44206639605 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14626.8147148128, + "Vacc_completed": 1413.5937989207, + "Vacc_refreshed": 4.347225901, + "Vacc_refreshed_2": 2.1736129505 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14636.7930742671, + "Vacc_completed": 1416.5445655325, + "Vacc_refreshed": 10.9126558661, + "Vacc_refreshed_2": 5.45632793305 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14639.261920851, + "Vacc_completed": 1419.7526675766, + "Vacc_refreshed": 12.1285186735, + "Vacc_refreshed_2": 6.06425933675 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14646.6246553828, + "Vacc_completed": 1429.1501916355, + "Vacc_refreshed": 14.2999622979, + "Vacc_refreshed_2": 7.14998114895 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14655.9228453283, + "Vacc_completed": 1433.2061319495, + "Vacc_refreshed": 18.6765331159, + "Vacc_refreshed_2": 9.33826655795 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.6905295279, + "Vacc_completed": 1437.4319338048, + "Vacc_refreshed": 19.3435044237, + "Vacc_refreshed_2": 9.67175221185 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14656.8883385186, + "Vacc_completed": 1446.7135497598, + "Vacc_refreshed": 28.359576628, + "Vacc_refreshed_2": 14.179788314 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14660.5634553543, + "Vacc_completed": 1450.9111526521, + "Vacc_refreshed": 38.3056947196, + "Vacc_refreshed_2": 19.1528473598 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14667.0822550267, + "Vacc_completed": 1458.1473384005, + "Vacc_refreshed": 38.8316353015, + "Vacc_refreshed_2": 19.41581765075 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14668.0361388154, + "Vacc_completed": 1464.9440155832, + "Vacc_refreshed": 44.1485629725, + "Vacc_refreshed_2": 22.07428148625 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14669.4679031112, + "Vacc_completed": 1470.1284856322, + "Vacc_refreshed": 47.7639888511, + "Vacc_refreshed_2": 23.88199442555 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.2618994679, + "Vacc_completed": 1476.9344530457, + "Vacc_refreshed": 56.361748961, + "Vacc_refreshed_2": 28.1808744805 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14674.3447644481, + "Vacc_completed": 1477.2393580763, + "Vacc_refreshed": 57.2273767339, + "Vacc_refreshed_2": 28.61368836695 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14684.0130216555, + "Vacc_completed": 1484.3234594705, + "Vacc_refreshed": 63.4497732245, + "Vacc_refreshed_2": 31.72488661225 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14691.8154699011, + "Vacc_completed": 1492.8513113216, + "Vacc_refreshed": 71.1720264341, + "Vacc_refreshed_2": 35.58601321705 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14697.5036031252, + "Vacc_completed": 1493.7450842417, + "Vacc_refreshed": 77.3635307257, + "Vacc_refreshed_2": 38.68176536285 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14702.599106658, + "Vacc_completed": 1503.4641107157, + "Vacc_refreshed": 82.0575571669, + "Vacc_refreshed_2": 41.02877858345 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14706.3806325115, + "Vacc_completed": 1509.7236994586, + "Vacc_refreshed": 82.4020129882, + "Vacc_refreshed_2": 41.2010064941 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14711.1723860607, + "Vacc_completed": 1510.3801441147, + "Vacc_refreshed": 89.5249618369, + "Vacc_refreshed_2": 44.76248091845 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14720.0093085987, + "Vacc_completed": 1517.7733661353, + "Vacc_refreshed": 99.2211580734, + "Vacc_refreshed_2": 49.6105790367 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14727.6474505495, + "Vacc_completed": 1519.2060691793, + "Vacc_refreshed": 104.7140344902, + "Vacc_refreshed_2": 52.3570172451 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14737.2025033477, + "Vacc_completed": 1520.8147599339, + "Vacc_refreshed": 111.7829864033, + "Vacc_refreshed_2": 55.89149320165 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14739.5787007901, + "Vacc_completed": 1526.8277919335, + "Vacc_refreshed": 118.2526435067, + "Vacc_refreshed_2": 59.12632175335 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14740.2622466128, + "Vacc_completed": 1533.9654672239, + "Vacc_refreshed": 121.0872593022, + "Vacc_refreshed_2": 60.5436296511 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.3105527103, + "Vacc_completed": 1534.5209202615, + "Vacc_refreshed": 130.3683956867, + "Vacc_refreshed_2": 65.18419784335 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14749.4386233429, + "Vacc_completed": 1534.652607589, + "Vacc_refreshed": 131.8609814668, + "Vacc_refreshed_2": 65.9304907334 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14750.7660084012, + "Vacc_completed": 1541.7255942491, + "Vacc_refreshed": 135.0718914562, + "Vacc_refreshed_2": 67.5359457281 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14754.5460710197, + "Vacc_completed": 1550.2608445951, + "Vacc_refreshed": 143.3620456295, + "Vacc_refreshed_2": 71.68102281475 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14759.0944017155, + "Vacc_completed": 1555.0005459425, + "Vacc_refreshed": 149.1268404613, + "Vacc_refreshed_2": 74.56342023065 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14765.0469016605, + "Vacc_completed": 1561.0596836707, + "Vacc_refreshed": 156.632878281, + "Vacc_refreshed_2": 78.3164391405 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14767.8747922121, + "Vacc_completed": 1562.2055298685, + "Vacc_refreshed": 158.7846499619, + "Vacc_refreshed_2": 79.39232498095 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14770.6956031505, + "Vacc_completed": 1564.0912014269, + "Vacc_refreshed": 160.2235512232, + "Vacc_refreshed_2": 80.1117756116 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14771.8405767953, + "Vacc_completed": 1569.1767284097, + "Vacc_refreshed": 163.0960075253, + "Vacc_refreshed_2": 81.54800376265 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14772.2052559189, + "Vacc_completed": 1577.0342160583, + "Vacc_refreshed": 171.338237261, + "Vacc_refreshed_2": 85.6691186305 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14775.8209952029, + "Vacc_completed": 1582.4601331483, + "Vacc_refreshed": 171.7811634642, + "Vacc_refreshed_2": 85.8905817321 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14783.195452278, + "Vacc_completed": 1590.5417141678, + "Vacc_refreshed": 180.3921690168, + "Vacc_refreshed_2": 90.1960845084 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14789.7908493035, + "Vacc_completed": 1599.1828252755, + "Vacc_refreshed": 184.3843375412, + "Vacc_refreshed_2": 92.1921687706 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14799.5061304555, + "Vacc_completed": 1604.6353429891, + "Vacc_refreshed": 186.9160630046, + "Vacc_refreshed_2": 93.4580315023 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14800.1953862328, + "Vacc_completed": 1607.3418569739, + "Vacc_refreshed": 194.8977352638, + "Vacc_refreshed_2": 97.4488676319 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14804.6194220955, + "Vacc_completed": 1610.8601925588, + "Vacc_refreshed": 198.1360514295, + "Vacc_refreshed_2": 99.06802571475 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14807.6135970058, + "Vacc_completed": 1620.4676732545, + "Vacc_refreshed": 199.7756827366, + "Vacc_refreshed_2": 99.8878413683 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14812.6404573806, + "Vacc_completed": 1625.8005590907, + "Vacc_refreshed": 208.9834954342, + "Vacc_refreshed_2": 104.4917477171 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14821.7780993542, + "Vacc_completed": 1634.2191287828, + "Vacc_refreshed": 218.0082295343, + "Vacc_refreshed_2": 109.00411476715 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14826.4757459809, + "Vacc_completed": 1642.5529482935, + "Vacc_refreshed": 225.0524176739, + "Vacc_refreshed_2": 112.52620883695 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14831.5528263871, + "Vacc_completed": 1649.3317542887, + "Vacc_refreshed": 229.0729255762, + "Vacc_refreshed_2": 114.5364627881 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14835.4543265309, + "Vacc_completed": 1656.6375918093, + "Vacc_refreshed": 230.6069957275, + "Vacc_refreshed_2": 115.30349786375 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14843.0829401722, + "Vacc_completed": 1661.236165662, + "Vacc_refreshed": 240.090987042, + "Vacc_refreshed_2": 120.045493521 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14846.441543514, + "Vacc_completed": 1663.7621214807, + "Vacc_refreshed": 242.6005891297, + "Vacc_refreshed_2": 121.30029456485 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14852.8592673291, + "Vacc_completed": 1670.5438763585, + "Vacc_refreshed": 243.1550853514, + "Vacc_refreshed_2": 121.5775426757 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14859.7577792484, + "Vacc_completed": 1671.9654195564, + "Vacc_refreshed": 252.4226950148, + "Vacc_refreshed_2": 126.2113475074 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14860.9361402439, + "Vacc_completed": 1673.0063955744, + "Vacc_refreshed": 254.9337371613, + "Vacc_refreshed_2": 127.46686858065 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14866.4446359141, + "Vacc_completed": 1680.8225588341, + "Vacc_refreshed": 260.3047312661, + "Vacc_refreshed_2": 130.15236563305 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14873.2607186268, + "Vacc_completed": 1689.7385811283, + "Vacc_refreshed": 267.8936320344, + "Vacc_refreshed_2": 133.9468160172 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14880.5922770798, + "Vacc_completed": 1689.9651236491, + "Vacc_refreshed": 275.7764918768, + "Vacc_refreshed_2": 137.8882459384 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14887.440916863, + "Vacc_completed": 1696.5525450807, + "Vacc_refreshed": 283.5225421273, + "Vacc_refreshed_2": 141.76127106365 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14888.0132355705, + "Vacc_completed": 1703.9968022938, + "Vacc_refreshed": 284.1554601622, + "Vacc_refreshed_2": 142.0777300811 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14897.4895745985, + "Vacc_completed": 1707.7124979313, + "Vacc_refreshed": 293.9654633907, + "Vacc_refreshed_2": 146.98273169535 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14900.9132287675, + "Vacc_completed": 1714.1256328363, + "Vacc_refreshed": 300.1498047442, + "Vacc_refreshed_2": 150.0749023721 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14907.9968139113, + "Vacc_completed": 1717.9722882107, + "Vacc_refreshed": 303.8260258963, + "Vacc_refreshed_2": 151.91301294815 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14914.3000727157, + "Vacc_completed": 1723.7459149842, + "Vacc_refreshed": 310.6001358466, + "Vacc_refreshed_2": 155.3000679233 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14915.2709520902, + "Vacc_completed": 1725.3728171833, + "Vacc_refreshed": 311.7419250413, + "Vacc_refreshed_2": 155.87096252065 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14924.9251049714, + "Vacc_completed": 1730.3968331067, + "Vacc_refreshed": 318.9914066325, + "Vacc_refreshed_2": 159.49570331625 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14929.9737051543, + "Vacc_completed": 1735.419819131, + "Vacc_refreshed": 327.2769475594, + "Vacc_refreshed_2": 163.6384737797 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.0867908297, + "Vacc_completed": 1735.4531164502, + "Vacc_refreshed": 333.9507530528, + "Vacc_refreshed_2": 166.9753765264 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14930.1585043075, + "Vacc_completed": 1744.7112606784, + "Vacc_refreshed": 337.8096837232, + "Vacc_refreshed_2": 168.9048418616 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14939.2420152133, + "Vacc_completed": 1745.8678859662, + "Vacc_refreshed": 344.4742142552, + "Vacc_refreshed_2": 172.2371071276 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14940.9708787633, + "Vacc_completed": 1748.1937727819, + "Vacc_refreshed": 352.7895987096, + "Vacc_refreshed_2": 176.3947993548 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14950.0282400838, + "Vacc_completed": 1750.2751748343, + "Vacc_refreshed": 354.0652893483, + "Vacc_refreshed_2": 177.03264467415 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14956.5498846765, + "Vacc_completed": 1758.7641351746, + "Vacc_refreshed": 361.0736440858, + "Vacc_refreshed_2": 180.5368220429 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14957.5908121778, + "Vacc_completed": 1763.4528309235, + "Vacc_refreshed": 364.3501912771, + "Vacc_refreshed_2": 182.17509563855 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14960.7281563782, + "Vacc_completed": 1772.006809538, + "Vacc_refreshed": 364.6804469838, + "Vacc_refreshed_2": 182.3402234919 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14969.2457673746, + "Vacc_completed": 1776.5678522654, + "Vacc_refreshed": 374.4882812856, + "Vacc_refreshed_2": 187.2441406428 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14974.8615073088, + "Vacc_completed": 1779.9556763371, + "Vacc_refreshed": 377.4421123342, + "Vacc_refreshed_2": 188.7210561671 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14984.5914886251, + "Vacc_completed": 1782.6146675026, + "Vacc_refreshed": 381.2082916917, + "Vacc_refreshed_2": 190.60414584585 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14987.5876984189, + "Vacc_completed": 1791.1028428437, + "Vacc_refreshed": 385.3294438436, + "Vacc_refreshed_2": 192.6647219218 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.58002825, + "Vacc_completed": 1793.9473770292, + "Vacc_refreshed": 388.9073184565, + "Vacc_refreshed_2": 194.45365922825 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14992.8771499871, + "Vacc_completed": 1796.0612762347, + "Vacc_refreshed": 390.0186176392, + "Vacc_refreshed_2": 195.0093088196 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14993.5505864267, + "Vacc_completed": 1798.6017730753, + "Vacc_refreshed": 390.5734438836, + "Vacc_refreshed_2": 195.2867219418 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 14998.158414122, + "Vacc_completed": 1802.0655230464, + "Vacc_refreshed": 391.8649823662, + "Vacc_refreshed_2": 195.9324911831 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.4313521872, + "Vacc_completed": 1804.413054883, + "Vacc_refreshed": 395.3533451537, + "Vacc_refreshed_2": 197.67667257685 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15001.7989985243, + "Vacc_completed": 1812.4490035114, + "Vacc_refreshed": 401.8191046925, + "Vacc_refreshed_2": 200.90955234625 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15002.2088852954, + "Vacc_completed": 1814.4865305652, + "Vacc_refreshed": 409.5825438963, + "Vacc_refreshed_2": 204.79127194815 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15008.2705384657, + "Vacc_completed": 1823.0023861142, + "Vacc_refreshed": 411.4567502649, + "Vacc_refreshed_2": 205.72837513245 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15013.4515790087, + "Vacc_completed": 1830.5873803301, + "Vacc_refreshed": 417.6053918266, + "Vacc_refreshed_2": 208.8026959133 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15022.965858679, + "Vacc_completed": 1833.2575088513, + "Vacc_refreshed": 421.7562400513, + "Vacc_refreshed_2": 210.87812002565 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15024.3362350043, + "Vacc_completed": 1839.0848659035, + "Vacc_refreshed": 429.2321579029, + "Vacc_refreshed_2": 214.61607895145 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15025.0436784182, + "Vacc_completed": 1840.7238800201, + "Vacc_refreshed": 434.1256619822, + "Vacc_refreshed_2": 217.0628309911 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15026.1929816575, + "Vacc_completed": 1848.4826094697, + "Vacc_refreshed": 436.1767563509, + "Vacc_refreshed_2": 218.08837817545 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "35-59", + "Vacc_partially": 15028.1115762872, + "Vacc_completed": 1851.353962867, + "Vacc_refreshed": 439.6190575403, + "Vacc_refreshed_2": 219.80952877015 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12940.2728292563, + "Vacc_completed": 1761.2082450081, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12944.552426313, + "Vacc_completed": 1763.9916052944, + "Vacc_refreshed": 5.8453121761, + "Vacc_refreshed_2": 2.92265608805 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12946.2293033065, + "Vacc_completed": 1764.8651614651, + "Vacc_refreshed": 11.3614134516, + "Vacc_refreshed_2": 5.6807067258 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12954.4553975676, + "Vacc_completed": 1773.9720915654, + "Vacc_refreshed": 19.8633846559, + "Vacc_refreshed_2": 9.93169232795 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12962.1675537316, + "Vacc_completed": 1776.6871749169, + "Vacc_refreshed": 23.5340750877, + "Vacc_refreshed_2": 11.76703754385 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12970.2114807284, + "Vacc_completed": 1779.4482697767, + "Vacc_refreshed": 32.7047145334, + "Vacc_refreshed_2": 16.3523572667 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12971.1155781651, + "Vacc_completed": 1787.6912361171, + "Vacc_refreshed": 41.3859214133, + "Vacc_refreshed_2": 20.69296070665 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12976.1479148685, + "Vacc_completed": 1796.0609011819, + "Vacc_refreshed": 49.2224218631, + "Vacc_refreshed_2": 24.61121093155 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12985.389251021, + "Vacc_completed": 1806.0439647379, + "Vacc_refreshed": 58.4565372826, + "Vacc_refreshed_2": 29.2282686413 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12987.6528992192, + "Vacc_completed": 1814.2136648594, + "Vacc_refreshed": 68.4133404236, + "Vacc_refreshed_2": 34.2066702118 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12988.8953336446, + "Vacc_completed": 1820.4740554862, + "Vacc_refreshed": 69.4164203636, + "Vacc_refreshed_2": 34.7082101818 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12989.930788247, + "Vacc_completed": 1825.1779692151, + "Vacc_refreshed": 71.594311523, + "Vacc_refreshed_2": 35.7971557615 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12993.9481590439, + "Vacc_completed": 1834.4690603586, + "Vacc_refreshed": 75.4387792504, + "Vacc_refreshed_2": 37.7193896252 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12997.41102572, + "Vacc_completed": 1836.6145856268, + "Vacc_refreshed": 81.7875242048, + "Vacc_refreshed_2": 40.8937621024 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 12999.5337504327, + "Vacc_completed": 1839.9662175544, + "Vacc_refreshed": 87.9455065083, + "Vacc_refreshed_2": 43.97275325415 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13007.2251436977, + "Vacc_completed": 1842.6498922014, + "Vacc_refreshed": 93.1900542901, + "Vacc_refreshed_2": 46.59502714505 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13012.0856312446, + "Vacc_completed": 1844.701996872, + "Vacc_refreshed": 99.712698674, + "Vacc_refreshed_2": 49.856349337 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13021.33252246, + "Vacc_completed": 1849.3061445307, + "Vacc_refreshed": 102.5319545699, + "Vacc_refreshed_2": 51.26597728495 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13027.1500152398, + "Vacc_completed": 1850.8078304213, + "Vacc_refreshed": 105.0259857828, + "Vacc_refreshed_2": 52.5129928914 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13035.650988116, + "Vacc_completed": 1851.8577100095, + "Vacc_refreshed": 110.1445342625, + "Vacc_refreshed_2": 55.07226713125 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13042.2123284129, + "Vacc_completed": 1856.2056162281, + "Vacc_refreshed": 113.6459186876, + "Vacc_refreshed_2": 56.8229593438 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13048.5274669921, + "Vacc_completed": 1856.9596604869, + "Vacc_refreshed": 119.7006093985, + "Vacc_refreshed_2": 59.85030469925 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13056.4261041722, + "Vacc_completed": 1859.9946313318, + "Vacc_refreshed": 128.4930741519, + "Vacc_refreshed_2": 64.24653707595 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13061.2580735831, + "Vacc_completed": 1864.4241013454, + "Vacc_refreshed": 129.4122729818, + "Vacc_refreshed_2": 64.7061364909 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13069.8769575412, + "Vacc_completed": 1870.828968765, + "Vacc_refreshed": 133.5606697443, + "Vacc_refreshed_2": 66.78033487215 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13074.4847352314, + "Vacc_completed": 1873.0576602324, + "Vacc_refreshed": 142.5189975609, + "Vacc_refreshed_2": 71.25949878045 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13077.43910001, + "Vacc_completed": 1881.1763507471, + "Vacc_refreshed": 143.4948395736, + "Vacc_refreshed_2": 71.7474197868 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13082.3470601758, + "Vacc_completed": 1888.5808588713, + "Vacc_refreshed": 149.0381282873, + "Vacc_refreshed_2": 74.51906414365 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13091.0962170402, + "Vacc_completed": 1894.9989493108, + "Vacc_refreshed": 149.7527355276, + "Vacc_refreshed_2": 74.8763677638 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13097.0655225667, + "Vacc_completed": 1904.9660517959, + "Vacc_refreshed": 155.7716165644, + "Vacc_refreshed_2": 77.8858082822 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13105.8431803144, + "Vacc_completed": 1907.1233275333, + "Vacc_refreshed": 162.7399373626, + "Vacc_refreshed_2": 81.3699686813 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13110.9052745957, + "Vacc_completed": 1915.3369502585, + "Vacc_refreshed": 166.1686970271, + "Vacc_refreshed_2": 83.08434851355 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13120.2888484357, + "Vacc_completed": 1924.594235894, + "Vacc_refreshed": 174.1871820852, + "Vacc_refreshed_2": 87.0935910426 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13122.2684309305, + "Vacc_completed": 1926.8954039089, + "Vacc_refreshed": 179.1800373951, + "Vacc_refreshed_2": 89.59001869755 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13129.679389954, + "Vacc_completed": 1929.8687720822, + "Vacc_refreshed": 186.5609898946, + "Vacc_refreshed_2": 93.2804949473 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13136.2121968271, + "Vacc_completed": 1930.5419008182, + "Vacc_refreshed": 190.3285119819, + "Vacc_refreshed_2": 95.16425599095 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13140.8693305096, + "Vacc_completed": 1933.1368513989, + "Vacc_refreshed": 199.5045342081, + "Vacc_refreshed_2": 99.75226710405 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13141.6505152789, + "Vacc_completed": 1938.3539275062, + "Vacc_refreshed": 199.9231054484, + "Vacc_refreshed_2": 99.9615527242 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13146.3819720109, + "Vacc_completed": 1943.0787615053, + "Vacc_refreshed": 203.5617342411, + "Vacc_refreshed_2": 101.78086712055 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.5833925737, + "Vacc_completed": 1944.8505615419, + "Vacc_refreshed": 206.5254255239, + "Vacc_refreshed_2": 103.26271276195 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13155.8864321418, + "Vacc_completed": 1946.7574709443, + "Vacc_refreshed": 208.0171497057, + "Vacc_refreshed_2": 104.00857485285 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13160.8319905342, + "Vacc_completed": 1949.6926878806, + "Vacc_refreshed": 213.0797703475, + "Vacc_refreshed_2": 106.53988517375 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13165.109826694, + "Vacc_completed": 1955.2468047197, + "Vacc_refreshed": 222.6760329578, + "Vacc_refreshed_2": 111.3380164789 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13168.7847714036, + "Vacc_completed": 1956.1809363506, + "Vacc_refreshed": 231.6808966253, + "Vacc_refreshed_2": 115.84044831265 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13176.0869758252, + "Vacc_completed": 1960.8024990411, + "Vacc_refreshed": 233.4328765098, + "Vacc_refreshed_2": 116.7164382549 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13180.123104626, + "Vacc_completed": 1969.8047949709, + "Vacc_refreshed": 241.5696524948, + "Vacc_refreshed_2": 120.7848262474 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13184.6423078124, + "Vacc_completed": 1974.8566545144, + "Vacc_refreshed": 250.4550885677, + "Vacc_refreshed_2": 125.22754428385 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13190.9452560841, + "Vacc_completed": 1975.9346724558, + "Vacc_refreshed": 252.799671753, + "Vacc_refreshed_2": 126.3998358765 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13194.9586490897, + "Vacc_completed": 1984.1998929758, + "Vacc_refreshed": 256.8657355625, + "Vacc_refreshed_2": 128.43286778125 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13203.1981501018, + "Vacc_completed": 1992.2264996957, + "Vacc_refreshed": 262.7110996677, + "Vacc_refreshed_2": 131.35554983385 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13210.570704838, + "Vacc_completed": 2000.1284432323, + "Vacc_refreshed": 268.7466273707, + "Vacc_refreshed_2": 134.37331368535 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13217.6966464936, + "Vacc_completed": 2001.108779963, + "Vacc_refreshed": 270.063420564, + "Vacc_refreshed_2": 135.031710282 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13222.8454105611, + "Vacc_completed": 2006.445790007, + "Vacc_refreshed": 272.306211944, + "Vacc_refreshed_2": 136.153105972 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13231.9459038211, + "Vacc_completed": 2014.1245558198, + "Vacc_refreshed": 274.2682102675, + "Vacc_refreshed_2": 137.13410513375 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.4430744102, + "Vacc_completed": 2021.01783734, + "Vacc_refreshed": 283.272422859, + "Vacc_refreshed_2": 141.6362114295 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13234.9880313892, + "Vacc_completed": 2021.3278488109, + "Vacc_refreshed": 288.8833613171, + "Vacc_refreshed_2": 144.44168065855 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13244.1020800967, + "Vacc_completed": 2028.5342497408, + "Vacc_refreshed": 295.5476346222, + "Vacc_refreshed_2": 147.7738173111 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13246.2035006005, + "Vacc_completed": 2034.7337820973, + "Vacc_refreshed": 295.8527619766, + "Vacc_refreshed_2": 147.9263809883 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13250.3034672718, + "Vacc_completed": 2040.4526371692, + "Vacc_refreshed": 297.6289642024, + "Vacc_refreshed_2": 148.8144821012 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13258.1309651863, + "Vacc_completed": 2043.9166550693, + "Vacc_refreshed": 307.2590005259, + "Vacc_refreshed_2": 153.62950026295 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13264.00554028, + "Vacc_completed": 2046.5596745193, + "Vacc_refreshed": 309.1250398792, + "Vacc_refreshed_2": 154.5625199396 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.4212557374, + "Vacc_completed": 2049.7116443058, + "Vacc_refreshed": 314.0515587013, + "Vacc_refreshed_2": 157.02577935065 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13272.7885616679, + "Vacc_completed": 2051.2982177338, + "Vacc_refreshed": 320.3832182075, + "Vacc_refreshed_2": 160.19160910375 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13274.2264538665, + "Vacc_completed": 2058.2989667129, + "Vacc_refreshed": 323.7063680074, + "Vacc_refreshed_2": 161.8531840037 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13281.9141553951, + "Vacc_completed": 2063.8206751836, + "Vacc_refreshed": 326.9158074422, + "Vacc_refreshed_2": 163.4579037211 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13290.64171309, + "Vacc_completed": 2064.3110765988, + "Vacc_refreshed": 336.7710359746, + "Vacc_refreshed_2": 168.3855179873 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.1885069646, + "Vacc_completed": 2072.8766922561, + "Vacc_refreshed": 344.574816718, + "Vacc_refreshed_2": 172.287408359 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13291.7117921559, + "Vacc_completed": 2081.2889195134, + "Vacc_refreshed": 352.6791052892, + "Vacc_refreshed_2": 176.3395526446 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13295.741331211, + "Vacc_completed": 2082.371745109, + "Vacc_refreshed": 358.7062427923, + "Vacc_refreshed_2": 179.35312139615 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13303.8543248793, + "Vacc_completed": 2084.7970217381, + "Vacc_refreshed": 363.3629273081, + "Vacc_refreshed_2": 181.68146365405 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13305.910901253, + "Vacc_completed": 2089.496376583, + "Vacc_refreshed": 364.4184919111, + "Vacc_refreshed_2": 182.20924595555 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13310.1770755649, + "Vacc_completed": 2091.8877772854, + "Vacc_refreshed": 373.8861441424, + "Vacc_refreshed_2": 186.9430720712 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13318.5822731817, + "Vacc_completed": 2100.0656871327, + "Vacc_refreshed": 380.7622590612, + "Vacc_refreshed_2": 190.3811295306 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13326.848015265, + "Vacc_completed": 2103.7807367097, + "Vacc_refreshed": 383.494468406, + "Vacc_refreshed_2": 191.747234203 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13329.8351558424, + "Vacc_completed": 2106.3811743673, + "Vacc_refreshed": 385.7094999088, + "Vacc_refreshed_2": 192.8547499544 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13334.0243800891, + "Vacc_completed": 2110.0143078684, + "Vacc_refreshed": 387.028737638, + "Vacc_refreshed_2": 193.514368819 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13340.0473805148, + "Vacc_completed": 2114.17877764, + "Vacc_refreshed": 390.7872507231, + "Vacc_refreshed_2": 195.39362536155 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13342.4710995253, + "Vacc_completed": 2117.5584807218, + "Vacc_refreshed": 394.4459716696, + "Vacc_refreshed_2": 197.2229858348 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13345.9586603577, + "Vacc_completed": 2124.6343373595, + "Vacc_refreshed": 401.3739608899, + "Vacc_refreshed_2": 200.68698044495 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13354.1694340722, + "Vacc_completed": 2132.584533812, + "Vacc_refreshed": 404.149558168, + "Vacc_refreshed_2": 202.074779084 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13360.0480186273, + "Vacc_completed": 2135.2279773256, + "Vacc_refreshed": 407.0589420913, + "Vacc_refreshed_2": 203.52947104565 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13362.9287822042, + "Vacc_completed": 2135.7661733179, + "Vacc_refreshed": 412.3495727781, + "Vacc_refreshed_2": 206.17478638905 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13365.9702033874, + "Vacc_completed": 2140.0801351424, + "Vacc_refreshed": 414.1173144704, + "Vacc_refreshed_2": 207.0586572352 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13375.8578305813, + "Vacc_completed": 2147.1687721976, + "Vacc_refreshed": 416.1274613074, + "Vacc_refreshed_2": 208.0637306537 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.3434411484, + "Vacc_completed": 2149.6360498231, + "Vacc_refreshed": 422.5420941028, + "Vacc_refreshed_2": 211.2710470514 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13384.8386238776, + "Vacc_completed": 2156.2105881723, + "Vacc_refreshed": 428.2913369026, + "Vacc_refreshed_2": 214.1456684513 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13388.7750604929, + "Vacc_completed": 2160.929719286, + "Vacc_refreshed": 437.0909930573, + "Vacc_refreshed_2": 218.54549652865 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13397.0959920005, + "Vacc_completed": 2169.0772334568, + "Vacc_refreshed": 438.0782576038, + "Vacc_refreshed_2": 219.0391288019 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13406.1913483212, + "Vacc_completed": 2172.8397968306, + "Vacc_refreshed": 445.0079409299, + "Vacc_refreshed_2": 222.50397046495 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13410.1064630998, + "Vacc_completed": 2179.4067803849, + "Vacc_refreshed": 453.2550919609, + "Vacc_refreshed_2": 226.62754598045 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.2872479216, + "Vacc_completed": 2183.7956163614, + "Vacc_refreshed": 462.0847473084, + "Vacc_refreshed_2": 231.0423736542 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "60-79", + "Vacc_partially": 13418.7274837683, + "Vacc_completed": 2186.2625889833, + "Vacc_refreshed": 470.3671533805, + "Vacc_refreshed_2": 235.18357669025 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15108.1816487494, + "Vacc_completed": 1951.3500240632, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15112.0388992614, + "Vacc_completed": 1956.8484422205, + "Vacc_refreshed": 4.7764537598, + "Vacc_refreshed_2": 2.3882268799 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15115.1174991099, + "Vacc_completed": 1961.6166149519, + "Vacc_refreshed": 11.6778924479, + "Vacc_refreshed_2": 5.83894622395 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15121.0352670933, + "Vacc_completed": 1969.039883077, + "Vacc_refreshed": 19.464449507, + "Vacc_refreshed_2": 9.7322247535 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15130.8297777562, + "Vacc_completed": 1970.7344191294, + "Vacc_refreshed": 28.0813773392, + "Vacc_refreshed_2": 14.0406886696 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15139.7963570637, + "Vacc_completed": 1971.420038313, + "Vacc_refreshed": 34.2304461363, + "Vacc_refreshed_2": 17.11522306815 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15149.3578353885, + "Vacc_completed": 1977.7986093705, + "Vacc_refreshed": 42.9385547047, + "Vacc_refreshed_2": 21.46927735235 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15150.8906121637, + "Vacc_completed": 1981.6633590428, + "Vacc_refreshed": 46.0030569507, + "Vacc_refreshed_2": 23.00152847535 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15153.3987479409, + "Vacc_completed": 1986.7151251441, + "Vacc_refreshed": 54.9967129669, + "Vacc_refreshed_2": 27.49835648345 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15155.2112066, + "Vacc_completed": 1993.3668502516, + "Vacc_refreshed": 59.2446234015, + "Vacc_refreshed_2": 29.62231170075 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15157.213160056, + "Vacc_completed": 2000.1282773775, + "Vacc_refreshed": 61.576334937, + "Vacc_refreshed_2": 30.7881674685 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15159.7206353696, + "Vacc_completed": 2000.5786646957, + "Vacc_refreshed": 62.4328961844, + "Vacc_refreshed_2": 31.2164480922 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15165.6048851908, + "Vacc_completed": 2000.600816545, + "Vacc_refreshed": 70.2254449832, + "Vacc_refreshed_2": 35.1127224916 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15175.5401574577, + "Vacc_completed": 2003.6984716795, + "Vacc_refreshed": 80.0202808521, + "Vacc_refreshed_2": 40.01014042605 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15178.2193352397, + "Vacc_completed": 2010.5259174304, + "Vacc_refreshed": 80.5289834705, + "Vacc_refreshed_2": 40.26449173525 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15186.1911779287, + "Vacc_completed": 2020.3094769054, + "Vacc_refreshed": 88.939485925, + "Vacc_refreshed_2": 44.4697429625 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15192.9408650715, + "Vacc_completed": 2027.102138126, + "Vacc_refreshed": 93.403990271, + "Vacc_refreshed_2": 46.7019951355 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15197.2522804828, + "Vacc_completed": 2033.1768424672, + "Vacc_refreshed": 103.3495680716, + "Vacc_refreshed_2": 51.6747840358 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15201.4718571012, + "Vacc_completed": 2041.9289374755, + "Vacc_refreshed": 107.0046191576, + "Vacc_refreshed_2": 53.5023095788 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15203.6899934618, + "Vacc_completed": 2042.5550193085, + "Vacc_refreshed": 108.1692912263, + "Vacc_refreshed_2": 54.08464561315 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15210.5751055, + "Vacc_completed": 2049.1508387429, + "Vacc_refreshed": 115.4885047404, + "Vacc_refreshed_2": 57.7442523702 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15216.3570734734, + "Vacc_completed": 2052.3213561982, + "Vacc_refreshed": 119.2061326333, + "Vacc_refreshed_2": 59.60306631665 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15225.8779749457, + "Vacc_completed": 2057.4663468474, + "Vacc_refreshed": 126.226397743, + "Vacc_refreshed_2": 63.1131988715 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15230.8206176005, + "Vacc_completed": 2064.8586744443, + "Vacc_refreshed": 133.0501812916, + "Vacc_refreshed_2": 66.5250906458 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15231.8828151205, + "Vacc_completed": 2068.2097593649, + "Vacc_refreshed": 142.0174284746, + "Vacc_refreshed_2": 71.0087142373 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15238.2426035555, + "Vacc_completed": 2071.8714182096, + "Vacc_refreshed": 148.7355853512, + "Vacc_refreshed_2": 74.3677926756 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15247.7928253295, + "Vacc_completed": 2078.7188555952, + "Vacc_refreshed": 156.2462830057, + "Vacc_refreshed_2": 78.12314150285 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15257.1929610505, + "Vacc_completed": 2083.6123346127, + "Vacc_refreshed": 163.8060000189, + "Vacc_refreshed_2": 81.90300000945 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15261.4225446127, + "Vacc_completed": 2092.4315663384, + "Vacc_refreshed": 165.098643188, + "Vacc_refreshed_2": 82.549321594 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15264.9230201438, + "Vacc_completed": 2098.3647861992, + "Vacc_refreshed": 173.1581071885, + "Vacc_refreshed_2": 86.57905359425 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15274.2090277291, + "Vacc_completed": 2098.6684198619, + "Vacc_refreshed": 179.3045017397, + "Vacc_refreshed_2": 89.65225086985 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15275.4881156514, + "Vacc_completed": 2104.7296501443, + "Vacc_refreshed": 184.3873991738, + "Vacc_refreshed_2": 92.1936995869 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.4296689803, + "Vacc_completed": 2109.0258070133, + "Vacc_refreshed": 190.3361011534, + "Vacc_refreshed_2": 95.1680505767 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15277.7641225132, + "Vacc_completed": 2111.2503398848, + "Vacc_refreshed": 196.3057900505, + "Vacc_refreshed_2": 98.15289502525 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15280.5288668271, + "Vacc_completed": 2120.2846622436, + "Vacc_refreshed": 201.8816019943, + "Vacc_refreshed_2": 100.94080099715 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15286.6794056665, + "Vacc_completed": 2127.5294418815, + "Vacc_refreshed": 205.8247713924, + "Vacc_refreshed_2": 102.9123856962 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15287.919376399, + "Vacc_completed": 2127.7213986428, + "Vacc_refreshed": 207.0848824799, + "Vacc_refreshed_2": 103.54244123995 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15288.8972252423, + "Vacc_completed": 2131.7043154907, + "Vacc_refreshed": 214.6605013946, + "Vacc_refreshed_2": 107.3302506973 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15295.1676694583, + "Vacc_completed": 2141.6853776317, + "Vacc_refreshed": 217.321705385, + "Vacc_refreshed_2": 108.6608526925 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.8279320379, + "Vacc_completed": 2150.6081907236, + "Vacc_refreshed": 224.1814306469, + "Vacc_refreshed_2": 112.09071532345 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15299.9502690873, + "Vacc_completed": 2150.8297260642, + "Vacc_refreshed": 224.2857175024, + "Vacc_refreshed_2": 112.1428587512 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15305.4629063272, + "Vacc_completed": 2159.4075137345, + "Vacc_refreshed": 226.4536786248, + "Vacc_refreshed_2": 113.2268393124 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15313.0091699117, + "Vacc_completed": 2160.0885470064, + "Vacc_refreshed": 232.5677391068, + "Vacc_refreshed_2": 116.2838695534 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15316.6742133238, + "Vacc_completed": 2163.6640679748, + "Vacc_refreshed": 242.4458167027, + "Vacc_refreshed_2": 121.22290835135 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15325.7736410299, + "Vacc_completed": 2171.6222500116, + "Vacc_refreshed": 251.5591803171, + "Vacc_refreshed_2": 125.77959015855 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15333.3685319398, + "Vacc_completed": 2174.4162160121, + "Vacc_refreshed": 254.1541702573, + "Vacc_refreshed_2": 127.07708512865 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15337.5758896556, + "Vacc_completed": 2180.7560110181, + "Vacc_refreshed": 255.4491825287, + "Vacc_refreshed_2": 127.72459126435 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15346.8261947795, + "Vacc_completed": 2184.562660479, + "Vacc_refreshed": 256.0794667401, + "Vacc_refreshed_2": 128.03973337005 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15347.5063487999, + "Vacc_completed": 2192.7053918922, + "Vacc_refreshed": 264.8657432896, + "Vacc_refreshed_2": 132.4328716448 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15355.2915215882, + "Vacc_completed": 2197.3639423288, + "Vacc_refreshed": 266.2003474583, + "Vacc_refreshed_2": 133.10017372915 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15357.0291297717, + "Vacc_completed": 2203.5668703416, + "Vacc_refreshed": 266.2591235692, + "Vacc_refreshed_2": 133.1295617846 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15363.7351300479, + "Vacc_completed": 2212.51470716, + "Vacc_refreshed": 268.1554009506, + "Vacc_refreshed_2": 134.0777004753 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15366.2054877706, + "Vacc_completed": 2220.7805776981, + "Vacc_refreshed": 270.2429125628, + "Vacc_refreshed_2": 135.1214562814 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15374.7828886007, + "Vacc_completed": 2223.4779151007, + "Vacc_refreshed": 271.3258668517, + "Vacc_refreshed_2": 135.66293342585 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15375.8644766411, + "Vacc_completed": 2223.902202818, + "Vacc_refreshed": 277.3418287874, + "Vacc_refreshed_2": 138.6709143937 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15384.0103684975, + "Vacc_completed": 2233.2600148125, + "Vacc_refreshed": 286.2795142721, + "Vacc_refreshed_2": 143.13975713605 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15388.2433647335, + "Vacc_completed": 2242.2405085188, + "Vacc_refreshed": 295.9058348626, + "Vacc_refreshed_2": 147.9529174313 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15395.874552707, + "Vacc_completed": 2242.5126967683, + "Vacc_refreshed": 297.0217883024, + "Vacc_refreshed_2": 148.5108941512 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15399.399317417, + "Vacc_completed": 2250.19318626, + "Vacc_refreshed": 297.4497074595, + "Vacc_refreshed_2": 148.72485372975 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15407.4994879004, + "Vacc_completed": 2258.8146667712, + "Vacc_refreshed": 302.8025504676, + "Vacc_refreshed_2": 151.4012752338 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15410.1346998553, + "Vacc_completed": 2259.5361618465, + "Vacc_refreshed": 305.0699464575, + "Vacc_refreshed_2": 152.53497322875 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15415.5662938607, + "Vacc_completed": 2266.2419298528, + "Vacc_refreshed": 306.5583985118, + "Vacc_refreshed_2": 153.2791992559 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15424.362408066, + "Vacc_completed": 2270.6973906417, + "Vacc_refreshed": 307.7300944183, + "Vacc_refreshed_2": 153.86504720915 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15427.4641661532, + "Vacc_completed": 2273.4475287465, + "Vacc_refreshed": 315.9257071161, + "Vacc_refreshed_2": 157.96285355805 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15430.3003374401, + "Vacc_completed": 2280.4953549554, + "Vacc_refreshed": 320.4057109928, + "Vacc_refreshed_2": 160.2028554964 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15434.7161891817, + "Vacc_completed": 2283.6641990131, + "Vacc_refreshed": 329.6425079267, + "Vacc_refreshed_2": 164.82125396335 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15439.6389263804, + "Vacc_completed": 2286.269595866, + "Vacc_refreshed": 336.6032551175, + "Vacc_refreshed_2": 168.30162755875 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.607595077, + "Vacc_completed": 2292.1795115763, + "Vacc_refreshed": 339.4752869467, + "Vacc_refreshed_2": 169.73764347335 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15445.7317234732, + "Vacc_completed": 2299.0428376394, + "Vacc_refreshed": 342.2213588852, + "Vacc_refreshed_2": 171.1106794426 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15448.8137925508, + "Vacc_completed": 2303.3104194582, + "Vacc_refreshed": 346.3780017598, + "Vacc_refreshed_2": 173.1890008799 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15449.4812178935, + "Vacc_completed": 2311.9261799324, + "Vacc_refreshed": 351.1765190663, + "Vacc_refreshed_2": 175.58825953315 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9089483618, + "Vacc_completed": 2315.5711542884, + "Vacc_refreshed": 352.532745084, + "Vacc_refreshed_2": 176.266372542 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15457.9943266817, + "Vacc_completed": 2322.1716179078, + "Vacc_refreshed": 355.0774800773, + "Vacc_refreshed_2": 177.53874003865 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15459.7074068986, + "Vacc_completed": 2323.3027059178, + "Vacc_refreshed": 364.5645466744, + "Vacc_refreshed_2": 182.2822733372 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15465.686171573, + "Vacc_completed": 2325.8040208828, + "Vacc_refreshed": 365.9637341301, + "Vacc_refreshed_2": 182.98186706505 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15466.2025927257, + "Vacc_completed": 2332.7537065257, + "Vacc_refreshed": 366.2841969775, + "Vacc_refreshed_2": 183.14209848875 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15471.0643499093, + "Vacc_completed": 2333.7718947218, + "Vacc_refreshed": 370.7174701468, + "Vacc_refreshed_2": 185.3587350734 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15480.1820736709, + "Vacc_completed": 2336.425519339, + "Vacc_refreshed": 378.1719392306, + "Vacc_refreshed_2": 189.0859696153 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15489.2619602904, + "Vacc_completed": 2342.4314320637, + "Vacc_refreshed": 382.1070985379, + "Vacc_refreshed_2": 191.05354926895 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15497.197059921, + "Vacc_completed": 2351.5508059781, + "Vacc_refreshed": 390.0131449372, + "Vacc_refreshed_2": 195.0065724686 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15506.8997820546, + "Vacc_completed": 2354.7951207515, + "Vacc_refreshed": 397.4755552416, + "Vacc_refreshed_2": 198.7377776208 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15514.6356932026, + "Vacc_completed": 2359.4543858263, + "Vacc_refreshed": 405.5265192328, + "Vacc_refreshed_2": 202.7632596164 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15517.1065215082, + "Vacc_completed": 2362.3705119741, + "Vacc_refreshed": 406.2503084488, + "Vacc_refreshed_2": 203.1251542244 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15526.1890623234, + "Vacc_completed": 2369.2123027947, + "Vacc_refreshed": 407.9863557734, + "Vacc_refreshed_2": 203.9931778867 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15529.1257916241, + "Vacc_completed": 2371.0230854052, + "Vacc_refreshed": 415.4330021443, + "Vacc_refreshed_2": 207.71650107215 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15534.1422800755, + "Vacc_completed": 2376.4314141852, + "Vacc_refreshed": 417.8710629027, + "Vacc_refreshed_2": 208.93553145135 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15536.9779956012, + "Vacc_completed": 2380.9412020655, + "Vacc_refreshed": 418.6065556413, + "Vacc_refreshed_2": 209.30327782065 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15542.623117778, + "Vacc_completed": 2383.2295524317, + "Vacc_refreshed": 425.5318613018, + "Vacc_refreshed_2": 212.7659306509 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15545.7349127212, + "Vacc_completed": 2388.7438112703, + "Vacc_refreshed": 435.2708995295, + "Vacc_refreshed_2": 217.63544976475 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15552.7663039717, + "Vacc_completed": 2398.7179519564, + "Vacc_refreshed": 436.7806978293, + "Vacc_refreshed_2": 218.39034891465 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15553.9038494269, + "Vacc_completed": 2401.9470135031, + "Vacc_refreshed": 445.294989416, + "Vacc_refreshed_2": 222.647494708 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "80-99", + "Vacc_partially": 15563.5219522465, + "Vacc_completed": 2408.3277109489, + "Vacc_refreshed": 449.1868908695, + "Vacc_refreshed_2": 224.59344543475 } -] +] \ No newline at end of file diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 751fe3282e..9c3c1f58a1 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -585,19 +585,19 @@ TEST(TestOdeSECIRVVS, read_data) // values were generated by the tested function; can only check stability of the implementation, not correctness auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 8792.15, 175.889, - 3.21484, 0.0633116, 0.221057, 1.42882, 0.0351731, 0.29682, 0, 0, 0, 6.93838, 0.0725173, 0.206715, 0, 0, 0, - 0.0337498, 1.23324e-05, 0.000208293, 0.0292822, 5.8568e-05, 0.000406386, 1340.42, 0, 0, 0, 17067.6, 220.137, - 7.64078, 0.0970237, 0.381933, 4.91193, 0.0779655, 0.741778, 0, 0, 0, 11.7286, 0.0890643, 0.286235, 0, 0, 0, - 0.0434344, 8.40756e-06, 0.000160098, 0.0294125, 3.7932e-05, 0.000296738, 1891.19, 0, 0, 0, 72501, 176.267, - 47.227, 0.113013, 0.490073, 24.4094, 0.0730141, 0.765246, 0, 0, 0, 64.6789, 0.0855947, 0.303032, 0, 0, 0, - 1.23754, 4.5968e-05, 0.000964262, 0.0751837, 1.82724e-05, 0.000157466, 1670.26, 0, 0, 0, 80790.1, 184.645, - 44.5477, 0.100229, 0.50512, 23.6881, 0.0666206, 0.811467, 0, 0, 0, 58.9805, 0.0758111, 0.31192, 0, 0, 0, - 3.75961, 0.000136175, 0.00331973, 0.486628, 0.000111199, 0.00111367, 2022.58, 0, 0, 0, 41581, 177.478, 9.27393, - 0.0389771, 0.216151, 5.77433, 0.030336, 0.4066, 0, 0, 0, 13.3664, 0.0312302, 0.141394, 0, 0, 0, 3.119, - 0.000209444, 0.00561852, 2.60439, 0.00111169, 0.0122515, 2136.6, 0, 0, 0, 13223.8, 216.037, 11.1838, 0.179986, - 0.863926, 3.50537, 0.0705169, 0.818075, 0, 0, 0, 3.52982, 0.0331744, 0.130002, 0, 0, 0, 0.695168, 0.000190699, - 0.00442784, 4.67895, 0.00764769, 0.0729502, 2253.61, 0, 0, 0) + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 410.72, 3630.45, + 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 2893.07, 0, 0, 0, 2652.78, 714.319, 763.188, 8032.87, + 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, 0.0132265, + 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 5916.15, 0, 0, 0, 3658.05, 799.805, 5554.16, 43483, 5.32163, + 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, 0.56467, 0.071343, + 0.0777408, 0.0753594, 3.5, 4, 21861.8, 0, 0, 0, 2589.83, 845.38, 6617.66, 48070, 5.33096, 40.6794, 9.01336, + 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, 1.78101, 0.218787, 0.234499, 0.487853, + 3.5, 4, 24154, 0, 0, 0, 3367.68, 774.244, 1528.03, 21414.7, 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, + 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, 0.328498, 2.61775, 3.5, 4, 16069.9, 0, + 0, 0, 4038.53, 836.776, 144.225, 1979.35, 0.22575, 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, + 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, 0.146922, 4.75954, 3.5, 4, 8288.72, 0, 0, 0, + 4447.91, 823.157) .finished(); ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), @@ -645,6 +645,9 @@ TEST(TestOdeSECIRVVS, read_data) 0); EXPECT_GE(double(model3[0].populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}]), 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity}]), 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity}]), + 0); // currently dead and confirmed after commuting compartments are initialized as zero EXPECT_EQ(double(model1[0].populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), @@ -745,7 +748,7 @@ TEST(TestOdeSECIRVVS, export_time_series_init) // Values were generated by the tested function export_input_data_county_timeseries; // can only check stability of the implementation, not correctness auto expected_results = - mio::read_result(mio::path_join(TEST_DATA_DIR, "export_time_series_initialization_osecirvvs.h5")).value(); + mio::read_result(mio::path_join(TEST_DATA_DIR, "export_time_series_initialization_osecirts.h5")).value(); ASSERT_THAT(print_wrap(data_extrapolated.value()[0].get_groups().matrix()), MatrixNear(print_wrap(expected_results[0].get_groups().matrix()), 1e-5, 1e-5)); @@ -767,20 +770,19 @@ TEST(TestOdeSECIRVVS, model_initialization) // Values from data/export_time_series_init_osecirvvs.h5, for reading in comparison // operator for return of mio::read_result and model population needed. auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 3.46722e+06, 176.06, - 3.42799, 0.00017139, 0.00059842, 1.52355, 9.52168e-05, 0.000803518, 0, 0, 0, 7.28479, 0.000193296, 0.000551002, - 0, 0, 0, 0.0342843, 3.1805e-08, 5.37183e-07, 0.029746, 1.51045e-07, 1.04806e-06, 1340.35, 0, 0, 0, 7.74734e+06, - 220.4, 7.99917, 0.000224064, 0.000882024, 5.14232, 0.000180051, 0.00171304, 0, 0, 0, 12.1419, 0.000203391, - 0.000653659, 0, 0, 0, 0.0439275, 1.87568e-08, 3.5717e-07, 0.0297464, 8.46241e-08, 6.62006e-07, 1891.15, 0, 0, - 0, 1.92155e+07, 176.538, 47.6768, 0.00043128, 0.00187022, 24.642, 0.000278636, 0.00292033, 0, 0, 0, 65.1411, - 0.000325876, 0.0011537, 0, 0, 0, 1.24042, 1.74173e-07, 3.65358e-06, 0.0753588, 6.9234e-08, 5.96637e-07, - 1671.81, 0, 0, 0, 3.00317e+07, 184.888, 44.9988, 0.000272769, 0.00137466, 23.9279, 0.000181305, 0.00220837, 0, - 0, 0, 59.4274, 0.000205796, 0.000846734, 0, 0, 0, 3.76905, 3.67799e-07, 8.9664e-06, 0.48785, 3.00341e-07, - 3.00797e-06, 2022.51, 0, 0, 0, 1.65123e+07, 177.579, 9.4638, 0.000100211, 0.00055573, 5.89255, 7.79946e-05, - 0.00104538, 0, 0, 0, 13.5709, 7.98864e-05, 0.000361685, 0, 0, 0, 3.13496, 5.30384e-07, 1.4228e-05, 2.61772, - 2.81518e-06, 3.1025e-05, 2136.56, 0, 0, 0, 6.17983e+06, 216.328, 11.9625, 0.000412312, 0.00197908, 3.74944, - 0.00016154, 0.00187405, 0, 0, 0, 3.71387, 7.47535e-05, 0.000292941, 0, 0, 0, 0.707117, 4.15435e-07, - 9.64602e-06, 4.75937, 1.66604e-05, 0.000158922, 2253.59, 0, 0, 0) + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 138748, 2.11327e+06, + 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 1.21334e+06, 0, 0, 0, 2652.78, 714.319, 309974, + 4.7235e+06, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, + 0.0132265, 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 2.71151e+06, 0, 0, 0, 3658.05, 799.805, 1.44128e+06, + 1.19121e+07, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, + 0.56467, 0.071343, 0.0777408, 0.0753594, 3.5, 4, 5.86047e+06, 0, 0, 0, 2589.83, 845.38, 2.40269e+06, + 1.86176e+07, 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, + 1.78101, 0.218787, 0.234499, 0.487853, 3.5, 4, 9.00942e+06, 0, 0, 0, 3367.68, 774.244, 578004, 9.57445e+06, + 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, + 0.223414, 0.328498, 2.61775, 3.5, 4, 6.35731e+06, 0, 0, 0, 4038.53, 836.776, 61810.3, 2.53029e+06, 0.22575, + 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, + 0.046887, 0.146922, 4.75954, 3.5, 4, 3.58492e+06, 0, 0, 0, 4447.91, 823.157) .finished(); ASSERT_THAT(print_wrap(model_vector[0].populations.array().cast()), @@ -798,7 +800,7 @@ TEST(TestOdeSECIRVVS, run_simulation) // Load result of a previous run; only tests stability, not correctness. auto expected_result = - mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirvvs.h5")).value()[0].get_groups(); + mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirts.h5")).value()[0].get_groups(); ASSERT_THAT(print_wrap(result.matrix()), MatrixNear(print_wrap(expected_result.matrix()), 1e-5, 1e-5)); } diff --git a/export_time_series_initialization_osecirts.h5 b/export_time_series_initialization_osecirts.h5 new file mode 100644 index 0000000000000000000000000000000000000000..51b3f0967561913060daf922cfecab1782394a29 GIT binary patch literal 10008 zcmeI12{cvv9>>o?9AgQYXHirVm6!PakD*Z9UW7sv8E%G*DY>FdxuVI`HKltqrXwPf zDW$lm3=J|RbEs4|iFZ!+aqrFA=e>2;TkE~Io_*HZ|Nq|q@BZ)K=eNIm@BjXv2z}ix z+#Dht1lmF(5m*RIzEJ6y~GY9bS;{#k?1=X%Kxhj={ozB$R^#HBD)zjVQkP23=!%9`G zRKv>kSh;~fFm?Cd=R!S>?tA+EVPgE9F3rRA=cW|qTe|LBAJgMlDF2)RB7t=_w^-tc z*c**VoZW$?mGFBh^i|I*1z7G8L5-83HiHQkQTNi0WMX3a+5rjckC}L!efG@sH|Fft zQmhx6_-xrA)gykh4gaC_tglFOqlM$Vj02(5#4Kg3lfs%)`55a~V9nR~8SCipg9-u0 zI(4kMX&GZ3{XSa3##o22<}N|TI=ogc?`LRij6m)>8UItR93ltr>E|oase`E1E#Ydh z?C8!$W#QK^hhRj0EJby5F(e&M@+Z1Yf&Vyb!6ojufY z45oO;jN{n4|z@INp&fx45pmQ=g^G(w@t-W6w1>CELnMqY9Q6^4A z^znUcy?+EKnFC>H+ifW0C%>+^Lqt}Stou06e87!cXe5lo{#gf9n_AEfzK&Z~o7?aqIJqo++zK>`b(|_oi$EB0`Hi<;eikrh@1F1>#3wCE@y+gi#;RG5OZDe zW^xjwz06YUZSRH-bcNexcqzHpQY*riw38fB-CN1r*a?rNCnx%!ilYxh-1=ZM16?Ox zpRV(4hF_m;MGvP0k>~E3Xr{wF2+uc3=RDJ-etivzbxv#2Z%QEr4vE@5*QanfPpaq3 z1TBjMva^{Y$FENC&cvS0IK+LYq{PEk z+8(zUmowX|wf(%&IFx5Hf90%~v}DM61M@A>GtE7_?;r?WSke2r#AD94-*V1uJ^2eG zPOTDI>T`$!ejASZ5-Ir4OFTa=>|e;hzaskIJW#(wgctHbof4hjm<$j2Y^F)p!? zk3Z%kLwX?}f6Rxi+<#*}W@GyAS*ubP@#*zs>2=Lg)i)i;Pp$TQWV`dpSvK&dkI#xLHZYBbb zS5({_voyo~UUH}%r+zQJ0%^2-tdmm^(K-J%ab*RKQ{rWI>Z|Bw$anLN_QZ)TNd1mq zsa&2M5+q(omN`vA`3GI|ay9`<(65rbLQuhtyH0puC#}}oEx?9PxWINx+PNxJ|t|ICFzC0Az+mByo z$hkg^XDGD~nk#uabt`}8>@Tt;&^Uh%+i9^%RS>PVzh+yKxD`z_d0RH?E=P&0+SE?o z=0waq%bWc!laa~3C;6l6RdM5%yK+xk;;=Mo$qKxczEl@!SXn0GkZB|ZP5~wEB&#a1o;q)`!-k8c0oaraqlSWh z1qprF0NsPvgOvB-`gSB_SDmQr00=pk^(fsIoZ~EeKg2`h6#TCH zOn0*YTA94^!RRAhbVQi5sK{FeX^)yD-s~cwYVXLFqnVnB`Th{4?~XEV+&)uNH_sfA zMhA)QhEbwAs7+CY^57RyTz#3(?l>WdOKeKt5txBlqEbFwENa zJdo)QsI~3CA(BFYAIrHZj5rCVHRi`^`r%gb{qK+1{m%JNf$~nC$~mFo!mM5{fR-JP zU88qf7qzpVNO9aRgPxfuwr|woLVL%gelmKBkYlY)WFhA|+_*;uOC6nOQn?qLiqFY>`DGF#&NfGO`ALmIn8?0p zsM8>XveZ8xDovLr2aJ>#67=?yFV7ruX&UYVv83?WK(aKlO7bfCFv)_nlb&VlTG|3$ zQ3~$c+C@;;g#EenQa)VH3;MR|FPDr$$|+)IAg45X>$LaS&S3(sev60w$D=O8ph9@e z(i&e6r+?OTmtbvymqM#;d) z)ld%!;d}fkt6SjS1&8we?7g5_lk;V9;yB#-^r+(mPcLM(O`T`N`2^#<`VHrvMWj?3 zr()1irW%7z_~B9gUbO*9G{78n<>CQmbW9~PqGYNSn)<_IoT=}@7gIf7x_NTxIJR!)X5bf&We3g`4WJfbD=aKsGFh-mv zixsV+s|w*P$9kLef#2Y_FU@{~%A+X7D`$J2nGX4qh_A-pSM_j7OjeV$Nd_gG%e6`* z38JR9gC7;d^C7B2lYA(K3*A|@JIlao8E)JXm)dt}-Maxzl*OS__XtSR_wd=l@;A8i zjpb$W)!`l#uzs+J^Bge)AiCDTtf2~0eLJ2I_q>2Q7sDT(3rvH&u4c8hH8T=Evm?OS zavOQ*7yYwx2J@fej-w*fc{mU7yqFlMY1cK!*;r7$hsJ4hx5HM zVeT)+ky_%2Rc|!yyR`L^7&PbQZQkidPyplZ3U9x$Ba5pW}s*pRr=Ok={dohSIMAn~kHwuOdmvHyqva=$ zK@h4D%qaNoBNSJ>+~w`afhw$)m{G>rk?64xULpTQL_56Id4@^L+zCvAy2pd}QcVnfC`K-v~>Jc9r=ayDi>h+w@d2?%9`XQ=+ z`~!b3t8`SJ;|zVLr9tCtEKf`)yRAg3fz=7wLDp#Pbol8DZGcYJh-;M$N}~2%)#;n0 z%u&VFiH3=GBV5iSEww3+wy7Zn#nlp4i}xTtE>F|!W$SVEnp%-@r0+OUVo9k_-Q^y5 pq3v}ok7XE_^W*R)BO2%00P5{|V?JlD9F21dZe4rJ@4HC_{R6whym Date: Thu, 7 Mar 2024 15:11:20 +0100 Subject: [PATCH 07/60] fix msvc --- cpp/models/ode_secirvvs/parameters_io.cpp | 16 ++++++++-------- cpp/models/ode_secirvvs/parameters_io.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index 8a5171d36e..6f872886f4 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -224,7 +224,7 @@ IOResult read_confirmed_cases_data( return success(); } -IOResult>> read_immunity_population(const std::string& path, const int& num_age_groups) +IOResult>> read_immunity_population(const std::string& path, const size_t& num_age_groups) { std::vector> ans(3, std::vector(num_age_groups, 0.0)); std::fstream immunity_file; @@ -383,17 +383,17 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto date_df = vacc_data_entry.date; if (it != vregion.end()) { auto region_idx = size_t(it - vregion.begin()); - auto age = vacc_data_entry.age_group; + AgeGroup age = vacc_data_entry.age_group; // initialize the temporary immunity states if (date_df >= offset_date_by_days( - date, + date, static_cast( -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age]) && + model[region_idx].parameters.template get()[age])) && date_df <= offset_date_by_days( - date, -model[region_idx].parameters.template get()[age])) { + date, static_cast(-model[region_idx].parameters.template get()[age]))) { model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += vacc_data_entry.num_vaccinations_completed; } @@ -401,11 +401,11 @@ IOResult set_vaccination_data(std::vector& model, const std::string if (date_df >= offset_date_by_days( date, - -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age]) && + static_cast(-model[region_idx].parameters.template get()[age] - + model[region_idx].parameters.template get()[age])) && date_df <= offset_date_by_days( - date, -model[region_idx].parameters.template get()[age]) + date, static_cast(-model[region_idx].parameters.template get()[age])) ) { model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index cd4b326815..c714cba76e 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -79,7 +79,7 @@ IOResult read_confirmed_cases_data( const std::vector& scaling_factor_inf); /**@}*/ -IOResult>> read_immunity_population(const std::string& path, const int& num_age_groups); +IOResult>> read_immunity_population(const std::string& path, const size_t& num_age_groups); /**@}*/ /** From 8f5b4e10c6b120c111c89bf19a54c4ff75eca79b Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 8 Mar 2024 11:37:11 +0100 Subject: [PATCH 08/60] fix gcc --- cpp/models/ode_secirvvs/parameters_io.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index 6f872886f4..cff1f5d962 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -224,7 +224,8 @@ IOResult read_confirmed_cases_data( return success(); } -IOResult>> read_immunity_population(const std::string& path, const size_t& num_age_groups) +IOResult>> read_immunity_population(const std::string& path, + const size_t& num_age_groups) { std::vector> ans(3, std::vector(num_age_groups, 0.0)); std::fstream immunity_file; @@ -241,7 +242,7 @@ IOResult>> read_immunity_population(const std::s if (linenumber < 2) tp.erase(tp.size() - 1); auto line = split(tp, ' '); - for (int i = 0; i < num_age_groups; i++) { + for (size_t i = 0; i < num_age_groups; i++) { ans[linenumber][i] = std::stod(line[i]); } linenumber++; @@ -383,17 +384,20 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto date_df = vacc_data_entry.date; if (it != vregion.end()) { auto region_idx = size_t(it - vregion.begin()); - AgeGroup age = vacc_data_entry.age_group; + AgeGroup age = vacc_data_entry.age_group; // initialize the temporary immunity states if (date_df >= offset_date_by_days( - date, static_cast( - -model[region_idx].parameters.template get()[age] - + date, + static_cast( + -model[region_idx].parameters.template get()[age] - model[region_idx].parameters.template get()[age])) && date_df <= offset_date_by_days( - date, static_cast(-model[region_idx].parameters.template get()[age]))) { + date, + static_cast( + -model[region_idx].parameters.template get()[age]))) { model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += vacc_data_entry.num_vaccinations_completed; } @@ -401,11 +405,13 @@ IOResult set_vaccination_data(std::vector& model, const std::string if (date_df >= offset_date_by_days( date, - static_cast(-model[region_idx].parameters.template get()[age] - + static_cast( + -model[region_idx].parameters.template get()[age] - model[region_idx].parameters.template get()[age])) && date_df <= offset_date_by_days( - date, static_cast(-model[region_idx].parameters.template get()[age])) + date, static_cast( + -model[region_idx].parameters.template get()[age])) ) { model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += From b7a1ff066a02317087f2d4ff54db18919a611d76 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 8 Mar 2024 12:56:54 +0100 Subject: [PATCH 09/60] move h5 to right dir --- .../export_time_series_initialization_osecirts.h5 | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename export_time_series_initialization_osecirts.h5 => cpp/tests/data/export_time_series_initialization_osecirts.h5 (100%) diff --git a/export_time_series_initialization_osecirts.h5 b/cpp/tests/data/export_time_series_initialization_osecirts.h5 similarity index 100% rename from export_time_series_initialization_osecirts.h5 rename to cpp/tests/data/export_time_series_initialization_osecirts.h5 From fd7ac985d211281070c45193bce58139ee309182 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 8 Mar 2024 13:24:31 +0100 Subject: [PATCH 10/60] missing init files --- cpp/tests/data/pydata/District/immunity_population.txt | 3 +++ cpp/tests/data/pydata/Germany/immunity_population.txt | 3 +++ 2 files changed, 6 insertions(+) create mode 100755 cpp/tests/data/pydata/District/immunity_population.txt create mode 100755 cpp/tests/data/pydata/Germany/immunity_population.txt diff --git a/cpp/tests/data/pydata/District/immunity_population.txt b/cpp/tests/data/pydata/District/immunity_population.txt new file mode 100755 index 0000000000..653b1ae446 --- /dev/null +++ b/cpp/tests/data/pydata/District/immunity_population.txt @@ -0,0 +1,3 @@ +0.04 0.04 0.075 0.08 0.035 0.01 +0.61 0.61 0.62 0.62 0.58 0.41 +0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file diff --git a/cpp/tests/data/pydata/Germany/immunity_population.txt b/cpp/tests/data/pydata/Germany/immunity_population.txt new file mode 100755 index 0000000000..653b1ae446 --- /dev/null +++ b/cpp/tests/data/pydata/Germany/immunity_population.txt @@ -0,0 +1,3 @@ +0.04 0.04 0.075 0.08 0.035 0.01 +0.61 0.61 0.62 0.62 0.58 0.41 +0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file From e4007bac15c0821ad0a922b87b068dfa2f6c581e Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 8 Mar 2024 13:46:35 +0100 Subject: [PATCH 11/60] missing file --- cpp/tests/data/results_osecirts.h5 | Bin 0 -> 35296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cpp/tests/data/results_osecirts.h5 diff --git a/cpp/tests/data/results_osecirts.h5 b/cpp/tests/data/results_osecirts.h5 new file mode 100644 index 0000000000000000000000000000000000000000..7e0ab295f990383d8e3859006c71f4a956d51ed8 GIT binary patch literal 35296 zcmeF(2T&BYQjzPj(-SLYk5T+`D%&GcqZ_wM!EOOI2^Cn?EU$Z@|Pq@*}P z9L>L;{`u$E&ZF1kuUGyo|5<-y=Lz0Ubl-`e@c(*(hx`45!!hl=PP?=Jzi+2;@x%!n zw&kDw|A{+q!}SvV^^Ek-3;)FbRxNPq#8LI%2duSo)PH(u*-k(E(-@LFPyY1BQ-49RIxS|KBa}_x}5*pSth#pFc;ZanIP`_j46< z6Dw1xop@j;9>n1^Oe}9cz}Eli-~UyAx^!Mm`F9`Q>3%q_oqqf0{eSPre?G@Q@jtcz z9*+30Hs5JDyqzl=9^PLsaPDmWClX-mf3KnCf}OTUIB5!;^sk-vC&FI+y&fMQ|6e;G z-Ps=jo+H^`yIS4Z<6nVpXD`1uCjB;s^%2|uu>Sw;g}?e0(f=4NIMV*-pWx5+{}tVT zz8%-j>InM(e7isWc|Xa2zTKbiM-sz-zTN*BYiD8SbD+N>=}x5Ci3~fDX(zJnM6R94 zvlIDtqQFkvzY~RbqUcT(--(htQEDe1*og;sqV!Ib*@?0{QEn&7??i>2cxWdc-ieAk z@yJe8+KIS-9{;q!KP~W23;fdp|Fpn=%NF>b$CZDLSn&QD7UKSlC)sye=kLq^55}3y zf9;Zq?cW>ze;#Mv{rA=X+n@h`*B(JK|Fj2oZ}C6wLy|81(;olc9%aV=C$`7`_Alf= zzu=!1_@@Q__qKqfIr`Tx$lHmyzu%Wj{Iwp(xD)@}|Fi5Y|GEF?-dX0^iGT6~9Dm!6 zcW3!eo`8R6d37iMK)ADv+lhbj5PNo(ck&U)hyXpRmT zQG|Y>*^jykiGSG03!y|?vj$6hLF7{K#cNKE87a?Si_Mr|M$_7vnMJo)kW=&ly1f~6 zXalcmn&k%_s!MSs*ex>6^k+I<-7GJrM89E*ixsM-lzy7fN z>Iy%Kc7G!O6JG!YTt7a#I=KKP5~asQ3~}hV$&$m!#dRPxp7@nGLx>EC^ujqDNzpj+ zNhKbqKqM3j$+2!G$j_?u^V?5;AUPahVayu@xA6%W?z{+r3U{4tdj}lSELT2vs)-vJ zS;{Mi*qWna`qwpCgcitiueivOY+kf%CfK`*_>lLKd`Rg6H_9bB{2{!Q33c5_CeG7m zLMvICuPHP3p`R%(s#e29sGESIH!Fq^O*YFXbZat$Ir!l?$~=8&>j z@JUW_ejtL6h*e%3a5oV^T74`Hgkk1rLjFt69ytqSO7C_p&VmaCWQi6oJmW&?x8qFn z<5`g!;qs4zm5hjz-RPr8}{z`e584_yGc@x2z6LoVYr@QitN}%Xd|TJ zU@&UTk-8%hzARB{$8aSBK5x-fLl_=7n`H++#K{vcPx;gZZOOD zVpbFtF@Jzdg%!~VJA|x0--|LSlvuw!-Yl5$^tD>Ud2eWO_|-d*E3kke|;>CVN@~FAX*`Lip;yBO;5xYefJR z6;Yfl$md00?nd!i_Hv_h$#UOROWDw~&VCa0FlHoQ$+u5skr_Epj&z7t^}_MQnDd&p zqhJthLiky15QMuX+k$D9VC%-W)cfPBkPwqx&OosVV1eq@k}54)sgc-$ zx&+5oO60EnY3S!QLNqcJZ2h^D3|-1rkT+N*LaYWo6&a&AR95AL?%>Mc%a9e*!J0g9 zKex31L}fl4#QFPCdI=yQ5n1Nd0UjjNM&VeH!iBm`k~aJ_n2~#HZLta)_I)o8IYM-s z5xtEUEp3bF1pg=R3l`W1!FSVKBr2^JH2bud!nEfhV*K0u$*d)4BQ3gCeQy;e$Q)B@ z<;;;-)M2fs-5K!caK!!c!#{wPl=g_QZyuE5-BgwdT?dKd)Qdu9>`0_7{E&;21xi?% zX3%7{MELqc?X;=n$b-OGaV4G_sm`b0*okrgXrg`Ro%`D>L9krMPry zejX@aM?HNA*m=0|bnaeLbF?Ri>zjAWcQAOj>?-S<3$R_RMbMuQpN$gOuispSW|ad> z!B~I6vHjwAOtnCor(GoH!4jos7|@!%Bu0fdzplRbAw=BFKf24^*T9acLZH+HAF=0L z4u8nE4Z|#BPC2|wFgC(^lHE87@b=_y%HIC~9zDumlf$CHBS_QXatR-zQrzVC4B$c` znI#JQnAni2ll5lkHF`9YbUDXw7 zJFR?Q)LJIM^ujY+zGt)WvhKJ6k^MZlr&@S7zBNZ`DH7UNKG|@^GGcwQIuB-WBrz() zg>Y}Z=EL&gWneNjwu%4Ahz{a1b#IPYAib;$gV8rFk>xFhm!(zsXywHBp)U(KB-nDi zDoSAygfGuAWJ!jEEs=6mh(O$G8hFG9erWT;z?Mov8^=UI}1}?(G?Au=7{RzjF&G} z4n*hY6iR)~2XC@_tgi@*VCArKX6?a6cx{sw@tK?fU1B)nI>u> z^Ezj(J1EirG|y1>goUU1i^`fjXkW9Hu_GlLlA3k-_O*c#g{>;)dFxUln<){(+8z?* zPD$hcU4RsQ;Bk{s(5!_OSCRflHVu%%JL#I4RSScQDL>7^qV-NZwnY zfc`|!u!l9~i0%VRn~YvA?5D7j60#`(VR|R4yuKocXMUjFpgIpXimn`GdQFS2c+w_` zU$I2o#|$lFLo5;Xyl}y%)HUel9lbJ=y$s^27fv419D~EJcwUqKSc0=Hg(gE=vmjn~ zxBAlZAZ$d8e_cH12?cVzcN4W9!x@{4_V$ZUfaU7L_;NySl+zsJEaZxf6A!LMCf{H{ z``E3upFJZ(yk_s28SWCI`cGx_x*rJ9-UlVyhea#ljHa}hylD-%8w7+d8dgAydb;7S zTm2BMTADynKLmSEtUWi<7zLMSlmnmJ%#pnP*SYJE2k#uN8NcK$gxfM%A?)vqVXp#r zmAJz!cqrOL1pc5xv*JD3tUi{=#x+6gO^PLYqtg4(`tcG($hzFDteXdheSrbbj}3yV z=alsu?s=#jl)EnWYXWAgXI4$Zdtv&5J=f)ur{FLAwmqKjA&_&pE(edB!0_mdo6}8B z^kzPdBAQ_zB7M-qkj_Gf&NVgS_kyy6_4J9Ye#ncOT0(+D;8u8ABfirdX+N@+?ER4k&yNO4 zgk=^24Zrk-o2n(i9psTq`DF^O7e^l=?jT1kvS)6*E44&D{Q^HPmRX`bI^id$Xy+l& zmvg>Oa|ZUv${Qr9^+GI(JB9X{X*hI#>;@6n2%KLr^slmN2W?W5nn0X65VEf7EWEn` zqj$2(IRkG(+(7iwLJ=DpxSOVJTg-s?@EV!J2x(Bvf(pNow9>wgu9UdG=i9 z+6IfKPboYCi@;Gr%XWWS5p=RXFlN700PSb*dfWAPfXcat=S7}l*O`$>R=eB%ppzy1 z%(2xRE!*%)kc#HR$ufd@dBq|)HWK)%vb_Y#p0&NZ6*dl4lzA-a4@nRsC4PP=&I(Dr zR`f%cuz$HxmN83oM$PYq3+XtlAnukGj$z;``*9-RO%qhMo=rcfI|M@Y zAvLwLJy`!ImoUb!hZLrWB-#&J@Zp}X*$oM0NIup=b>;dASgR8G5!UT#ukZ z0uS{#uQrh)?gDki>eWp+Jjt46kg)`j@;+Mlt4lz8ODL1}aW0HlxvQxh$p)uoDpU67 znGp44Ppuq(6Es=Gm%hep13~u50n^eBD4tA~JeFgQE?<9J{G=xz!lj>INTn$Ta@l76 zJ*A~k#X=`{?d%YI9c|eBT7ie8&s_@Yv9Lmf31y>hOW1k0`NP}Nlf!_wMp?*^-47BA zH9ya0)I*+Jz}-oTemLprc_cBb9qjh66R$W`Li8iMS=z?4&~J3zs~cp2`&RCU32!+N zw$oM&f43LSk=Nh^Ln%=eo05N7DG?G^U$&3qSp&n^$%V`p^ANQp_yMnA9+qT>!n}gA z;F5JSevjriP#AJ%OTLr_k66B3U^Qw0CC-x?p*c-3)`T~DjJFl`nzFtrjWtKxpNZ-Y z?Jt0Fzcs=*!(xcpq*QknC<6{IwZ8rM0}w|c5X`o|4M)j6-0>5vP=I%ol{K2@!TgRTuflRk9AIgzLH*Pb*(V`r;M{EZTDDU~Va>_Xt# zy4iB?`F>Dp7P^|XA_Q57X*v2_=@I?N1e=Z;IWkGjzwbapfc)1}3HQ}3fl#kS)ycRS z*iP@sS|*r<)Q-D*S`{+j(p7;(k#i|v^JAnxw&^Pb`MqGWB&&m`YoX45BMq?M?O>b# zY9qKZIGUb+ZI1T72@~+UQvjA`x9#qIErwqwjGkNAmBG0?yi+rCy|DH9O@Q;_I>a4( zIb$?xgxpr(sI2)w4DJ2^O(V}jyx_EpI60}6&s8sq1 zhhn8%%*Ds&LBQ(QOe5I@gn2xsAJ>|ItAaM_7H866Mqf*>b}kWukFK~MY>$U)>M@-h zGnJrtlJ8T>!#Y^}q_~tK*8pc^_mteXGDl2K67#uX1yD^ZbNcptF&qGbZKwP)7@9VD zm@M86k3+&oKANwT=?QafS%^evtt{T3iRJ27jaQv^b0 zmviAxGnl1s7EkfkK{B6}?X++XR0O(EbL+KU>R1#)xW#ZaRs zANE$5d?ZA7O|OTr&~JgOW3-sq-C2k=+anUPcLWw0c=Fk_N8kW&sfEOkWVogMb|Bs2 zGZ2mzvEuMzq1i!M*jA$qz6$2j_xM!7+lpIh4bipW;(HOj*EB~q5}_>BH3eX2!~d>R zxC9y*9RrwgQ710v23@36XD)k z3c*Hrv=Kh=oh2Wni@R0~RDXhTXzq6ok4kXWv7_nS%78szqGm4OvBE_ei}%MK;9wz1 zyzTXEJYYCcvK?-`2hpe{`3qrr52dNRZI>%+aIEp@v0K)YFx$|sbR}&7bQuI{R;CA_ z?8hkyH>V^B3(0d8ornezZGDd5r4R5)yxrq~R54VqjWIaZm%%+@OJ=txmGCXeKtx~0 z9J!u$v5r|SfHz+?sb_UdK%Lg!9`A2~usFBdH?!v8yOu^@TaY!{Km4Ix zi{1)t+PLEEo0>rJTb$35Q9TUiyncLjAR7*gD#&|$se>C?4J%##rBJNl+HTvB3J&rS z!D2zwFe!awFJhTjI&HaW+Ah4Hly%&$mDqs{x$+Ei-m?FQPL>* zo}{Ta`PmDpo;O+}3Hv}LMBZA7B_4vB8@-D~-@}KY30+bDNZ>ZGvuLp@fT~}I#`}D* z^Nc(F$FJR`z*Xm>vX>6a-(AbNz{Xw(NlhNBZ=RRH#`m%Ac!P4_o{v0q@^BMey!Vdz zebY4LRlL12|I->#D&DxUf*ofj{!_y(?w_EY9!HsXpawF97xwOP$^cczsuv&Ts-WKo z8QoVY0>ff$|)rLDO^KJ+w{7Q$}PkQ_mxmg&2$r@ zM6>RlJh%YQ%4h5I?hOG>y{@qPdnf3dI<$6Cb-_cS$=4i+wMG``RmZd#14a?D**G-HL^vypgdS7FPmREc7Gs z-sRv`{6?9-s{!a1)}2Rc#sQDKvUY>Y2BlWE#}Q!1dEN7l1F>E`_*YQU9;B?qzDKjg zpC6`yT3T{~=ecq)n?L@1)+Zm>nfir|tmDC=h5D#r_>$5kfr84|?ItCL$j+r+)fOd3 zt6Q<|W`u}?uKQ6Q?HUlaB+;yXorTZ!3=WaL{gCVG*2eAD3Z$_w&bHLFLYJp0+xgEQ z0mLP{B=!V@T^j}YTy+o}NU{iVC&~tIksBfJmGfZQ`uaJMU-@u^iSqS}5;N3S$R_Hc zRS4_HC08peOMosdIz}bA95k46<81Ql;FOQVJ94!V2#lrNTvW9|Ms|#;5j0k4S$y&k zok$(Ttl7BmwwD2swqbXTdGHeW8_&`ED1-E+_R;O8eA+OuMDPy(~ z6yvBDX2qI7_SNAB)I=XZU0=t&qs|Wk8DkiEI{dKymi-ZoGC;D$_?X$zY`9Os)Kw3; z@V3giqB+bA={gLud@wD9qhm^WKSoO6L0sZv$@+45twTB%Us??cqOao4s|>=ysZN4z z7aQcvQZz@5oo{QMGhQ4XuLh4p{I?ZSO5kO}`S-^TddmHGc@|Qo8rfX!d;OcO^WW&vy2iY^BR1&a*C8ame|?!P!HP7Jy35;V|c+ zF=*f+bu60e04JY}#P_}RaE^>cXPBV@sDI8zI&ky@d9(Yg0;zN`d08Cra+2 zsJFZ}HP)!l}6LWLES{ac!#O=cb3Cb|c8HT(K3_^)tU(J+Hy854v5+JvFf4mD>AJH5^i_W9fc0 zyaWdoPX0UIUZ8o5-h{(58T9Vozj5bW8c1D9eER(5H;A#&VsAKWhG72sllj0x_&9rV zm40t2glivjzCcg`gF)F(Z(!%k2C=%bW7XZTvV6N$V8aHP-G3YEgKvc%ix0a*s+L2) z{=7kNb^)AId#hu6KMo>iY$!KCK6%i^S4(#Y^Wh8Ctvgt!gNy5X@NFSFQ<`LKpX;Igfo6Fmd;kK|Mh+(B(b6M>fz7F88SQ6lHCZ zRlb^Z=Y}Q9oUHJV+FuIv3yl1SR`Nh_>{g+v)hBSp(O!$#lM7leyYEmwO9jSxlADQ1 zVZiCe;r=xFo6;?fBZ*=|ua$0Se{T6S@2hl0$|N(v*kVbv09>?-@SrLSRz2FI< zd4-1?z?6FIcnp-ljUhL>WXBTV3@&#)?id8}F#S4_*af`msodM}T)|vG$~IK^3q%m> zz5Gm>1W&c2bJBi%g^0Tni;k+{3rk- zw|xuM_APLa`*Z49Gh39RTb6rr(GpeF8H}D4Ee0kre1H7-9B^xXkZ4{T4KA$@x+?Bu zgYQk*&tX2vz~a%RPjNN`t`$*en`Fi*-R*hDn4bAeDWCacRbIb~62GL4pydA5v9a0|ZI;bekLMS{*#Qj_vJ<5c z9a?ODQN997sLQ=$GxH$gP~(X#&&IzT?!SQxE;Ao=)H-gCp6K@kwUwBo>Exh3no%Ki z?B-{ad)dN>@Z@}$C&7M1aC&*|U@|lE4jx!?KhJ^|Z?Q7=xa{tN0ynAe8YXceO_jdH zN+xck`=y#gCuMgRe499Hw}rXjG8?(qZx_sY&M@=a1yd`M@RBeWEL-&ZmkXXY{{Al) z6lit(!THn#jjvM0{dPgOq40mXU{@pAzg+N#YP`-5HyrwQ-~1FwJ2(2UVfjJjvN;-_ za?yA?YK}~-$E|ZH1d+6a`|#xr0VJ11f5&Zv2TiF?Tl_l9f|S&v8jVOYL$=Q)76AbZrIx!*20=G3&x5od}nah})x?Sf>D zs~*2yus_&A@3#wbpJ{T-B*aH4nQT>dAp&T!#PE5Fy*cs}y-#}OfCXx;lKD7+$BV?T zSszyK<3{fKLkBH=nb6wv)6=gxm=LM=oAab$dy(YX{zr7dw7a@sO6P~S+?Ilf^rFml zd~tpx=lDzPLGMBTu{sZUfXXMTstJv z_S*#mjU26mxXcg^&%{9$b3ws$`47KcaG`Q>^S29{=zH@SUB*LP0q0DZh53<>8&4b` zmcJi*Z}=iv#{%I*@v~irxDeyvp^zw1PQ=YbrF&OV@BL5?a-}=nyk@=GJ zF{DYks|zmpn0iyB?MLbjTY5py`O%_#OKhSH@2)O5=P6a(+c*FsM}`v|%cj65f`jC^ z!6-aANVe>Uxgg$GV(%)<1+PYxeBi@eFfL{)RLa8)@g@f(abqq>H+Q7=w+p&{qB8pJ zf;HJS1IpewL{208BUpnMiBu%w-TGmU*blI`d~~%yO-E+WU({nq9cAy@bCX#RxsP=u z7cUL+s`8Si)@MLZ==ombBx%uS!Jr0p6Xt?HS6$k_ z449$k9Y;tlM`@&U9uJ$M=&t1j{d9Bza6hU`&pFxjxrTRi;CXSHAJc?4?4cx@QetdkA)Q z!FU>nP2NNyL`au2s({ar*4e4;PT%I<)deLR&59HoIsumvK;O5dA_1p@+uD}K8mA5q`s zfsic-&JgT7caIZ+T^iqUatpNm-Ztw{vjw^wqhb9ah7sMV;Yj6UWk7=hv4KbXiO|`x z3p&e3Y0$Y5#*%M9jykTDbo*%H&~7f6EYsYj>m-C4sh!Uco#sQnw)<}<%5d%Kf|R#M zQci&nUhdf1I}gN2`BCKH+CW&oB3FBp$RtCwnG~j&E3? ztJS0BWHbzjZN;v~A%YgkTsXWmtB#M_dEQ(2b?rf{+Tus`Cy0?m;)%?b_4Qp{@Dkqf zeF0nhQQy1U4;zQ`2&t}Zy#TtLHny$SQ^h;-o-9bm$=9#=}x0$eqO%8}T4 zxa-33VR_62WwXyVGhi;bms!yyE7TmxoC}tEhq>VS04J3h%moFln@vgLJwsYV@*vsXP?HJ;e)vwxYp@OFk?zxn zy~xnoaGbpq9wB-sFHI$XeR)?G6jAuteMx>l^5V<8QFDa{`Iuyxi{4}1)dlecBsw-c z8o(sE*~!$V8F<=`(y?;=1f%U6dF^Nvg4LunK4UIe6uCm-j=5mrpwPX|LUYt5t#4e1 zx!?l^$Gb9^3l`&C=X^02Y+TyI?@zx9A3L_9vh5j>$E7yU%dahvGq>Gq_hXjmWqhe_+tu=?fW(t<&N)-dqK@hVXNl+Qg{GZ|WV$q5CeMu~k5a|C%`xrjf|nAL0{85%14CZ3t_0TxP<}=DRJ)-T>PdUh|H0iygZ*HSSODX+=xMd5}t7wfs?tnScy+HZWB_gyQ zNN-wPj*r^DFtmkVnggXxg<{)k9P)1-FQv3v13V9^P!H{~U0tx{!qkbuZa$O~nQ|g9 zg&kFF#y6*4WZ2aOrI$Vj-o)}Wjx1U=?uzAr|InY|2U7`rlq?Z_M2zKG*5<8}Fc*B` z*#E{KbHPksD%m~1%u%qfde@okop* zwZ1vIEM$ouw}f0f`qmO9)I`qX=m=0zKvd?YEDlXYbzc4 zUJ^a`KTWf%3v#;)jFamZ!f~^L`F6+$sZObHFh!g86`!M^OCPa z{45dg3q2#h5=$iiBm3wru`M9~NW4A$bQRWv;ynjghM;>@vF^a~5;z!;9m`Xm1>MRo z-u-FVysuqcu!ivP_Rs_udZ!a@SJ%Rbs_(zM%t=AHs|$9GJaQnB&Ida|`^<;fb>hVv zmn(f`nP6pjbxlXI3Fv>Yhu7n`!Ku#KH)drWuoM{?!L)+Szno|CKGK^H?zhKpR$wm3 zar=EgJLZB0k1v-rM@@qCu`ol5J;bQiW~`a1(h}tX@XM<3<5j*^ z;CokDer61Fhle@k0zw5qCxFI_F&BLJkRmA%b3x+djifx1ao}kV4cv4jKni*X?f{nm zBJ`De^la1;9quN4(fMT=jw|cp+REmEJ8Vn=v8ZA#wWWnok_5jz&6o~hUbO~ii zhRlYV)>_6oSV&!(q#kPk8x}gwvb9F=2s!Oe-eQh!XPq}nyjuYCArB%wFc-utq2lwx zTrj#VQ?V#~1X4mm-K_u*eOP<^ctgPoDWz2ej$zJgKhm~r!ng=m@aET5p3i~<#Yj!d zT02~?&^fedKLzot_J$-DLy)k(R@HH~VOJOI8&!Jp!jc8Ci;i7CO+kya($5Y*yhOOG z3zjzVFWPEnz~ZRTk-4);Fn8ia_Vn!pP%CoN{6G;Ut{o^tEPRWq91C?{Jn-PYj<_Q z^RK*QdyX(6C6`y9nainAhUlPD<2D}J%>@(B&8QtONrUStF`I9hy=<$1_{Owi6!4ufpXee(`TP*fh+Jqs6mW5A}vkxxKLLBo-f9(k&2W6Jhcf@#9Z+0 zX?@q%`U4;#Rlk0Hc^z&K+3QY!wn9`<>iNgWtzypaLC={nxO(z-}&> z+-LObxzVAJZPo8GA z4#35tB!%Q5VZUF?^IzfC>f_M-hsJbt*G*W zBiTJ*l2XW^M7IP1FTCcg*sW1!Y_RkYqZQiodhE-=Yh!S_U()`z;viVArd@q2R||Vn zV}9=8?1#kiqSL8KZ9o{HZ02fJw5tmS=-r-dvZO-Z19;Q3Q6{jz8y5o1-`6 zbLsR@2!(ptn_ZX-wh9CU^kOcU+mq(@D4`SFoijBABIhCFTgTZPO>3mbwkdmt#R^$8 zOKr?~j=)Kx2DYG}et7OedhE1H71U`PlTgd`0^ji#?)1iHV1H_}d}cg zOM~o}uTVwF5+aKg@v2X=OS`(@wTr1`(^%f!Im@qTTJkLrYm8j3&ke@rsRnu9Rm}z^ z83EfA4|6Y+kB{tna2yA>8*rl|Wln0w+ltsvR&FY+E*spBQTc z^}}?IR(7*ckP+kD=VOh;X5CMkGTO;AfYYEzIh% zaJ9y}>h-8URFn!hJuL8t$oCO%;uA99lu5<&f>YVRY?oJ1dms3)FrWsrf861&$+oS_@SW8u%XnumyVWJ^^;vc)Z;LsISm#=*k z=-}DQPiL;+kZ+!Cp+EcFt}dvN^6`{v;YX-sN!X{P;|quDUj)?M^#xbTPvvEvX+XeD z^Yy~340wKfGPqVC3-0v2t5)bTLsG+*=K|ad;q&96{g*Kp>=n&bQpH?QZRxuBF~ufu z(%GiUA07ijgSgl}d>f?Iy0STd^;^rM_}^lN2jEEKc1ZQ(Za9;n`P2*>|L0cdi`4qG z0de`G(Vr3ZaQqSyEwcW;s|$V?jz|@GK!#q@n`tO*#hqrsq4uv)`8RTn)@?}j9p#ujGi-e%}qH@>e%Tp`paoW7rnxgeA7DnTpef>q?k);zBD@KQdT zDDCAS>?_#E5nyeD_~&%&#P(XD7U71oKeYOQi0HYyELA%^2zCB!_^|*C&J?QrIN1z* z*;R9r2Wx;_IPLr~w)9C++$#dC`~7Y?XdgK zq@^P=F_;V5s^DuFVJ_%(sJ$#~uofbTo!@5Z^uwOjLyZwhHYl10?@JCgKS5P4__`@i zFR0ou3wZo$ffpY%$JOxjK~Y`o+nJI^$gvN?wG3B6f9LA8O9xYTb-|^E)!|x00+hnP zWppfM3CL92eb)94?dpP&tyghkzd~Waccb#mb!V9P=`-ZS{0wAOwJ-Nl$HL>}<)xyD zI3PBa7JJ#808IxeESeO}&>lk9>7T`gFe4dw)*5p`LBC+?ILrlQzi7DCQCCCSS(SsM zMp$0>_v62T3x57Iy#F-jg2NIXb(00=C{JyF{edwd)G(jHNB=_@eJS6d&ca+UkY(1+ z5OYEI_$&1>mP!~YCbM(aHC9bYtM^D z{76)RnRfUCKhlp(J12Hd08#p%TD!ct2qzbl%ZZk-IzQRLtzqpA*kofSx!y~Nk`Fqm zh}tDzE^Pz7 z%=bGCeO#!SW-*@#bHO`nt&a}%n4>kbYAF#KLDc&41!e4(0J_7Y7EU+HgVH-+Eg4|P z7iR0*doP3;9nm!!uK70??EG83;7RlJiQ;Wu)O?`5=Zz;XTCrFMX~$V=jymjQNEN?F{^GC^h{j&K)9U?Z%SQWUQ#Roex)Y^Wc+xj$26&i z-HjiOCOJQ?xMPlV(u9v?VR?vIf|Co?J$xwr^CfB7{d_2OnqZIwaiC&31Jx94K7WYJ z74D10`%s*h;cU;pxghJ`>IDsyUhrJQ>X9yG6+Jn_#gCr1#o-^v^78vTSKgCc25XYsS2F!wKs<_ev*$L9AbdRKM5D~Cs~#91$K;Grx5P3G=u zel+$$VK(}SIb!&wx8IQ40!gYghJB>LT&qA>l5dO~(Yl3m4f->oo^#Fn0|l7Sq9Lgs z_4~cZ$$4M%;=j3|+TZF0^8)op3tsF;uZr!{W3c?DINrMYwkaRV4ck}I9L|H3sAb-= zp5jK{UXJIExN)P+3R6QuuPIn9JmVdFQiH<|8(?2@1J6Pfhg>Hz zW~9&KqcNBA5OxwXRMxzDD2AjA`YyK>UJ|T=pbtuOz65pf9>15IHvxw@ax2HK2J<12 zi+-1agUr#dxuh5s6$|8NyZ5l}Di_Kp#k+apC?|?2leCdup+`9ll^0WufC zdU5eO2O1R!yXaoPfm-A#lqzG#f%uEfL{buVe1{Y|;(Djx6Y1B&nCTVBpt^2oD6t9Z z%hqi#vHQFFdueT_ADE#=hA^iu@>Rfu{4K>^)WH#3@{FMB2KbEshQo^qhpNJ^a)+(( zAX=$c9apl<(f)(n?iQvNsF=|yk>8CS&E(x2*r;GZGu7b-M1^S3keE#OfF%PuP66;q zo)(os=X(!XQe?7IFG%#adclETc1LrXh0*tk?665+0i;)65_al5FFLo8O*a379SJC& zHs`(1g7|QGE=Rtzpkry;B4tuo{@K;8#*Akg!mlsWT&x;{^b>lstxbzCEkJgl)oT^x zUS8cd9=`!AZy0#%i_Flo`qP4G-L=q`W8{15YXd-py^h(TCXmzka;Bkn8(5ht3ayp7 zG4GewkiqizkD?DVKEvui!)?e~$A*~E-M#Eg;aD9gIp5PQ@+ah|igcTtOPdbW^C;E4 z7p6khhVCEQ1_@BfPQ764-|7YLQPv&D7ZpKz{_90Eq5>$5q3uM#2_7U@96P2U%Ys@D zrTwsOWJKQYx1|p4-G`pOi`zD&9)|G6cGibUW01P))GL2}7#ag^9^>MlhoMrI4VK$W zAU?>=(nGTf^I8uSt*Fh>Ia#rhU)Z?khla|jxL1wfm>bptnk}H<@kAm1_!j)6%c*&H zgcC(m`K)o1SfDf1!r1gg3pCoB(c0L-h~}2^uhbr5K>h;m;f9MuNO(x+-D_!_92!9*9rS3c68AY?Y7nvqUbMl)5ODC48~!>!0CGS2U86&1K$_3+tZ2kM z?CVeCFqvEgf%Rbp(sSm>jW}83;AjI}AxlzcInWH|J?`1%7 zAHV1`chjKPl@#I!usm5^{Tk){7yaN{?zOo5tsfi+KXR#O^}_ilYgF{!6HqVwJakxY z7O2W3Hm9)4#th@k%YIMIQ7!JLLK~!VB9$?SN{7%k&x~U02mh zKhKOPibPXF^ej-?f%j~!B$jCX-Irv`Fj}5Nt}<2c`BwVuQbWAo59nvIKD#bgJtwG!TyhPN zo@8n_aSsozsL-cT`p<*SPQBoxzts!275}^_UA-T<1UReLYw#d_LxP;~dn~Boc^zf8 z0~NA6H^7pRM~VmnmfuU`k)fkBQq!UKJwU>EQv2ME4)8&(C(EVUz)DYCc3=ssUp}4~ z_Sk3w zdD;!D@Af5O*AXK^J|}Pc9@Hm7hYQO0=`wVIxbBa8lx8iU_fBJ}vcCybArfpz5c+p+=d zI;?zM9f{Im_nXf%v}P^P%C}58r+b#D;+*|7sSYs;nX0kBMMZ#G=rnG%;Unk$0gF@EyzB2$K874U?XbiakV(I<5hz=y-g6ND1hP|w^397q z5F7f8#6P?r)?-%+OUeeJ?o~y!!jL(-q-*<~#jgcUYaY#1PUrwTj?>xex*`99IVQieDdq4JZ z=!-2-)z}nh=3a(-UIj<1Rfa%or(O{6Z}ox?qc3YeS?5EYG7Zlyl-QBgt-IC+x9QQt z!I_IVGD5_VOHrq@vJD|WRQBPk{DRj>qKwCzTS4f9QIGH8dboOjIWri$?!REI3EZ6Q z0IVu~dqlby?jyJR1+@LZ{3`R5>o_)<%DnHEs$?tl_bzJB-|mE$fp4_5DY5+W12XNd zlsSmms%t;kv{iI;OhbVZL&Vsu5BWIQ&a_2s!qEyV%d>1_z%al~ z=Y#oDd+w0I#J&YcnB9s~Z0-a6oq9q4ztsy;9XqXu3*be1YK(n^jV!41TXFK_n13YM0p=~Ps850`rcm4iu zg9^JYv4EArHoU?$ov{mFhC2_(svX*v!8<`>5hvXQ4_-LjIQpO*-o<>n=s{Bst9L4A zvaVv|8_F&xezf6V(J<}Y~B-{n275k$u>xTo+S15MHjrfCz(%@jLm1Z zQt^EgGX)>Mm7JH$BSuf1N3Z4=S|Zyor}n-rwnXi+Tm6+<>rfcNo8B^v)h$*8phWY2 zh%_-C`|^4L&|bGOqwkXtDDPUs?$icRJN1HHJN1GbJN1ID9U>;5Td;AmtjB$eON?lQ z*=>M1hyoqyKK@1!h_3>2u`7T{oh=$%>LpAaJdy)CG-7~bUO7AF5J z1~#UWY_YTk5EOX36s+9@BU(1)$8%et+srgv{t6R0%V;Im+R01#F#l{ z*LC(l^NI4|4DQ{=K=jXIGo!5vCy{x#H991UW#r6;^lXZg4qAdVm#@$bat@~B-}OB?%wYP zhy0&0j^celZCN~_6EzBh9ap=L4CA4}yGdeWQda0pkGFyApe0(qw^8*fc@cs=7w%tO zn+1Hc%kN7gI{^Pe#4&NjX%Iac+$MSPlzg>`Vr(Uper(RGql8M#Bj}7@} zC$=cxphH|SFU|#)5TQWU8s5Ru1(^SFlb;;B?r+(g-lyj}3CZxda4ZU|&!g_X?kk-K zHSTxZ%wFe#=GWYQ+ng$x)1Y8w!RFoc@NCR;E!0E(YOkS5k~tEVi_Y*=Zil9gJi^W5 zZcz6POKrT-2lr-Q_nO`vhUQt0wT`S`FrlN@)o{-W1zAuIy`8m09Ol8zkq@x>2MmhF z=kcbYU)t~9e#%ym$>gTsOdE&#mP;-#j}E{?9N(G$tFZHq=Q4cXK1F8s3fY@vXP;*h zB{CY?5uuHQXwa~CDwGkDtR%9svPX9ICOc$gh3EeLzP``%=kxjJdflJ(`i%R!?(4da z<9(dB85;kuF37*l3l4Adf;}>S%&b&7@#sSTLD6VJe^}j@5qx|nn$D|R(@XtF1Keo#@9o<-Ng{GxqNW@=GtB`_zlW@E~o}7S3}u`RFW-M9kd-_ z8dg_ofYJJqA}wM)$-}_GG40a@XVgTQD_HvBM3(;PSA}9Ql~w$PIDZE(arqA0&cWmgGw;faNjUVyQ0^YdPneUSV_W$+28v`pM|Lg^ zfOmc1(3`sdrwbZv^MZ5Ryx`b#TCY}e4$S&!@p+w`4jFH*#n5n)V&#_4Da*#+P*PLV zR30?~X;+`72epiV#i|y1?XQDd_ssMdIdkCko_ji^(z!4o;E`%1Tmd29wVECgI%vpc zHeWKqT3C!6NMj{@!(0}W`59GR@Y_p4_W0R;;C`HT4gIC*BuGMRsUBP9NXpvk8bmVW05Z-y_Z>W*mam8iG>Cw1Ijq|>uf?ji?P_#!3mhB zHNR04H3$X@5<;W3gK%5FbNcRRHE6N7ic>aZ66<8&Cp(w2z^nF(LH4~;@LKTY)H_rT zJLh&;bB0wy>1wL8;bnqD=PYLVyV(Vq)sqerq5Uv9eQO&iDgeG{F^J+!1h_NyM@yz zFdh}7qS{N08yv6od9U{o`XbXxM@1!E^9(PjTl);|Wi2joB46MdZJZ$6>!n$v-2bVX(P7D&1uK1DbaxRNSc@fPW;? zeAmL;p>E?`)5H7U!ET!uG~DI|8Mb*rn{eklLi$V?>~yW7dYK$m=A#t_)0RPZfm*}Q zZ5SL2n}TlTcLIYBFO&X8C*g;1S$3{3hg!{34h9^bfOF>0#pz6fL(0eq)aEIKO1Y3O zcGhADzhh2!u&o3NF26dgzSkZ@M*cKMo#_U@Uz!bVOT>Bmn#9(bY6#xP3T}OU(hZ?q zyH3fO{((gEmh{c%j=2B3-}giG_fUPVex%A~43wK~z2^=N!QE)5k}D>)pzZqQ+S!sm zINe5?-+BKhbiK=XsvB4gWZS%8-8L_nv&{>hJ^D0O`x66dJ__DXU%3<2Bzi9o&MiXv z!~Ewwqqp_{y72F&;6Q12~rL=wE&$V%uAd-Z4vM@2`W%BkP#JJ%p|mF5j(>sEtOR?CkQ zzCB=-D8J{#j}}l;^i0%ZF9hLjUeIEj7u?ti_+MVI^yo9^9rlF&`R&K8XU(LzCby$a z%xfOT%v5N9Tl9kDZK~p}>SnmPNWQ?nM(pcc6Hc{1_8q4sRIPD>npO zNw3>%;@jX-h5V^67pH*w&7$tT6-R9EJsI|r_&}3s%>5{e47_Ex+gJ!^)x8l-JiqAN`hyO zaEO#$pM!E^mSBOWonWAMLt31!5f};t#tt561d^6Hiep4h3Gd2Oy{JMwR6AOl{#HzY z+3@^j=BP|KA;niGFPa5(z3J{fce7#l5}gBmnjQX={32eP*9}ZN8^x@o2SCu0i8?@Q z2pDU)JA+@fLceRz>n;o8x+SmCydmp^?eh^G-T%`+xlhcGJsXBKx~-c=!Mz~0--znM z#d7#~$~~|DcLz|}%_S>SG(nnBXBxeHE?nH^1tqt6!QgFPkoFs+MzKt` z?toHok)@$~X+(@a;zlPbLK?t(Om}w{TQ+cR^MV()dBKa@ydZCk&6JW31>WcEk2!vP z4W5|nbm#1u00plXj+!bhFfN)yp<`bOd*+@s9ZjnQr-XsRryKduW}4RU#y$$-eClkJ z=3=1zh}*6argZo@(X*AY@d=0(vrl*aXIRjcb)da$haySr-uEVn{RdXIY&V?&Fzm{c z)x9_bor16I?y@&Qs)Jrzf$J~~|GECr?Y$E+3$}_g6FCt!g+d>A)&}6BoXV|bl}@M- zQP6+UR|4dDB#MKTKVg8{j;=xF2NVcIgqaCu!P#wI(0rR0EZXJ;T`78FkDMgOJN5}L zUbiiS#j==35z( z;2uMGB&44|ypVZ41^!W%l?65>gD9I`Wp#TR&>SB(3sbVgSSCt0#m#Og8y&feMgy?V zWloOGW(eA-opto(8{nHyyuGNy;D2<%Bfj{*`XHa*e_A)4|Fk4W{?nrF_Wl2@_aV1^ z{NFks+jTtLRJLEIw%u;m{cuy-KK}3X{#(~WbNhW@`*Ei2mS?;DZ(gau_VIu7M#cVf zZ0oswKgs|1=5s19*7KGx?zfeb*WT}k%3KS~4_37B-}7@U4^s{y$B=1^^x#3Ps)aC9DBpdB84kEqv$nwKBvt_H zq4!22E!)anBWOUYOU3=IQP+oIcg>JCrO%&bC5%kl3F@DJz1Q;#V(LNEsdUug=#ksFk@S` z%?=x8M&whg*7RdxLRWj9&%P%SDZ_uD$Yw|EMo$# zbiX(nI2=1->$(dy4OLqnHSa+G)%zKY_zBm1vNx(FxyU+uv_jrMTG|7;4ru=ve`Ef9H(2j+>vMSrVny&-ZGb7e>0>x^kWdYv6W6z{#*^5eD7l{R@_tAUJY^vCm2iHMR`H zT=pRLbqB6$(rTc@{$KLbVamAmP`ql;R0%8k_%hSqE1}4@wd&g;Bq%|p|H0rJ1wtwe4%H09d+GMq{M|yy| z_U|W4#sOgea@RV6n*+7U%tA*W5dG$1!T`0tAFeq@E0tXGM_LN*XnS{gbd^-NnLj0q z2O3s$N@%V)qtl|jd|Zxl?zTwYEn zjYI3zb6c|wTDZrGQSbdQV2B=DgxC)?Tw|xX#NVQb$2Oi0%w3bm_gBA9XC%s_7U_?5 zRHEe!Lo)bMJVm=8Od3_p6J1w~1+f47cq2=N7zX?}rbizjgelBjlfI|9@zq&#TLY3I zaO+5q*H`QW{lz;4W9eNGLZPxm+ogrt*PMofr~v25U80SpRZ-)k)=I|#d0bOH6>_jt z1||FrB%A)qV8(3?f%}%LU_kx+U%e{{eh(O-8th$%j(ZZ^CvMVUGF|EUn@S9Lp>b?4 zAHj!M97UP~YQA{$O6QI-Qol&GOvvn1#LQR(A04Q<5l`06CXzMoP!Dt9<(OJW~-6@3{jvH1%sM}xrp={nSKZSd4TS%x=G%eOBM zQ{YV&_W@fiS}fk&X_8EEH`lCeOJ_rUu{n=NibR6gm)^(9_lDqj62#PZ*LnPc-7}?| zv~xs0>2k~-?H~nw;52K`M(dAEjJkX5=>srf%b=8@K^$+^45*I&6hS&KA;LBs0f9z|Ru%}ymA~~)KNJ98sn_~*$!-oa3T?dLGfoA4k8;cfZ z@W_8C(Nah1oc^~DtdvmToxXbHwS7dt@$TO7O$;Z6q;@fqiQ}IZx%B7#3vjN{v0?YW zztCE{b2g}V0lrpMZMij&A>G(=B7Za`+DHs=J$p%mNs*c2A>F>{9HUijAU6oMS4-BW5SJqz)v+NKZ!OoVlV}k;7OsJ!q zi1G7uqp?IZ!JS0vQRXHd{slSyhv%GG$01_<7QmOgX-@4I%cB$u{b<; zaF_Q$2`c2w zW18#gA@Z*Fk^D1#6AQPG^PKki5(g~7=JW5v5KpP3>yp+eBVU3rrMIsfl0}7Bd?kEQ zoHg~7%zOfPIOXu&q!R*oH?cXuB5@WvKPgvSWS;{a0~^b052hhB<=<}{ZO@Vt zj;zgjMduLx(%_+asD&U3s)~q}Z1Nz7{#uX2XOnM0`lMpRfv2av! z9NPMot&jVx6P(5r^Bye{{PHl43~?Ntk2{{H8h~ONv+|GY1MuN3txx41Txf4((x4N=j*-IW zO1~5HfR7(q_$KXHF{G&URKYO@WOX_&y4p|p6E-e(6tTR9ndk+JCvQB!t8LhMVb&8E z_C{&ExvPPh7j-!8_!QBKA!4qNR2pp<95Q%2_|X0VtK^f1ocR5|(LbpwPAmwy)}$0L z0rh=HJ4xS-f}hJ5kMmw5z@4B<-%Gjzr+xos9X9v}f@8x8^}bug{vTu5eKS8CwN2w= z5g!3r_Yl@aB1fg?dcwQxx=FC@^1qtsOpUTP=)Qg}5J9HQ2E%Nh03@@0RU5PrfX$N% zeSH<|C{j6g!S4_Yy3DAPo+{meBTSzYo9vlTN3n2^RV58hr&<7a{W?7NOUN1~@r7q% z4n%anGm-xpp7!aA3mlmkiJx#(!;eAAJ$Fvaqn;5R|9YbY_Wde4PJM7M$`w?9(2Zpy z`oS>G)F2zWT*~e)rWpedUoMh*(qVYOcG6|laS(D-6z<2)EJEs&=JMW{6$th8 z4$imCH+rx5AI%S{6-B&?5Cw|_pC|PWK!)xj|B#N8$ zqROYP?!h(7!{x)Ln6X!T%~8US&_x&bB?~r>fSl;KzzHHJ)QPj-w5_lg2I|$o{NOxr zDhBB9?_ysRANxhcaiM)m9qCa*sO~a&G_sqtd7TW4jIrR4g=$r*FdWp5fxOpgZm{Q@&S%kcr&xR$({E*?slXe=fUvTwWX1Uby z3Fr!>I}!478fLyv3C{o8iQ0d-&bl1q#ge#?(F^W@$W!x{a_MLwj!ih6{}f7(jwv$% zv8L2GE)$|!{^c*w`RBZ*9i+g#_q+L*Uy$PW2kp!s_RPUL*LjEC(N{q%h+=Z|lM#e@ z2jUF17ZtlVUO<|{626fs`6{27SP_7(Dr zT@J)ii|P2I8N`VP}K3wZJ7GQ*H^TFGCGGubHHXgsV3CAxvmFG)LflhMc zhfl}Of>rE>d4r`Eq?z?Uue*N;yi~h=?sm%KAMs4nKmiF1zS=jF^o|d0tKwyK!x>PY z3fbK`h}`xQ#6IqMN@AZ!(~)ha57PV;oEHRJfakB>v9^cJ5K3ZtMNMlQPRpv%WXev1 z)r3-L$FW(UZuw$W%;tx!)#R5CNRNV@?xh)9x=F%!WZ#T8egmf3lpiu6LEi*{vulPN z=r1fi%FG&swB**IQ?`Nlvv?%@387Q=%{nIU79&Hm&P1CnB6rU|piX0#{0^)N|82Nx zy9Nou&syDf6MpyD3}&e?131YPEnuyq00LDz9_KhI5`65{kV|5681w*jt9(T9tAbRn zmHA$DfE&;F>WMr`i8G}8LdmfHN)UbB4>DYT6x%Aay9Y7@%B~klHbQ#RSB|xq25|fA zT7E+M7o=R@ndI|y96X%(2ghWmKu-18Y4ZhN40xYBvSK$1-!I(dRJkw-4hwafktM$& z&n4mas>23IN2R<9zQKxx#tpwJAPA){m&-Xl4n)SqW6N~8 zg$%Yl-LrX5QWzCx&7$uUbz9O`4-G18Qewr6oE!<_{EujXxr=3_ME=cL8jic2utOb6 zY|ht0H-m-wZRT2d^CjfL@5e(>9nbbB+K})M+>-e&^ll6e|7$ufTC| z&k%kE%lfGe_I7yOWA3IbSqb)Uy&oycSAvA4)l#GQ0JQxL)>QWx0=bCVgHN`8H7E0~DPt=(0AVbp& zmnD?t1u{gz%#eZ4Oq2$0r@4I8Ev5x4-ms>pE|TbAXPEPemLHv7UbDYP)N3hzq-kT( zxC3c^6z}>OOZZpf?@fkIu0jAyY7y^JD?BpQ4!!Wc6kfcu$cy|{3N-=Dw|5-u0a9Ty zwS+wb(A5|!&O!KGlHTZ^$-eE2mX;$Xo^)gI*2KKIj_@PgJMjF#YmXU-ZA+cF9km23 z5p6~cM|Wd?cI&!DNf5eu{iW;+55%q^8k*U-O^9Cz@s%@Mfv^yNip|*}IKRd47is>2 zPR{qkx#F`x($B?6v9}X)ayc5va=BnqgOB&b%!cMKKi_QH&s&<6<+e>xQ9?1D~-Xc&Y}cRodQ!K zG&BPa(=4w%dw-W|iLTpZTa`ST``Ggt_9M9bYbA8{bH7d@}{H5yclZfgA*vH}La zrKHNUvry6^r==$}2X?QRg#wKlfU%-cr9mJE;=^0M?pMnN&JL10RYWdz+uhCL626~c zZ!H}D`bs;DY9*U|`{9Gsw@xZnIE}&lda8``lPQ>9xV_j*F$*_+Ohf2mXF+UO^Jftq z89w*AXmjRJFlq)ZdIY`=#MZG7R}WoZg};{%e(Zg<0RGU=A;;JY@%I@y?)c8Zox4X} zuZ)jEv5?3!6Tc?d`;qpYtK45rgC#?Sb?R14qS8&_59OblAaGLccnaZ@I>VDuwZMu# zx{+Mg{FE4Xjp=ExF~QgB6a>Z|o`R=4BTvi+PXR@F(!fibI#9X7yxJd}2{e~-m!!XD zL5Q(<*f~EUmwI@;Tkw1{RGCUpGa0o)PY7Lk&kG-H($buH6EX%h#;fj$(L}z>ntYb5 z*erNVSocH)P6Mq`my~NhDdrU~cXr+mMo#Xu%a%m{Ty>*1acEoymb|$`)spkT9e8Up zCb|pKm-U1Pie_Lof!FRekssrHDT>yc>4 zs>5Ump1`6o^^0!?Gy16ie&(h{j%Py{&G$W?hj>#aTSGnK^NGS07vC{xRx8SPEw3i# zw+odW{+~fB>-NL)j0|W!S|5CHy$+;73>jIE9d&m80EUeqheh)~P3>rB z<9+9HG<$wVrjJzRYU*zuKX7h<2RE!TY)3K}k$t~=?~kG#82q(hSc-NINcjbI>xYM7 zXW)M7dt4*%XW1dl+Po5A;Cfp!Ng9023ukHBn+})6S+$^SUoP@25y%=Druxn0tL;XNByJ(f9J^? z5qzfxPXA&X?JIB64BG7WC~HsBr1N-uXyZnT=3+vBDhDq&);*d$=G94$dC7OxZ2d_v ze&^Ww6(S!hBX~&g>c0W_D*gW9l;j{-{%d;pOQ{@o89d>VPW=eXA&QKu^~pe&7;Lsl ztm#RZkFc!f6WXx_BxXe4; z^%Z`B4X>19dJR!mXGf@C_n%<=+E}kg>k&xQd%3~aMC3?2MjU->Wo}Z~raHSfVgTl4uG)07RKekvswd2~Wttp@Q~bfNA~j<~R^|9lMr(erc|`U- zZV&SPnXhR4OpEGYD)eg)Zh#4eC!4Dnv3{yuYp2=S3pd|npFVK17b3bpKsT1cFI)<( zAWeYtY;my}q=`U%WL1;=2~mfG@xtuDXc_pwe#dZ&rxF;Rn@GHi@x~Vq`0r2;jzP;* h|B-?DDTvYWdU5L6EM(dVzm|nzFk8DGuf+5h{tpZAV?6)> literal 0 HcmV?d00001 From 420afe28e3a67ba9dcfe8e21d3c801c20ca00b3e Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 8 Mar 2024 14:31:16 +0100 Subject: [PATCH 12/60] diff in line ending between Linux/Win --- cpp/models/ode_secirvvs/parameters_io.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index cff1f5d962..c768d40854 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -238,9 +238,12 @@ IOResult>> read_immunity_population(const std::s int linenumber = 0; while (linenumber < 3) { getline(immunity_file, tp); - // delete /r at the end by delete last entry. - if (linenumber < 2) - tp.erase(tp.size() - 1); + // Find the last character that is not a line ending + size_t lastChar = tp.find_last_not_of("\r\n"); + // If such a character was found, reduce the string + if (lastChar != std::string::npos) { + tp = tp.substr(0, lastChar + 1); + } auto line = split(tp, ' '); for (size_t i = 0; i < num_age_groups; i++) { ans[linenumber][i] = std::stod(line[i]); From 13afaf91dc1ec16c894204d351769986a20d38e2 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Thu, 14 Mar 2024 15:50:29 +0100 Subject: [PATCH 13/60] disable vvs example --- cpp/examples/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/examples/CMakeLists.txt b/cpp/examples/CMakeLists.txt index ec8849ce13..3ae1035a44 100644 --- a/cpp/examples/CMakeLists.txt +++ b/cpp/examples/CMakeLists.txt @@ -28,9 +28,9 @@ add_executable(ode_secir_example ode_secir.cpp) target_link_libraries(ode_secir_example PRIVATE memilio ode_secir) target_compile_options(ode_secir_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) -add_executable(ode_secirvvs_example ode_secirvvs.cpp) -target_link_libraries(ode_secirvvs_example PRIVATE memilio ode_secirvvs) -target_compile_options(ode_secirvvs_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) +# add_executable(ode_secirvvs_example ode_secirvvs.cpp) +# target_link_libraries(ode_secirvvs_example PRIVATE memilio ode_secirvvs) +# target_compile_options(ode_secirvvs_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) add_executable(ode_secir_ageres_example ode_secir_ageres.cpp) target_link_libraries(ode_secir_ageres_example PRIVATE memilio ode_secir) From f5af93889c5d55d54ff7770410f9cb5c968ca97b Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 15 Mar 2024 09:50:56 +0100 Subject: [PATCH 14/60] add some tests --- cpp/models/ode_secirvvs/parameters.h | 41 +++++-- cpp/tests/test_odesecirvvs.cpp | 158 ++++++++++----------------- 2 files changed, 89 insertions(+), 110 deletions(-) diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 3b69122cfd..67e56619ae 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -798,6 +798,23 @@ class Parameters : public ParametersBase corrected = true; } + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_warning("Constraint check: Parameter TransmissionProbabilityOnContact changed from {} to {} ", @@ -925,14 +942,6 @@ class Parameters : public ParametersBase this->get()[i] = 0; corrected = true; } - if (this->get()[i] < 0.0) { - log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {:0.4f} to {:d}", - this->get()[i], 0); - } - if (this->get()[i] < 0.0) { - log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {:0.4f} to {:d}", - this->get()[i], 0); - } } return corrected; } @@ -998,6 +1007,22 @@ class Parameters : public ParametersBase return true; } + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeTemporaryImmunityPI {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeTemporaryImmunityII {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_error("Constraint check: Parameter TransmissionProbabilityOnContact smaller {} or larger {}", 0, 1); diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 9c3c1f58a1..42f66e1048 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -71,110 +71,56 @@ TEST(TestOdeSECIRVVS, simulateDefault) EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); } -TEST(TestOdeSECIRVVS, reduceToSecirAndCompareWithPreviousRun) +TEST(TestOdeSECIRVVS, overflow_vaccinations) { - // double t0 = 0; - // double tmax = 50; - + // init simple model mio::osecirvvs::Model model(1); + model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; + model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; + model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; + + // set vaccination rates higher than total population for each layer + const size_t daily_vaccinations = 100; + const size_t num_days = 100; + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); + for (size_t i = 0; i < num_days; ++i) { + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + i * daily_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + i * daily_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + i * daily_vaccinations; + } - double nb_total_t0 = 10000, nb_exp_t0 = 100, nb_inf_t0 = 50, nb_car_t0 = 50, nb_hosp_t0 = 20, nb_icu_t0 = 10, - nb_rec_t0 = 10; - - model.populations.set_total(nb_total_t0); - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedNaive}] = nb_exp_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedImprovedImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedPartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive}] = nb_car_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = - 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = - 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsNaive}] = nb_inf_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = - 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSevereNaive}] = nb_hosp_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSevereImprovedImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSeverePartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalNaive}] = nb_icu_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalPartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalImprovedImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = nb_rec_t0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadNaive}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadPartialImmunity}] = 0; - model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadImprovedImmunity}] = 0; - model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleNaive}, - nb_total_t0); - - model.parameters.get() = 10000; - model.parameters.get() = 10000; - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); - - auto& contacts = model.parameters.get(); - auto& contact_matrix = contacts.get_cont_freq_mat(); - contact_matrix[0] = mio::ContactMatrix(Eigen::MatrixXd::Constant(1, 1, 10)); - contact_matrix[0].add_damping(0.7, mio::SimulationTime(30.)); - - //times - model.parameters.get()[mio::AgeGroup(0)] = 5.2; - model.parameters.get()[mio::AgeGroup(0)] = 4.2; - model.parameters.get()[mio::AgeGroup(0)] = 5; - model.parameters.get()[mio::AgeGroup(0)] = 10; - model.parameters.get()[mio::AgeGroup(0)] = 8; - - //probabilities - model.parameters.get()[mio::AgeGroup(0)] = 0.05; - model.parameters.get()[mio::AgeGroup(0)] = 1; - model.parameters.get()[mio::AgeGroup(0)] = 0.25; - model.parameters.get()[mio::AgeGroup(0)] = 0.09; - model.parameters.get()[mio::AgeGroup(0)] = 0.2; - model.parameters.get()[mio::AgeGroup(0)] = 0.25; - model.parameters.get()[mio::AgeGroup(0)] = 0.3; - - // TODO: Reduction not possible like this, division by zero! - model.parameters.get()[mio::AgeGroup(0)] = 1.0; - model.parameters.get()[mio::AgeGroup(0)] = 1.0; - model.parameters.get()[mio::AgeGroup(0)] = 1.0; - model.parameters.get()[mio::AgeGroup(0)] = 0; - model.parameters.get()[mio::AgeGroup(0)] = 0; - model.parameters.get()[mio::AgeGroup(0)] = 0; - model.parameters.get()[mio::AgeGroup(0)] = 1; - - model.parameters.get() = 0.2; - - mio::set_log_level(mio::LogLevel::err); - model.apply_constraints(); - mio::set_log_level(mio::LogLevel::warn); - // TODO: gets stuck by division by zero!! - // auto integrator = std::make_shared(); - // integrator->set_dt_min(0.3); - // integrator->set_dt_max(1.0); - // integrator->set_rel_tolerance(1e-4); - // integrator->set_abs_tolerance(1e-1); - // mio::TimeSeries secihurd = simulate(t0, tmax, 0.1, model, integrator); - - // auto compare = load_test_data_csv("secihurd-compare.csv"); - - // ASSERT_EQ(compare.size(), static_cast(secihurd.get_num_time_points())); - // for (size_t i = 0; i < compare.size(); i++) { - // ASSERT_EQ(compare[i].size(), static_cast(secihurd.get_num_elements()) + 1) << "at row " << i; - // EXPECT_NEAR(secihurd.get_time(i), compare[i][0], 1e-10) << "at row " << i; - // for (size_t j = 1; j < compare[i].size(); j++) { - // // TODO: extract naive compartments - // EXPECT_NEAR(secihurd.get_value(i)[j - 1], compare[i][j], 1e-10) << " at row " << i; - // } - // } + // simulate one step with explicit Euler + auto integrator = std::make_shared(); + auto result = simulate_flows(0., 2., 1., model, integrator); + + // get the flow indices for each type of vaccination and also the indices of the susceptible compartments + auto flow_indx_partial_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + auto flow_indx_full_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + auto flow_indx_booster_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + + auto indx_S_naive = + model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}); + auto indx_S_partial = model.populations.get_flat_index( + {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}); + auto indx_S_improved = model.populations.get_flat_index( + {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}); + + // check that the number of vaccinated people is never higher than the number of susceptible people + EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(1)[indx_S_naive], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(1)[indx_S_partial], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(1)[indx_S_improved], + 1e-10); } void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) @@ -1064,7 +1010,7 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(0.5); - model.parameters.set(-0); + model.parameters.set(0); ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(1); @@ -1115,6 +1061,14 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + model.parameters.set(2.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_NEAR(model.parameters.get()[indx_agegroup], 0.0, 1e-14); From ab1041a9a5f395e12dcdbaf9f43ca2dcc778fa50 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 15 Mar 2024 10:11:49 +0100 Subject: [PATCH 15/60] more tests + fix msvc --- cpp/tests/test_odesecirvvs.cpp | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 42f66e1048..f8511676d9 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -86,12 +86,13 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) model.parameters.get().resize(mio::SimulationDay(num_days)); model.parameters.get().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { + auto num_vaccinations = static_cast(i * daily_vaccinations); model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - i * daily_vaccinations; + num_vaccinations; model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - i * daily_vaccinations; + num_vaccinations; model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - i * daily_vaccinations; + num_vaccinations; } // simulate one step with explicit Euler @@ -370,7 +371,7 @@ mio::osecirvvs::Model make_model(int num_age_groups, bool set_invalid_initial_va return model; } -TEST(TestOdeSECIRVVS, draw_sample) +TEST(TestOdeSECIRVVS, draw_sample_graph) { mio::log_thread_local_rng_seeds(mio::LogLevel::warn); @@ -425,6 +426,35 @@ TEST(TestOdeSECIRVVS, draw_sample) ASSERT_FALSE((populations1.array() == populations0.array()).all()) << "Failure might be spurious, check RNG seeds."; } +TEST(TestOdeSECIRVVS, draw_sample_model) +{ + mio::log_thread_local_rng_seeds(mio::LogLevel::warn); + + auto num_age_groups = 6; + auto model = make_model(num_age_groups, /*set_invalid_initial_value*/ true); + mio::osecirvvs::draw_sample(model); + + // spot check for sampling + auto& parameters = model.parameters; + auto& populations = model.populations; + auto& timeInfectedCritical = parameters.get()[mio::AgeGroup(1)]; + ASSERT_GE(double(timeInfectedCritical), 4.95); + ASSERT_LE(double(timeInfectedCritical), 8.95); + auto& param_exp_factor = parameters.get()[mio::AgeGroup(0)]; + ASSERT_GE(double(param_exp_factor), 0.75); + ASSERT_LE(double(param_exp_factor), 0.85); + auto& compartment_inf = + populations[{mio::AgeGroup(2), mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}]; + ASSERT_GE(double(compartment_inf), 5.0); + ASSERT_LE(double(compartment_inf), 10.0); + + // special cases + ASSERT_NEAR(populations.get_total(), 1000 * num_age_groups, 1e-2); + ASSERT_TRUE((parameters.get().array(), + parameters.get().array() * 1.0) + .all()); +} + TEST(TestOdeSECIRVVS, checkPopulationConservation) { auto num_age_groups = 2; From 30f2060bc89c0ace71f924edb03afb97ee096825 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 15 Mar 2024 13:15:05 +0100 Subject: [PATCH 16/60] improve draw_sample_demographics --- cpp/models/ode_secirvvs/parameter_space.cpp | 84 +++++++++++++++------ 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index 3570ddd841..dec5d0975e 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -23,6 +23,10 @@ #include "ode_secirvvs/infection_state.h" #include "ode_secirvvs/model.h" +#include +#include +#include + namespace mio { namespace osecirvvs @@ -33,39 +37,73 @@ void draw_sample_demographics(Model& model) model.parameters.get().draw_sample(); model.parameters.get().draw_sample(); + std::vector naive_states = { + InfectionState::SusceptibleNaive, + InfectionState::ExposedNaive, + InfectionState::InfectedNoSymptomsNaive, + InfectionState::InfectedNoSymptomsNaiveConfirmed, + InfectionState::InfectedSymptomsNaive, + InfectionState::InfectedSymptomsNaiveConfirmed, + InfectionState::InfectedSevereNaive, + InfectionState::InfectedCriticalNaive, + InfectionState::DeadNaive, + }; + + std::vector partial_states = { + InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, + InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, + InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, + }; + + std::vector improved_states = { + InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, + InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, + InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, + }; + + // helper function to calculate the total population of a layer for a given age group + auto calculate_layer_total = [&model](const std::vector& states, AgeGroup ageGroup) { + return std::accumulate(states.begin(), states.end(), 0.0, + [&model, &ageGroup](double sum, const InfectionState& state) { + return sum + model.populations[{ageGroup, state}]; + }); + }; + + // helper function to adjust the susceptible population of a layer for a given age group + auto adjust_susceptible_population = [&model](AgeGroup i, double diff, InfectionState susceptibleState) { + model.populations[{i, susceptibleState}] += diff; + if (model.populations[{i, susceptibleState}] < 0) { + mio::log_warning("Negative population in State " + std::to_string(static_cast(susceptibleState)) + + " for age group " + std::to_string(static_cast(i)) + ". Setting to 0."); + model.populations[{i, susceptibleState}] = 0; + } + }; + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { - double group_total = model.populations.get_group_total(i); + + double group_naive_total = calculate_layer_total(naive_states, i); + double group_partial_total = calculate_layer_total(partial_states, i); + double group_improved_total = calculate_layer_total(improved_states, i); //sample initial compartments (with exceptions) for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { - if (inf_state != InfectionState::SusceptibleNaive && //not sampled, fixed after sampling everything else - inf_state != InfectionState::DeadNaive && //not sampled, fixed from data + if (inf_state != InfectionState::DeadNaive && //not sampled, fixed from data inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data model.populations[{i, inf_state}].draw_sample(); } } + double diff_naive = group_naive_total - calculate_layer_total(naive_states, i); + double diff_partial = group_partial_total - calculate_layer_total(partial_states, i); + double diff_improved = group_improved_total - calculate_layer_total(improved_states, i); - //set susceptibles so the total number stays the same as before sampling. - //if the new total without susceptibles is already bigger than the previous total - //subtract the overflow from SusceptibleImprovedImmunity, susceptibles will then be approximately zero. - model.populations[{i, InfectionState::SusceptibleNaive}] = 0; - double diff = model.populations.get_group_total(i) - group_total; - if (diff > 0) { - if (model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] - diff > 0) { - model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] = - model.populations[{i, InfectionState::TemporaryImmunImprovedImmunity}] - diff - 1e-10; - } - else { - model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] = - model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] - diff - 1e-10; - } - if (model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] < 0.0) { - log_error("Compartment SusceptibleImprovedImmunity negative after sampling."); - } - assert(group_total - model.populations.get_group_total(i) > 1e-10 && "Sanity check."); - } - model.populations.set_difference_from_group_total({i, InfectionState::SusceptibleNaive}, group_total); + adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); + adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); + adjust_susceptible_population(i, diff_improved, InfectionState::SusceptibleImprovedImmunity); } } From 4f9e5122a15587a3f9448e876a35ea69ebf9a2ee Mon Sep 17 00:00:00 2001 From: HenrZu Date: Fri, 15 Mar 2024 13:31:38 +0100 Subject: [PATCH 17/60] remove unused entries from test data --- .../pydata/District/vaccination_data.json | 477 ------ .../Germany/all_county_ageinf_vacc_ma7.json | 477 ------ cpp/tests/data/vacc_county_ageinf_ma7.json | 1305 ----------------- cpp/tests/data/vaccination_data.json | 477 ------ 4 files changed, 2736 deletions(-) diff --git a/cpp/tests/data/pydata/District/vaccination_data.json b/cpp/tests/data/pydata/District/vaccination_data.json index b6dc849643..0a0230e6f8 100644 --- a/cpp/tests/data/pydata/District/vaccination_data.json +++ b/cpp/tests/data/pydata/District/vaccination_data.json @@ -1,481 +1,4 @@ [ - { - "Date": "2020-10-01", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14093.5670993244, - "Vacc_completed": 1058.2133302677, - "Vacc_refreshed": 0, - "Vacc_refreshed_2": 0.0 - }, - { - "Date": "2020-10-02", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14094.6780758432, - "Vacc_completed": 1058.2386490178, - "Vacc_refreshed": 3.9480185817, - "Vacc_refreshed_2": 1.97400929085 - }, - { - "Date": "2020-10-03", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14102.3458622773, - "Vacc_completed": 1063.1811826304, - "Vacc_refreshed": 7.8235846725, - "Vacc_refreshed_2": 3.91179233625 - }, - { - "Date": "2020-10-04", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14106.0158477852, - "Vacc_completed": 1071.0829580916, - "Vacc_refreshed": 13.0365435255, - "Vacc_refreshed_2": 6.51827176275 - }, - { - "Date": "2020-10-05", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14115.8958402416, - "Vacc_completed": 1072.5136218055, - "Vacc_refreshed": 15.4582843201, - "Vacc_refreshed_2": 7.72914216005 - }, - { - "Date": "2020-10-06", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14116.0603009948, - "Vacc_completed": 1080.8706574256, - "Vacc_refreshed": 22.3037298829, - "Vacc_refreshed_2": 11.15186494145 - }, - { - "Date": "2020-10-07", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14124.4849162097, - "Vacc_completed": 1087.4957123195, - "Vacc_refreshed": 27.7666004775, - "Vacc_refreshed_2": 13.88330023875 - }, - { - "Date": "2020-10-08", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14132.812800891, - "Vacc_completed": 1094.2936630058, - "Vacc_refreshed": 29.4212640594, - "Vacc_refreshed_2": 14.7106320297 - }, - { - "Date": "2020-10-09", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14139.2772895404, - "Vacc_completed": 1100.1665827188, - "Vacc_refreshed": 29.4568827793, - "Vacc_refreshed_2": 14.72844138965 - }, - { - "Date": "2020-10-10", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14145.4868397119, - "Vacc_completed": 1105.3345419667, - "Vacc_refreshed": 34.7217238502, - "Vacc_refreshed_2": 17.3608619251 - }, - { - "Date": "2020-10-11", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14147.7480966959, - "Vacc_completed": 1111.2289166538, - "Vacc_refreshed": 34.771310214, - "Vacc_refreshed_2": 17.385655107 - }, - { - "Date": "2020-10-12", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14154.5204084505, - "Vacc_completed": 1114.7870563855, - "Vacc_refreshed": 41.8898823514, - "Vacc_refreshed_2": 20.9449411757 - }, - { - "Date": "2020-10-13", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14155.4472543415, - "Vacc_completed": 1124.6385432496, - "Vacc_refreshed": 48.6348857735, - "Vacc_refreshed_2": 24.31744288675 - }, - { - "Date": "2020-10-14", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14162.2764203336, - "Vacc_completed": 1128.54825128, - "Vacc_refreshed": 48.7694054724, - "Vacc_refreshed_2": 24.3847027362 - }, - { - "Date": "2020-10-15", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14163.6229511244, - "Vacc_completed": 1128.7143765883, - "Vacc_refreshed": 53.2059941772, - "Vacc_refreshed_2": 26.6029970886 - }, - { - "Date": "2020-10-16", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14170.704731349, - "Vacc_completed": 1138.0466956792, - "Vacc_refreshed": 59.0394633797, - "Vacc_refreshed_2": 29.51973168985 - }, - { - "Date": "2020-10-17", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14177.9754226866, - "Vacc_completed": 1144.8391611423, - "Vacc_refreshed": 68.7607294969, - "Vacc_refreshed_2": 34.38036474845 - }, - { - "Date": "2020-10-18", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14180.6917277285, - "Vacc_completed": 1145.8477444825, - "Vacc_refreshed": 68.9221667424, - "Vacc_refreshed_2": 34.4610833712 - }, - { - "Date": "2020-10-19", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14183.6510488722, - "Vacc_completed": 1148.5261706572, - "Vacc_refreshed": 74.1781085786, - "Vacc_refreshed_2": 37.0890542893 - }, - { - "Date": "2020-10-20", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14187.685478561, - "Vacc_completed": 1156.317724845, - "Vacc_refreshed": 82.4605426733, - "Vacc_refreshed_2": 41.23027133665 - }, - { - "Date": "2020-10-21", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14190.8756861073, - "Vacc_completed": 1158.3230049846, - "Vacc_refreshed": 85.9686058349, - "Vacc_refreshed_2": 42.98430291745 - }, - { - "Date": "2020-10-22", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14194.7125443701, - "Vacc_completed": 1162.8869701267, - "Vacc_refreshed": 86.9745448839, - "Vacc_refreshed_2": 43.48727244195 - }, - { - "Date": "2020-10-23", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14198.1736788429, - "Vacc_completed": 1172.5122981568, - "Vacc_refreshed": 87.3520867387, - "Vacc_refreshed_2": 43.67604336935 - }, - { - "Date": "2020-10-24", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14200.0337444888, - "Vacc_completed": 1173.9022323601, - "Vacc_refreshed": 96.1323881978, - "Vacc_refreshed_2": 48.0661940989 - }, - { - "Date": "2020-10-25", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14209.9091251899, - "Vacc_completed": 1180.4819879148, - "Vacc_refreshed": 102.8081520102, - "Vacc_refreshed_2": 51.4040760051 - }, - { - "Date": "2020-10-26", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14215.7510791988, - "Vacc_completed": 1187.6749019896, - "Vacc_refreshed": 111.0676626302, - "Vacc_refreshed_2": 55.5338313151 - }, - { - "Date": "2020-10-27", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14216.891975169, - "Vacc_completed": 1194.8246181318, - "Vacc_refreshed": 112.2172983632, - "Vacc_refreshed_2": 56.1086491816 - }, - { - "Date": "2020-10-28", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14226.1128719795, - "Vacc_completed": 1199.3288757923, - "Vacc_refreshed": 115.0035825103, - "Vacc_refreshed_2": 57.50179125515 - }, - { - "Date": "2020-10-29", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14234.2678640476, - "Vacc_completed": 1200.3667784603, - "Vacc_refreshed": 122.2552339507, - "Vacc_refreshed_2": 61.12761697535 - }, - { - "Date": "2020-10-30", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14236.1003192184, - "Vacc_completed": 1204.1967603181, - "Vacc_refreshed": 127.0429292216, - "Vacc_refreshed_2": 63.5214646108 - }, - { - "Date": "2020-10-31", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14242.538633822, - "Vacc_completed": 1212.5454877324, - "Vacc_refreshed": 134.6939665016, - "Vacc_refreshed_2": 67.3469832508 - }, - { - "Date": "2020-11-01", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14244.3387278104, - "Vacc_completed": 1213.6034702862, - "Vacc_refreshed": 136.0920891424, - "Vacc_refreshed_2": 68.0460445712 - }, - { - "Date": "2020-11-02", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14251.4120506037, - "Vacc_completed": 1216.4725302456, - "Vacc_refreshed": 140.2813449601, - "Vacc_refreshed_2": 70.14067248005 - }, - { - "Date": "2020-11-03", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14260.7111088561, - "Vacc_completed": 1223.9349650326, - "Vacc_refreshed": 144.4607939662, - "Vacc_refreshed_2": 72.2303969831 - }, - { - "Date": "2020-11-04", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.4310619138, - "Vacc_completed": 1230.2964929538, - "Vacc_refreshed": 149.281965675, - "Vacc_refreshed_2": 74.6409828375 - }, - { - "Date": "2020-11-05", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.8430243455, - "Vacc_completed": 1233.791799902, - "Vacc_refreshed": 152.843700775, - "Vacc_refreshed_2": 76.4218503875 - }, - { - "Date": "2020-11-06", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14270.6723528208, - "Vacc_completed": 1235.7852283109, - "Vacc_refreshed": 158.6087157945, - "Vacc_refreshed_2": 79.30435789725 - }, - { - "Date": "2020-11-07", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14276.398217781, - "Vacc_completed": 1244.1189399585, - "Vacc_refreshed": 161.780101215, - "Vacc_refreshed_2": 80.8900506075 - }, - { - "Date": "2020-11-08", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14282.7632141243, - "Vacc_completed": 1252.4246776385, - "Vacc_refreshed": 164.4087953839, - "Vacc_refreshed_2": 82.20439769195 - }, - { - "Date": "2020-11-09", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14285.2172118541, - "Vacc_completed": 1253.0967186007, - "Vacc_refreshed": 165.7333648079, - "Vacc_refreshed_2": 82.86668240395 - }, - { - "Date": "2020-11-10", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14288.3981413127, - "Vacc_completed": 1261.2285273698, - "Vacc_refreshed": 175.6751183454, - "Vacc_refreshed_2": 87.8375591727 - }, - { - "Date": "2020-11-11", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14296.6990830234, - "Vacc_completed": 1261.8928424603, - "Vacc_refreshed": 181.3746988194, - "Vacc_refreshed_2": 90.6873494097 - }, - { - "Date": "2020-11-12", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14304.9324135674, - "Vacc_completed": 1268.1858225933, - "Vacc_refreshed": 182.8207287588, - "Vacc_refreshed_2": 91.4103643794 - }, - { - "Date": "2020-11-13", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14312.7990335985, - "Vacc_completed": 1270.8693167453, - "Vacc_refreshed": 192.6352794711, - "Vacc_refreshed_2": 96.31763973555 - }, - { - "Date": "2020-11-14", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14316.0317804647, - "Vacc_completed": 1276.8328604136, - "Vacc_refreshed": 199.109084232, - "Vacc_refreshed_2": 99.554542116 - }, - { - "Date": "2020-11-15", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14317.8224126817, - "Vacc_completed": 1285.9345839202, - "Vacc_refreshed": 204.9564534429, - "Vacc_refreshed_2": 102.47822672145 - }, - { - "Date": "2020-11-16", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14319.969225103, - "Vacc_completed": 1292.0814432843, - "Vacc_refreshed": 209.3116185701, - "Vacc_refreshed_2": 104.65580928505 - }, - { - "Date": "2020-11-17", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14325.5010146205, - "Vacc_completed": 1296.8562638588, - "Vacc_refreshed": 214.164106287, - "Vacc_refreshed_2": 107.0820531435 - }, - { - "Date": "2020-11-18", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14334.64723979, - "Vacc_completed": 1299.2846390455, - "Vacc_refreshed": 215.8187786169, - "Vacc_refreshed_2": 107.90938930845 - }, - { - "Date": "2020-11-19", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14341.3416549169, - "Vacc_completed": 1307.3997120401, - "Vacc_refreshed": 220.1718442512, - "Vacc_refreshed_2": 110.0859221256 - }, - { - "Date": "2020-11-20", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14349.3146443239, - "Vacc_completed": 1309.8026404332, - "Vacc_refreshed": 222.9315364644, - "Vacc_refreshed_2": 111.4657682322 - }, - { - "Date": "2020-11-21", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14359.2839765392, - "Vacc_completed": 1313.6592234511, - "Vacc_refreshed": 226.6469703335, - "Vacc_refreshed_2": 113.32348516675 - }, - { - "Date": "2020-11-22", - "ID_District": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14365.2176903694, - "Vacc_completed": 1319.2137305156, - "Vacc_refreshed": 227.7079880211, - "Vacc_refreshed_2": 113.85399401055 - }, { "Date": "2020-11-23", "ID_District": 1002, diff --git a/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json b/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json index 0716826088..e8c47d14fb 100644 --- a/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json +++ b/cpp/tests/data/pydata/Germany/all_county_ageinf_vacc_ma7.json @@ -1,481 +1,4 @@ [ - { - "Date": "2020-10-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14093.5670993244, - "Vacc_completed": 1058.2133302677, - "Vacc_refreshed": 0, - "Vacc_refreshed_2": 0.0 - }, - { - "Date": "2020-10-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14094.6780758432, - "Vacc_completed": 1058.2386490178, - "Vacc_refreshed": 3.9480185817, - "Vacc_refreshed_2": 1.97400929085 - }, - { - "Date": "2020-10-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14102.3458622773, - "Vacc_completed": 1063.1811826304, - "Vacc_refreshed": 7.8235846725, - "Vacc_refreshed_2": 3.91179233625 - }, - { - "Date": "2020-10-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14106.0158477852, - "Vacc_completed": 1071.0829580916, - "Vacc_refreshed": 13.0365435255, - "Vacc_refreshed_2": 6.51827176275 - }, - { - "Date": "2020-10-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14115.8958402416, - "Vacc_completed": 1072.5136218055, - "Vacc_refreshed": 15.4582843201, - "Vacc_refreshed_2": 7.72914216005 - }, - { - "Date": "2020-10-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14116.0603009948, - "Vacc_completed": 1080.8706574256, - "Vacc_refreshed": 22.3037298829, - "Vacc_refreshed_2": 11.15186494145 - }, - { - "Date": "2020-10-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14124.4849162097, - "Vacc_completed": 1087.4957123195, - "Vacc_refreshed": 27.7666004775, - "Vacc_refreshed_2": 13.88330023875 - }, - { - "Date": "2020-10-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14132.812800891, - "Vacc_completed": 1094.2936630058, - "Vacc_refreshed": 29.4212640594, - "Vacc_refreshed_2": 14.7106320297 - }, - { - "Date": "2020-10-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14139.2772895404, - "Vacc_completed": 1100.1665827188, - "Vacc_refreshed": 29.4568827793, - "Vacc_refreshed_2": 14.72844138965 - }, - { - "Date": "2020-10-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14145.4868397119, - "Vacc_completed": 1105.3345419667, - "Vacc_refreshed": 34.7217238502, - "Vacc_refreshed_2": 17.3608619251 - }, - { - "Date": "2020-10-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14147.7480966959, - "Vacc_completed": 1111.2289166538, - "Vacc_refreshed": 34.771310214, - "Vacc_refreshed_2": 17.385655107 - }, - { - "Date": "2020-10-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14154.5204084505, - "Vacc_completed": 1114.7870563855, - "Vacc_refreshed": 41.8898823514, - "Vacc_refreshed_2": 20.9449411757 - }, - { - "Date": "2020-10-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14155.4472543415, - "Vacc_completed": 1124.6385432496, - "Vacc_refreshed": 48.6348857735, - "Vacc_refreshed_2": 24.31744288675 - }, - { - "Date": "2020-10-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14162.2764203336, - "Vacc_completed": 1128.54825128, - "Vacc_refreshed": 48.7694054724, - "Vacc_refreshed_2": 24.3847027362 - }, - { - "Date": "2020-10-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14163.6229511244, - "Vacc_completed": 1128.7143765883, - "Vacc_refreshed": 53.2059941772, - "Vacc_refreshed_2": 26.6029970886 - }, - { - "Date": "2020-10-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14170.704731349, - "Vacc_completed": 1138.0466956792, - "Vacc_refreshed": 59.0394633797, - "Vacc_refreshed_2": 29.51973168985 - }, - { - "Date": "2020-10-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14177.9754226866, - "Vacc_completed": 1144.8391611423, - "Vacc_refreshed": 68.7607294969, - "Vacc_refreshed_2": 34.38036474845 - }, - { - "Date": "2020-10-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14180.6917277285, - "Vacc_completed": 1145.8477444825, - "Vacc_refreshed": 68.9221667424, - "Vacc_refreshed_2": 34.4610833712 - }, - { - "Date": "2020-10-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14183.6510488722, - "Vacc_completed": 1148.5261706572, - "Vacc_refreshed": 74.1781085786, - "Vacc_refreshed_2": 37.0890542893 - }, - { - "Date": "2020-10-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14187.685478561, - "Vacc_completed": 1156.317724845, - "Vacc_refreshed": 82.4605426733, - "Vacc_refreshed_2": 41.23027133665 - }, - { - "Date": "2020-10-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14190.8756861073, - "Vacc_completed": 1158.3230049846, - "Vacc_refreshed": 85.9686058349, - "Vacc_refreshed_2": 42.98430291745 - }, - { - "Date": "2020-10-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14194.7125443701, - "Vacc_completed": 1162.8869701267, - "Vacc_refreshed": 86.9745448839, - "Vacc_refreshed_2": 43.48727244195 - }, - { - "Date": "2020-10-23", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14198.1736788429, - "Vacc_completed": 1172.5122981568, - "Vacc_refreshed": 87.3520867387, - "Vacc_refreshed_2": 43.67604336935 - }, - { - "Date": "2020-10-24", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14200.0337444888, - "Vacc_completed": 1173.9022323601, - "Vacc_refreshed": 96.1323881978, - "Vacc_refreshed_2": 48.0661940989 - }, - { - "Date": "2020-10-25", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14209.9091251899, - "Vacc_completed": 1180.4819879148, - "Vacc_refreshed": 102.8081520102, - "Vacc_refreshed_2": 51.4040760051 - }, - { - "Date": "2020-10-26", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14215.7510791988, - "Vacc_completed": 1187.6749019896, - "Vacc_refreshed": 111.0676626302, - "Vacc_refreshed_2": 55.5338313151 - }, - { - "Date": "2020-10-27", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14216.891975169, - "Vacc_completed": 1194.8246181318, - "Vacc_refreshed": 112.2172983632, - "Vacc_refreshed_2": 56.1086491816 - }, - { - "Date": "2020-10-28", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14226.1128719795, - "Vacc_completed": 1199.3288757923, - "Vacc_refreshed": 115.0035825103, - "Vacc_refreshed_2": 57.50179125515 - }, - { - "Date": "2020-10-29", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14234.2678640476, - "Vacc_completed": 1200.3667784603, - "Vacc_refreshed": 122.2552339507, - "Vacc_refreshed_2": 61.12761697535 - }, - { - "Date": "2020-10-30", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14236.1003192184, - "Vacc_completed": 1204.1967603181, - "Vacc_refreshed": 127.0429292216, - "Vacc_refreshed_2": 63.5214646108 - }, - { - "Date": "2020-10-31", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14242.538633822, - "Vacc_completed": 1212.5454877324, - "Vacc_refreshed": 134.6939665016, - "Vacc_refreshed_2": 67.3469832508 - }, - { - "Date": "2020-11-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14244.3387278104, - "Vacc_completed": 1213.6034702862, - "Vacc_refreshed": 136.0920891424, - "Vacc_refreshed_2": 68.0460445712 - }, - { - "Date": "2020-11-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14251.4120506037, - "Vacc_completed": 1216.4725302456, - "Vacc_refreshed": 140.2813449601, - "Vacc_refreshed_2": 70.14067248005 - }, - { - "Date": "2020-11-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14260.7111088561, - "Vacc_completed": 1223.9349650326, - "Vacc_refreshed": 144.4607939662, - "Vacc_refreshed_2": 72.2303969831 - }, - { - "Date": "2020-11-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.4310619138, - "Vacc_completed": 1230.2964929538, - "Vacc_refreshed": 149.281965675, - "Vacc_refreshed_2": 74.6409828375 - }, - { - "Date": "2020-11-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.8430243455, - "Vacc_completed": 1233.791799902, - "Vacc_refreshed": 152.843700775, - "Vacc_refreshed_2": 76.4218503875 - }, - { - "Date": "2020-11-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14270.6723528208, - "Vacc_completed": 1235.7852283109, - "Vacc_refreshed": 158.6087157945, - "Vacc_refreshed_2": 79.30435789725 - }, - { - "Date": "2020-11-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14276.398217781, - "Vacc_completed": 1244.1189399585, - "Vacc_refreshed": 161.780101215, - "Vacc_refreshed_2": 80.8900506075 - }, - { - "Date": "2020-11-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14282.7632141243, - "Vacc_completed": 1252.4246776385, - "Vacc_refreshed": 164.4087953839, - "Vacc_refreshed_2": 82.20439769195 - }, - { - "Date": "2020-11-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14285.2172118541, - "Vacc_completed": 1253.0967186007, - "Vacc_refreshed": 165.7333648079, - "Vacc_refreshed_2": 82.86668240395 - }, - { - "Date": "2020-11-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14288.3981413127, - "Vacc_completed": 1261.2285273698, - "Vacc_refreshed": 175.6751183454, - "Vacc_refreshed_2": 87.8375591727 - }, - { - "Date": "2020-11-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14296.6990830234, - "Vacc_completed": 1261.8928424603, - "Vacc_refreshed": 181.3746988194, - "Vacc_refreshed_2": 90.6873494097 - }, - { - "Date": "2020-11-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14304.9324135674, - "Vacc_completed": 1268.1858225933, - "Vacc_refreshed": 182.8207287588, - "Vacc_refreshed_2": 91.4103643794 - }, - { - "Date": "2020-11-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14312.7990335985, - "Vacc_completed": 1270.8693167453, - "Vacc_refreshed": 192.6352794711, - "Vacc_refreshed_2": 96.31763973555 - }, - { - "Date": "2020-11-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14316.0317804647, - "Vacc_completed": 1276.8328604136, - "Vacc_refreshed": 199.109084232, - "Vacc_refreshed_2": 99.554542116 - }, - { - "Date": "2020-11-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14317.8224126817, - "Vacc_completed": 1285.9345839202, - "Vacc_refreshed": 204.9564534429, - "Vacc_refreshed_2": 102.47822672145 - }, - { - "Date": "2020-11-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14319.969225103, - "Vacc_completed": 1292.0814432843, - "Vacc_refreshed": 209.3116185701, - "Vacc_refreshed_2": 104.65580928505 - }, - { - "Date": "2020-11-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14325.5010146205, - "Vacc_completed": 1296.8562638588, - "Vacc_refreshed": 214.164106287, - "Vacc_refreshed_2": 107.0820531435 - }, - { - "Date": "2020-11-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14334.64723979, - "Vacc_completed": 1299.2846390455, - "Vacc_refreshed": 215.8187786169, - "Vacc_refreshed_2": 107.90938930845 - }, - { - "Date": "2020-11-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14341.3416549169, - "Vacc_completed": 1307.3997120401, - "Vacc_refreshed": 220.1718442512, - "Vacc_refreshed_2": 110.0859221256 - }, - { - "Date": "2020-11-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14349.3146443239, - "Vacc_completed": 1309.8026404332, - "Vacc_refreshed": 222.9315364644, - "Vacc_refreshed_2": 111.4657682322 - }, - { - "Date": "2020-11-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14359.2839765392, - "Vacc_completed": 1313.6592234511, - "Vacc_refreshed": 226.6469703335, - "Vacc_refreshed_2": 113.32348516675 - }, - { - "Date": "2020-11-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14365.2176903694, - "Vacc_completed": 1319.2137305156, - "Vacc_refreshed": 227.7079880211, - "Vacc_refreshed_2": 113.85399401055 - }, { "Date": "2020-11-23", "ID_County": 1002, diff --git a/cpp/tests/data/vacc_county_ageinf_ma7.json b/cpp/tests/data/vacc_county_ageinf_ma7.json index 0716826088..5900d0a515 100644 --- a/cpp/tests/data/vacc_county_ageinf_ma7.json +++ b/cpp/tests/data/vacc_county_ageinf_ma7.json @@ -1,1309 +1,4 @@ [ - { - "Date": "2020-10-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14093.5670993244, - "Vacc_completed": 1058.2133302677, - "Vacc_refreshed": 0, - "Vacc_refreshed_2": 0.0 - }, - { - "Date": "2020-10-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14094.6780758432, - "Vacc_completed": 1058.2386490178, - "Vacc_refreshed": 3.9480185817, - "Vacc_refreshed_2": 1.97400929085 - }, - { - "Date": "2020-10-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14102.3458622773, - "Vacc_completed": 1063.1811826304, - "Vacc_refreshed": 7.8235846725, - "Vacc_refreshed_2": 3.91179233625 - }, - { - "Date": "2020-10-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14106.0158477852, - "Vacc_completed": 1071.0829580916, - "Vacc_refreshed": 13.0365435255, - "Vacc_refreshed_2": 6.51827176275 - }, - { - "Date": "2020-10-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14115.8958402416, - "Vacc_completed": 1072.5136218055, - "Vacc_refreshed": 15.4582843201, - "Vacc_refreshed_2": 7.72914216005 - }, - { - "Date": "2020-10-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14116.0603009948, - "Vacc_completed": 1080.8706574256, - "Vacc_refreshed": 22.3037298829, - "Vacc_refreshed_2": 11.15186494145 - }, - { - "Date": "2020-10-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14124.4849162097, - "Vacc_completed": 1087.4957123195, - "Vacc_refreshed": 27.7666004775, - "Vacc_refreshed_2": 13.88330023875 - }, - { - "Date": "2020-10-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14132.812800891, - "Vacc_completed": 1094.2936630058, - "Vacc_refreshed": 29.4212640594, - "Vacc_refreshed_2": 14.7106320297 - }, - { - "Date": "2020-10-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14139.2772895404, - "Vacc_completed": 1100.1665827188, - "Vacc_refreshed": 29.4568827793, - "Vacc_refreshed_2": 14.72844138965 - }, - { - "Date": "2020-10-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14145.4868397119, - "Vacc_completed": 1105.3345419667, - "Vacc_refreshed": 34.7217238502, - "Vacc_refreshed_2": 17.3608619251 - }, - { - "Date": "2020-10-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14147.7480966959, - "Vacc_completed": 1111.2289166538, - "Vacc_refreshed": 34.771310214, - "Vacc_refreshed_2": 17.385655107 - }, - { - "Date": "2020-10-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14154.5204084505, - "Vacc_completed": 1114.7870563855, - "Vacc_refreshed": 41.8898823514, - "Vacc_refreshed_2": 20.9449411757 - }, - { - "Date": "2020-10-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14155.4472543415, - "Vacc_completed": 1124.6385432496, - "Vacc_refreshed": 48.6348857735, - "Vacc_refreshed_2": 24.31744288675 - }, - { - "Date": "2020-10-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14162.2764203336, - "Vacc_completed": 1128.54825128, - "Vacc_refreshed": 48.7694054724, - "Vacc_refreshed_2": 24.3847027362 - }, - { - "Date": "2020-10-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14163.6229511244, - "Vacc_completed": 1128.7143765883, - "Vacc_refreshed": 53.2059941772, - "Vacc_refreshed_2": 26.6029970886 - }, - { - "Date": "2020-10-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14170.704731349, - "Vacc_completed": 1138.0466956792, - "Vacc_refreshed": 59.0394633797, - "Vacc_refreshed_2": 29.51973168985 - }, - { - "Date": "2020-10-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14177.9754226866, - "Vacc_completed": 1144.8391611423, - "Vacc_refreshed": 68.7607294969, - "Vacc_refreshed_2": 34.38036474845 - }, - { - "Date": "2020-10-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14180.6917277285, - "Vacc_completed": 1145.8477444825, - "Vacc_refreshed": 68.9221667424, - "Vacc_refreshed_2": 34.4610833712 - }, - { - "Date": "2020-10-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14183.6510488722, - "Vacc_completed": 1148.5261706572, - "Vacc_refreshed": 74.1781085786, - "Vacc_refreshed_2": 37.0890542893 - }, - { - "Date": "2020-10-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14187.685478561, - "Vacc_completed": 1156.317724845, - "Vacc_refreshed": 82.4605426733, - "Vacc_refreshed_2": 41.23027133665 - }, - { - "Date": "2020-10-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14190.8756861073, - "Vacc_completed": 1158.3230049846, - "Vacc_refreshed": 85.9686058349, - "Vacc_refreshed_2": 42.98430291745 - }, - { - "Date": "2020-10-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14194.7125443701, - "Vacc_completed": 1162.8869701267, - "Vacc_refreshed": 86.9745448839, - "Vacc_refreshed_2": 43.48727244195 - }, - { - "Date": "2020-10-23", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14198.1736788429, - "Vacc_completed": 1172.5122981568, - "Vacc_refreshed": 87.3520867387, - "Vacc_refreshed_2": 43.67604336935 - }, - { - "Date": "2020-10-24", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14200.0337444888, - "Vacc_completed": 1173.9022323601, - "Vacc_refreshed": 96.1323881978, - "Vacc_refreshed_2": 48.0661940989 - }, - { - "Date": "2020-10-25", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14209.9091251899, - "Vacc_completed": 1180.4819879148, - "Vacc_refreshed": 102.8081520102, - "Vacc_refreshed_2": 51.4040760051 - }, - { - "Date": "2020-10-26", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14215.7510791988, - "Vacc_completed": 1187.6749019896, - "Vacc_refreshed": 111.0676626302, - "Vacc_refreshed_2": 55.5338313151 - }, - { - "Date": "2020-10-27", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14216.891975169, - "Vacc_completed": 1194.8246181318, - "Vacc_refreshed": 112.2172983632, - "Vacc_refreshed_2": 56.1086491816 - }, - { - "Date": "2020-10-28", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14226.1128719795, - "Vacc_completed": 1199.3288757923, - "Vacc_refreshed": 115.0035825103, - "Vacc_refreshed_2": 57.50179125515 - }, - { - "Date": "2020-10-29", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14234.2678640476, - "Vacc_completed": 1200.3667784603, - "Vacc_refreshed": 122.2552339507, - "Vacc_refreshed_2": 61.12761697535 - }, - { - "Date": "2020-10-30", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14236.1003192184, - "Vacc_completed": 1204.1967603181, - "Vacc_refreshed": 127.0429292216, - "Vacc_refreshed_2": 63.5214646108 - }, - { - "Date": "2020-10-31", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14242.538633822, - "Vacc_completed": 1212.5454877324, - "Vacc_refreshed": 134.6939665016, - "Vacc_refreshed_2": 67.3469832508 - }, - { - "Date": "2020-11-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14244.3387278104, - "Vacc_completed": 1213.6034702862, - "Vacc_refreshed": 136.0920891424, - "Vacc_refreshed_2": 68.0460445712 - }, - { - "Date": "2020-11-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14251.4120506037, - "Vacc_completed": 1216.4725302456, - "Vacc_refreshed": 140.2813449601, - "Vacc_refreshed_2": 70.14067248005 - }, - { - "Date": "2020-11-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14260.7111088561, - "Vacc_completed": 1223.9349650326, - "Vacc_refreshed": 144.4607939662, - "Vacc_refreshed_2": 72.2303969831 - }, - { - "Date": "2020-11-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.4310619138, - "Vacc_completed": 1230.2964929538, - "Vacc_refreshed": 149.281965675, - "Vacc_refreshed_2": 74.6409828375 - }, - { - "Date": "2020-11-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.8430243455, - "Vacc_completed": 1233.791799902, - "Vacc_refreshed": 152.843700775, - "Vacc_refreshed_2": 76.4218503875 - }, - { - "Date": "2020-11-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14270.6723528208, - "Vacc_completed": 1235.7852283109, - "Vacc_refreshed": 158.6087157945, - "Vacc_refreshed_2": 79.30435789725 - }, - { - "Date": "2020-11-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14276.398217781, - "Vacc_completed": 1244.1189399585, - "Vacc_refreshed": 161.780101215, - "Vacc_refreshed_2": 80.8900506075 - }, - { - "Date": "2020-11-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14282.7632141243, - "Vacc_completed": 1252.4246776385, - "Vacc_refreshed": 164.4087953839, - "Vacc_refreshed_2": 82.20439769195 - }, - { - "Date": "2020-11-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14285.2172118541, - "Vacc_completed": 1253.0967186007, - "Vacc_refreshed": 165.7333648079, - "Vacc_refreshed_2": 82.86668240395 - }, - { - "Date": "2020-11-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14288.3981413127, - "Vacc_completed": 1261.2285273698, - "Vacc_refreshed": 175.6751183454, - "Vacc_refreshed_2": 87.8375591727 - }, - { - "Date": "2020-11-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14296.6990830234, - "Vacc_completed": 1261.8928424603, - "Vacc_refreshed": 181.3746988194, - "Vacc_refreshed_2": 90.6873494097 - }, - { - "Date": "2020-11-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14304.9324135674, - "Vacc_completed": 1268.1858225933, - "Vacc_refreshed": 182.8207287588, - "Vacc_refreshed_2": 91.4103643794 - }, - { - "Date": "2020-11-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14312.7990335985, - "Vacc_completed": 1270.8693167453, - "Vacc_refreshed": 192.6352794711, - "Vacc_refreshed_2": 96.31763973555 - }, - { - "Date": "2020-11-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14316.0317804647, - "Vacc_completed": 1276.8328604136, - "Vacc_refreshed": 199.109084232, - "Vacc_refreshed_2": 99.554542116 - }, - { - "Date": "2020-11-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14317.8224126817, - "Vacc_completed": 1285.9345839202, - "Vacc_refreshed": 204.9564534429, - "Vacc_refreshed_2": 102.47822672145 - }, - { - "Date": "2020-11-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14319.969225103, - "Vacc_completed": 1292.0814432843, - "Vacc_refreshed": 209.3116185701, - "Vacc_refreshed_2": 104.65580928505 - }, - { - "Date": "2020-11-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14325.5010146205, - "Vacc_completed": 1296.8562638588, - "Vacc_refreshed": 214.164106287, - "Vacc_refreshed_2": 107.0820531435 - }, - { - "Date": "2020-11-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14334.64723979, - "Vacc_completed": 1299.2846390455, - "Vacc_refreshed": 215.8187786169, - "Vacc_refreshed_2": 107.90938930845 - }, - { - "Date": "2020-11-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14341.3416549169, - "Vacc_completed": 1307.3997120401, - "Vacc_refreshed": 220.1718442512, - "Vacc_refreshed_2": 110.0859221256 - }, - { - "Date": "2020-11-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14349.3146443239, - "Vacc_completed": 1309.8026404332, - "Vacc_refreshed": 222.9315364644, - "Vacc_refreshed_2": 111.4657682322 - }, - { - "Date": "2020-11-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14359.2839765392, - "Vacc_completed": 1313.6592234511, - "Vacc_refreshed": 226.6469703335, - "Vacc_refreshed_2": 113.32348516675 - }, - { - "Date": "2020-11-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14365.2176903694, - "Vacc_completed": 1319.2137305156, - "Vacc_refreshed": 227.7079880211, - "Vacc_refreshed_2": 113.85399401055 - }, - { - "Date": "2020-11-23", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14372.2949635005, - "Vacc_completed": 1325.3928078641, - "Vacc_refreshed": 234.0214496372, - "Vacc_refreshed_2": 117.0107248186 - }, - { - "Date": "2020-11-24", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14377.1100641854, - "Vacc_completed": 1326.7384263101, - "Vacc_refreshed": 242.1400638609, - "Vacc_refreshed_2": 121.07003193045 - }, - { - "Date": "2020-11-25", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14381.7559278649, - "Vacc_completed": 1329.4413693873, - "Vacc_refreshed": 246.2374710913, - "Vacc_refreshed_2": 123.11873554565 - }, - { - "Date": "2020-11-26", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14385.7162526455, - "Vacc_completed": 1338.1839321545, - "Vacc_refreshed": 252.0149200475, - "Vacc_refreshed_2": 126.00746002375 - }, - { - "Date": "2020-11-27", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14389.4326934411, - "Vacc_completed": 1345.9094675595, - "Vacc_refreshed": 256.9046042339, - "Vacc_refreshed_2": 128.45230211695 - }, - { - "Date": "2020-11-28", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14391.2007554132, - "Vacc_completed": 1348.71606757, - "Vacc_refreshed": 258.1776032516, - "Vacc_refreshed_2": 129.0888016258 - }, - { - "Date": "2020-11-29", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14394.8621297613, - "Vacc_completed": 1354.2416050796, - "Vacc_refreshed": 267.8589065036, - "Vacc_refreshed_2": 133.9294532518 - }, - { - "Date": "2020-11-30", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14398.3456243909, - "Vacc_completed": 1359.868800934, - "Vacc_refreshed": 270.9855298163, - "Vacc_refreshed_2": 135.49276490815 - }, - { - "Date": "2020-12-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14398.4645205246, - "Vacc_completed": 1363.0538159145, - "Vacc_refreshed": 275.840425604, - "Vacc_refreshed_2": 137.920212802 - }, - { - "Date": "2020-12-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14399.1657319944, - "Vacc_completed": 1365.5993182323, - "Vacc_refreshed": 277.5856365007, - "Vacc_refreshed_2": 138.79281825035 - }, - { - "Date": "2020-12-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14402.7230837573, - "Vacc_completed": 1368.6201543223, - "Vacc_refreshed": 286.3361695339, - "Vacc_refreshed_2": 143.16808476695 - }, - { - "Date": "2020-12-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14403.1500082752, - "Vacc_completed": 1371.4419603277, - "Vacc_refreshed": 291.9429549926, - "Vacc_refreshed_2": 145.9714774963 - }, - { - "Date": "2020-12-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14409.601025491, - "Vacc_completed": 1375.0385110041, - "Vacc_refreshed": 294.4838831323, - "Vacc_refreshed_2": 147.24194156615 - }, - { - "Date": "2020-12-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14412.5992098988, - "Vacc_completed": 1379.7282797993, - "Vacc_refreshed": 304.3709721295, - "Vacc_refreshed_2": 152.18548606475 - }, - { - "Date": "2020-12-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14412.7379664054, - "Vacc_completed": 1388.4437755617, - "Vacc_refreshed": 310.9469195789, - "Vacc_refreshed_2": 155.47345978945 - }, - { - "Date": "2020-12-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14413.0256783966, - "Vacc_completed": 1395.0228908154, - "Vacc_refreshed": 316.1322991564, - "Vacc_refreshed_2": 158.0661495782 - }, - { - "Date": "2020-12-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14418.5923400284, - "Vacc_completed": 1395.4421160716, - "Vacc_refreshed": 324.326203234, - "Vacc_refreshed_2": 162.163101617 - }, - { - "Date": "2020-12-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14427.1006875636, - "Vacc_completed": 1400.9550416303, - "Vacc_refreshed": 326.1675291407, - "Vacc_refreshed_2": 163.08376457035 - }, - { - "Date": "2020-12-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14428.1259159444, - "Vacc_completed": 1401.6589165675, - "Vacc_refreshed": 336.1473853823, - "Vacc_refreshed_2": 168.07369269115 - }, - { - "Date": "2020-12-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14429.6710322591, - "Vacc_completed": 1406.4316961423, - "Vacc_refreshed": 338.7341080527, - "Vacc_refreshed_2": 169.36705402635 - }, - { - "Date": "2020-12-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14435.5405186058, - "Vacc_completed": 1406.8193757343, - "Vacc_refreshed": 348.5515447081, - "Vacc_refreshed_2": 174.27577235405 - }, - { - "Date": "2020-12-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14440.6128511884, - "Vacc_completed": 1406.8790930463, - "Vacc_refreshed": 349.9224707035, - "Vacc_refreshed_2": 174.96123535175 - }, - { - "Date": "2020-12-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14448.1553470558, - "Vacc_completed": 1407.8576900416, - "Vacc_refreshed": 354.7521313753, - "Vacc_refreshed_2": 177.37606568765 - }, - { - "Date": "2020-12-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14456.4196110425, - "Vacc_completed": 1411.7530351787, - "Vacc_refreshed": 361.5526839017, - "Vacc_refreshed_2": 180.77634195085 - }, - { - "Date": "2020-12-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14466.1757833279, - "Vacc_completed": 1412.4941157515, - "Vacc_refreshed": 364.0766791828, - "Vacc_refreshed_2": 182.0383395914 - }, - { - "Date": "2020-12-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14472.9152722164, - "Vacc_completed": 1421.7399661156, - "Vacc_refreshed": 371.2418954122, - "Vacc_refreshed_2": 185.6209477061 - }, - { - "Date": "2020-12-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14474.3971159945, - "Vacc_completed": 1423.8796012137, - "Vacc_refreshed": 378.3445685688, - "Vacc_refreshed_2": 189.1722842844 - }, - { - "Date": "2020-12-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14482.9259977884, - "Vacc_completed": 1428.8212618966, - "Vacc_refreshed": 382.6712538747, - "Vacc_refreshed_2": 191.33562693735 - }, - { - "Date": "2020-12-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14491.6837567491, - "Vacc_completed": 1430.1481016913, - "Vacc_refreshed": 392.5489632959, - "Vacc_refreshed_2": 196.27448164795 - }, - { - "Date": "2020-12-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14499.5728298642, - "Vacc_completed": 1439.468906008, - "Vacc_refreshed": 397.6649554861, - "Vacc_refreshed_2": 198.83247774305 - }, - { - "Date": "2020-12-23", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14500.4884339857, - "Vacc_completed": 1447.6074532094, - "Vacc_refreshed": 404.4236802991, - "Vacc_refreshed_2": 202.21184014955 - }, - { - "Date": "2020-12-24", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14508.6628209678, - "Vacc_completed": 1449.1955087396, - "Vacc_refreshed": 413.1290507873, - "Vacc_refreshed_2": 206.56452539365 - }, - { - "Date": "2020-12-25", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14509.0177335192, - "Vacc_completed": 1457.0313439789, - "Vacc_refreshed": 418.6984801264, - "Vacc_refreshed_2": 209.3492400632 - }, - { - "Date": "2020-12-26", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14518.7925361684, - "Vacc_completed": 1462.4055060107, - "Vacc_refreshed": 419.6070699812, - "Vacc_refreshed_2": 209.8035349906 - }, - { - "Date": "2020-12-27", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14522.121758092, - "Vacc_completed": 1468.1811367429, - "Vacc_refreshed": 425.9772045183, - "Vacc_refreshed_2": 212.98860225915 - }, - { - "Date": "2020-12-28", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14528.5474917037, - "Vacc_completed": 1473.5164593205, - "Vacc_refreshed": 435.7810319021, - "Vacc_refreshed_2": 217.89051595105 - }, - { - "Date": "2020-12-29", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14536.5601109176, - "Vacc_completed": 1481.2704120463, - "Vacc_refreshed": 438.2410199432, - "Vacc_refreshed_2": 219.1205099716 - }, - { - "Date": "2020-12-30", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14542.1473955627, - "Vacc_completed": 1482.7064631605, - "Vacc_refreshed": 445.3488141502, - "Vacc_refreshed_2": 222.6744070751 - }, - { - "Date": "2020-12-31", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14544.5952478081, - "Vacc_completed": 1486.0552178086, - "Vacc_refreshed": 446.1812966093, - "Vacc_refreshed_2": 223.09064830465 - }, - { - "Date": "2020-10-01", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10765.9941189788, - "Vacc_completed": 1603.3500569399, - "Vacc_refreshed": 0, - "Vacc_refreshed_2": 0.0 - }, - { - "Date": "2020-10-02", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10773.3717745702, - "Vacc_completed": 1605.3068408797, - "Vacc_refreshed": 3.6283182226, - "Vacc_refreshed_2": 1.8141591113 - }, - { - "Date": "2020-10-03", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10773.4956401429, - "Vacc_completed": 1610.6119068185, - "Vacc_refreshed": 6.1967396209, - "Vacc_refreshed_2": 3.09836981045 - }, - { - "Date": "2020-10-04", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10774.4184508751, - "Vacc_completed": 1613.016161978, - "Vacc_refreshed": 15.7069691534, - "Vacc_refreshed_2": 7.8534845767 - }, - { - "Date": "2020-10-05", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10780.8073818373, - "Vacc_completed": 1622.1917795654, - "Vacc_refreshed": 20.1697274397, - "Vacc_refreshed_2": 10.08486371985 - }, - { - "Date": "2020-10-06", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10785.5287460006, - "Vacc_completed": 1625.0602525893, - "Vacc_refreshed": 22.4671684217, - "Vacc_refreshed_2": 11.23358421085 - }, - { - "Date": "2020-10-07", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10790.1084610651, - "Vacc_completed": 1627.3787523231, - "Vacc_refreshed": 28.5217462646, - "Vacc_refreshed_2": 14.2608731323 - }, - { - "Date": "2020-10-08", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10796.2300309, - "Vacc_completed": 1630.4363483664, - "Vacc_refreshed": 35.3070676184, - "Vacc_refreshed_2": 17.6535338092 - }, - { - "Date": "2020-10-09", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10801.7222904172, - "Vacc_completed": 1638.725087864, - "Vacc_refreshed": 43.7679344272, - "Vacc_refreshed_2": 21.8839672136 - }, - { - "Date": "2020-10-10", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10804.7724722766, - "Vacc_completed": 1646.4905335365, - "Vacc_refreshed": 44.1718542676, - "Vacc_refreshed_2": 22.0859271338 - }, - { - "Date": "2020-10-11", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10814.3453353804, - "Vacc_completed": 1650.9992837124, - "Vacc_refreshed": 49.5204655539, - "Vacc_refreshed_2": 24.76023277695 - }, - { - "Date": "2020-10-12", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10821.6255112157, - "Vacc_completed": 1656.4335840831, - "Vacc_refreshed": 52.7009855172, - "Vacc_refreshed_2": 26.3504927586 - }, - { - "Date": "2020-10-13", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10830.9379325639, - "Vacc_completed": 1657.186187271, - "Vacc_refreshed": 56.5428649986, - "Vacc_refreshed_2": 28.2714324993 - }, - { - "Date": "2020-10-14", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10838.202902864, - "Vacc_completed": 1662.1470499364, - "Vacc_refreshed": 58.6277824858, - "Vacc_refreshed_2": 29.3138912429 - }, - { - "Date": "2020-10-15", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10840.8786753296, - "Vacc_completed": 1670.6860254071, - "Vacc_refreshed": 58.7593924743, - "Vacc_refreshed_2": 29.37969623715 - }, - { - "Date": "2020-10-16", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10843.7453960183, - "Vacc_completed": 1673.6372365137, - "Vacc_refreshed": 61.8595630166, - "Vacc_refreshed_2": 30.9297815083 - }, - { - "Date": "2020-10-17", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10849.1151892515, - "Vacc_completed": 1675.1066023109, - "Vacc_refreshed": 64.6020615007, - "Vacc_refreshed_2": 32.30103075035 - }, - { - "Date": "2020-10-18", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10850.9329685403, - "Vacc_completed": 1679.1505675366, - "Vacc_refreshed": 72.0237510859, - "Vacc_refreshed_2": 36.01187554295 - }, - { - "Date": "2020-10-19", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10854.4610677614, - "Vacc_completed": 1681.5473018047, - "Vacc_refreshed": 75.0145349272, - "Vacc_refreshed_2": 37.5072674636 - }, - { - "Date": "2020-10-20", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10858.0662824418, - "Vacc_completed": 1688.7179113019, - "Vacc_refreshed": 82.7641475111, - "Vacc_refreshed_2": 41.38207375555 - }, - { - "Date": "2020-10-21", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10867.8357803799, - "Vacc_completed": 1688.741478882, - "Vacc_refreshed": 92.1411476813, - "Vacc_refreshed_2": 46.07057384065 - }, - { - "Date": "2020-10-22", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10877.245759177, - "Vacc_completed": 1696.3354153291, - "Vacc_refreshed": 93.5350586202, - "Vacc_refreshed_2": 46.7675293101 - }, - { - "Date": "2020-10-23", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10878.9277486403, - "Vacc_completed": 1704.5169058825, - "Vacc_refreshed": 99.9257252117, - "Vacc_refreshed_2": 49.96286260585 - }, - { - "Date": "2020-10-24", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10881.5163902637, - "Vacc_completed": 1704.5184844203, - "Vacc_refreshed": 104.0563799981, - "Vacc_refreshed_2": 52.02818999905 - }, - { - "Date": "2020-10-25", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10882.0628121233, - "Vacc_completed": 1710.1811092467, - "Vacc_refreshed": 110.998904559, - "Vacc_refreshed_2": 55.4994522795 - }, - { - "Date": "2020-10-26", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10884.1868939764, - "Vacc_completed": 1711.6669667815, - "Vacc_refreshed": 119.5835613879, - "Vacc_refreshed_2": 59.79178069395 - }, - { - "Date": "2020-10-27", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10890.26315895, - "Vacc_completed": 1712.8219244738, - "Vacc_refreshed": 126.203975023, - "Vacc_refreshed_2": 63.1019875115 - }, - { - "Date": "2020-10-28", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10894.6858788747, - "Vacc_completed": 1721.7467435031, - "Vacc_refreshed": 135.9649739788, - "Vacc_refreshed_2": 67.9824869894 - }, - { - "Date": "2020-10-29", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10897.5575288795, - "Vacc_completed": 1721.7787127468, - "Vacc_refreshed": 145.614673399, - "Vacc_refreshed_2": 72.8073366995 - }, - { - "Date": "2020-10-30", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10903.1231721286, - "Vacc_completed": 1724.7269587992, - "Vacc_refreshed": 149.6717929743, - "Vacc_refreshed_2": 74.83589648715 - }, - { - "Date": "2020-10-31", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10911.1763853993, - "Vacc_completed": 1726.3071857535, - "Vacc_refreshed": 158.0496522084, - "Vacc_refreshed_2": 79.0248261042 - }, - { - "Date": "2020-11-01", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10919.5582023277, - "Vacc_completed": 1727.9236223535, - "Vacc_refreshed": 160.5751263702, - "Vacc_refreshed_2": 80.2875631851 - }, - { - "Date": "2020-11-02", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10920.4962369047, - "Vacc_completed": 1730.7211296321, - "Vacc_refreshed": 162.2038531114, - "Vacc_refreshed_2": 81.1019265557 - }, - { - "Date": "2020-11-03", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10930.0062994591, - "Vacc_completed": 1733.2273616859, - "Vacc_refreshed": 164.6178844659, - "Vacc_refreshed_2": 82.30894223295 - }, - { - "Date": "2020-11-04", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10931.0781786076, - "Vacc_completed": 1743.0639116966, - "Vacc_refreshed": 171.6949336111, - "Vacc_refreshed_2": 85.84746680555 - }, - { - "Date": "2020-11-05", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10936.2371584575, - "Vacc_completed": 1743.4973637943, - "Vacc_refreshed": 173.1954991423, - "Vacc_refreshed_2": 86.59774957115 - }, - { - "Date": "2020-11-06", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10937.1969149599, - "Vacc_completed": 1752.0043206175, - "Vacc_refreshed": 173.4521249531, - "Vacc_refreshed_2": 86.72606247655 - }, - { - "Date": "2020-11-07", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10942.5829785849, - "Vacc_completed": 1758.5438162851, - "Vacc_refreshed": 175.0971428389, - "Vacc_refreshed_2": 87.54857141945 - }, - { - "Date": "2020-11-08", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10945.8458051779, - "Vacc_completed": 1765.593119461, - "Vacc_refreshed": 184.781293552, - "Vacc_refreshed_2": 92.390646776 - }, - { - "Date": "2020-11-09", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10955.2619609788, - "Vacc_completed": 1766.7516696253, - "Vacc_refreshed": 194.3279051811, - "Vacc_refreshed_2": 97.16395259055 - }, - { - "Date": "2020-11-10", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10963.0529992794, - "Vacc_completed": 1774.4096958807, - "Vacc_refreshed": 199.3585168564, - "Vacc_refreshed_2": 99.6792584282 - }, - { - "Date": "2020-11-11", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10963.0740456643, - "Vacc_completed": 1776.7353479155, - "Vacc_refreshed": 200.2783085421, - "Vacc_refreshed_2": 100.13915427105 - }, - { - "Date": "2020-11-12", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10972.7647446192, - "Vacc_completed": 1786.1838226639, - "Vacc_refreshed": 202.522841172, - "Vacc_refreshed_2": 101.261420586 - }, - { - "Date": "2020-11-13", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10972.7950553291, - "Vacc_completed": 1788.5013884886, - "Vacc_refreshed": 205.1107008609, - "Vacc_refreshed_2": 102.55535043045 - }, - { - "Date": "2020-11-14", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10973.1049316279, - "Vacc_completed": 1790.2712267193, - "Vacc_refreshed": 214.0688577867, - "Vacc_refreshed_2": 107.03442889335 - }, - { - "Date": "2020-11-15", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10976.2696576646, - "Vacc_completed": 1797.8582422894, - "Vacc_refreshed": 219.0460187772, - "Vacc_refreshed_2": 109.5230093886 - }, - { - "Date": "2020-11-16", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10984.9161656634, - "Vacc_completed": 1801.5924446935, - "Vacc_refreshed": 227.656626047, - "Vacc_refreshed_2": 113.8283130235 - }, - { - "Date": "2020-11-17", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10994.063273181, - "Vacc_completed": 1802.6817444812, - "Vacc_refreshed": 235.6032823069, - "Vacc_refreshed_2": 117.80164115345 - }, - { - "Date": "2020-11-18", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 10996.8771305673, - "Vacc_completed": 1802.9071097171, - "Vacc_refreshed": 237.7242073629, - "Vacc_refreshed_2": 118.86210368145 - }, - { - "Date": "2020-11-19", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 11002.0527900673, - "Vacc_completed": 1809.5395950318, - "Vacc_refreshed": 241.3631599251, - "Vacc_refreshed_2": 120.68157996255 - }, - { - "Date": "2020-11-20", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 11007.1528572096, - "Vacc_completed": 1813.9025489723, - "Vacc_refreshed": 245.5305344153, - "Vacc_refreshed_2": 122.76526720765 - }, - { - "Date": "2020-11-21", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 11013.1337350258, - "Vacc_completed": 1821.5275057931, - "Vacc_refreshed": 250.3168579858, - "Vacc_refreshed_2": 125.1584289929 - }, - { - "Date": "2020-11-22", - "ID_County": 1002, - "Age_RKI": "5-14", - "Vacc_partially": 11015.6696905796, - "Vacc_completed": 1822.9598630397, - "Vacc_refreshed": 255.6335351411, - "Vacc_refreshed_2": 127.81676757055 - }, { "Date": "2020-11-23", "ID_County": 1002, diff --git a/cpp/tests/data/vaccination_data.json b/cpp/tests/data/vaccination_data.json index 0716826088..e8c47d14fb 100644 --- a/cpp/tests/data/vaccination_data.json +++ b/cpp/tests/data/vaccination_data.json @@ -1,481 +1,4 @@ [ - { - "Date": "2020-10-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14093.5670993244, - "Vacc_completed": 1058.2133302677, - "Vacc_refreshed": 0, - "Vacc_refreshed_2": 0.0 - }, - { - "Date": "2020-10-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14094.6780758432, - "Vacc_completed": 1058.2386490178, - "Vacc_refreshed": 3.9480185817, - "Vacc_refreshed_2": 1.97400929085 - }, - { - "Date": "2020-10-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14102.3458622773, - "Vacc_completed": 1063.1811826304, - "Vacc_refreshed": 7.8235846725, - "Vacc_refreshed_2": 3.91179233625 - }, - { - "Date": "2020-10-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14106.0158477852, - "Vacc_completed": 1071.0829580916, - "Vacc_refreshed": 13.0365435255, - "Vacc_refreshed_2": 6.51827176275 - }, - { - "Date": "2020-10-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14115.8958402416, - "Vacc_completed": 1072.5136218055, - "Vacc_refreshed": 15.4582843201, - "Vacc_refreshed_2": 7.72914216005 - }, - { - "Date": "2020-10-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14116.0603009948, - "Vacc_completed": 1080.8706574256, - "Vacc_refreshed": 22.3037298829, - "Vacc_refreshed_2": 11.15186494145 - }, - { - "Date": "2020-10-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14124.4849162097, - "Vacc_completed": 1087.4957123195, - "Vacc_refreshed": 27.7666004775, - "Vacc_refreshed_2": 13.88330023875 - }, - { - "Date": "2020-10-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14132.812800891, - "Vacc_completed": 1094.2936630058, - "Vacc_refreshed": 29.4212640594, - "Vacc_refreshed_2": 14.7106320297 - }, - { - "Date": "2020-10-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14139.2772895404, - "Vacc_completed": 1100.1665827188, - "Vacc_refreshed": 29.4568827793, - "Vacc_refreshed_2": 14.72844138965 - }, - { - "Date": "2020-10-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14145.4868397119, - "Vacc_completed": 1105.3345419667, - "Vacc_refreshed": 34.7217238502, - "Vacc_refreshed_2": 17.3608619251 - }, - { - "Date": "2020-10-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14147.7480966959, - "Vacc_completed": 1111.2289166538, - "Vacc_refreshed": 34.771310214, - "Vacc_refreshed_2": 17.385655107 - }, - { - "Date": "2020-10-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14154.5204084505, - "Vacc_completed": 1114.7870563855, - "Vacc_refreshed": 41.8898823514, - "Vacc_refreshed_2": 20.9449411757 - }, - { - "Date": "2020-10-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14155.4472543415, - "Vacc_completed": 1124.6385432496, - "Vacc_refreshed": 48.6348857735, - "Vacc_refreshed_2": 24.31744288675 - }, - { - "Date": "2020-10-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14162.2764203336, - "Vacc_completed": 1128.54825128, - "Vacc_refreshed": 48.7694054724, - "Vacc_refreshed_2": 24.3847027362 - }, - { - "Date": "2020-10-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14163.6229511244, - "Vacc_completed": 1128.7143765883, - "Vacc_refreshed": 53.2059941772, - "Vacc_refreshed_2": 26.6029970886 - }, - { - "Date": "2020-10-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14170.704731349, - "Vacc_completed": 1138.0466956792, - "Vacc_refreshed": 59.0394633797, - "Vacc_refreshed_2": 29.51973168985 - }, - { - "Date": "2020-10-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14177.9754226866, - "Vacc_completed": 1144.8391611423, - "Vacc_refreshed": 68.7607294969, - "Vacc_refreshed_2": 34.38036474845 - }, - { - "Date": "2020-10-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14180.6917277285, - "Vacc_completed": 1145.8477444825, - "Vacc_refreshed": 68.9221667424, - "Vacc_refreshed_2": 34.4610833712 - }, - { - "Date": "2020-10-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14183.6510488722, - "Vacc_completed": 1148.5261706572, - "Vacc_refreshed": 74.1781085786, - "Vacc_refreshed_2": 37.0890542893 - }, - { - "Date": "2020-10-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14187.685478561, - "Vacc_completed": 1156.317724845, - "Vacc_refreshed": 82.4605426733, - "Vacc_refreshed_2": 41.23027133665 - }, - { - "Date": "2020-10-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14190.8756861073, - "Vacc_completed": 1158.3230049846, - "Vacc_refreshed": 85.9686058349, - "Vacc_refreshed_2": 42.98430291745 - }, - { - "Date": "2020-10-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14194.7125443701, - "Vacc_completed": 1162.8869701267, - "Vacc_refreshed": 86.9745448839, - "Vacc_refreshed_2": 43.48727244195 - }, - { - "Date": "2020-10-23", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14198.1736788429, - "Vacc_completed": 1172.5122981568, - "Vacc_refreshed": 87.3520867387, - "Vacc_refreshed_2": 43.67604336935 - }, - { - "Date": "2020-10-24", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14200.0337444888, - "Vacc_completed": 1173.9022323601, - "Vacc_refreshed": 96.1323881978, - "Vacc_refreshed_2": 48.0661940989 - }, - { - "Date": "2020-10-25", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14209.9091251899, - "Vacc_completed": 1180.4819879148, - "Vacc_refreshed": 102.8081520102, - "Vacc_refreshed_2": 51.4040760051 - }, - { - "Date": "2020-10-26", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14215.7510791988, - "Vacc_completed": 1187.6749019896, - "Vacc_refreshed": 111.0676626302, - "Vacc_refreshed_2": 55.5338313151 - }, - { - "Date": "2020-10-27", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14216.891975169, - "Vacc_completed": 1194.8246181318, - "Vacc_refreshed": 112.2172983632, - "Vacc_refreshed_2": 56.1086491816 - }, - { - "Date": "2020-10-28", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14226.1128719795, - "Vacc_completed": 1199.3288757923, - "Vacc_refreshed": 115.0035825103, - "Vacc_refreshed_2": 57.50179125515 - }, - { - "Date": "2020-10-29", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14234.2678640476, - "Vacc_completed": 1200.3667784603, - "Vacc_refreshed": 122.2552339507, - "Vacc_refreshed_2": 61.12761697535 - }, - { - "Date": "2020-10-30", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14236.1003192184, - "Vacc_completed": 1204.1967603181, - "Vacc_refreshed": 127.0429292216, - "Vacc_refreshed_2": 63.5214646108 - }, - { - "Date": "2020-10-31", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14242.538633822, - "Vacc_completed": 1212.5454877324, - "Vacc_refreshed": 134.6939665016, - "Vacc_refreshed_2": 67.3469832508 - }, - { - "Date": "2020-11-01", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14244.3387278104, - "Vacc_completed": 1213.6034702862, - "Vacc_refreshed": 136.0920891424, - "Vacc_refreshed_2": 68.0460445712 - }, - { - "Date": "2020-11-02", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14251.4120506037, - "Vacc_completed": 1216.4725302456, - "Vacc_refreshed": 140.2813449601, - "Vacc_refreshed_2": 70.14067248005 - }, - { - "Date": "2020-11-03", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14260.7111088561, - "Vacc_completed": 1223.9349650326, - "Vacc_refreshed": 144.4607939662, - "Vacc_refreshed_2": 72.2303969831 - }, - { - "Date": "2020-11-04", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.4310619138, - "Vacc_completed": 1230.2964929538, - "Vacc_refreshed": 149.281965675, - "Vacc_refreshed_2": 74.6409828375 - }, - { - "Date": "2020-11-05", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14264.8430243455, - "Vacc_completed": 1233.791799902, - "Vacc_refreshed": 152.843700775, - "Vacc_refreshed_2": 76.4218503875 - }, - { - "Date": "2020-11-06", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14270.6723528208, - "Vacc_completed": 1235.7852283109, - "Vacc_refreshed": 158.6087157945, - "Vacc_refreshed_2": 79.30435789725 - }, - { - "Date": "2020-11-07", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14276.398217781, - "Vacc_completed": 1244.1189399585, - "Vacc_refreshed": 161.780101215, - "Vacc_refreshed_2": 80.8900506075 - }, - { - "Date": "2020-11-08", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14282.7632141243, - "Vacc_completed": 1252.4246776385, - "Vacc_refreshed": 164.4087953839, - "Vacc_refreshed_2": 82.20439769195 - }, - { - "Date": "2020-11-09", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14285.2172118541, - "Vacc_completed": 1253.0967186007, - "Vacc_refreshed": 165.7333648079, - "Vacc_refreshed_2": 82.86668240395 - }, - { - "Date": "2020-11-10", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14288.3981413127, - "Vacc_completed": 1261.2285273698, - "Vacc_refreshed": 175.6751183454, - "Vacc_refreshed_2": 87.8375591727 - }, - { - "Date": "2020-11-11", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14296.6990830234, - "Vacc_completed": 1261.8928424603, - "Vacc_refreshed": 181.3746988194, - "Vacc_refreshed_2": 90.6873494097 - }, - { - "Date": "2020-11-12", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14304.9324135674, - "Vacc_completed": 1268.1858225933, - "Vacc_refreshed": 182.8207287588, - "Vacc_refreshed_2": 91.4103643794 - }, - { - "Date": "2020-11-13", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14312.7990335985, - "Vacc_completed": 1270.8693167453, - "Vacc_refreshed": 192.6352794711, - "Vacc_refreshed_2": 96.31763973555 - }, - { - "Date": "2020-11-14", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14316.0317804647, - "Vacc_completed": 1276.8328604136, - "Vacc_refreshed": 199.109084232, - "Vacc_refreshed_2": 99.554542116 - }, - { - "Date": "2020-11-15", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14317.8224126817, - "Vacc_completed": 1285.9345839202, - "Vacc_refreshed": 204.9564534429, - "Vacc_refreshed_2": 102.47822672145 - }, - { - "Date": "2020-11-16", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14319.969225103, - "Vacc_completed": 1292.0814432843, - "Vacc_refreshed": 209.3116185701, - "Vacc_refreshed_2": 104.65580928505 - }, - { - "Date": "2020-11-17", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14325.5010146205, - "Vacc_completed": 1296.8562638588, - "Vacc_refreshed": 214.164106287, - "Vacc_refreshed_2": 107.0820531435 - }, - { - "Date": "2020-11-18", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14334.64723979, - "Vacc_completed": 1299.2846390455, - "Vacc_refreshed": 215.8187786169, - "Vacc_refreshed_2": 107.90938930845 - }, - { - "Date": "2020-11-19", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14341.3416549169, - "Vacc_completed": 1307.3997120401, - "Vacc_refreshed": 220.1718442512, - "Vacc_refreshed_2": 110.0859221256 - }, - { - "Date": "2020-11-20", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14349.3146443239, - "Vacc_completed": 1309.8026404332, - "Vacc_refreshed": 222.9315364644, - "Vacc_refreshed_2": 111.4657682322 - }, - { - "Date": "2020-11-21", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14359.2839765392, - "Vacc_completed": 1313.6592234511, - "Vacc_refreshed": 226.6469703335, - "Vacc_refreshed_2": 113.32348516675 - }, - { - "Date": "2020-11-22", - "ID_County": 1002, - "Age_RKI": "0-4", - "Vacc_partially": 14365.2176903694, - "Vacc_completed": 1319.2137305156, - "Vacc_refreshed": 227.7079880211, - "Vacc_refreshed_2": 113.85399401055 - }, { "Date": "2020-11-23", "ID_County": 1002, From 4c3ee0945afa00bcbc82115b93de197c12b80c6f Mon Sep 17 00:00:00 2001 From: HenrZu Date: Mon, 18 Mar 2024 08:48:26 +0100 Subject: [PATCH 18/60] example, some namings --- cpp/examples/CMakeLists.txt | 3 + cpp/examples/ode_secirts.cpp | 150 ++++++++++++++++++++ cpp/models/ode_secirvvs/README.md | 6 +- cpp/models/ode_secirvvs/infection_state.h | 2 +- cpp/models/ode_secirvvs/model.h | 6 +- cpp/models/ode_secirvvs/parameter_space.cpp | 2 +- cpp/models/ode_secirvvs/parameters.h | 115 ++++++++++----- cpp/models/ode_secirvvs/parameters_io.cpp | 2 +- cpp/models/ode_secirvvs/parameters_io.h | 5 +- cpp/tests/test_odesecirvvs.cpp | 38 ++++- 10 files changed, 282 insertions(+), 47 deletions(-) create mode 100644 cpp/examples/ode_secirts.cpp diff --git a/cpp/examples/CMakeLists.txt b/cpp/examples/CMakeLists.txt index 3ae1035a44..8bfd8eb0ae 100644 --- a/cpp/examples/CMakeLists.txt +++ b/cpp/examples/CMakeLists.txt @@ -31,6 +31,9 @@ target_compile_options(ode_secir_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARN # add_executable(ode_secirvvs_example ode_secirvvs.cpp) # target_link_libraries(ode_secirvvs_example PRIVATE memilio ode_secirvvs) # target_compile_options(ode_secirvvs_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) +add_executable(ode_secirts_example ode_secirts.cpp) +target_link_libraries(ode_secirts_example PRIVATE memilio ode_secirvvs) +target_compile_options(ode_secirts_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) add_executable(ode_secir_ageres_example ode_secir_ageres.cpp) target_link_libraries(ode_secir_ageres_example PRIVATE memilio ode_secir) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp new file mode 100644 index 0000000000..01d5d757a1 --- /dev/null +++ b/cpp/examples/ode_secirts.cpp @@ -0,0 +1,150 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "ode_secirvvs/analyze_result.h" +#include "ode_secirvvs/model.h" +#include "ode_secirvvs/parameters.h" +#include "memilio/compartments/simulation.h" +#include "memilio/utils/logging.h" + +int main() +{ + mio::set_log_level(mio::LogLevel::debug); + + double t0 = 0; + double tmax = 100; + double dt = 0.1; + + mio::log_info("Simulating SECIRVVS; t={} ... {} with dt = {}.", t0, tmax, dt); + + mio::osecirvvs::Model model(3); + auto nb_groups = model.parameters.get_num_groups(); + + for (mio::AgeGroup i = 0; i < nb_groups; i++) { + // population + model.populations[{i, mio::osecirvvs::InfectionState::ExposedNaive}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::ExposedImprovedImmunity}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::ExposedPartialImmunity}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsNaive}] = 40; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}] = 40; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}] = 40; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSevereNaive}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSevereImprovedImmunity}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedSeverePartialImmunity}] = 30; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalNaive}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalPartialImmunity}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalImprovedImmunity}] = 20; + model.populations[{i, mio::osecirvvs::InfectionState::SusceptibleNaive}] = 1000; + model.populations[{i, mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 1200; + model.populations[{i, mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 1000; + model.populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity}] = 60; + model.populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity}] = 70; + model.populations[{i, mio::osecirvvs::InfectionState::DeadNaive}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::DeadPartialImmunity}] = 0; + model.populations[{i, mio::osecirvvs::InfectionState::DeadImprovedImmunity}] = 0; + + // parameters + //times + model.parameters.get()[i] = 5.2; + model.parameters.get()[i] = 4.265; + model.parameters.get()[i] = 7; + model.parameters.get()[i] = 6; + model.parameters.get()[i] = 7; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 180; + model.parameters.get()[i] = 180; + + //probabilities + model.parameters.get()[i] = 0.15; + model.parameters.get()[i] = 0.5; + model.parameters.get()[i] = 0.0; + model.parameters.get()[i] = 0.4; + model.parameters.get()[i] = 0.2; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.1; + + model.parameters.get()[i] = 0.8; + model.parameters.get()[i] = 0.331; + model.parameters.get()[i] = 0.65; + model.parameters.get()[i] = 0.243; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.091; + model.parameters.get()[i] = 0.9; + } + + model.parameters.get() = 100; + model.parameters.get() = 0.0143; + const size_t daily_vaccinations = 10; + const size_t num_days = 300; + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); + for (size_t i = 0; i < num_days; ++i) { + auto num_vaccinations = static_cast(i * daily_vaccinations); + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + } + + mio::ContactMatrixGroup& contact_matrix = model.parameters.get(); + const double cont_freq = 10; + const double fact = 1.0 / (double)(size_t)nb_groups; + contact_matrix[0] = + mio::ContactMatrix(Eigen::MatrixXd::Constant((size_t)nb_groups, (size_t)nb_groups, fact * cont_freq)); + contact_matrix.add_damping(Eigen::MatrixXd::Constant((size_t)nb_groups, (size_t)nb_groups, 0.7), + mio::SimulationTime(30.)); + + model.parameters.get() = 0.2; + + model.apply_constraints(); + + mio::TimeSeries result = simulate(t0, tmax, dt, model); + + bool print_to_terminal = true; + + if (print_to_terminal) { + auto result_interpolated = mio::interpolate_simulation_result(result); + for (auto t_indx = 0; t_indx < result_interpolated.get_num_time_points(); t_indx++) { + double timm_pi = 0.0; + double timm_ii = 0.0; + for (mio::AgeGroup i = 0; i < nb_groups; i++) { + timm_pi += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( + {i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity})]; + timm_ii += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( + {i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity})]; + } + printf("t=%i, timm_pi=%f, timm_ii=%f\n", int(result_interpolated.get_time(t_indx)), timm_pi, timm_ii); + } + } +} diff --git a/cpp/models/ode_secirvvs/README.md b/cpp/models/ode_secirvvs/README.md index 2e891bd7c8..a19f7ba0db 100644 --- a/cpp/models/ode_secirvvs/README.md +++ b/cpp/models/ode_secirvvs/README.md @@ -2,7 +2,7 @@ This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. -In the model, waning immunity is defined by the parameters `WaningPartialImmunity`, `WaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `WaningPartialImmunity` and `WaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. +In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v1). @@ -26,8 +26,8 @@ Below is an overview of the model architecture and its compartments. | $T_{I_{Cr}}$ | `TimeInfectedCritical` | Time in days an individual stays in the InfectedCritical compartment. | | $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunPartialImmunity compartment. | | $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmunImprovedImmunity compartment. | -| $T_{W_{PI}}$ | `WaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | -| $T_{W_{II}}$ | `WaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | +| $T_{W_{PI}}$ | `TimeWaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | +| $T_{W_{II}}$ | `TimeWaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | | $\mu_{I_{NS}}^{I_{Sy}}$ | `1 - RecoveredPerInfectedNoSymptoms` | Probability of transition from compartment InfectedNoSymptoms to InfectedSymptoms. | | $\mu_{I_{Sy}}^{I_{Sev}}$ | `SeverePerInfectedSymptoms` | Probability of transition from compartment InfectedSymptoms to InfectedSevere. | | $\mu_{I_{Sev}}^{I_{Cr}}$ | `CriticalPerSevere` | Probability of transition from compartment InfectedSevere to InfectedCritical. | diff --git a/cpp/models/ode_secirvvs/infection_state.h b/cpp/models/ode_secirvvs/infection_state.h index 3ac9eee0d7..93b171ff79 100644 --- a/cpp/models/ode_secirvvs/infection_state.h +++ b/cpp/models/ode_secirvvs/infection_state.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index ef6d8d8692..d2519cb767 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -1,7 +1,7 @@ /* * * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -550,10 +550,10 @@ class Model : public FlowModel( - {i})] = 1 / params.get()[i] * y[SPIi]; + {i})] = 1 / params.get()[i] * y[SPIi]; flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[SIIi]; + 1 / params.get()[i] * y[SIIi]; } } diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index dec5d0975e..e23e0458dd 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 67e56619ae..88b3779b70 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -261,6 +261,36 @@ struct TimeInfectedCritical { } }; +/** + * @brief Time in days to describe waning immunity to get person from S_PI -> S + */ +struct TimeWaningPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "TimeWaningPartialImmunity"; + } +}; + +/** + * @brief Time in days to describe waning immunity to get person from SII -> SPI + */ +struct TimeWaningImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "TimeWaningImprovedImmunity"; + } +}; + /** * @brief probability of getting infected from a contact */ @@ -441,36 +471,6 @@ struct DaysUntilEffectiveBoosterImmunity { } }; -/** - * @brief Time in days to describe waning immunity to get person from S_PI -> S - */ -struct WaningPartialImmunity { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 90.0); - } - static std::string name() - { - return "WaningPartialImmunity"; - } -}; - -/** - * @brief Time in days to describe waning immunity to get person from SII -> SPI - */ -struct WaningImprovedImmunity { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 90.0); - } - static std::string name() - { - return "WaningImprovedImmunity"; - } -}; - /** * @brief Total number of first vaccinations up to the given day. */ @@ -648,8 +648,8 @@ using ParametersBase = ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, StartDayNewVariant, - InfectiousnessNewVariant, WaningPartialImmunity, WaningImprovedImmunity, TimeTemporaryImmunityPI, - TimeTemporaryImmunityII>; + InfectiousnessNewVariant, TimeWaningPartialImmunity, TimeWaningImprovedImmunity, + TimeTemporaryImmunityPI, TimeTemporaryImmunityII>; /** * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over @@ -806,6 +806,7 @@ class Parameters : public ParametersBase this->get()[i] = tol_times; corrected = true; } + if (this->get()[i] < tol_times) { log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " @@ -815,6 +816,24 @@ class Parameters : public ParametersBase corrected = true; } + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeWaningPartialImmunity changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeWaningImprovedImmunity changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_warning("Constraint check: Parameter TransmissionProbabilityOnContact changed from {} to {} ", @@ -873,6 +892,7 @@ class Parameters : public ParametersBase this->get()[i] = 0; corrected = true; } + if (this->get()[i] < 0.0) { log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity changed from {} to {}", this->get()[i], 0); @@ -880,6 +900,13 @@ class Parameters : public ParametersBase corrected = true; } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DaysUntilEffectiveBoosterImmunity changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { log_warning("Constraint check: Parameter ReducExposedPartialImmunity changed from {} to {}", @@ -1023,6 +1050,22 @@ class Parameters : public ParametersBase return true; } + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeWaningPartialImmunity {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeWaningImprovedImmunity {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_error("Constraint check: Parameter TransmissionProbabilityOnContact smaller {} or larger {}", 0, 1); @@ -1070,11 +1113,17 @@ class Parameters : public ParametersBase log_error("Constraint check: Parameter DaysUntilEffectivePartialImmunity smaller {}", 0); return true; } + if (this->get()[i] < 0.0) { log_error("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity smaller {}", 0); return true; } + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity smaller {}", 0); + return true; + } + if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { log_error("Constraint check: Parameter ReducExposedPartialImmunity smaller {} or larger {}", 0, 1); diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index c768d40854..80867bad95 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index c714cba76e..8f435edb12 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -79,7 +79,8 @@ IOResult read_confirmed_cases_data( const std::vector& scaling_factor_inf); /**@}*/ -IOResult>> read_immunity_population(const std::string& path, const size_t& num_age_groups); +IOResult>> read_immunity_population(const std::string& path, + const size_t& num_age_groups); /**@}*/ /** diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index f8511676d9..72fcc6a227 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -975,7 +975,23 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) model.parameters.set(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); + model.parameters.set(10.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(90.); + model.parameters.set(-20.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(90.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(100.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(200); model.parameters.set(2.0); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1011,11 +1027,15 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) model.parameters.set(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(30); + model.parameters.set(7); model.parameters.set(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(30); + model.parameters.set(7); + model.parameters.set(-2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(7); model.parameters.set(0); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1099,6 +1119,14 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + model.parameters.set(2.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_NEAR(model.parameters.get()[indx_agegroup], 0.0, 1e-14); @@ -1139,6 +1167,10 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + model.parameters.set(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); From aeb5e4aa211ac1945bdc1a1fe9c100d655423d55 Mon Sep 17 00:00:00 2001 From: HenrZu Date: Mon, 18 Mar 2024 11:12:22 +0100 Subject: [PATCH 19/60] fixes from merge --- cpp/examples/ode_secirts.cpp | 4 ++-- cpp/models/ode_secirvvs/parameters.h | 31 +++++++++++++++++++++++++ cpp/models/ode_secirvvs/parameters_io.h | 18 +++++++------- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 01d5d757a1..786c724b46 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -70,8 +70,8 @@ int main() // parameters //times - model.parameters.get()[i] = 5.2; - model.parameters.get()[i] = 4.265; + model.parameters.get()[i] = 3.33; + model.parameters.get()[i] = 1.87; model.parameters.get()[i] = 7; model.parameters.get()[i] = 6; model.parameters.get()[i] = 7; diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 640f864e95..969b2ce8c8 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -259,6 +259,37 @@ struct TimeWaningImprovedImmunity { } }; +/** + * @brief the time people stays immune after infection or vaccination located in S + in the model in day unit + */ +struct TimeTemporaryImmunityPI { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityPI"; + } +}; + +/** + * @brief the time people stays immune after infection or vaccination located in S_PI or S_II + in the model in day unit + */ +struct TimeTemporaryImmunityII { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityII"; + } +}; /** * @brief probability of getting infected from a contact */ diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index 3ca42f97c1..7b84792018 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -620,11 +620,11 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - t_Exposed_uv[county].push_back( + t_Exposed_n[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_uv[county].push_back(static_cast( + t_InfectedNoSymptoms_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedSymptoms_uv[county].push_back(static_cast( + t_InfectedSymptoms_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); t_InfectedSevere_n[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); @@ -674,11 +674,11 @@ IOResult export_input_data_county_timeseries( for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_pv[county].push_back( + t_Exposed_pi[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_pv[county].push_back(static_cast(std::round( + t_InfectedNoSymptoms_pi[county].push_back(static_cast(std::round( model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_pv[county].push_back(static_cast( + t_InfectedSymptoms_pi[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); t_InfectedSevere_pi[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); @@ -741,11 +741,11 @@ IOResult export_input_data_county_timeseries( for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_fv[county].push_back( + t_Exposed_ii[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_fv[county].push_back(static_cast(std::round( + t_InfectedNoSymptoms_ii[county].push_back(static_cast(std::round( model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_fv[county].push_back(static_cast( + t_InfectedSymptoms_ii[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); t_InfectedSevere_ii[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); From bade95204b014f00d25ad7c636d694464cd96155 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 3 May 2024 16:50:08 +0200 Subject: [PATCH 20/60] vaccinations at t = 0 --- cpp/examples/ode_secirts.cpp | 2 +- cpp/models/ode_secirvvs/model.h | 105 ++++++++++++++++---------------- 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 786c724b46..51a803269f 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -31,7 +31,7 @@ int main() double tmax = 100; double dt = 0.1; - mio::log_info("Simulating SECIRVVS; t={} ... {} with dt = {}.", t0, tmax, dt); + mio::log_info("Simulating SECIRTS; t={} ... {} with dt = {}.", t0, tmax, dt); mio::osecirvvs::Model model(3); auto nb_groups = model.parameters.get_num_groups(); diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 8ff88aed6d..3d96c14b3b 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -265,53 +265,55 @@ class Model : public FlowModel SimulationDay(0)) { - auto t_m1 = SimulationDay((size_t)t - 1); - double first_vacc; - double full_vacc; - double booster_vacc; - - first_vacc = params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_m1}]; - full_vacc = params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_m1}]; - booster_vacc = params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{(AgeGroup)i, t_m1}]; - - double first_vaccinations = - (y[SNi] - flows[get_flat_flow_index( - {i})] < - first_vacc) - ? y[SNi] - - flows[get_flat_flow_index( - {i})] - : first_vacc; - - double second_vaccinations = - (y[SPIi] - flows[get_flat_flow_index({i})] < - full_vacc) - ? y[SPIi] - flows[get_flat_flow_index({i})] - : full_vacc; - flows[get_flat_flow_index({i})] = first_vaccinations; - - flows[get_flat_flow_index({i})] = second_vaccinations; - - double third_vaccinations = - (y[SIIi] - flows[get_flat_flow_index({i})] < - booster_vacc) - ? y[SIIi] - flows[get_flat_flow_index({i})] - : booster_vacc; + const auto t_idx = SimulationDay((size_t)t); + + // Calculates the number of vaccinations per layer for a specific day and age group. + // If the size of the `DailyPartialVaccination` array is smaller than the current day t then zero is returned. + // Otherwise, we differentiate between greater and equal SimulationDay(0) since the numbers are accumulated. + double first_vacc = + static_cast(params.get().size()) > (size_t)t + ? (t_idx > SimulationDay(0) ? params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{ + (AgeGroup)i, SimulationDay((size_t)t - 1)}] + : params.template get()[{(AgeGroup)i, t_idx}]) + : 0; + + double full_vacc = + static_cast(params.get().size()) > (size_t)t + ? (t_idx > SimulationDay(0) + ? params.template get()[{(AgeGroup)i, t_idx}] - + params + .template get()[{(AgeGroup)i, SimulationDay((size_t)t - 1)}] + : params.template get()[{(AgeGroup)i, t_idx}]) + : 0; + + double booster_vacc = + static_cast(params.get().size()) > (size_t)t + ? (t_idx > SimulationDay(0) ? params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{ + (AgeGroup)i, SimulationDay((size_t)t - 1)}] + : params.template get()[{(AgeGroup)i, t_idx}]) + : 0; + + flows[get_flat_flow_index( + {i})] = + std::min( + y[SNi] - + flows[get_flat_flow_index({i})], + first_vacc); + + flows[get_flat_flow_index({i})] = + std::min(y[SPIi] - flows[get_flat_flow_index({i})], + full_vacc); - flows[get_flat_flow_index({i})] = third_vaccinations; - } + flows[get_flat_flow_index({i})] = + std::min( + y[SNi] - + flows[get_flat_flow_index({i})], + booster_vacc); // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere @@ -379,7 +381,9 @@ class Model : public FlowModel({i})] = (1 - params.get()[i]) / params.get()[i] * y[ICrNi]; - // TemporaryImmunPartialImmunity + // Waning immunity + flows[get_flat_flow_index( + {i})] = 1 / params.get()[i] * y[SPIi]; flows[get_flat_flow_index({i})] = 1 / params.get()[i] * y[TImm1]; @@ -550,14 +554,11 @@ class Model : public FlowModel()[i]) / params.get()[i] * y[ICrIIi]; - // TemporaryImmunImprovedImmunity + // Waning immunity flows[get_flat_flow_index({i})] = 1 / params.get()[i] * y[TImm2]; - // waning - flows[get_flat_flow_index( - {i})] = 1 / params.get()[i] * y[SPIi]; flows[get_flat_flow_index({i})] = 1 / params.get()[i] * y[SIIi]; @@ -593,7 +594,7 @@ class Model : public FlowModel> From 02db84eb86b56b699552f6535497be2e849d7965 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 3 May 2024 16:54:20 +0200 Subject: [PATCH 21/60] typo booster vacc --- cpp/models/ode_secirvvs/model.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 3d96c14b3b..0dcb02f7f0 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -310,10 +310,9 @@ class Model : public FlowModel({i})] = - std::min( - y[SNi] - - flows[get_flat_flow_index({i})], - booster_vacc); + std::min(y[SIIi] - flows[get_flat_flow_index({i})], + booster_vacc); // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere From a7d95a290da96fc6f15b248db873b59401160fe1 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 6 May 2024 16:00:17 +0200 Subject: [PATCH 22/60] naming + parameter space static var --- cpp/models/ode_secirvvs/analyze_result.h | 4 +- cpp/models/ode_secirvvs/parameter_space.cpp | 18 ++-- cpp/models/ode_secirvvs/parameters.h | 40 ++++----- cpp/models/ode_secirvvs/parameters_io.cpp | 12 +-- cpp/tests/test_epi_data_io.cpp | 4 +- cpp/tests/test_odesecirvvs.cpp | 92 +++++++++++++++++---- 6 files changed, 116 insertions(+), 54 deletions(-) diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index dccf908475..0f7a2dfe9f 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -149,11 +149,11 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get()[i]; }); for (auto day = SimulationDay(0); day < num_days; ++day) { diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index e21976a526..b2992256bc 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -37,7 +37,7 @@ void draw_sample_demographics(Model& model) model.parameters.get().draw_sample(); model.parameters.get().draw_sample(); - std::vector naive_states = { + const static std::vector naive_immunity_states = { InfectionState::SusceptibleNaive, InfectionState::ExposedNaive, InfectionState::InfectedNoSymptomsNaive, @@ -49,7 +49,7 @@ void draw_sample_demographics(Model& model) InfectionState::DeadNaive, }; - std::vector partial_states = { + const static std::vector partial_immunity_states = { InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, @@ -57,7 +57,7 @@ void draw_sample_demographics(Model& model) InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, }; - std::vector improved_states = { + const static std::vector improved_immunity_states = { InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, @@ -85,9 +85,9 @@ void draw_sample_demographics(Model& model) for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { - double group_naive_total = calculate_layer_total(naive_states, i); - double group_partial_total = calculate_layer_total(partial_states, i); - double group_improved_total = calculate_layer_total(improved_states, i); + const double group_naive_total = calculate_layer_total(naive_immunity_states, i); + const double group_partial_total = calculate_layer_total(partial_immunity_states, i); + const double group_improved_total = calculate_layer_total(improved_immunity_states, i); //sample initial compartments (with exceptions) for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { @@ -97,9 +97,9 @@ void draw_sample_demographics(Model& model) model.populations[{i, inf_state}].draw_sample(); } } - double diff_naive = group_naive_total - calculate_layer_total(naive_states, i); - double diff_partial = group_partial_total - calculate_layer_total(partial_states, i); - double diff_improved = group_improved_total - calculate_layer_total(improved_states, i); + const double diff_naive = group_naive_total - calculate_layer_total(naive_immunity_states, i); + const double diff_partial = group_partial_total - calculate_layer_total(partial_immunity_states, i); + const double diff_improved = group_improved_total - calculate_layer_total(improved_immunity_states, i); adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 969b2ce8c8..de247d0bdf 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -428,7 +428,7 @@ struct VaccinationGap { /** * @brief Time in days until first vaccine dose takes full effect. */ -struct DaysUntilEffectivePartialImmunity { +struct DaysUntilEffectivePartialVaccination { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -436,14 +436,14 @@ struct DaysUntilEffectivePartialImmunity { } static std::string name() { - return "DaysUntilEffectivePartialImmunity"; + return "DaysUntilEffectivePartialVaccination"; } }; /** * @brief Time in days until second vaccine dose takes full effect. */ -struct DaysUntilEffectiveImprovedImmunity { +struct DaysUntilEffectiveImprovedVaccination { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -451,7 +451,7 @@ struct DaysUntilEffectiveImprovedImmunity { } static std::string name() { - return "DaysUntilEffectiveImprovedImmunity"; + return "DaysUntilEffectiveImprovedVaccination"; } }; @@ -641,8 +641,8 @@ using ParametersBase = TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, TimeInfectedSevere, TimeInfectedCritical, TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, - CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, - DaysUntilEffectiveImprovedImmunity, DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, + CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialVaccination, + DaysUntilEffectiveImprovedVaccination, DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, DailyBoosterVaccination, DailyPartialVaccination, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, @@ -883,18 +883,18 @@ class Parameters : public ParametersBase corrected = true; } - if (this->get()[i] < 0.0) { + if (this->get()[i] < 0.0) { log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0) { - log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; } if (this->get()[i] < 0.0) { @@ -1105,18 +1105,18 @@ class Parameters : public ParametersBase return true; } - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectivePartialImmunity smaller {}", 0); + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectivePartialVaccination smaller {}", 0); return true; } - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity smaller {}", 0); + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); return true; } if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity smaller {}", 0); + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); return true; } diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index 80867bad95..21ecaf4653 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -345,9 +345,9 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto num_groups = model[0].parameters.get_num_groups(); auto days_until_effective_n = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; + (int)(double)model[0].parameters.get()[AgeGroup(0)]; auto days_until_effective_pi = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; + (int)(double)model[0].parameters.get()[AgeGroup(0)]; auto days_until_effective_ii = (int)(double)model[0].parameters.get()[AgeGroup(0)]; // iterate over regions (e.g., counties) @@ -395,12 +395,12 @@ IOResult set_vaccination_data(std::vector& model, const std::string date, static_cast( -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age])) && + model[region_idx].parameters.template get()[age])) && date_df <= offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get()[age]))) { + date, static_cast( + -model[region_idx] + .parameters.template get()[age]))) { model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += vacc_data_entry.num_vaccinations_completed; } diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index 069036437b..3d7299e2b3 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -334,8 +334,8 @@ TEST(TestEpiData, set_vaccination_data) std::vector county_ids = {1001}; mio::osecirvvs::Model model(num_age_groups); model.parameters.set(3); - model.parameters.set(1); - model.parameters.set(2); + model.parameters.set(1); + model.parameters.set(2); model.parameters.set(1); std::vector model_vector{model}; diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 1b6b51243d..af53db014f 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -73,20 +73,25 @@ TEST(TestOdeSECIRVVS, simulateDefault) TEST(TestOdeSECIRVVS, overflow_vaccinations) { + const double t0 = 0; + const double tmax = 1; + const double dt = 1; + // init simple model mio::osecirvvs::Model model(1); model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; + // model.parameters.get(0.0); + model.parameters.get()[mio::AgeGroup(0)] = 0.0; // set vaccination rates higher than total population for each layer const size_t daily_vaccinations = 100; - const size_t num_days = 100; - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); - for (size_t i = 0; i < num_days; ++i) { - auto num_vaccinations = static_cast(i * daily_vaccinations); + model.parameters.get().resize(mio::SimulationDay(tmax)); + model.parameters.get().resize(mio::SimulationDay(tmax)); + model.parameters.get().resize(mio::SimulationDay(tmax)); + for (size_t i = 0; i < tmax; ++i) { + auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = @@ -97,7 +102,7 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) // simulate one step with explicit Euler auto integrator = std::make_shared(); - auto result = simulate_flows(0., 2., 1., model, integrator); + auto result = simulate_flows(t0, tmax, dt, model, integrator); // get the flow indices for each type of vaccination and also the indices of the susceptible compartments auto flow_indx_partial_vaccination = @@ -124,6 +129,63 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) 1e-10); } +// TEST(TestOdeSECIRVVS, vaccination_rate) +// { +// const double t0 = 0; +// const double tmax = 1; +// const double dt = 1; + +// // init simple model +// mio::osecirvvs::Model model(1); +// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; +// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; +// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; + +// // set vaccination rates higher than total population for each layer +// const size_t daily_vaccinations = 100; +// const size_t num_days = 100; +// model.parameters.get().resize(mio::SimulationDay(num_days)); +// model.parameters.get().resize(mio::SimulationDay(num_days)); +// model.parameters.get().resize(mio::SimulationDay(num_days)); +// for (size_t i = 0; i < num_days; ++i) { +// auto num_vaccinations = static_cast(i * daily_vaccinations); +// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = +// num_vaccinations; +// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = +// num_vaccinations; +// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = +// num_vaccinations; +// } + +// // simulate one step with explicit Euler +// auto integrator = std::make_shared(); +// auto result = simulate_flows(t0, tmax, dt, model, integrator); + +// // get the flow indices for each type of vaccination and also the indices of the susceptible compartments +// auto flow_indx_partial_vaccination = +// model.get_flat_flow_index({mio::AgeGroup(0)}); +// auto flow_indx_full_vaccination = +// model.get_flat_flow_index({mio::AgeGroup(0)}); +// auto flow_indx_booster_vaccination = +// model.get_flat_flow_index({mio::AgeGroup(0)}); + +// auto indx_S_naive = +// model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}); +// auto indx_S_partial = model.populations.get_flat_index( +// {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}); +// auto indx_S_improved = model.populations.get_flat_index( +// {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}); + +// // check that the number of vaccinated people is never higher than the number of susceptible people +// EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(1)[indx_S_naive], 1e-10); +// EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(1)[indx_S_partial], 1e-10); +// EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(1)[indx_S_improved], +// 1e-10); +// } + void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) { auto invalid_initial = max == 0 ? 1.0 : max * 1.001; @@ -1020,14 +1082,14 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(2); - model.parameters.set(-2); + model.parameters.set(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); - model.parameters.set(-0.2); + model.parameters.set(7); + model.parameters.set(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); + model.parameters.set(7); model.parameters.set(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1151,13 +1213,13 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); - model.parameters.set(-2); + model.parameters.set(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); - model.parameters.set(-0.2); + model.parameters.set(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); model.parameters.set(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); From 6a1119db0c32643a5a559ebe10f28d72e0be34e7 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 7 May 2024 14:59:08 +0200 Subject: [PATCH 23/60] smooth vaccinations --- cpp/models/ode_secirvvs/model.h | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 0dcb02f7f0..f508b25131 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -135,6 +135,13 @@ class Model : public FlowModelpopulations.get_from(pop, {i, InfectionState::InfectedCriticalImprovedImmunity}); } + // get vaccinations with + // Eigen::VectorXd vaccinations_at(const CustomIndexArray& daily_vaccinations, + // const Scalartype t, const ScalarType eps = 0.15) const + auto const& partial_vaccination = vaccinations_at(this->parameters.get(), t); + + mio::unused(partial_vaccination); + for (auto i = AgeGroup(0); i < n_agegroups; i++) { size_t SNi = this->populations.get_flat_index({i, InfectionState::SusceptibleNaive}); @@ -564,6 +571,40 @@ class Model : public FlowModel& daily_vaccinations, + const ScalarType t, const ScalarType eps = 0.15) const + { + auto const& params = this->parameters; + const ScalarType ub = (size_t)t + 1.0; + const ScalarType lb = ub - eps; + + Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); + + if (t > ub) { + mio::log_warning("Vaccination time is out of bounds"); + } + // check if t is in the range of the interval [lb,ub] + if (t >= lb) { + // need a eigen vector of size params.get_num_groups() to store the number of vaccinations per age group + + // ToDo: Find a way to Iterate over all three vaccination types + for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { + const auto num_vaccinations = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - + daily_vaccinations[{age, SimulationDay((size_t)t)}]; + const auto num_vaccinations_eps = daily_vaccinations[{age, SimulationDay((size_t)t - eps + 1)}] - + daily_vaccinations[{age, SimulationDay((size_t)t - eps)}]; + smoothed_vaccinations[(size_t)age] = smoother_cosine(t, lb, ub, num_vaccinations_eps, num_vaccinations); + } + } + else { + for (auto age = AgeGroup(0); age < params.get_num_groups(); age++) { + smoothed_vaccinations[(size_t)age] = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - + daily_vaccinations[{age, SimulationDay((size_t)t)}]; + } + } + return smoothed_vaccinations; + } + /** * serialize this. * @see mio::serialize From d9fb61794d7769d22379956bc6b63ea93f3a0e73 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 10 May 2024 15:12:19 +0200 Subject: [PATCH 24/60] smoothing vaccinations + tests --- cpp/examples/ode_secirts.cpp | 15 ++-- cpp/models/ode_secirvvs/model.h | 67 ++++++----------- cpp/tests/test_odesecirvvs.cpp | 129 +++++++++++++++----------------- 3 files changed, 91 insertions(+), 120 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 51a803269f..6780dd1d50 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -108,13 +108,14 @@ int main() model.parameters.get().resize(mio::SimulationDay(num_days)); model.parameters.get().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { - auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; + for (mio::AgeGroup j = 0; j < nb_groups; ++j) { + auto num_vaccinations = static_cast(i * daily_vaccinations); + model.parameters.get()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; + model.parameters.get()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + } } mio::ContactMatrixGroup& contact_matrix = model.parameters.get(); diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index f508b25131..8300b9953a 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -135,12 +135,10 @@ class Model : public FlowModelpopulations.get_from(pop, {i, InfectionState::InfectedCriticalImprovedImmunity}); } - // get vaccinations with - // Eigen::VectorXd vaccinations_at(const CustomIndexArray& daily_vaccinations, - // const Scalartype t, const ScalarType eps = 0.15) const - auto const& partial_vaccination = vaccinations_at(this->parameters.get(), t); - - mio::unused(partial_vaccination); + // get vaccinations + auto const partial_vaccination = vaccinations_at(t, this->parameters.get()); + auto const full_vaccination = vaccinations_at(t, this->parameters.get()); + auto const booster_vaccination = vaccinations_at(t, this->parameters.get()); for (auto i = AgeGroup(0); i < n_agegroups; i++) { @@ -272,54 +270,24 @@ class Model : public FlowModel(params.get().size()) > (size_t)t - ? (t_idx > SimulationDay(0) ? params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{ - (AgeGroup)i, SimulationDay((size_t)t - 1)}] - : params.template get()[{(AgeGroup)i, t_idx}]) - : 0; - - double full_vacc = - static_cast(params.get().size()) > (size_t)t - ? (t_idx > SimulationDay(0) - ? params.template get()[{(AgeGroup)i, t_idx}] - - params - .template get()[{(AgeGroup)i, SimulationDay((size_t)t - 1)}] - : params.template get()[{(AgeGroup)i, t_idx}]) - : 0; - - double booster_vacc = - static_cast(params.get().size()) > (size_t)t - ? (t_idx > SimulationDay(0) ? params.template get()[{(AgeGroup)i, t_idx}] - - params.template get()[{ - (AgeGroup)i, SimulationDay((size_t)t - 1)}] - : params.template get()[{(AgeGroup)i, t_idx}]) - : 0; - flows[get_flat_flow_index( {i})] = std::min( y[SNi] - flows[get_flat_flow_index({i})], - first_vacc); + partial_vaccination[static_cast(i)]); flows[get_flat_flow_index({i})] = std::min(y[SPIi] - flows[get_flat_flow_index({i})], - full_vacc); + full_vaccination[static_cast(i)]); flows[get_flat_flow_index({i})] = std::min(y[SIIi] - flows[get_flat_flow_index({i})], - booster_vacc); + booster_vaccination[static_cast(i)]); // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere @@ -571,29 +539,36 @@ class Model : public FlowModel& daily_vaccinations, - const ScalarType t, const ScalarType eps = 0.15) const + Eigen::VectorXd vaccinations_at(const ScalarType t, + const CustomIndexArray& daily_vaccinations, + const ScalarType eps = 0.15) const { auto const& params = this->parameters; const ScalarType ub = (size_t)t + 1.0; const ScalarType lb = ub - eps; Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); + smoothed_vaccinations.setZero(); if (t > ub) { mio::log_warning("Vaccination time is out of bounds"); } + + if (static_cast(daily_vaccinations.size()) <= (size_t)t) { + return smoothed_vaccinations; + } // check if t is in the range of the interval [lb,ub] if (t >= lb) { // need a eigen vector of size params.get_num_groups() to store the number of vaccinations per age group // ToDo: Find a way to Iterate over all three vaccination types for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { - const auto num_vaccinations = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - - daily_vaccinations[{age, SimulationDay((size_t)t)}]; - const auto num_vaccinations_eps = daily_vaccinations[{age, SimulationDay((size_t)t - eps + 1)}] - - daily_vaccinations[{age, SimulationDay((size_t)t - eps)}]; - smoothed_vaccinations[(size_t)age] = smoother_cosine(t, lb, ub, num_vaccinations_eps, num_vaccinations); + const auto num_vaccinations_ub = + daily_vaccinations[{age, SimulationDay(ub + 1)}] - daily_vaccinations[{age, SimulationDay(ub)}]; + const auto num_vaccinations_lb = + daily_vaccinations[{age, SimulationDay(lb + 1)}] - daily_vaccinations[{age, SimulationDay(lb)}]; + smoothed_vaccinations[(size_t)age] = + smoother_cosine(t, lb, ub, num_vaccinations_lb, num_vaccinations_ub); } } else { diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index af53db014f..be6c9f5817 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -82,15 +82,14 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; - // model.parameters.get(0.0); - model.parameters.get()[mio::AgeGroup(0)] = 0.0; + model.parameters.get()[mio::AgeGroup(0)] = 0.0; // set vaccination rates higher than total population for each layer const size_t daily_vaccinations = 100; - model.parameters.get().resize(mio::SimulationDay(tmax)); - model.parameters.get().resize(mio::SimulationDay(tmax)); - model.parameters.get().resize(mio::SimulationDay(tmax)); - for (size_t i = 0; i < tmax; ++i) { + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + for (size_t i = 0; i <= tmax; ++i) { auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; @@ -114,7 +113,6 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) auto flow_indx_booster_vaccination = model.get_flat_flow_index({mio::AgeGroup(0)}); - auto indx_S_naive = model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}); auto indx_S_partial = model.populations.get_flat_index( @@ -122,69 +120,66 @@ TEST(TestOdeSECIRVVS, overflow_vaccinations) auto indx_S_improved = model.populations.get_flat_index( {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}); - // check that the number of vaccinated people is never higher than the number of susceptible people - EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(1)[indx_S_naive], 1e-10); - EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(1)[indx_S_partial], 1e-10); - EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(1)[indx_S_improved], + // check that the number of vaccinated people is never higher than the total number of susceptible people + EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(0)[indx_S_naive], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(0)[indx_S_partial], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(0)[indx_S_improved], 1e-10); } -// TEST(TestOdeSECIRVVS, vaccination_rate) -// { -// const double t0 = 0; -// const double tmax = 1; -// const double dt = 1; - -// // init simple model -// mio::osecirvvs::Model model(1); -// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; -// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; -// model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; - -// // set vaccination rates higher than total population for each layer -// const size_t daily_vaccinations = 100; -// const size_t num_days = 100; -// model.parameters.get().resize(mio::SimulationDay(num_days)); -// model.parameters.get().resize(mio::SimulationDay(num_days)); -// model.parameters.get().resize(mio::SimulationDay(num_days)); -// for (size_t i = 0; i < num_days; ++i) { -// auto num_vaccinations = static_cast(i * daily_vaccinations); -// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = -// num_vaccinations; -// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = -// num_vaccinations; -// model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = -// num_vaccinations; -// } - -// // simulate one step with explicit Euler -// auto integrator = std::make_shared(); -// auto result = simulate_flows(t0, tmax, dt, model, integrator); - -// // get the flow indices for each type of vaccination and also the indices of the susceptible compartments -// auto flow_indx_partial_vaccination = -// model.get_flat_flow_index({mio::AgeGroup(0)}); -// auto flow_indx_full_vaccination = -// model.get_flat_flow_index({mio::AgeGroup(0)}); -// auto flow_indx_booster_vaccination = -// model.get_flat_flow_index({mio::AgeGroup(0)}); - -// auto indx_S_naive = -// model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}); -// auto indx_S_partial = model.populations.get_flat_index( -// {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}); -// auto indx_S_improved = model.populations.get_flat_index( -// {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}); - -// // check that the number of vaccinated people is never higher than the number of susceptible people -// EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(1)[indx_S_naive], 1e-10); -// EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(1)[indx_S_partial], 1e-10); -// EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(1)[indx_S_improved], -// 1e-10); -// } +TEST(TestOdeSECIRVVS, smooth_vaccination_rate) +{ + const ScalarType tmax = 2.; + + // init simple model + mio::osecirvvs::Model model(1); + auto& daily_vaccinations = model.parameters.get(); + daily_vaccinations.resize(mio::SimulationDay(tmax + 1)); + + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(1)}] = 10; + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(2)}] = 110; + + const auto eps1 = 0.15; + + // test when t is out of the range + Eigen::VectorXd result = model.vaccinations_at(5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 0, 1e-12); + + // test when t i below the lower bound + result = model.vaccinations_at(0.5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 10, 1e-12); + + result = model.vaccinations_at(1.5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 100, 1e-12); + + // test when t is withing the range of the smoothing + result = model.vaccinations_at(0.85, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 10.0, 1e-12); + + result = model.vaccinations_at(0.90, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 32.5, 1e-12); + + result = model.vaccinations_at(0.95, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 77.5, 1e-12); + + result = model.vaccinations_at(1.0, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 100.0, 1e-12); + + // Test also with a different epsilon + const auto eps2 = 0.4; + result = model.vaccinations_at(0.6, daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 10.0, 1e-12); + + result = model.vaccinations_at(0.8, daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 55, 1e-12); + + result = model.vaccinations_at(1., daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 100.0, 1e-12); +} void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) { From 69f45f898908764ad366e953d22e7abf348373a8 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 10 May 2024 15:21:41 +0200 Subject: [PATCH 25/60] move into own directory secirts --- cpp/examples/ode_secirts.cpp | 144 +-- cpp/models/ode_secirts/CMakeLists.txt | 18 + cpp/models/ode_secirts/README.md | 35 + cpp/models/ode_secirts/analyze_result.cpp | 28 + cpp/models/ode_secirts/analyze_result.h | 203 +++ cpp/models/ode_secirts/infection_state.h | 74 ++ cpp/models/ode_secirts/model.cpp | 28 + cpp/models/ode_secirts/model.h | 920 ++++++++++++++ cpp/models/ode_secirts/parameter_space.cpp | 228 ++++ cpp/models/ode_secirts/parameter_space.h | 69 ++ cpp/models/ode_secirts/parameters.h | 1210 ++++++++++++++++++ cpp/models/ode_secirts/parameters_io.cpp | 476 +++++++ cpp/models/ode_secirts/parameters_io.h | 1242 +++++++++++++++++++ cpp/tests/CMakeLists.txt | 3 +- cpp/tests/test_odesecirts.cpp | 1294 ++++++++++++++++++++ 15 files changed, 5899 insertions(+), 73 deletions(-) create mode 100644 cpp/models/ode_secirts/CMakeLists.txt create mode 100644 cpp/models/ode_secirts/README.md create mode 100644 cpp/models/ode_secirts/analyze_result.cpp create mode 100644 cpp/models/ode_secirts/analyze_result.h create mode 100644 cpp/models/ode_secirts/infection_state.h create mode 100644 cpp/models/ode_secirts/model.cpp create mode 100644 cpp/models/ode_secirts/model.h create mode 100644 cpp/models/ode_secirts/parameter_space.cpp create mode 100644 cpp/models/ode_secirts/parameter_space.h create mode 100644 cpp/models/ode_secirts/parameters.h create mode 100644 cpp/models/ode_secirts/parameters_io.cpp create mode 100644 cpp/models/ode_secirts/parameters_io.h create mode 100644 cpp/tests/test_odesecirts.cpp diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 6780dd1d50..494c53a7bd 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -17,9 +17,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "ode_secirvvs/analyze_result.h" -#include "ode_secirvvs/model.h" -#include "ode_secirvvs/parameters.h" +#include "ode_secirts/analyze_result.h" +#include "ode_secirts/model.h" +#include "ode_secirts/parameters.h" #include "memilio/compartments/simulation.h" #include "memilio/utils/logging.h" @@ -33,92 +33,92 @@ int main() mio::log_info("Simulating SECIRTS; t={} ... {} with dt = {}.", t0, tmax, dt); - mio::osecirvvs::Model model(3); + mio::osecirts::Model model(3); auto nb_groups = model.parameters.get_num_groups(); for (mio::AgeGroup i = 0; i < nb_groups; i++) { // population - model.populations[{i, mio::osecirvvs::InfectionState::ExposedNaive}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::ExposedImprovedImmunity}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::ExposedPartialImmunity}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsNaive}] = 40; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}] = 40; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}] = 40; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSevereNaive}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSevereImprovedImmunity}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedSeverePartialImmunity}] = 30; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalNaive}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalPartialImmunity}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::InfectedCriticalImprovedImmunity}] = 20; - model.populations[{i, mio::osecirvvs::InfectionState::SusceptibleNaive}] = 1000; - model.populations[{i, mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 1200; - model.populations[{i, mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 1000; - model.populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity}] = 60; - model.populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity}] = 70; - model.populations[{i, mio::osecirvvs::InfectionState::DeadNaive}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::DeadPartialImmunity}] = 0; - model.populations[{i, mio::osecirvvs::InfectionState::DeadImprovedImmunity}] = 0; + model.populations[{i, mio::osecirts::InfectionState::ExposedNaive}] = 20; + model.populations[{i, mio::osecirts::InfectionState::ExposedImprovedImmunity}] = 20; + model.populations[{i, mio::osecirts::InfectionState::ExposedPartialImmunity}] = 20; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaive}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaive}] = 40; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}] = 40; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}] = 40; + model.populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; + model.populations[{i, mio::osecirts::InfectionState::InfectedSevereNaive}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedSevereImprovedImmunity}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedSeverePartialImmunity}] = 30; + model.populations[{i, mio::osecirts::InfectionState::InfectedCriticalNaive}] = 20; + model.populations[{i, mio::osecirts::InfectionState::InfectedCriticalPartialImmunity}] = 20; + model.populations[{i, mio::osecirts::InfectionState::InfectedCriticalImprovedImmunity}] = 20; + model.populations[{i, mio::osecirts::InfectionState::SusceptibleNaive}] = 1000; + model.populations[{i, mio::osecirts::InfectionState::SusceptiblePartialImmunity}] = 1200; + model.populations[{i, mio::osecirts::InfectionState::SusceptibleImprovedImmunity}] = 1000; + model.populations[{i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity}] = 60; + model.populations[{i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity}] = 70; + model.populations[{i, mio::osecirts::InfectionState::DeadNaive}] = 0; + model.populations[{i, mio::osecirts::InfectionState::DeadPartialImmunity}] = 0; + model.populations[{i, mio::osecirts::InfectionState::DeadImprovedImmunity}] = 0; // parameters //times - model.parameters.get()[i] = 3.33; - model.parameters.get()[i] = 1.87; - model.parameters.get()[i] = 7; - model.parameters.get()[i] = 6; - model.parameters.get()[i] = 7; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 180; - model.parameters.get()[i] = 180; + model.parameters.get()[i] = 3.33; + model.parameters.get()[i] = 1.87; + model.parameters.get()[i] = 7; + model.parameters.get()[i] = 6; + model.parameters.get()[i] = 7; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 60; + model.parameters.get()[i] = 180; + model.parameters.get()[i] = 180; //probabilities - model.parameters.get()[i] = 0.15; - model.parameters.get()[i] = 0.5; - model.parameters.get()[i] = 0.0; - model.parameters.get()[i] = 0.4; - model.parameters.get()[i] = 0.2; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.15; + model.parameters.get()[i] = 0.5; + model.parameters.get()[i] = 0.0; + model.parameters.get()[i] = 0.4; + model.parameters.get()[i] = 0.2; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.8; - model.parameters.get()[i] = 0.331; - model.parameters.get()[i] = 0.65; - model.parameters.get()[i] = 0.243; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.091; - model.parameters.get()[i] = 0.9; + model.parameters.get()[i] = 0.8; + model.parameters.get()[i] = 0.331; + model.parameters.get()[i] = 0.65; + model.parameters.get()[i] = 0.243; + model.parameters.get()[i] = 0.1; + model.parameters.get()[i] = 0.091; + model.parameters.get()[i] = 0.9; } - model.parameters.get() = 100; - model.parameters.get() = 0.0143; - const size_t daily_vaccinations = 10; - const size_t num_days = 300; - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get() = 100; + model.parameters.get() = 0.0143; + const size_t daily_vaccinations = 10; + const size_t num_days = 300; + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { for (mio::AgeGroup j = 0; j < nb_groups; ++j) { auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get()[{j, mio::SimulationDay(i)}] = + model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{j, mio::SimulationDay(i)}] = + model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; + model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; } } - mio::ContactMatrixGroup& contact_matrix = model.parameters.get(); + mio::ContactMatrixGroup& contact_matrix = model.parameters.get(); const double cont_freq = 10; const double fact = 1.0 / (double)(size_t)nb_groups; contact_matrix[0] = @@ -126,7 +126,7 @@ int main() contact_matrix.add_damping(Eigen::MatrixXd::Constant((size_t)nb_groups, (size_t)nb_groups, 0.7), mio::SimulationTime(30.)); - model.parameters.get() = 0.2; + model.parameters.get() = 0.2; model.apply_constraints(); @@ -141,9 +141,9 @@ int main() double timm_ii = 0.0; for (mio::AgeGroup i = 0; i < nb_groups; i++) { timm_pi += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( - {i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity})]; + {i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity})]; timm_ii += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( - {i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity})]; + {i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity})]; } printf("t=%i, timm_pi=%f, timm_ii=%f\n", int(result_interpolated.get_time(t_indx)), timm_pi, timm_ii); } diff --git a/cpp/models/ode_secirts/CMakeLists.txt b/cpp/models/ode_secirts/CMakeLists.txt new file mode 100644 index 0000000000..07f1970526 --- /dev/null +++ b/cpp/models/ode_secirts/CMakeLists.txt @@ -0,0 +1,18 @@ +add_library(ode_secirts + analyze_result.h + analyze_result.cpp + infection_state.h + parameter_space.h + parameter_space.cpp + parameters.h + parameters_io.h + parameters_io.cpp + model.h + model.cpp +) +target_link_libraries(ode_secirts PUBLIC memilio) +target_include_directories(ode_secirts PUBLIC + $ + $ +) +target_compile_options(ode_secirts PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) diff --git a/cpp/models/ode_secirts/README.md b/cpp/models/ode_secirts/README.md new file mode 100644 index 0000000000..6156155e06 --- /dev/null +++ b/cpp/models/ode_secirts/README.md @@ -0,0 +1,35 @@ +# SECIRTS-type model including multi-layer waning immunity + +This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. + +In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. + +For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v1). + +Below is an overview of the model architecture and its compartments. + +![SECIRTS_model](https://github.com/SciCompMod/memilio/assets/69154294/6dec331f-bd91-410f-be5e-c8cf6eb0572b) +| Mathematical variable | C++ variable name | Description | +|---------------------------- | --------------- | -------------------------------------------------------------------------------------------------- | +| $\lambda_{N,i} = \rho_{N,i} \sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `ext_inf_force_dummy` | Force of infection for susceptibles located in the naive immunity level. | +| $\lambda_{PI,i} = \rho_{PI,i}\sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `reducExposedPartialImmunity * ext_inf_force_dummy` | Force of infection for susceptibles located in the partial immunity level. | +| $\lambda_{II,i} = \rho_{II}\sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `reducExposedImprovedImmunity * ext_inf_force_dummy` | Force of infection for susceptibles located in the improved immunity level. | +| $\phi$ | `ContactPatterns` | Matrix of daily contact rates / number of daily contacts between different age groups. | +| $\rho$ | `TransmissionProbabilityOnContact` | Transmission risk for people located in one of the susceptible compartments. | +| $\xi_{I_{NS}}$ | `RelativeTransmissionNoSymptoms` | Proportion of asymptomatically infected people who are not isolated (time-dependent if `TestAndTraceCapacity` used). | +| $\xi_{I_{Sy}}$ | `riskFromInfectedSymptomatic` | Proportion of symptomatically infected people who are not isolated (time-dependent if `TestAndTraceCapacity` used). | +| $N_j^{D^\perp}$ | `Nj` | Sum of all living individuals of age groups j. | +| $T_{E}$ | `TimeExposed` | Time in days an individual stays in the Exposed compartment. | +| $T_{I_{NS}}$ | `TimeInfectedNoSymptoms` | Time in days an individual stays in the InfectedNoSymptoms compartment. | +| $T_{I_{Sy}}$ | `TimeInfectedSymptoms` | Time in days an individual stays in the InfectedSymptoms compartment. | +| $T_{I_{Sev}}$ | `TimeInfectedSevere` | Time in days an individual stays in the InfectedSevere compartment. | +| $T_{I_{Cr}}$ | `TimeInfectedCritical` | Time in days an individual stays in the InfectedCritical compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunPartialImmunity compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmunImprovedImmunity compartment. | +| $T_{W_{PI}}$ | `TimeWaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | +| $T_{W_{II}}$ | `TimeWaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | +| $\mu_{I_{NS}}^{I_{Sy}}$ | `1 - RecoveredPerInfectedNoSymptoms` | Probability of transition from compartment InfectedNoSymptoms to InfectedSymptoms. | +| $\mu_{I_{Sy}}^{I_{Sev}}$ | `SeverePerInfectedSymptoms` | Probability of transition from compartment InfectedSymptoms to InfectedSevere. | +| $\mu_{I_{Sev}}^{I_{Cr}}$ | `CriticalPerSevere` | Probability of transition from compartment InfectedSevere to InfectedCritical. | +| $\mu_{I_{Cr}}^{D}$ | `DeathsPerCritical` | Probability of dying when located in compartment InfectedCritical. | +| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | \ No newline at end of file diff --git a/cpp/models/ode_secirts/analyze_result.cpp b/cpp/models/ode_secirts/analyze_result.cpp new file mode 100644 index 0000000000..9b50b95f0d --- /dev/null +++ b/cpp/models/ode_secirts/analyze_result.cpp @@ -0,0 +1,28 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Wadim Koslow, Daniel Abele +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "ode_secirts/analyze_result.h" + +namespace mio +{ +namespace osecirts +{ + +} // namespace osecirts +} // namespace mio diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h new file mode 100644 index 0000000000..12a766b15f --- /dev/null +++ b/cpp/models/ode_secirts/analyze_result.h @@ -0,0 +1,203 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_ANALYZE_RESULT_H +#define ODESECIRTS_ANALYZE_RESULT_H + +#include "ode_secirts/model.h" +#include "memilio/data/analyze_result.h" +#include "ode_secirts/parameters.h" + +#include +#include + +namespace mio +{ +namespace osecirvvs +{ +/** + * @brief computes the p percentile of the parameters for each node. + * @param ensemble_result graph of multiple simulation runs + * @param p percentile value in open interval (0, 1) + * @return p percentile of the parameters over all runs + */ +template +std::vector ensemble_params_percentile(const std::vector>& ensemble_params, double p) +{ + assert(p > 0.0 && p < 1.0 && "Invalid percentile value."); + + auto num_runs = ensemble_params.size(); + auto num_nodes = ensemble_params[0].size(); + auto num_groups = (size_t)ensemble_params[0][0].parameters.get_num_groups(); + auto num_days = + ensemble_params[0][0].parameters.template get().template size(); + + std::vector single_element_ensemble(num_runs); + + // lambda function that calculates the percentile of a single parameter + std::vector percentile(num_nodes, Model((int)num_groups)); + auto param_percentil = [&ensemble_params, p, num_runs, &percentile](auto n, auto get_param) mutable { + std::vector single_element(num_runs); + for (size_t run = 0; run < num_runs; run++) { + auto const& params = ensemble_params[run][n]; + single_element[run] = get_param(params); + } + std::sort(single_element.begin(), single_element.end()); + auto& new_params = get_param(percentile[n]); + new_params = single_element[static_cast(num_runs * p)]; + }; + + for (size_t node = 0; node < num_nodes; node++) { + percentile[node].parameters.template get().resize(num_days); + percentile[node].parameters.template get().resize(num_days); + percentile[node].parameters.template get().resize(num_days); + + for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { + //Population + for (auto compart = Index(0); compart < InfectionState::Count; ++compart) { + param_percentil( + node, [ compart, i ](auto&& model) -> auto& { + return model.populations[{i, compart}]; + }); + } + // times + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + //probs + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + //vaccinations + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + + for (auto day = SimulationDay(0); day < num_days; ++day) { + param_percentil( + node, [ i, day ](auto&& model) -> auto& { + return model.parameters.template get()[{i, day}]; + }); + param_percentil( + node, [ i, day ](auto&& model) -> auto& { + return model.parameters.template get()[{i, day}]; + }); + param_percentil( + node, [ i, day ](auto&& model) -> auto& { + return model.parameters.template get()[{i, day}]; + }); + } + //virus variants + param_percentil( + node, [i](auto&& model) -> auto& { + return model.parameters.template get()[i]; + }); + } + // group independent params + param_percentil( + node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + param_percentil( + node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + param_percentil( + node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + + for (size_t run = 0; run < num_runs; run++) { + + auto const& params = ensemble_params[run][node]; + single_element_ensemble[run] = + params.parameters.template get() * params.populations.get_total(); + } + std::sort(single_element_ensemble.begin(), single_element_ensemble.end()); + percentile[node].parameters.template set( + single_element_ensemble[static_cast(num_runs * p)]); + } + return percentile; +} + +} // namespace osecirts +} // namespace mio + +#endif //ODESECIRTS diff --git a/cpp/models/ode_secirts/infection_state.h b/cpp/models/ode_secirts/infection_state.h new file mode 100644 index 0000000000..18c96bc2e6 --- /dev/null +++ b/cpp/models/ode_secirts/infection_state.h @@ -0,0 +1,74 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_INFECTIONSTATE_H +#define ODESECIRTS_INFECTIONSTATE_H +namespace mio +{ +namespace osecirts +{ + +/** + * @brief The InfectionState enum describes the possible + * categories for the infectious state of persons. + * Enum is usable as an index, e.g. in CustomIndexArray. + * Suffix `Naive` means no immunity through vaccination or infection. + * Suffix `PartialImmunity` means vaccinated once. + * Suffix `ImprovedImmunity` means vaccinated twice or recovered from infection. + * Suffix `Confirmed` means infection has been confirmed by a test, e.g. during commute. + */ +enum class InfectionState +{ + SusceptibleNaive = 0, + SusceptiblePartialImmunity, + ExposedNaive, + ExposedPartialImmunity, + ExposedImprovedImmunity, + InfectedNoSymptomsNaive, + InfectedNoSymptomsPartialImmunity, + InfectedNoSymptomsImprovedImmunity, + InfectedNoSymptomsNaiveConfirmed, + InfectedNoSymptomsPartialImmunityConfirmed, + InfectedNoSymptomsImprovedImmunityConfirmed, + InfectedSymptomsNaive, + InfectedSymptomsPartialImmunity, + InfectedSymptomsImprovedImmunity, + InfectedSymptomsNaiveConfirmed, + InfectedSymptomsPartialImmunityConfirmed, + InfectedSymptomsImprovedImmunityConfirmed, + InfectedSevereNaive, + InfectedSeverePartialImmunity, + InfectedSevereImprovedImmunity, + InfectedCriticalNaive, + InfectedCriticalPartialImmunity, + InfectedCriticalImprovedImmunity, + SusceptibleImprovedImmunity, //includes all with improved immunity, either through infection or at least two vaccinations + DeadNaive, + DeadPartialImmunity, + DeadImprovedImmunity, + TemporaryImmunPartialImmunity, + TemporaryImmunImprovedImmunity, + + Count +}; + +} // namespace osecirts +} // namespace mio + +#endif //ODESECIRTS_INFECTIONSTATE_H diff --git a/cpp/models/ode_secirts/model.cpp b/cpp/models/ode_secirts/model.cpp new file mode 100644 index 0000000000..5969707b6b --- /dev/null +++ b/cpp/models/ode_secirts/model.cpp @@ -0,0 +1,28 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "ode_secirts/model.h" + +namespace mio +{ +namespace osecirts +{ + +} // namespace osecirts +} // namespace mio diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h new file mode 100644 index 0000000000..d25cf78a55 --- /dev/null +++ b/cpp/models/ode_secirts/model.h @@ -0,0 +1,920 @@ +/* +* * Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_MODEL_H +#define ODESECIRTS_MODEL_H + +#include "memilio/compartments/flow_model.h" +#include "memilio/compartments/simulation.h" +#include "memilio/compartments/flow_simulation.h" +#include "memilio/epidemiology/populations.h" +#include "ode_secirts/infection_state.h" +#include "ode_secirts/parameters.h" +#include "memilio/math/smoother.h" +#include "memilio/math/eigen_util.h" + +namespace mio +{ +namespace osecirts +{ +// clang-format off +using Flows = TypeList< + //naive + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + //partial immunity + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + //improved immunity + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + Flow, + + // waning + Flow, + Flow, + Flow, + Flow>; + +// clang-format on + +class Model : public FlowModel, Parameters, Flows> +{ + using Base = FlowModel, Parameters, Flows>; + +public: + Model(const Populations& pop, const ParameterSet& params) + : Base(pop, params) + { + } + + Model(int num_agegroups) + : Model(Populations({AgeGroup(num_agegroups), InfectionState::Count}), ParameterSet(AgeGroup(num_agegroups))) + { + } + + void get_flows(Eigen::Ref pop, Eigen::Ref y, double t, + Eigen::Ref flows) const override + { + auto const& params = this->parameters; + AgeGroup n_agegroups = params.get_num_groups(); + + ContactMatrixGroup const& contact_matrix = params.get(); + + auto icu_occupancy = 0.0; + auto test_and_trace_required = 0.0; + for (auto i = AgeGroup(0); i < n_agegroups; ++i) { + test_and_trace_required += + (1 - params.get()[i]) / params.get()[i] * + (this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaive}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunity}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunity}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaiveConfirmed}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed})); + icu_occupancy += this->populations.get_from(pop, {i, InfectionState::InfectedCriticalNaive}) + + this->populations.get_from(pop, {i, InfectionState::InfectedCriticalPartialImmunity}) + + this->populations.get_from(pop, {i, InfectionState::InfectedCriticalImprovedImmunity}); + } + + // get vaccinations + auto const partial_vaccination = vaccinations_at(t, this->parameters.get()); + auto const full_vaccination = vaccinations_at(t, this->parameters.get()); + auto const booster_vaccination = vaccinations_at(t, this->parameters.get()); + + for (auto i = AgeGroup(0); i < n_agegroups; i++) { + + size_t SNi = this->populations.get_flat_index({i, InfectionState::SusceptibleNaive}); + size_t ENi = this->populations.get_flat_index({i, InfectionState::ExposedNaive}); + size_t INSNi = this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsNaive}); + size_t ISyNi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsNaive}); + size_t ISevNi = this->populations.get_flat_index({i, InfectionState::InfectedSevereNaive}); + size_t ICrNi = this->populations.get_flat_index({i, InfectionState::InfectedCriticalNaive}); + + size_t INSNCi = this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsNaiveConfirmed}); + size_t ISyNCi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsNaiveConfirmed}); + + size_t SPIi = this->populations.get_flat_index({i, InfectionState::SusceptiblePartialImmunity}); + size_t EPIi = this->populations.get_flat_index({i, InfectionState::ExposedPartialImmunity}); + size_t INSPIi = this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsPartialImmunity}); + size_t ISyPIi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsPartialImmunity}); + size_t ISevPIi = this->populations.get_flat_index({i, InfectionState::InfectedSeverePartialImmunity}); + size_t ICrPIi = this->populations.get_flat_index({i, InfectionState::InfectedCriticalPartialImmunity}); + + size_t INSPICi = + this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}); + size_t ISyPICi = + this->populations.get_flat_index({i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}); + + size_t EIIi = this->populations.get_flat_index({i, InfectionState::ExposedImprovedImmunity}); + size_t INSIIi = this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunity}); + size_t ISyIIi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunity}); + size_t ISevIIi = this->populations.get_flat_index({i, InfectionState::InfectedSevereImprovedImmunity}); + size_t ICrIIi = this->populations.get_flat_index({i, InfectionState::InfectedCriticalImprovedImmunity}); + + size_t INSIICi = + this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); + size_t ISyIICi = + this->populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); + size_t TImm1 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunPartialImmunity}); + size_t TImm2 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunImprovedImmunity}); + + size_t SIIi = this->populations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); + + double reducExposedPartialImmunity = params.get()[i]; + double reducExposedImprovedImmunity = params.get()[i]; + double reducInfectedSymptomsPartialImmunity = params.get()[i]; + double reducInfectedSymptomsImprovedImmunity = params.get()[i]; + double reducInfectedSevereCriticalDeadPartialImmunity = + params.get()[i]; + double reducInfectedSevereCriticalDeadImprovedImmunity = + params.get()[i]; + double reducTimeInfectedMild = params.get()[i]; + + //symptomatic are less well quarantined when testing and tracing is overwhelmed so they infect more people + auto riskFromInfectedSymptomatic = smoother_cosine( + test_and_trace_required, params.get(), params.get() * 15, + params.get()[i], params.get()[i]); + + auto riskFromInfectedNoSymptoms = smoother_cosine( + test_and_trace_required, params.get(), params.get() * 2, + params.get()[i], 1.0); + + for (auto j = AgeGroup(0); j < n_agegroups; j++) { + size_t SNj = this->populations.get_flat_index({j, InfectionState::SusceptibleNaive}); + size_t ENj = this->populations.get_flat_index({j, InfectionState::ExposedNaive}); + size_t INSNj = this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsNaive}); + size_t ISyNj = this->populations.get_flat_index({j, InfectionState::InfectedSymptomsNaive}); + size_t ISevNj = this->populations.get_flat_index({j, InfectionState::InfectedSevereNaive}); + size_t ICrNj = this->populations.get_flat_index({j, InfectionState::InfectedCriticalNaive}); + size_t SIIj = this->populations.get_flat_index({j, InfectionState::SusceptibleImprovedImmunity}); + + size_t INSNCj = this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsNaiveConfirmed}); + size_t ISyNCj = this->populations.get_flat_index({j, InfectionState::InfectedSymptomsNaiveConfirmed}); + + size_t SPIj = this->populations.get_flat_index({j, InfectionState::SusceptiblePartialImmunity}); + size_t EPIj = this->populations.get_flat_index({j, InfectionState::ExposedPartialImmunity}); + size_t INSPIj = + this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsPartialImmunity}); + size_t ISyPIj = this->populations.get_flat_index({j, InfectionState::InfectedSymptomsPartialImmunity}); + size_t ISevPIj = this->populations.get_flat_index({j, InfectionState::InfectedSeverePartialImmunity}); + size_t ICrPIj = this->populations.get_flat_index({j, InfectionState::InfectedCriticalPartialImmunity}); + + size_t INSPICj = + this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}); + size_t ISyPICj = + this->populations.get_flat_index({j, InfectionState::InfectedSymptomsPartialImmunityConfirmed}); + + size_t EIIj = this->populations.get_flat_index({j, InfectionState::ExposedImprovedImmunity}); + size_t INSIIj = + this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsImprovedImmunity}); + size_t ISyIIj = this->populations.get_flat_index({j, InfectionState::InfectedSymptomsImprovedImmunity}); + size_t ISevIIj = this->populations.get_flat_index({j, InfectionState::InfectedSevereImprovedImmunity}); + size_t ICrIIj = this->populations.get_flat_index({j, InfectionState::InfectedCriticalImprovedImmunity}); + + size_t INSIICj = + this->populations.get_flat_index({j, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); + size_t ISyIICj = + this->populations.get_flat_index({j, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); + + // effective contact rate by contact rate between groups i and j and damping j + double season_val = + (1 + params.get() * + sin(3.141592653589793 * (std::fmod((params.get() + t), 365.0) / 182.5 + 0.5))); + double cont_freq_eff = + season_val * contact_matrix.get_matrix_at(t)(static_cast((size_t)i), + static_cast((size_t)j)); + // without died people + double Nj = pop[SNj] + pop[ENj] + pop[INSNj] + pop[ISyNj] + pop[ISevNj] + pop[ICrNj] + pop[INSNCj] + + pop[ISyNCj] + pop[SPIj] + pop[EPIj] + pop[INSPIj] + pop[ISyPIj] + pop[ISevPIj] + + pop[ICrPIj] + pop[INSPICj] + pop[ISyPICj] + pop[SIIj] + pop[EIIj] + pop[INSIIj] + + pop[ISyIIj] + pop[ISevIIj] + pop[ICrIIj] + pop[INSIICj] + pop[ISyIICj]; + + double divNj = (Nj > 0) ? 1.0 / Nj : 0; + + double ext_inf_force_dummy = cont_freq_eff * divNj * + params.template get()[(AgeGroup)i] * + (riskFromInfectedNoSymptoms * (pop[INSNj] + pop[INSPIj] + pop[INSIIj]) + + riskFromInfectedSymptomatic * (pop[ISyNj] + pop[ISyPIj] + pop[ISyIIj])); + + double dummy_SN = y[SNi] * ext_inf_force_dummy; + + double dummy_SPI = y[SPIi] * reducExposedPartialImmunity * ext_inf_force_dummy; + + double dummy_SII = y[SIIi] * reducExposedImprovedImmunity * ext_inf_force_dummy; + + flows[get_flat_flow_index({i})] += + dummy_SN; + flows[get_flat_flow_index({i})] += dummy_SPI; + flows[get_flat_flow_index({i})] += dummy_SII; + } + + // vaccinations + flows[get_flat_flow_index( + {i})] = + std::min( + y[SNi] - + flows[get_flat_flow_index({i})], + partial_vaccination[static_cast(i)]); + + flows[get_flat_flow_index({i})] = + std::min(y[SPIi] - flows[get_flat_flow_index({i})], + full_vaccination[static_cast(i)]); + + flows[get_flat_flow_index({i})] = + std::min(y[SIIi] - flows[get_flat_flow_index({i})], + booster_vaccination[static_cast(i)]); + + // ICU capacity shortage is close + // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere + // is different for different vaccination status. This is not the case here and in addition, ICUCapacity + // is set to infinity and this functionality is deactivated, so this is OK for the moment. + double criticalPerSevereAdjusted = + smoother_cosine(icu_occupancy, 0.90 * params.get(), params.get(), + params.get()[i], 0); + + double deathsPerSevereAdjusted = params.get()[i] - criticalPerSevereAdjusted; + + /**** path of immune-naive ***/ + // Exposed + flows[get_flat_flow_index({i})] += + y[ENi] / params.get()[i]; + + // InfectedNoSymptoms + flows[get_flat_flow_index({i})] = + params.get()[i] * (1 / params.get()[i]) * + y[INSNi]; + flows[get_flat_flow_index( + {i})] = (1 - params.get()[i]) / + params.get()[i] * y[INSNi]; + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * + y[INSNCi]; + flows[get_flat_flow_index({i})] = + params.get()[i] * (1 / params.get()[i]) * + y[INSNCi]; + + // // InfectedSymptoms + flows[get_flat_flow_index( + {i})] = params.get()[i] / params.get()[i] * y[ISyNi]; + + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * y[ISyNi]; + + flows[get_flat_flow_index({i})] = + params.get()[i] / params.get()[i] * y[ISyNCi]; + + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * y[ISyNCi]; + + // InfectedSevere + flows[get_flat_flow_index( + {i})] = criticalPerSevereAdjusted / params.get()[i] * y[ISevNi]; + + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; + + flows[get_flat_flow_index({i})] = + deathsPerSevereAdjusted / params.get()[i] * y[ISevNi]; + // InfectedCritical + flows[get_flat_flow_index({i})] = + params.get()[i] / params.get()[i] * y[ICrNi]; + + flows[get_flat_flow_index({i})] = + (1 - params.get()[i]) / params.get()[i] * y[ICrNi]; + + // Waning immunity + flows[get_flat_flow_index( + {i})] = 1 / params.get()[i] * y[SPIi]; + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[TImm1]; + + // /**** path of partially immune ***/ + + // Exposed + flows[get_flat_flow_index({i})] += + y[EPIi] / params.get()[i]; + + // InfectedNoSymptoms + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * + (1 - params.get()[i])) / + (params.get()[i] * reducTimeInfectedMild) * y[INSPIi]; + flows[get_flat_flow_index({i})] = + (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * + (1 - params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[INSPIi]; + flows[get_flat_flow_index({i})] = + (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * + (1 - params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * + (1 - params.get()[i])) / + (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; + + // InfectedSymptoms + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity * + params.get()[i] / + (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * + params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; + + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity * + params.get()[i] / + (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * + params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; + + // InfectedSevere + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity * + criticalPerSevereAdjusted / params.get()[i] * y[ISevPIi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * + params.get()[i]) / + params.get()[i] * y[ISevPIi]; + + flows[get_flat_flow_index({i})] = + (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * + deathsPerSevereAdjusted / params.get()[i] * y[ISevPIi]; + // InfectedCritical + flows[get_flat_flow_index({i})] = + (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * + params.get()[i] / params.get()[i] * y[ICrPIi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * + params.get()[i]) / + params.get()[i] * y[ICrPIi]; + + // /**** path of improved immunity ***/ + // Exposed + flows[get_flat_flow_index({i})] += + y[EIIi] / params.get()[i]; + + // InfectedNoSymptoms + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * + (1 - params.get()[i])) / + (params.get()[i] * reducTimeInfectedMild) * y[INSIIi]; + flows[get_flat_flow_index({i})] = + (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * + (1 - params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[INSIIi]; + flows[get_flat_flow_index({i})] = + (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * + (1 - params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * + (1 - params.get()[i])) / + (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; + + // InfectedSymptoms + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity * + params.get()[i] / + (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * + params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; + + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity * + params.get()[i] / + (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; + + flows[get_flat_flow_index({i})] = + (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * + params.get()[i]) / + (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; + + // InfectedSevere + flows[get_flat_flow_index({i})] = + reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity * + criticalPerSevereAdjusted / params.get()[i] * y[ISevIIi]; + + flows[get_flat_flow_index({i})] = + (1 - + (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * + params.get()[i]) / + params.get()[i] * y[ISevIIi]; + + flows[get_flat_flow_index({i})] = + (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * + deathsPerSevereAdjusted / params.get()[i] * y[ISevIIi]; + + // InfectedCritical + flows[get_flat_flow_index({i})] = + (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * + params.get()[i] / params.get()[i] * y[ICrIIi]; + + flows[get_flat_flow_index({i})] = + (1 - + (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * + params.get()[i]) / + params.get()[i] * y[ICrIIi]; + + // Waning immunity + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[TImm2]; + + flows[get_flat_flow_index({i})] = + 1 / params.get()[i] * y[SIIi]; + } + } + + Eigen::VectorXd vaccinations_at(const ScalarType t, + const CustomIndexArray& daily_vaccinations, + const ScalarType eps = 0.15) const + { + auto const& params = this->parameters; + const ScalarType ub = (size_t)t + 1.0; + const ScalarType lb = ub - eps; + + Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); + smoothed_vaccinations.setZero(); + + if (t > ub) { + mio::log_warning("Vaccination time is out of bounds"); + } + + if (static_cast(daily_vaccinations.size()) <= (size_t)t) { + return smoothed_vaccinations; + } + // check if t is in the range of the interval [lb,ub] + if (t >= lb) { + // need a eigen vector of size params.get_num_groups() to store the number of vaccinations per age group + + // ToDo: Find a way to Iterate over all three vaccination types + for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { + const auto num_vaccinations_ub = + daily_vaccinations[{age, SimulationDay(ub + 1)}] - daily_vaccinations[{age, SimulationDay(ub)}]; + const auto num_vaccinations_lb = + daily_vaccinations[{age, SimulationDay(lb + 1)}] - daily_vaccinations[{age, SimulationDay(lb)}]; + smoothed_vaccinations[(size_t)age] = + smoother_cosine(t, lb, ub, num_vaccinations_lb, num_vaccinations_ub); + } + } + else { + for (auto age = AgeGroup(0); age < params.get_num_groups(); age++) { + smoothed_vaccinations[(size_t)age] = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - + daily_vaccinations[{age, SimulationDay((size_t)t)}]; + } + } + return smoothed_vaccinations; + } + + /** + * serialize this. + * @see mio::serialize + */ + template + void serialize(IOContext& io) const + { + auto obj = io.create_object("Model"); + obj.add_element("Parameters", parameters); + obj.add_element("Populations", populations); + } + + /** + * deserialize an object of this class. + * @see mio::deserialize + */ + template + static IOResult deserialize(IOContext& io) + { + auto obj = io.expect_object("Model"); + auto par = obj.expect_element("Parameters", Tag{}); + auto pop = obj.expect_element("Populations", Tag{}); + return apply( + io, + [](auto&& par_, auto&& pop_) { + return Model{pop_, par_}; + }, + par, pop); + } +}; // namespace osecirts + +//forward declaration, see below. +template > +class Simulation; + +/** +* get percentage of infections per total population. +* @param model the compartment model with initial values. +* @param t current simulation time. +* @param y current value of compartments. +* @tparam Base simulation type that uses the SECIRS-type compartment model. see Simulation. +*/ +template > +double get_infections_relative(const Simulation& model, double t, const Eigen::Ref& y); + +/** + * specialization of compartment model simulation for the SECIRS-type model. + * @tparam BaseT simulation type, default mio::Simulation. For testing purposes only! + */ +template +class Simulation : public BaseT +{ +public: + /** + * construct a simulation. + * @param model the model to simulate. + * @param t0 start time + * @param dt time steps + */ + Simulation(Model const& model, double t0 = 0., double dt = 0.1) + : BaseT(model, t0, dt) + , m_t_last_npi_check(t0) + { + } + + /** + * @brief Applies the effect of a new variant of a disease to the transmission probability of the model. + * + * This function adjusts the transmission probability of the disease for each age group based on the share of the new variant. + * The share of the new variant is calculated based on the time `t` and the start day of the new variant. + * The transmission probability is then updated for each age group in the model. + * + * Based on Equation (35) and (36) in doi.org/10.1371/journal.pcbi.1010054 + * + * @param [in] t The current time. + * @param [in] base_infectiousness The base infectiousness of the old variant for each age group. + */ + + void apply_variant(const double t, const CustomIndexArray base_infectiousness) + { + auto start_day = this->get_model().parameters.template get(); + auto start_day_new_variant = this->get_model().parameters.template get(); + + if (start_day + t >= start_day_new_variant - 1e-10) { + const double days_variant = t - (start_day_new_variant - start_day); + const double share_new_variant = std::min(1.0, 0.01 * pow(2, (1. / 7) * days_variant)); + const auto num_groups = this->get_model().parameters.get_num_groups(); + for (auto i = AgeGroup(0); i < num_groups; ++i) { + double new_transmission = (1 - share_new_variant) * base_infectiousness[i] + + share_new_variant * base_infectiousness[i] * + this->get_model().parameters.template get()[i]; + this->get_model().parameters.template get()[i] = new_transmission; + } + } + } + + /** + * @brief advance simulation to tmax. + * Overwrites Simulation::advance and includes a check for dynamic NPIs in regular intervals. + * @see Simulation::advance + * @param tmax next stopping point of simulation + * @return value at tmax + */ + Eigen::Ref advance(double tmax) + { + auto& t_end_dyn_npis = this->get_model().parameters.get_end_dynamic_npis(); + auto& dyn_npis = this->get_model().parameters.template get(); + auto& contact_patterns = this->get_model().parameters.template get(); + // const size_t num_groups = (size_t)this->get_model().parameters.get_num_groups(); + + // in the apply_variant function, we adjust the TransmissionProbabilityOnContact parameter. We need to store + // the base value to use it in the apply_variant function and also to reset the parameter after the simulation. + auto base_infectiousness = this->get_model().parameters.template get(); + + double delay_lockdown; + auto t = BaseT::get_result().get_last_time(); + const auto dt = dyn_npis.get_interval().get(); + while (t < tmax) { + + auto dt_eff = std::min({dt, tmax - t, m_t_last_npi_check + dt - t}); + if (dt_eff >= 1.0) { + dt_eff = 1.0; + } + + BaseT::advance(t + dt_eff); + if (t + 0.5 + dt_eff - std::floor(t + 0.5) >= 1) { + this->apply_variant(t, base_infectiousness); + } + + if (t > 0) { + delay_lockdown = 7; + } + else { + delay_lockdown = 0; + } + t = t + dt_eff; + + if (dyn_npis.get_thresholds().size() > 0) { + if (floating_point_greater_equal(t, m_t_last_npi_check + dt)) { + if (t < t_end_dyn_npis) { + auto inf_rel = get_infections_relative(*this, t, this->get_result().get_last_value()) * + dyn_npis.get_base_value(); + auto exceeded_threshold = dyn_npis.get_max_exceeded_threshold(inf_rel); + if (exceeded_threshold != dyn_npis.get_thresholds().end() && + (exceeded_threshold->first > m_dynamic_npi.first || + t > double(m_dynamic_npi.second))) { //old npi was weaker or is expired + + auto t_start = SimulationTime(t + delay_lockdown); + auto t_end = t_start + SimulationTime(dyn_npis.get_duration()); + this->get_model().parameters.get_start_commuter_detection() = (double)t_start; + this->get_model().parameters.get_end_commuter_detection() = (double)t_end; + m_dynamic_npi = std::make_pair(exceeded_threshold->first, t_end); + implement_dynamic_npis(contact_patterns.get_cont_freq_mat(), exceeded_threshold->second, + t_start, t_end, [](auto& g) { + return make_contact_damping_matrix(g); + }); + } + } + m_t_last_npi_check = t; + } + } + else { + m_t_last_npi_check = t; + } + } + // reset TransmissionProbabilityOnContact. This is important for the graph simulation where the advance + // function is called multiple times for the same model. + this->get_model().parameters.template get() = base_infectiousness; + + return this->get_result().get_last_value(); + } + +private: + double m_t_last_npi_check; + std::pair m_dynamic_npi = {-std::numeric_limits::max(), SimulationTime(0)}; +}; + +/** + * @brief Specialization of simulate for SECIRS-type models using Simulation. + * + * @param[in] t0 start time. + * @param[in] tmax end time. + * @param[in] dt time step. + * @param[in] model SECIRS-type model to simulate. + * @param[in] integrator optional integrator, uses rk45 if nullptr. + * + * @return Returns the result of the simulation. + */ +inline auto simulate(double t0, double tmax, double dt, const Model& model, + std::shared_ptr integrator = nullptr) +{ + return mio::simulate>(t0, tmax, dt, model, integrator); +} + +/** + * @brief Specialization of simulate for SECIRS-type models using the FlowSimulation. + * + * @param[in] t0 start time. + * @param[in] tmax end time. + * @param[in] dt time step. + * @param[in] model SECIRS-type model to simulate. + * @param[in] integrator optional integrator, uses rk45 if nullptr. + * + * @return Returns the result of the Flowsimulation. + */ +inline auto simulate_flows(double t0, double tmax, double dt, const Model& model, + std::shared_ptr integrator = nullptr) +{ + return mio::simulate_flows>>(t0, tmax, dt, model, integrator); +} + +//see declaration above. +template +double get_infections_relative(const Simulation& sim, double /*t*/, const Eigen::Ref& y) +{ + double sum_inf = 0; + for (auto i = AgeGroup(0); i < sim.get_model().parameters.get_num_groups(); ++i) { + sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsNaive}); + sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsNaiveConfirmed}); + sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsPartialImmunity}); + sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsImprovedImmunity}); + sum_inf += + sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}); + sum_inf += + sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); + } + auto inf_rel = sum_inf / sim.get_model().populations.get_total(); + + return inf_rel; +} + +/** + * Get migration factors. + * Used by migration graph simulation. + * Like infection risk, migration of infected individuals is reduced if they are well isolated. + * @param model the compartment model with initial values. + * @param t current simulation time. + * @param y current value of compartments. + * @return vector expression, same size as y, with migration factors per compartment. + * @tparam Base simulation type that uses a SECIRS-type compartment model. see Simulation. + */ +template > +auto get_migration_factors(const Simulation& sim, double /*t*/, const Eigen::Ref& y) +{ + auto& params = sim.get_model().parameters; + //parameters as arrays + auto& p_asymp = params.template get().array().template cast(); + auto& p_inf = params.template get().array().template cast(); + auto& p_inf_max = params.template get().array().template cast(); + //slice of InfectedNoSymptoms + auto y_INS = slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsNaive), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsPartialImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsImprovedImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}); + + //compute isolation, same as infection risk from main model + auto test_and_trace_required = + ((1 - p_asymp) / params.template get().array().template cast() * y_INS.array()) + .sum(); + auto riskFromInfectedSymptomatic = + smoother_cosine(test_and_trace_required, double(params.template get()), + params.template get() * 5, p_inf.matrix(), p_inf_max.matrix()); + + //set factor for infected + auto factors = Eigen::VectorXd::Ones(y.rows()).eval(); + slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsNaive), Eigen::Index(size_t(params.get_num_groups())), + Eigen::Index(InfectionState::Count)}) + .array() = riskFromInfectedSymptomatic; + slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsPartialImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + .array() = riskFromInfectedSymptomatic; + slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsImprovedImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + .array() = riskFromInfectedSymptomatic; + return factors; +} + +template > +auto test_commuters(Simulation& sim, Eigen::Ref migrated, double time) +{ + auto& model = sim.get_model(); + auto nondetection = 1.0; + if (time >= model.parameters.get_start_commuter_detection() && + time < model.parameters.get_end_commuter_detection()) { + nondetection = (double)model.parameters.get_commuter_nondetection(); + } + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); ++i) { + auto ISyNi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsNaive}); + auto ISyNCi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsNaiveConfirmed}); + auto INSNi = model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsNaive}); + auto INSNCi = model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsNaiveConfirmed}); + + auto ISPIi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsPartialImmunity}); + auto ISPICi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}); + auto INSPIi = model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsPartialImmunity}); + auto INSPICi = + model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}); + + auto ISyIIi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunity}); + auto ISyIICi = model.populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); + auto INSIIi = model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunity}); + auto INSIICi = + model.populations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); + + //put detected commuters in their own compartment so they don't contribute to infections in their home node + sim.get_result().get_last_value()[ISyNi] -= migrated[ISyNi] * (1 - nondetection); + sim.get_result().get_last_value()[ISyNCi] += migrated[ISyNi] * (1 - nondetection); + sim.get_result().get_last_value()[INSNi] -= migrated[INSNi] * (1 - nondetection); + sim.get_result().get_last_value()[INSNCi] += migrated[INSNi] * (1 - nondetection); + + sim.get_result().get_last_value()[ISPIi] -= migrated[ISPIi] * (1 - nondetection); + sim.get_result().get_last_value()[ISPICi] += migrated[ISPIi] * (1 - nondetection); + sim.get_result().get_last_value()[INSPIi] -= migrated[INSPIi] * (1 - nondetection); + sim.get_result().get_last_value()[INSPICi] += migrated[INSPIi] * (1 - nondetection); + + sim.get_result().get_last_value()[ISyIIi] -= migrated[ISyIIi] * (1 - nondetection); + sim.get_result().get_last_value()[ISyIICi] += migrated[ISyIIi] * (1 - nondetection); + sim.get_result().get_last_value()[INSIIi] -= migrated[INSIIi] * (1 - nondetection); + sim.get_result().get_last_value()[INSIICi] += migrated[INSIIi] * (1 - nondetection); + + //reduce the number of commuters + migrated[ISyNi] *= nondetection; + migrated[INSNi] *= nondetection; + + migrated[ISPIi] *= nondetection; + migrated[INSPIi] *= nondetection; + + migrated[ISyIIi] *= nondetection; + migrated[INSIIi] *= nondetection; + } +} + +} // namespace osecirts +} // namespace mio + +#endif //ODESECIRTS_MODEL_H diff --git a/cpp/models/ode_secirts/parameter_space.cpp b/cpp/models/ode_secirts/parameter_space.cpp new file mode 100644 index 0000000000..3cd8a16dc9 --- /dev/null +++ b/cpp/models/ode_secirts/parameter_space.cpp @@ -0,0 +1,228 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "ode_secirts/parameter_space.h" +#include "memilio/utils/logging.h" +#include "memilio/utils/parameter_distributions.h" +#include "ode_secirts/infection_state.h" +#include "ode_secirts/model.h" + +#include +#include +#include + +namespace mio +{ +namespace osecirts +{ + +void draw_sample_demographics(Model& model) +{ + model.parameters.get().draw_sample(); + model.parameters.get().draw_sample(); + + const static std::vector naive_immunity_states = { + InfectionState::SusceptibleNaive, + InfectionState::ExposedNaive, + InfectionState::InfectedNoSymptomsNaive, + InfectionState::InfectedNoSymptomsNaiveConfirmed, + InfectionState::InfectedSymptomsNaive, + InfectionState::InfectedSymptomsNaiveConfirmed, + InfectionState::InfectedSevereNaive, + InfectionState::InfectedCriticalNaive, + InfectionState::DeadNaive, + }; + + const static std::vector partial_immunity_states = { + InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, + InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, + InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, + }; + + const static std::vector improved_immunity_states = { + InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, + InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, + InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, + }; + + // helper function to calculate the total population of a layer for a given age group + auto calculate_layer_total = [&model](const std::vector& states, AgeGroup ageGroup) { + return std::accumulate(states.begin(), states.end(), 0.0, + [&model, &ageGroup](double sum, const InfectionState& state) { + return sum + model.populations[{ageGroup, state}]; + }); + }; + + // helper function to adjust the susceptible population of a layer for a given age group + auto adjust_susceptible_population = [&model](AgeGroup i, double diff, InfectionState susceptibleState) { + model.populations[{i, susceptibleState}] += diff; + if (model.populations[{i, susceptibleState}] < 0) { + mio::log_warning("Negative population in State " + std::to_string(static_cast(susceptibleState)) + + " for age group " + std::to_string(static_cast(i)) + ". Setting to 0."); + model.populations[{i, susceptibleState}] = 0; + } + }; + + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { + + const double group_naive_total = calculate_layer_total(naive_immunity_states, i); + const double group_partial_total = calculate_layer_total(partial_immunity_states, i); + const double group_improved_total = calculate_layer_total(improved_immunity_states, i); + + //sample initial compartments (with exceptions) + for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { + if (inf_state != InfectionState::DeadNaive && //not sampled, fixed from data + inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data + inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data + model.populations[{i, inf_state}].draw_sample(); + } + } + const double diff_naive = group_naive_total - calculate_layer_total(naive_immunity_states, i); + const double diff_partial = group_partial_total - calculate_layer_total(partial_immunity_states, i); + const double diff_improved = group_improved_total - calculate_layer_total(improved_immunity_states, i); + + adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); + adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); + adjust_susceptible_population(i, diff_improved, InfectionState::SusceptibleImprovedImmunity); + } +} + +void draw_sample_infection(Model& model) +{ + model.parameters.get().draw_sample(); + + //not age dependent + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + model.parameters.get()[AgeGroup(0)].draw_sample(); + + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { + //not age dependent + model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = + model.parameters.get()[AgeGroup(0)]; + model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; + + //age dependent + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + model.parameters.get()[i].draw_sample(); + } +} + +void draw_sample(Model& model) +{ + draw_sample_infection(model); + draw_sample_demographics(model); + model.parameters.get().draw_sample(); + model.apply_constraints(); +} + +Graph draw_sample(Graph& graph) +{ + Graph sampled_graph; + + //sample global parameters + auto& shared_params_model = graph.nodes()[0].property; + draw_sample_infection(shared_params_model); + auto& shared_contacts = shared_params_model.parameters.template get(); + shared_contacts.draw_sample_dampings(); + auto& shared_dynamic_npis = shared_params_model.parameters.template get(); + shared_dynamic_npis.draw_sample(); + + for (auto& params_node : graph.nodes()) { + auto& node_model = params_node.property; + + //sample local parameters + draw_sample_demographics(params_node.property); + + //copy global parameters + //save demographic parameters so they aren't overwritten + auto local_icu_capacity = node_model.parameters.template get(); + auto local_tnt_capacity = node_model.parameters.template get(); + auto local_holidays = node_model.parameters.template get().get_school_holidays(); + auto local_daily_v1 = node_model.parameters.template get(); + auto local_daily_v2 = node_model.parameters.template get(); + auto local_daily_v3 = node_model.parameters.template get(); + node_model.parameters = shared_params_model.parameters; + node_model.parameters.template get() = local_icu_capacity; + node_model.parameters.template get() = local_tnt_capacity; + node_model.parameters.template get().get_school_holidays() = local_holidays; + node_model.parameters.template get() = local_daily_v1; + node_model.parameters.template get() = local_daily_v2; + node_model.parameters.template get() = local_daily_v3; + + node_model.parameters.template get().make_matrix(); + node_model.apply_constraints(); + + sampled_graph.add_node(params_node.id, node_model); + } + + for (auto& edge : graph.edges()) { + auto edge_params = edge.property; + //no dynamic NPIs + //TODO: add switch to optionally enable dynamic NPIs to edges + sampled_graph.add_edge(edge.start_node_idx, edge.end_node_idx, edge_params); + } + + return sampled_graph; +} + +} // namespace osecirts +} // namespace mio diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h new file mode 100644 index 0000000000..1b36e2ed87 --- /dev/null +++ b/cpp/models/ode_secirts/parameter_space.h @@ -0,0 +1,69 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_PARAMETER_SPACE_H +#define ODESECIRTS_PARAMETER_SPACE_H + +#include "memilio/mobility/metapopulation_mobility_instant.h" +#include "memilio/utils/memory.h" +#include "memilio/utils/logging.h" +#include "memilio/utils/parameter_distributions.h" +#include "ode_secirts/model.h" + +#include +#include +#include +#include +#include + +namespace mio +{ +namespace osecirts +{ +/** + * draws a sample from the specified distributions for all parameters related to the demographics, e.g. population. + * @param[inout] model Model including contact patterns for alle age groups + */ +void draw_sample_demographics(Model& model); + +/** + * draws a sample from the specified distributions for all parameters related to the infection. + * @param[inout] model Model including contact patterns for alle age groups + */ +void draw_sample_infection(Model& model); + +/** Draws a sample from Model parameter distributions and stores sample values + * as Parameters parameter values (cf. UncertainValue and Parameters classes) + * @param[inout] model Model including contact patterns for alle age groups + */ +void draw_sample(Model& model); + +/** + * Draws samples for each model node in a graph. + * Some parameters are shared between nodes and only sampled once. + * @param graph Graph to be sampled. + * @param variant_high If true, use high value for infectiousness of variant. + * @return Graph with nodes and edges from the input graph sampled. + */ +Graph draw_sample(Graph& graph); + +} // namespace osecirts +} // namespace mio + +#endif // ODESECIRTS_PARAMETER_SPACE_H diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h new file mode 100644 index 0000000000..f710b216e5 --- /dev/null +++ b/cpp/models/ode_secirts/parameters.h @@ -0,0 +1,1210 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_PARAMETERS_H +#define ODESECIRTS_PARAMETERS_H + +#include "memilio/math/eigen.h" +#include "memilio/utils/uncertain_value.h" +#include "memilio/math/adapt_rk.h" +#include "memilio/epidemiology/age_group.h" +#include "memilio/epidemiology/simulation_day.h" +#include "memilio/epidemiology/uncertain_matrix.h" +#include "memilio/epidemiology/dynamic_npis.h" +#include "memilio/utils/parameter_set.h" +#include "memilio/utils/custom_index_array.h" + +#include + +namespace mio +{ +namespace osecirts +{ + +/** +* @brief the start day in the SECIRS-type model +* The start day defines in which season the simulation can be started +* If the start day is 180 and simulation takes place from t0=0 to +* tmax=100 the days 180 to 280 of the year are simulated +*/ +struct StartDay { + using Type = double; + static Type get_default(AgeGroup) + { + return 0.; + } + static std::string name() + { + return "StartDay"; + } +}; + +/** +* @brief the start day of a new variant in the SECIRS-type model +* The start day of the new variant defines in which day of the simulation the new variant is introduced. +* Starting on this day, the new variant will impact the transmission probability depending on the +* infectiousness of the new variant in the parameter InfectiousnessNewVariant. +*/ +struct StartDayNewVariant { + using Type = double; + static Type get_default(AgeGroup) + { + return std::numeric_limits::max(); + } + static std::string name() + { + return "StartDayNewVariant"; + } +}; + +/** +* @brief the seasonality in the SECIRS-type model +* the seasonality is given as (1+k*sin()) where the sine +* curve is below one in summer and above one in winter +*/ +struct Seasonality { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(0.); + } + static std::string name() + { + return "Seasonality"; + } +}; + +/** +* @brief the icu capacity in the SECIRS-type model +*/ +struct ICUCapacity { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(std::numeric_limits::max()); + } + static std::string name() + { + return "ICUCapacity"; + } +}; + +/** + * @brief capacity to test and trace contacts of infected for quarantine per day. + */ +struct TestAndTraceCapacity { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(std::numeric_limits::max()); + } + static std::string name() + { + return "TestAndTraceCapacity"; + } +}; + +/** + * @brief the contact patterns within the society are modelled using an UncertainContactMatrix + */ +struct ContactPatterns { + using Type = UncertainContactMatrix; + static Type get_default(AgeGroup size) + { + return Type(1, static_cast((size_t)size)); + } + static std::string name() + { + return "ContactPatterns"; + } +}; + +/** + * @brief the NPIs that are enacted if certain infection thresholds are exceeded. + */ +struct DynamicNPIsInfectedSymptoms { + using Type = DynamicNPIs; + static Type get_default(AgeGroup /*size*/) + { + return {}; + } + static std::string name() + { + return "DynamicNPIsInfectedSymptoms"; + } +}; + +/** + * @brief the (mean) latent time in day unit + */ +struct TimeExposed { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeExposed"; + } +}; + +/** + * @brief the (mean) time in day unit for asymptomatic cases that are infected but + * have not yet developed symptoms. + */ +struct TimeInfectedNoSymptoms { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeInfectedNoSymptoms"; + } +}; + +/** +* @brief the infectious time for symptomatic cases that are infected but +* who do not need to be hsopitalized in the SECIRS-type model in day unit +*/ +struct TimeInfectedSymptoms { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeInfectedSymptoms"; + } +}; + +/** + * @brief the time people are 'simply' hospitalized before returning home in the SECIR model + * in day unit + */ +struct TimeInfectedSevere { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeInfectedSevere"; + } +}; + +/** + * @brief the time people are treated by ICU before returning home in the SECIRS-type model + * in day unit + */ +struct TimeInfectedCritical { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeInfectedCritical"; + } +}; + +/** + * @brief Time in days to describe waning immunity to get person from S_PI -> S + */ +struct TimeWaningPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "TimeWaningPartialImmunity"; + } +}; + +/** + * @brief Time in days to describe waning immunity to get person from SII -> SPI + */ +struct TimeWaningImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 90.0); + } + static std::string name() + { + return "TimeWaningImprovedImmunity"; + } +}; + +/** + * @brief the time people stays immune after infection or vaccination located in S + in the model in day unit + */ +struct TimeTemporaryImmunityPI { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityPI"; + } +}; + +/** + * @brief the time people stays immune after infection or vaccination located in S_PI or S_II + in the model in day unit + */ +struct TimeTemporaryImmunityII { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TimeTemporaryImmunityII"; + } +}; +/** +* @brief probability of getting infected from a contact +*/ +struct TransmissionProbabilityOnContact { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "TransmissionProbabilityOnContact"; + } +}; + +/** +* @brief the relative InfectedNoSymptoms infectability +*/ +struct RelativeTransmissionNoSymptoms { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "RelativeTransmissionNoSymptoms"; + } +}; + +/** +* @brief the percentage of asymptomatic cases in the SECIRS-type model +*/ +struct RecoveredPerInfectedNoSymptoms { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "RecoveredPerInfectedNoSymptoms"; + } +}; + +/** +* @brief the risk of infection from symptomatic cases in the SECIRS-type model +*/ +struct RiskOfInfectionFromSymptomatic { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "RiskOfInfectionFromSymptomatic"; + } +}; + +/** +* @brief risk of infection from symptomatic cases increases as test and trace capacity is exceeded. +*/ +struct MaxRiskOfInfectionFromSymptomatic { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "MaxRiskOfInfectionFromSymptomatic"; + } +}; + +/** +* @brief the percentage of hospitalized patients per infected patients in the SECIRS-type model +*/ +struct SeverePerInfectedSymptoms { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "SeverePerInfectedSymptoms"; + } +}; + +/** +* @brief the percentage of ICU patients per hospitalized patients in the SECIRS-type model +*/ +struct CriticalPerSevere { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "CriticalPerSevere"; + } +}; + +/** +* @brief the percentage of dead patients per ICU patients in the SECIRS-type model +*/ +struct DeathsPerCritical { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.); + } + static std::string name() + { + return "DeathsPerCritical"; + } +}; + +/** + * @brief Time in days between first and second vaccine dose. + */ +struct VaccinationGap { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 49.0); + } + static std::string name() + { + return "VaccinationGap"; + } +}; + +/** + * @brief Time in days until first vaccine dose takes full effect. + */ +struct DaysUntilEffectivePartialVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 14.0); + } + static std::string name() + { + return "DaysUntilEffectivePartialVaccination"; + } +}; + +/** + * @brief Time in days until second vaccine dose takes full effect. + */ +struct DaysUntilEffectiveImprovedVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 7.0); + } + static std::string name() + { + return "DaysUntilEffectiveImprovedVaccination"; + } +}; + +/** + * @brief Time in days until booster vaccine dose takes full effect. + */ +struct DaysUntilEffectiveBoosterImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 7.0); + } + static std::string name() + { + return "DaysUntilEffectiveBoosterImmunity"; + } +}; + +/** +* @brief Total number of first vaccinations up to the given day. +*/ +struct DailyPartialVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type({size, SimulationDay(0)}); + } + static std::string name() + { + return "DailyPartialVaccination"; + } +}; + +/** +* @brief Total number of full vaccinations up to the given day. +*/ +struct DailyFullVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type({size, SimulationDay(0)}); + } + static std::string name() + { + return "DailyFullVaccination"; + } +}; + +/** +* @brief Total number of full vaccinations up to the given day. +*/ +struct DailyBoosterVaccination { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type({size, SimulationDay(0)}); + } + static std::string name() + { + return "DailyBoosterVaccination"; + } +}; + +/** + * @brief Factor to reduce infection risk for persons with partial immunity. + */ +struct ReducExposedPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducExposedPartialImmunity"; + } +}; + +/** + * @brief Factor to reduce infection risk for persons with improved immunity. + */ +struct ReducExposedImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducExposedImprovedImmunity"; + } +}; + +/** + * @brief Factor to reduce risk of developing symptoms for persons with partial immunity. + */ +struct ReducInfectedSymptomsPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducInfectedSymptomsPartialImmunity"; + } +}; + +/** + * @brief Factor to reduce risk of developing symptoms for persons with improved immunity. + */ +struct ReducInfectedSymptomsImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducInfectedSymptomsImprovedImmunity"; + } +}; + +/** + * @brief Factor to reduce risk of hospitalization for persons with partial immunity. + * Also applies to ICU and Death risk. + */ +struct ReducInfectedSevereCriticalDeadPartialImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducInfectedSevereCriticalDeadPartialImmunity"; + } +}; + +/** + * @brief Factor to reduce risk of hospitalization for persons with improved immunity. + */ +struct ReducInfectedSevereCriticalDeadImprovedImmunity { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.); + } + static std::string name() + { + return "ReducInfectedSevereCriticalDeadImprovedImmunity"; + } +}; + +/** + * @brief Factor to reduce infectious time of persons with partial or improved immunity. + */ +struct ReducTimeInfectedMild { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 0.5); + } + static std::string name() + { + return "ReducTimeInfectedMild"; + } +}; + +/** + * @brief Represents the relative infectiousness of a new variant. + */ +struct InfectiousnessNewVariant { + using Type = CustomIndexArray; + static Type get_default(AgeGroup size) + { + return Type(size, 1.0); + } + static std::string name() + { + return "InfectiousnessNewVariant"; + } +}; + +using ParametersBase = + ParameterSet; + +/** + * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over +time. + */ +class Parameters : public ParametersBase +{ +public: + Parameters(AgeGroup num_agegroups) + : ParametersBase(num_agegroups) + , m_num_groups{num_agegroups} + { + } + + AgeGroup get_num_groups() const + { + return m_num_groups; + } + + /** + * Percentage of infected commuters that are not detected. + */ + double& get_commuter_nondetection() + { + return m_commuter_nondetection; + } + double get_commuter_nondetection() const + { + return m_commuter_nondetection; + } + + /** + * Time in simulation before which no infected commuters are detected. + */ + double& get_start_commuter_detection() + { + return m_start_commuter_detection; + } + + double get_start_commuter_detection() const + { + return m_start_commuter_detection; + } + + /** + * Time in simulation after which no infected commuters are detected. + */ + double& get_end_commuter_detection() + { + return m_end_commuter_detection; + } + + double get_end_commuter_detection() const + { + return m_end_commuter_detection; + } + + /** + * Time in simulation after which no dynamic NPIs are applied. + */ + double& get_end_dynamic_npis() + { + return m_end_dynamic_npis; + } + double get_end_dynamic_npis() const + { + return m_end_dynamic_npis; + } + + /** + * @brief Checks whether all Parameters satisfy their corresponding constraints and applies them, if they do not. + * Time spans cannot be negative and probabilities can only take values between [0,1]. + * + * Attention: This function should be used with care. It is necessary for some test problems to run through quickly, + * but in a manual execution of an example, check_constraints() may be preferred. Note that the apply_constraints() + * function can and will not set Parameters to meaningful values in an epidemiological or virological context, + * as all models are designed to be transferable to multiple diseases. Consequently, only acceptable + * (like 0 or 1 for probabilities or small positive values for time spans) values are set here and a manual adaptation + * may often be necessary to have set meaningful values. + * + * @return Returns true if one ore more constraint were corrected, false otherwise. + */ + bool apply_constraints() + { + int corrected = false; + if (this->get() < 0.0 || this->get() > 0.5) { + log_warning("Constraint check: Parameter Seasonality changed from {} to {}", this->get(), 0); + this->set(0); + corrected = true; + } + + if (this->get() < 0.0) { + log_warning("Constraint check: Parameter ICUCapacity changed from {} to {}", this->get(), 0); + this->set(0); + corrected = true; + } + + const double tol_times = 1e-1; // accepted tolerance for compartment stays + + for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeExposed changed from {:.4f} to {:.4f}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeInfectedNoSymptoms changed from {:.4f} to {:.4f}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeInfectedSymptoms changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeInfectedSevere changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeInfectedCritical changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeWaningPartialImmunity changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < tol_times) { + log_warning("Constraint check: Parameter TimeWaningImprovedImmunity changed from {} to {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + this->get()[i] = tol_times; + corrected = true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter TransmissionProbabilityOnContact changed from {} to {} ", + this->get()[i], 0.0); + this->get()[i] = 0.0; + corrected = true; + } + + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter RelativeTransmissionNoSymptoms changed from {} to {} ", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter RecoveredPerInfectedNoSymptoms changed from {} to {} ", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter RiskOfInfectionFromSymptomatic changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter SeverePerInfectedSymptoms changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter CriticalPerSevere changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DaysUntilEffectiveBoosterImmunity changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducExposedPartialImmunity changed from {} to {}", + this->get()[i], 1); + this->get()[i] = 1; + corrected = true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducExposedImprovedImmunity changed from {} to {}", + this->get()[i], 1); + this->get()[i] = 1; + corrected = true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducInfectedSymptomsPartialImmunity changed from {} to {}", + this->get()[i], 1); + this->get()[i] = 1; + corrected = true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducInfectedSymptomsImprovedImmunity changed from {} to {}", + this->get()[i], 1.0); + this->get()[i] = 1.0; + corrected = true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducInfectedSevereCriticalDeadPartialImmunity changed from " + "{} to {}", + this->get()[i], 1.0); + this->get()[i] = 1.0; + corrected = true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducInfectedSevereCriticalDeadImprovedImmunity changed from " + "{} to {}", + this->get()[i], 1.0); + this->get()[i] = 1.0; + corrected = true; + } + if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { + log_warning("Constraint check: Parameter ReducTimeInfectedMild changed from {} to {}", + this->get()[i], 1.0); + this->get()[i] = 1.0; + corrected = true; + } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter InfectiousnessNewVariant changed from {} to {}", + this->get()[i], 1.0); + this->get()[i] = 1.0; + corrected = true; + } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter VaccinationGap changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } + } + return corrected; + } + + /** + * @brief Checks whether all Parameters satisfy their corresponding constraints and logs an error + * if constraints are not satisfied. + * @return Returns true if one constraint is not satisfied, otherwise false. + */ + bool check_constraints() const + { + const double tol_times = 1e-1; // accepted tolerance for compartment stays + if (this->get() < 0.0 || this->get() > 0.5) { + log_error("Constraint check: Parameter m_seasonality smaller {} or larger {}", 0, 0.5); + return true; + } + + if (this->get() < 0.0) { + log_error("Constraint check: Parameter m_icu_capacity smaller {}", 0); + return true; + } + + for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeExposed {:.4f} smaller {:.4f}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeInfectedNoSymptoms {:.4f} smaller {:.4f}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeInfectedSymptoms {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeInfectedSevere {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeInfectedCritical {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeTemporaryImmunityPI {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeTemporaryImmunityII {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeWaningPartialImmunity {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < tol_times) { + log_error("Constraint check: Parameter TimeWaningImprovedImmunity {} smaller {}. Please " + "note that unreasonably small compartment stays lead to massively increased run time. " + "Consider to cancel and reset parameters.", + this->get()[i], tol_times); + return true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter TransmissionProbabilityOnContact smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter RelativeTransmissionNoSymptoms smaller {}", 0); + return true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter RecoveredPerInfectedNoSymptoms smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter RiskOfInfectionFromSymptomatic smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_error("Constraint check: Parameter SeverePerInfectedSymptoms smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_error("Constraint check: Parameter CriticalPerSevere smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + log_error("Constraint check: Parameter DeathsPerCritical smaller {} or larger {}", 0, 1); + return true; + } + + if (this->get()[i] < 1) { + log_error("Constraint check: Parameter VaccinationGap smaller {}", 1); + return true; + } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectivePartialVaccination smaller {}", 0); + return true; + } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); + return true; + } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); + return true; + } + + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducExposedPartialImmunity smaller {} or larger {}", 0, 1); + return true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducExposedImprovedImmunity smaller {} or larger {}", 0, 1); + return true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducInfectedSymptomsPartialImmunity smaller {} or larger {}", 0, + 1); + return true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducInfectedSymptomsImprovedImmunity smaller {} or larger {}", + 0, 1); + return true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducInfectedSevereCriticalDeadPartialImmunity smaller {} or " + "larger {}", + 0, 1); + return true; + } + if (this->get()[i] <= 0.0 || + this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducInfectedSevereCriticalDeadImprovedImmunity smaller {} or " + "larger {}", + 0, 1); + return true; + } + if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { + log_error("Constraint check: Parameter ReducTimeInfectedMild smaller {} or larger {}", 0, 1); + return true; + } + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter InfectiousnessNewVariant smaller {}", 0); + return true; + } + + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter TimeTemporaryImmunityPI smaller {:d}", 0); + return true; + } + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter TimeTemporaryImmunityII smaller {:d}", 0); + return true; + } + } + return false; + } + +private: + Parameters(ParametersBase&& base) + : ParametersBase(std::move(base)) + , m_num_groups(get().get_cont_freq_mat().get_num_groups()) + { + } + +public: + /** + * deserialize an object of this class. + * @see epi::deserialize + */ + template + static IOResult deserialize(IOContext& io) + { + BOOST_OUTCOME_TRY(base, ParametersBase::deserialize(io)); + return success(Parameters(std::move(base))); + } + +private: + AgeGroup m_num_groups; + double m_commuter_nondetection = 0.0; + double m_start_commuter_detection = 0.0; + double m_end_commuter_detection = 0.0; + double m_end_dynamic_npis = 0.0; +}; + +} // namespace osecirts +} // namespace mio + +#endif // ODESECIRTS_PARAMETERS_H diff --git a/cpp/models/ode_secirts/parameters_io.cpp b/cpp/models/ode_secirts/parameters_io.cpp new file mode 100644 index 0000000000..6f8d65c86f --- /dev/null +++ b/cpp/models/ode_secirts/parameters_io.cpp @@ -0,0 +1,476 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "ode_secirts/parameters_io.h" +#include "memilio/geography/regions.h" +#include "memilio/io/io.h" +#include "ode_secirts/parameters.h" + +#ifdef MEMILIO_HAS_JSONCPP + +#include "memilio/io/epi_data.h" +#include "memilio/utils/memory.h" +#include "memilio/utils/uncertain_value.h" +#include "memilio/utils/stl_util.h" +#include "memilio/mobility/graph.h" +#include "memilio/mobility/metapopulation_mobility_instant.h" +#include "memilio/epidemiology/damping.h" +#include "memilio/epidemiology/populations.h" +#include "memilio/epidemiology/uncertain_matrix.h" +#include "memilio/utils/compiler_diagnostics.h" +#include "memilio/utils/date.h" + +#include + +#include +#include +#include +#include +#include +#include + +namespace mio +{ +namespace osecirts +{ +namespace details +{ +//gets the county or state id of the entry if available, 0 (for whole country) otherwise +//used for comparisons of entry to integer region id +template +int get_region_id(const EpiDataEntry& rki_entry) +{ + return rki_entry.county_id ? rki_entry.county_id->get() + : (rki_entry.state_id ? rki_entry.state_id->get() + : (rki_entry.district_id ? rki_entry.district_id->get() : 0)); +} + +IOResult read_confirmed_cases_data( + std::string const& path, std::vector const& vregion, Date date, std::vector>& vnum_Exposed, + std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, + std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, + std::vector>& vnum_death, std::vector>& vnum_timm_i, + const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, + const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, + const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, + const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) +{ + BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); + return read_confirmed_cases_data( + rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, vnum_InfectedSevere, + vnum_icu, vnum_death, vnum_timm_i, vt_Exposed, vt_InfectedNoSymptoms, vt_InfectedSymptoms, vt_InfectedSevere, + vt_InfectedCritical, vt_imm_interval_i, vmu_C_R, vmu_I_H, vmu_H_U, scaling_factor_inf); +} + +IOResult read_confirmed_cases_data( + const std::vector& rki_data, std::vector const& vregion, Date date, + std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, + std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, + std::vector>& vnum_icu, std::vector>& vnum_death, + std::vector>& vnum_timm_i, const std::vector>& vt_Exposed, + const std::vector>& vt_InfectedNoSymptoms, + const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, + const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, + const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) +{ + auto max_date_entry = std::max_element(rki_data.begin(), rki_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == rki_data.end()) { + log_error("RKI data file is empty."); + return failure(StatusCode::InvalidValue, "RKI data is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < date) { + log_error("Specified date does not exist in RKI data"); + return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); + } + + // shifts the initilization to the recent past if simulation starts + // around current day and data of the future would be required. + // Only needed for preinfection compartments, exposed and InfectedNoSymptoms. + auto days_surplus = get_offset_in_days(max_date, date) - 6; // 6 > T_E + T_C + if (days_surplus > 0) { + days_surplus = 0; + } + + for (auto&& entry : rki_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { + return r == 0 || get_region_id(entry) == r; + }); + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + + auto& t_Exposed = vt_Exposed[region_idx]; + auto& t_InfectedNoSymptoms = vt_InfectedNoSymptoms[region_idx]; + auto& t_InfectedSymptoms = vt_InfectedSymptoms[region_idx]; + auto& t_InfectedSevere = vt_InfectedSevere[region_idx]; + auto& t_InfectedCritical = vt_InfectedCritical[region_idx]; + auto& t_imm_interval_i = vt_imm_interval_i[region_idx]; + + auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; + auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_Exposed = vnum_Exposed[region_idx]; + auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; + auto& num_death = vnum_death[region_idx]; + auto& num_icu = vnum_icu[region_idx]; + auto& num_imm = vnum_timm_i[region_idx]; + + auto& mu_C_R = vmu_C_R[region_idx]; + auto& mu_I_H = vmu_I_H[region_idx]; + auto& mu_H_U = vmu_H_U[region_idx]; + + bool read_icu = false; + + auto age = (size_t)entry.age_group; + if (entry.date == offset_date_by_days(date, 0)) { + num_InfectedSymptoms[age] += scaling_factor_inf[age] * entry.num_confirmed; + num_imm[age] += entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, t_InfectedNoSymptoms[age] + days_surplus)) { + num_InfectedNoSymptoms[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; + num_Exposed[age] -= 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, days_surplus)) { + num_InfectedNoSymptoms[age] -= 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, t_Exposed[age] + t_InfectedNoSymptoms[age] + days_surplus)) { + num_Exposed[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms[age])) { + num_InfectedSymptoms[age] -= scaling_factor_inf[age] * entry.num_confirmed; + num_InfectedSevere[age] += mu_I_H[age] * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms[age] - t_InfectedSevere[age])) { + num_InfectedSevere[age] -= mu_I_H[age] * scaling_factor_inf[age] * entry.num_confirmed; + if (read_icu) { + num_icu[age] += mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; + } + } + if (entry.date == + offset_date_by_days(date, -t_InfectedSymptoms[age] - t_InfectedSevere[age] - t_InfectedCritical[age])) { + num_death[age] += entry.num_deaths; + if (read_icu) { + num_icu[age] -= mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; + } + } + if (entry.date == offset_date_by_days(date, 0 - t_imm_interval_i[age])) { + num_imm[age] -= entry.num_confirmed; + } + } + } + + for (size_t region_idx = 0; region_idx < vregion.size(); ++region_idx) { + auto region = vregion[region_idx]; + + auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; + auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_Exposed = vnum_Exposed[region_idx]; + auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; + auto& num_death = vnum_death[region_idx]; + auto& num_icu = vnum_icu[region_idx]; + auto& num_timm_i = vnum_timm_i[region_idx]; + + size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); + for (size_t i = 0; i < num_groups; i++) { + auto try_fix_constraints = [region, i](double& value, double error, auto str) { + if (value < error) { + // this should probably return a failure + // but the algorithm is not robust enough to avoid large negative + // values and there are tests that rely on it + log_error("{:s} for age group {:s} is {:.4f} for region {:d}, " + "exceeds expected negative value.", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + else if (value < 0) { + log_info("{:s} for age group {:s} is {:.4f} for region {:d}, " + "automatically corrected", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + }; + + const double tol_error = -1e-8; + try_fix_constraints(num_InfectedSymptoms[i], tol_error, "InfectedSymptoms"); + try_fix_constraints(num_InfectedNoSymptoms[i], tol_error, "InfectedNoSymptoms"); + try_fix_constraints(num_Exposed[i], tol_error, "Exposed"); + try_fix_constraints(num_InfectedSevere[i], tol_error, "InfectedSevere"); + try_fix_constraints(num_death[i], tol_error, "Dead"); + try_fix_constraints(num_icu[i], tol_error, "InfectedCritical"); + try_fix_constraints(num_timm_i[i], tol_error, "Recently Recovered"); + } + } + + return success(); +} + +IOResult>> read_immunity_population(const std::string& path, + const size_t& num_age_groups) +{ + std::vector> ans(3, std::vector(num_age_groups, 0.0)); + std::fstream immunity_file; + immunity_file.open(path, std::ios::in); + if (immunity_file.fail()) { // checks to see if file opended + return mio::failure(mio::StatusCode::InvalidValue, "Failed to open immunity_population.txt."); + } + if (immunity_file.is_open()) { + std::string tp; + int linenumber = 0; + while (linenumber < 3) { + getline(immunity_file, tp); + // Find the last character that is not a line ending + size_t lastChar = tp.find_last_not_of("\r\n"); + // If such a character was found, reduce the string + if (lastChar != std::string::npos) { + tp = tp.substr(0, lastChar + 1); + } + auto line = split(tp, ' '); + for (size_t i = 0; i < num_age_groups; i++) { + ans[linenumber][i] = std::stod(line[i]); + } + linenumber++; + } + immunity_file.close(); //close the file object. + } + + // assert that the sum of the cols is 1 (tolerance 1-10) + for (size_t i = 0; i < 6; ++i) { + assert(std::abs(ans[0][i] + ans[1][i] + ans[2][i] - 1.0) < 1e-10); + } + + return ans; +} + +IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, + std::vector& vnum_icu) +{ + BOOST_OUTCOME_TRY(divi_data, mio::read_divi_data(path)); + return read_divi_data(divi_data, vregion, date, vnum_icu); +} + +IOResult read_divi_data(const std::vector& divi_data, const std::vector& vregion, Date date, + std::vector& vnum_icu) +{ + auto max_date_entry = std::max_element(divi_data.begin(), divi_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == divi_data.end()) { + log_error("DIVI data is empty."); + return failure(StatusCode::InvalidValue, "DIVI data is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < date) { + log_error("DIVI data does not contain the specified date."); + return failure(StatusCode::OutOfRange, "DIVI data does not contain the specified date."); + } + + for (auto&& entry : divi_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { + return r == 0 || r == get_region_id(entry); + }); + auto date_df = entry.date; + if (it != vregion.end() && date_df == date) { + auto region_idx = size_t(it - vregion.begin()); + vnum_icu[region_idx] = entry.num_icu; + } + } + + return success(); +} + +IOResult>> read_population_data(const std::string& path, + const std::vector& vregion) +{ + BOOST_OUTCOME_TRY(population_data, mio::read_population_data(path)); + return read_population_data(population_data, vregion); +} + +IOResult>> read_population_data(const std::vector& population_data, + const std::vector& vregion) +{ + std::vector> vnum_population( + vregion.size(), std::vector(ConfirmedCasesDataEntry::age_group_names.size(), 0.0)); + + for (auto&& county_entry : population_data) { + //accumulate population of states or country from population of counties + if (!county_entry.county_id && !county_entry.district_id) { + return failure(StatusCode::InvalidFileFormat, "File with county population expected."); + } + //find region that this county belongs to + //all counties belong to the country (id = 0) + auto it = std::find_if(vregion.begin(), vregion.end(), [&county_entry](auto r) { + return r == 0 || + (county_entry.county_id && + regions::StateId(r) == regions::get_state_id(int(*county_entry.county_id))) || + (county_entry.county_id && regions::CountyId(r) == *county_entry.county_id) || + (county_entry.district_id && regions::DistrictId(r) == *county_entry.district_id); + }); + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + auto& num_population = vnum_population[region_idx]; + for (size_t age = 0; age < num_population.size(); age++) { + num_population[age] += county_entry.population[AgeGroup(age)]; + } + } + } + + return success(vnum_population); +} + +IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, + const std::vector& vregion, int num_days) +{ + BOOST_OUTCOME_TRY(vacc_data, read_vaccination_data(path)); + + auto num_groups = model[0].parameters.get_num_groups(); + + auto days_until_effective_n = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto days_until_effective_pi = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto days_until_effective_ii = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; + // iterate over regions (e.g., counties) + for (size_t i = 0; i < model.size(); ++i) { + // iterate over age groups in region + for (auto g = AgeGroup(0); g < num_groups; ++g) { + + model[i].parameters.template get().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get().resize(SimulationDay(num_days + 1)); + for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { + model[i].parameters.template get()[{g, d}] = 0.0; + model[i].parameters.template get()[{g, d}] = 0.0; + model[i].parameters.template get()[{g, d}] = 0.0; + } + } + } + + auto max_date_entry = std::max_element(vacc_data.begin(), vacc_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == vacc_data.end()) { + return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < offset_date_by_days(date, num_days)) { + log_error("Vaccination data does not contain all dates. After the last day the data, vaccinations per day are " + "set to 0."); + } + + for (auto&& vacc_data_entry : vacc_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { + return r == 0 || (vacc_data_entry.county_id && vacc_data_entry.county_id == regions::CountyId(r)) || + (vacc_data_entry.state_id && vacc_data_entry.state_id == regions::StateId(r)) || + (vacc_data_entry.district_id && vacc_data_entry.district_id == regions::DistrictId(r)); + }); + auto date_df = vacc_data_entry.date; + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + AgeGroup age = vacc_data_entry.age_group; + + // initialize the temporary immunity states + if (date_df >= + offset_date_by_days( + date, + static_cast( + -model[region_idx].parameters.template get()[age] - + model[region_idx].parameters.template get()[age])) && + date_df <= + offset_date_by_days( + date, static_cast( + -model[region_idx] + .parameters.template get()[age]))) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += + vacc_data_entry.num_vaccinations_completed; + } + + if (date_df >= + offset_date_by_days( + date, + static_cast( + -model[region_idx].parameters.template get()[age] - + model[region_idx].parameters.template get()[age])) && + date_df <= + offset_date_by_days( + date, static_cast( + -model[region_idx].parameters.template get()[age])) + + ) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + } + + // get daily vaccinations for each layer + for (size_t d = 0; d < (size_t)num_days + 1; ++d) { + auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); + if (max_date >= offset_first_date) { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_partial; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + 0; + } + } + + auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); + if (max_date >= offset_full_date) { + if (date_df == offset_full_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_completed; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = 0; + } + } + + auto offset_booster_date = offset_date_by_days(date, (int)d - days_until_effective_ii); + if (max_date >= offset_booster_date) { + if (date_df == offset_booster_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = + 0; + } + } + } + } + } + return success(); +} + +} // namespace details +} // namespace osecirts +} // namespace mio + +#endif // MEMILIO_HAS_JSONCPP diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h new file mode 100644 index 0000000000..8b7b2c5717 --- /dev/null +++ b/cpp/models/ode_secirts/parameters_io.h @@ -0,0 +1,1242 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#ifndef ODESECIRTS_PARAMETERS_IO_H +#define ODESECIRTS_PARAMETERS_IO_H + +#include "memilio/config.h" + +#ifdef MEMILIO_HAS_JSONCPP + +#include "ode_secirts/model.h" +#include "ode_secirts/analyze_result.h" +#include "memilio/math/eigen_util.h" +#include "memilio/mobility/graph.h" +#include "memilio/mobility/metapopulation_mobility_instant.h" +#include "memilio/io/epi_data.h" +#include "memilio/io/io.h" +#include "memilio/io/json_serializer.h" +#include "memilio/io/result_io.h" +#include "memilio/utils/logging.h" +#include "memilio/utils/date.h" + +namespace mio +{ +namespace osecirts +{ + +namespace details +{ +/** + * @brief Reads subpopulations of infection states from transformed RKI cases file. + * @param path Path to transformed RKI cases file. + * @param vregion vector of keys of the region of interest + * @param date Date for which the arrays are initialized + * @param num_* output vector for number of people in the corresponding compartement + * @param t_* average time it takes to get from one compartement to another (vector with one element per age group) + * @param mu_* probabilities to get from one compartement to another (vector with one element per age group) + * @param scaling_factor_inf Factor for scaling the confirmed cases to account for estimated undetected cases. + * @see mio::read_confirmed_cases_data + * @{ + */ +IOResult read_confirmed_cases_data( + std::string const& path, std::vector const& vregion, Date date, std::vector>& num_Exposed, + std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, + std::vector>& num_InfectedSevere, std::vector>& num_icu, + std::vector>& num_death, std::vector>& vnum_timm_i, + const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, + const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, + const std::vector>& t_InfectedCritical, const std::vector>& vt_imm_interval_i, + const std::vector>& mu_C_R, const std::vector>& mu_I_H, + const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); + +IOResult read_confirmed_cases_data( + const std::vector& rki_data, std::vector const& vregion, Date date, + std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, + std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, + std::vector>& num_icu, std::vector>& num_death, + std::vector>& vnum_timm_i, const std::vector>& t_Exposed, + const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, + const std::vector>& t_InfectedSevere, const std::vector>& t_InfectedCritical, + const std::vector>& vt_imm_interval_i, const std::vector>& mu_C_R, + const std::vector>& mu_I_H, const std::vector>& mu_H_U, + const std::vector& scaling_factor_inf); +/**@}*/ + +IOResult>> read_immunity_population(const std::string& path, + const size_t& num_age_groups); +/**@}*/ + +/** + * @brief sets infected and immun compartment(s) from a transformed RKI cases file into a Model. + * @param model vector of objects in which the data is set + * @param path Path to transformed RKI cases file + * @param region vector of keys of the region of interest + * @param date Date for which the arrays are initialized + * @param scaling_factor_inf factors by which to scale the confirmed cases of + * @param immunity_data_path Path to immunity data file + */ +template +IOResult +set_confirmed_cases_data(std::vector& model, const std::string& path, std::vector const& region, Date date, + const std::vector& scaling_factor_inf, const std::string& immunity_data_path) +{ + auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); + assert(scaling_factor_inf.size() == num_age_groups); //TODO: allow vector or scalar valued scaling factors + assert(ConfirmedCasesDataEntry::age_group_names.size() == num_age_groups); + + BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + + BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); + + std::vector> t_Exposed{model.size()}; + std::vector> t_InfectedNoSymptoms{model.size()}; + std::vector> t_InfectedSymptoms{model.size()}; + std::vector> t_InfectedSevere{model.size()}; + std::vector> t_InfectedCritical{model.size()}; + std::vector> t_imm_interval1{model.size()}; + std::vector> t_imm_interval2{model.size()}; + + std::vector> mu_C_R{model.size()}; + std::vector> mu_I_H{model.size()}; + std::vector> mu_H_U{model.size()}; + + std::vector> num_InfectedSymptoms(model.size()); + std::vector> num_death(model.size()); + std::vector> num_Exposed(model.size()); + std::vector> num_InfectedNoSymptoms(model.size()); + std::vector> num_InfectedSevere(model.size()); + std::vector> num_icu(model.size()); + std::vector> num_timm1(model.size()); + std::vector> num_timm2(model.size()); + + std::vector denom_E(num_age_groups, 0.0); + std::vector denom_I_NS(num_age_groups, 0.0); + std::vector denom_I_Sy(num_age_groups, 0.0); + std::vector denom_I_Sev(num_age_groups, 0.0); + + /*----------- UNVACCINATED -----------*/ + for (size_t county = 0; county < model.size(); county++) { + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); + num_timm1[county] = std::vector(num_age_groups, 0.0); + num_timm2[county] = std::vector(num_age_groups, 0.0); + for (size_t group = 0; group < num_age_groups; group++) { + + t_Exposed[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedSymptoms[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedSevere[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_imm_interval1[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + t_imm_interval2[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + + mu_C_R[county].push_back( + model[county].parameters.template get()[(AgeGroup)group]); + mu_I_H[county].push_back( + model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + + // calculate the denominators to split the reported case numbers to the different immunity layers. + denom_E[group] = + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_NS[group] = + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_Sy[group] = + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get()[(AgeGroup)group]); + + denom_I_Sev[group] = + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county] + .parameters.template get()[(AgeGroup)group] + + immunity_population[2][group] * + model[county] + .parameters.template get()[(AgeGroup)group]); + } + } + + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + + for (size_t county = 0; county < model.size(); county++) { + // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { + size_t num_groups = (size_t)model[county].parameters.get_num_groups(); + for (size_t i = 0; i < num_groups; i++) { + model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = + immunity_population[0][i] * denom_E[i] * num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaive}] = + immunity_population[0][i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaive}] = + immunity_population[0][i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereNaive}] = + immunity_population[0][i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; + } + + // } + if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { + log_warning("No infections for unvaccinated reported on date " + std::to_string(date.year) + "-" + + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + + std::to_string(region[county]) + ". Population data has not been set."); + } + } + + /*----------- PARTIALLY VACCINATED -----------*/ + for (size_t county = 0; county < model.size(); county++) { + t_InfectedNoSymptoms[county].clear(); + t_Exposed[county].clear(); + t_InfectedSymptoms[county].clear(); + t_InfectedSevere[county].clear(); + t_InfectedCritical[county].clear(); + + mu_C_R[county].clear(); + mu_I_H[county].clear(); + mu_H_U[county].clear(); + + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); + for (size_t group = 0; group < num_age_groups; group++) { + + double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; + t_Exposed[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms[county].push_back(static_cast(std::round( + model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSevere[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + + double exp_fac_part_immune = + model[county].parameters.template get()[(AgeGroup)group]; + double inf_fac_part_immune = + model[county].parameters.template get()[(AgeGroup)group]; + double hosp_fac_part_immune = + model[county] + .parameters.template get()[(AgeGroup)group]; + double icu_fac_part_immune = + model[county] + .parameters.template get()[(AgeGroup)group]; + mu_C_R[county].push_back( + (1 - + inf_fac_part_immune / exp_fac_part_immune * + (1 - model[county].parameters.template get()[(AgeGroup)group]))); + mu_I_H[county].push_back( + hosp_fac_part_immune / inf_fac_part_immune * + model[county].parameters.template get()[(AgeGroup)group]); + // transfer from H to U, D unchanged. + mu_H_U[county].push_back(icu_fac_part_immune / hosp_fac_part_immune * + model[county].parameters.template get()[(AgeGroup)group]); + } + } + + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + + for (size_t county = 0; county < model.size(); county++) { + // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { + size_t num_groups = (size_t)model[county].parameters.get_num_groups(); + for (size_t i = 0; i < num_groups; i++) { + model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * + num_InfectedNoSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSeverePartialImmunity}] = + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sev[i] * num_InfectedSevere[county][i]; + // the += is necessary because we already set the previous vaccinated individuals + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += + immunity_population[1][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_timm1[county][i]; + } + // } + if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { + log_warning("No infections for partially vaccinated reported on date " + std::to_string(date.year) + "-" + + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + + std::to_string(region[county]) + ". Population data has not been set."); + } + } + + /*----------- FULLY VACCINATED -----------*/ + for (size_t county = 0; county < model.size(); county++) { + t_InfectedNoSymptoms[county].clear(); + t_Exposed[county].clear(); + t_InfectedSymptoms[county].clear(); + t_InfectedSevere[county].clear(); + t_InfectedCritical[county].clear(); + + mu_C_R[county].clear(); + mu_I_H[county].clear(); + mu_H_U[county].clear(); + + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); + for (size_t group = 0; group < num_age_groups; group++) { + + double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; + t_Exposed[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms[county].push_back(static_cast(std::round( + model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSevere[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + + double reduc_immune_exp = + model[county].parameters.template get()[(AgeGroup)group]; + double reduc_immune_inf = + model[county].parameters.template get()[(AgeGroup)group]; + double reduc_immune_hosp = + model[county] + .parameters.template get()[(AgeGroup)group]; + double reduc_immune_icu = + model[county] + .parameters.template get()[(AgeGroup)group]; + mu_C_R[county].push_back( + (1 - + reduc_immune_inf / reduc_immune_exp * + (1 - model[county].parameters.template get()[(AgeGroup)group]))); + mu_I_H[county].push_back( + reduc_immune_hosp / reduc_immune_inf * + model[county].parameters.template get()[(AgeGroup)group]); + // transfer from H to U, D unchanged. + mu_H_U[county].push_back(reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get()[(AgeGroup)group]); + } + } + + BOOST_OUTCOME_TRY(read_confirmed_cases_data( + rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, + num_death, num_timm2, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, + t_imm_interval2, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + + for (size_t county = 0; county < model.size(); county++) { + // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { + size_t num_groups = (size_t)model[county].parameters.get_num_groups(); + for (size_t i = 0; i < num_groups; i++) { + model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * + num_InfectedNoSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; + model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereImprovedImmunity}] = + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * + denom_I_Sev[i] * num_InfectedSevere[county][i]; + // the += is necessary because we already set the previous vaccinated individuals + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += + immunity_population[2][i] * + model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + num_timm2[county][i]; + } + // } + if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { + log_warning("No infections for vaccinated reported on date " + std::to_string(date.year) + "-" + + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + + std::to_string(region[county]) + ". Population data has not been set."); + } + } + return success(); +} + +/** + * @brief reads number of ICU patients from DIVI register into Parameters + * @param path Path to transformed DIVI file + * @param vregion Keys of the region of interest + * @param date Date for which the arrays are initialized + * @param vnum_icu number of ICU patients + * @see mio::read_divi_data + * @{ + */ +IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, + std::vector& vnum_icu); +IOResult read_divi_data(const std::vector& divi_data, const std::vector& vregion, Date date, + std::vector& vnum_icu); +/**@}*/ + +/** + * @brief sets populations data from DIVI register into Model + * @param model vector of objects in which the data is set + * @param path Path to transformed DIVI file + * @param vregion vector of keys of the regions of interest + * @param date Date for which the arrays are initialized + * @param scaling_factor_icu factor by which to scale the icu cases of divi data + */ +template +IOResult set_divi_data(std::vector& model, const std::string& path, const std::vector& vregion, + Date date, double scaling_factor_icu) +{ + std::vector sum_mu_I_U(vregion.size(), 0); + std::vector> mu_I_U{model.size()}; + for (size_t region = 0; region < vregion.size(); region++) { + auto num_groups = model[region].parameters.get_num_groups(); + for (auto i = AgeGroup(0); i < num_groups; i++) { + sum_mu_I_U[region] += model[region].parameters.template get()[i] * + model[region].parameters.template get()[i]; + mu_I_U[region].push_back(model[region].parameters.template get()[i] * + model[region].parameters.template get()[i]); + } + } + std::vector num_icu(model.size(), 0.0); + BOOST_OUTCOME_TRY(read_divi_data(path, vregion, date, num_icu)); + + for (size_t region = 0; region < vregion.size(); region++) { + auto num_groups = model[region].parameters.get_num_groups(); + for (auto i = AgeGroup(0); i < num_groups; i++) { + model[region].populations[{i, InfectionState::InfectedCriticalNaive}] = + scaling_factor_icu * num_icu[region] * mu_I_U[region][(size_t)i] / sum_mu_I_U[region]; + } + } + + return success(); +} + +/** + * @brief reads population data from census data. + * @param path Path to population data file. + * @param vregion vector of keys of the regions of interest + * @see mio::read_population_data + * @{ + */ +IOResult>> read_population_data(const std::string& path, + const std::vector& vregion); +IOResult>> read_population_data(const std::vector& population_data, + const std::vector& vregion); +/**@}*/ + +template +IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, + const std::string& immunity_data_path) +{ + BOOST_OUTCOME_TRY(num_population, read_population_data(path, vregion)); + + auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); + BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + + for (size_t region = 0; region < vregion.size(); region++) { + if (std::accumulate(num_population[region].begin(), num_population[region].end(), 0.0) > 0) { + auto num_groups = model[region].parameters.get_num_groups(); + for (auto i = AgeGroup(0); i < num_groups; i++) { + + double SN = num_population[region][size_t(i)] * immunity_population[0][size_t(i)]; + double SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; + double SII = num_population[region][size_t(i)] - SN - SPI; + + model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = + SII - (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + + model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]); + + model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::min( + SII, + std::max(0.0, double(model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}]))); + + model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( + 0.0, + SPI - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] - + model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] - + model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] - + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] - + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] - + model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] - + model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] - + model[region].populations[{i, InfectionState::DeadPartialImmunity}] - + model[region].populations[{i, InfectionState::TemporaryImmunPartialImmunity}]); + + model[region].populations.template set_difference_from_group_total( + {i, InfectionState::SusceptibleNaive}, num_population[region][size_t(i)]); + } + + for (auto i = AgeGroup(0); i < AgeGroup(6); i++) { + for (auto j = Index(0); j < InfectionState::Count; ++j) { + if (model[region].populations[{i, j}] < 0) { + log_warning("Compartment at age group {}, infection state {}, is negative: {}", size_t(i), + size_t(j), model[region].populations[{i, j}] / num_population[region][size_t(i)]); + } + } + } + } + else { + log_warning("No population data available for region " + std::to_string(region) + + ". Population data has not been set."); + } + } + + return success(); +} + +IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, + const std::vector& vregion, int num_days); +} // namespace details + +#ifdef MEMILIO_HAS_HDF5 + +/** + * @brief Exports the time series of extrapolated real data according to + * the extrapolation / approximation method used to initialize the model from + * real world data. + (This is the vector-valued functionality of set_confirmed_cases_data()) + * @param model vector of objects in which the data is set + * @param data_dir Path to transformed RKI cases files + * @param results_dir Path to result files + * @param start_date Start date of the time series to be exported. + * @param region vector of keys of the region of interest + * @param scaling_factor_inf Factor for scaling the confirmed cases to account for an estimated number of undetected cases. + * @param scaling_factor_icu Factor for scaling the reported ICU cases to account for possibly unreported ICU cases. + * @param num_days Number of days for which the time series is exported. + * @param divi_data_path path to divi data file + * @param confirmed_cases_path path to confirmed cases file + * @param population_data_path path to population data file + * @param immunity_data_path path to immunity data file + */ +template +IOResult export_input_data_county_timeseries( + const std::vector& model, const std::string& dir, std::vector const& region, Date start_date, + const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, + const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, + const std::string& immunity_data_path) +{ + auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); + BOOST_OUTCOME_TRY(immunity_population, details::read_immunity_population(immunity_data_path, num_age_groups)); + + assert(scaling_factor_inf.size() == num_age_groups); + assert(num_age_groups == ConfirmedCasesDataEntry::age_group_names.size()); + assert(model.size() == region.size()); + + BOOST_OUTCOME_TRY(rki_data, read_confirmed_cases_data(confirmed_cases_path)); + BOOST_OUTCOME_TRY(population_data, read_population_data(population_data_path)); + BOOST_OUTCOME_TRY(divi_data, read_divi_data(divi_data_path)); + + /* functionality copy from set_confirmed_cases_data() here splitted in params */ + /* which do not need to be reset for each day and compartments sizes that are */ + /* set later for each day */ + /*----------- UNVACCINATED -----------*/ + // data needs to be int, because access to data-specific confirmed cases + // is done with these parameters. TODO: Rounding instead + // of casting to int should be introduced in the future. + std::vector> t_InfectedNoSymptoms_n{model.size()}; + std::vector> t_Exposed_n{model.size()}; + std::vector> t_InfectedSymptoms_n{model.size()}; + std::vector> t_InfectedSevere_n{model.size()}; + std::vector> t_InfectedCritical_n{model.size()}; + std::vector> t_imm_interval1{model.size()}; + std::vector> t_imm_interval2{model.size()}; + + std::vector> mu_C_R_n{model.size()}; + std::vector> mu_I_H_n{model.size()}; + std::vector> mu_H_U_n{model.size()}; + // ICU data is not age-resolved. Use a partition of unity defined by + // the age-dependent probability I->H->U divided by the sum over all + // age groups of all of these probabilities. + std::vector sum_mu_I_U_n(model.size(), 0); + std::vector> mu_I_U_n{model.size()}; + + for (size_t county = 0; county < model.size(); county++) { + for (size_t group = 0; group < num_age_groups; group++) { + + t_Exposed_n[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms_n[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedSymptoms_n[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedSevere_n[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical_n[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_imm_interval1[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + t_imm_interval2[county].push_back( + static_cast(model[county].parameters.template get()[(AgeGroup)group])); + + mu_C_R_n[county].push_back( + model[county].parameters.template get()[(AgeGroup)group]); + mu_I_H_n[county].push_back( + model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U_n[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + + /* begin: NOT in set_confirmed_cases_data() */ + sum_mu_I_U_n[county] += model[county].parameters.template get()[AgeGroup(group)] * + model[county].parameters.template get()[AgeGroup(group)]; + mu_I_U_n[county].push_back( + model[county].parameters.template get()[AgeGroup(group)] * + model[county].parameters.template get()[AgeGroup(group)]); + /* end: NOT in set_confirmed_cases_data() */ + } + } + + /*----------- PARTIALLY VACCINATED -----------*/ + // data needs to be int, because access to data-specific confirmed cases + // is done with these parameters. TODO: Rounding instead + // of casting to int should be introduced in the future. + std::vector> t_InfectedNoSymptoms_pi{model.size()}; + std::vector> t_Exposed_pi{model.size()}; + std::vector> t_InfectedSymptoms_pi{model.size()}; + std::vector> t_InfectedSevere_pi{model.size()}; + std::vector> t_InfectedCritical_pi{model.size()}; + + std::vector> mu_C_R_pi{model.size()}; + std::vector> mu_I_H_pi{model.size()}; + std::vector> mu_H_U_pi{model.size()}; + + // ICU data is not age-resolved. Use a partition of unity defined by + // the age-dependent probability I->H->U divided by the sum over all + // age groups of all of these probabilities. + std::vector sum_mu_I_U_pi(model.size(), 0); + std::vector> mu_I_U_pi{model.size()}; + for (size_t county = 0; county < model.size(); county++) { + for (size_t group = 0; group < num_age_groups; group++) { + + double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; + t_Exposed_pi[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms_pi[county].push_back(static_cast(std::round( + model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms_pi[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSevere_pi[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical_pi[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + + double exp_fact_part_immune = + model[county].parameters.template get()[(AgeGroup)group]; + double inf_fact_part_immune = + model[county].parameters.template get()[(AgeGroup)group]; + double hosp_fact_part_immune = + model[county] + .parameters.template get()[(AgeGroup)group]; + double icu_fact_part_immune = + model[county] + .parameters.template get()[(AgeGroup)group]; + mu_C_R_pi[county].push_back( + (1 - + inf_fact_part_immune / exp_fact_part_immune * + (1 - model[county].parameters.template get()[(AgeGroup)group]))); + mu_I_H_pi[county].push_back( + hosp_fact_part_immune / inf_fact_part_immune * + model[county].parameters.template get()[(AgeGroup)group]); + // transfer from H to U, D unchanged. + mu_H_U_pi[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * + model[county].parameters.template get()[(AgeGroup)group]); + + sum_mu_I_U_pi[county] += + icu_fact_part_immune / hosp_fact_part_immune * + model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / + inf_fact_part_immune * + model[county].parameters.template get()[AgeGroup(group)]; + mu_I_U_pi[county].push_back( + icu_fact_part_immune / hosp_fact_part_immune * + model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / + inf_fact_part_immune * + model[county].parameters.template get()[AgeGroup(group)]); + } + } + + /*----------- FULLY VACCINATED -----------*/ + // data needs to be int, because access to data-specific confirmed cases + // is done with these parameters. TODO: Rounding instead + // of casting to int should be introduced in the future. + std::vector> t_InfectedNoSymptoms_ii{model.size()}; + std::vector> t_Exposed_ii{model.size()}; + std::vector> t_InfectedSymptoms_ii{model.size()}; + std::vector> t_InfectedSevere_ii{model.size()}; + std::vector> t_InfectedCritical_ii{model.size()}; + + std::vector> mu_C_R_ii{model.size()}; + std::vector> mu_I_H_ii{model.size()}; + std::vector> mu_H_U_ii{model.size()}; + // ICU data is not age-resolved. Use a partition of unity defined by + // the age-dependent probability I->H->U divided by the sum over all + // age groups of all of these probabilities. + std::vector sum_mu_I_U_ii(model.size(), 0); + std::vector> mu_I_U_ii{model.size()}; + for (size_t county = 0; county < model.size(); county++) { + for (size_t group = 0; group < num_age_groups; group++) { + + double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; + t_Exposed_ii[county].push_back( + static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedNoSymptoms_ii[county].push_back(static_cast(std::round( + model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms_ii[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + t_InfectedSevere_ii[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_InfectedCritical_ii[county].push_back(static_cast( + std::round(model[county].parameters.template get()[(AgeGroup)group]))); + + double reduc_immune_exp = + model[county].parameters.template get()[(AgeGroup)group]; + double reduc_immune_inf = + model[county].parameters.template get()[(AgeGroup)group]; + double reduc_immune_hosp = + model[county] + .parameters.template get()[(AgeGroup)group]; + double reduc_immune_icu = + model[county] + .parameters.template get()[(AgeGroup)group]; + mu_C_R_ii[county].push_back( + (1 - + reduc_immune_inf / reduc_immune_exp * + (1 - model[county].parameters.template get()[(AgeGroup)group]))); + mu_I_H_ii[county].push_back( + reduc_immune_hosp / reduc_immune_inf * + model[county].parameters.template get()[(AgeGroup)group]); + // transfer from H to U, D unchanged. + mu_H_U_ii[county].push_back(reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get()[(AgeGroup)group]); + + sum_mu_I_U_ii[county] += + reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / + reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]; + mu_I_U_ii[county].push_back( + reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / + reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]); + } + } + std::vector> extrapolated_rki( + model.size(), TimeSeries::zero(num_days + 1, (size_t)InfectionState::Count * num_age_groups)); + + for (size_t day = 0; day <= static_cast(num_days); day++) { + auto date = offset_date_by_days(start_date, int(day)); + + // unvaccinated + std::vector> num_Exposed_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_n(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptoms_n(model.size(), std::vector(num_age_groups, 0.0)); + // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! + std::vector> num_InfectedNoSymptomsConfirmed_n(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptomsConfirmed_n(model.size(), + std::vector(num_age_groups, 0.0)); + // end TODO + std::vector> num_InfectedSevere_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_death_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> dummy_icu(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> dummy_timm(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_timm1(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_timm2(model.size(), std::vector(num_age_groups, 0.0)); + BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( + rki_data, region, date, num_Exposed_n, num_InfectedNoSymptoms_n, num_InfectedSymptoms_n, + num_InfectedSevere_n, dummy_icu, num_death_n, dummy_timm, t_Exposed_n, t_InfectedNoSymptoms_n, + t_InfectedSymptoms_n, t_InfectedSevere_n, t_InfectedCritical_n, t_imm_interval1, mu_C_R_n, mu_I_H_n, + mu_H_U_n, scaling_factor_inf)); + + // partially vaccinated + std::vector> num_Exposed_pi(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_pi(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptoms_pi(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_pi(model.size(), std::vector(num_age_groups, 0.0)); + // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! + std::vector> num_InfectedNoSymptomsConfirmed_pi(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptomsConfirmed_pi(model.size(), + std::vector(num_age_groups, 0.0)); + // end TODO + std::vector> dummy_death(model.size(), std::vector(num_age_groups, 0.0)); + for (size_t county = 0; county < model.size(); county++) { + dummy_death[county] = std::vector(num_age_groups, 0.0); + dummy_icu[county] = std::vector(num_age_groups, 0.0); + } + BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( + rki_data, region, date, num_Exposed_pi, num_InfectedNoSymptoms_pi, num_InfectedSymptoms_pi, + num_InfectedSevere_pi, dummy_icu, dummy_death, num_timm1, t_Exposed_pi, t_InfectedNoSymptoms_pi, + t_InfectedSymptoms_pi, t_InfectedSevere_pi, t_InfectedCritical_pi, t_imm_interval1, mu_C_R_pi, mu_I_H_pi, + mu_H_U_pi, scaling_factor_inf)); + + // fully vaccinated + std::vector> num_Exposed_ii(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_ii(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptoms_ii(model.size(), + std::vector(num_age_groups, 0.0)); + // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! + std::vector> num_InfectedNoSymptomsConfirmed_ii(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptomsConfirmed_ii(model.size(), + std::vector(num_age_groups, 0.0)); + // end TODO + std::vector> num_InfectedSevere_ii(model.size(), std::vector(num_age_groups, 0.0)); + for (size_t county = 0; county < model.size(); county++) { + dummy_death[county] = std::vector(num_age_groups, 0.0); + dummy_icu[county] = std::vector(num_age_groups, 0.0); + } + BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( + rki_data, region, date, num_Exposed_ii, num_InfectedNoSymptoms_ii, num_InfectedSymptoms_ii, + num_InfectedSevere_ii, dummy_icu, dummy_death, num_timm2, t_Exposed_ii, t_InfectedNoSymptoms_ii, + t_InfectedSymptoms_ii, t_InfectedSevere_ii, t_InfectedCritical_ii, t_imm_interval2, mu_C_R_ii, mu_I_H_ii, + mu_H_U_ii, scaling_factor_inf)); + + // ICU only read for compartment InfectionState::InfectedCritical and then distributed later + std::vector dummy_icu2(model.size(), 0.0); + BOOST_OUTCOME_TRY(details::read_divi_data(divi_data, region, date, dummy_icu2)); + + std::vector> num_icu(model.size(), std::vector(num_age_groups, 0.0)); + for (size_t county = 0; county < region.size(); county++) { + for (size_t age = 0; age < num_age_groups; age++) { + num_icu[county][age] = + scaling_factor_icu * dummy_icu2[county] * mu_I_U_n[county][age] / sum_mu_I_U_n[county]; + } + } + + // read population basics + BOOST_OUTCOME_TRY(num_population, details::read_population_data(population_data, region)); + + for (size_t county = 0; county < region.size(); county++) { + if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { + for (size_t age = 0; age < num_age_groups; age++) { + auto age_group_offset = age * (size_t)InfectionState::Count; + double SN = num_population[county][size_t(age)] * immunity_population[0][size_t(age)]; + double SPI = num_population[county][size_t(age)] * immunity_population[1][size_t(age)]; + double SII = num_population[county][size_t(age)] - SN - SPI; + + double denom_E = + 1 / + (SN + + SPI * model[county].parameters.template get()[AgeGroup(age)] + + SII * model[county].parameters.template get()[AgeGroup(age)]); + double denom_C = + 1 / + (SN + + SPI * model[county].parameters.template get()[AgeGroup(age)] + + SII * model[county].parameters.template get()[AgeGroup(age)]); + double denom_I = + 1 / + (SN + + SPI * model[county] + .parameters.template get()[AgeGroup(age)] + + SII * model[county] + .parameters.template get()[AgeGroup(age)]); + double denom_HU = + 1 / (SN + + SPI * model[county] + .parameters + .template get()[AgeGroup(age)] + + SII * model[county] + .parameters + .template get()[AgeGroup(age)]); + + extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) = + SN * denom_E * num_Exposed_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) = + SPI * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) = + SII * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + age_group_offset) = + SN * denom_C * num_InfectedNoSymptoms_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + + age_group_offset) = + SPI * denom_C * num_InfectedNoSymptoms_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + + age_group_offset) = + SII * denom_C * num_InfectedNoSymptoms_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaiveConfirmed + + age_group_offset) = + SN * denom_C * num_InfectedNoSymptomsConfirmed_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + + age_group_offset) = + SPI * denom_C * num_InfectedNoSymptomsConfirmed_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + + age_group_offset) = + SII * denom_C * num_InfectedNoSymptomsConfirmed_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) = + SN * denom_I * num_InfectedSymptoms_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + age_group_offset) = + SPI * + model[county].parameters.template get()[AgeGroup(age)] * + denom_I * num_InfectedSymptoms_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + age_group_offset) = + SII * + model[county].parameters.template get()[AgeGroup(age)] * + denom_I * num_InfectedSymptoms_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + + age_group_offset) = + SN * denom_I * num_InfectedSymptomsConfirmed_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + + age_group_offset) = + SPI * + model[county].parameters.template get()[AgeGroup(age)] * + denom_I * num_InfectedSymptomsConfirmed_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + + age_group_offset) = + SII * + model[county].parameters.template get()[AgeGroup(age)] * + denom_I * num_InfectedSymptomsConfirmed_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) = + SN * denom_HU * num_InfectedSevere_n[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + + age_group_offset) = + SPI * + model[county] + .parameters.template get()[AgeGroup(age)] * + denom_HU * num_InfectedSevere_pi[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + + age_group_offset) = + SII * + model[county] + .parameters.template get()[AgeGroup(age)] * + denom_HU * num_InfectedSevere_ii[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) = + SN * denom_HU * num_icu[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + + age_group_offset) = + SPI * + model[county] + .parameters.template get()[AgeGroup(age)] * + denom_HU * num_icu[county][age]; + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + + age_group_offset) = + SII * + model[county] + .parameters.template get()[AgeGroup(age)] * + denom_HU * num_icu[county][age]; + + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunPartialImmunity + + age_group_offset) = + num_timm1[county][age] * immunity_population[0][size_t(age)]; + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + + age_group_offset) = + num_timm2[county][age] * immunity_population[1][size_t(age)] + + immunity_population[2][size_t(age)] * immunity_population[2][size_t(age)]; + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + + age_group_offset) = + SII - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + + age_group_offset) = + std::min( + SII - (extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)), + std::max(0.0, + double(extrapolated_rki[county][day]( + (size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset)))); + + ///////////////// + extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + + age_group_offset) = + SPI - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + + age_group_offset) = + std::min(SPI, std::max(0.0, double(extrapolated_rki[county][day]( + (size_t)InfectionState::SusceptiblePartialImmunity + + age_group_offset)))); + + ///////////////// + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = + SPI - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = + std::min(SN, std::max(0.0, double(extrapolated_rki[county][day]( + (size_t)InfectionState::SusceptibleNaive + age_group_offset)))); + + // in set_confirmed_cases_data initilization, deaths are now set to 0. In order to visualize + // the extrapolated real number of deaths, they have to be set here. In the comparison of data + // it has to be paid attention to the fact, the the simulation starts with deaths=0 + // while this method starts with deaths=number of reported deaths so far... + // Additionally, we set the number of reported deaths to DeadNaive since no information on that is + // available here. + // Do only add deaths after substraction. + extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) = + num_death_n[county][age]; + } + } + else { + log_warning("No population data available for region " + std::to_string(county) + + ". Population data has not been set."); + } + } + log_info("extrapolated real data for date: {}-{}-{}", date.day, date.month, date.year); + } + /* end: similar functionality in set_confirmed_cases_data(), here only for vector of TimeSeries */ + auto num_groups = (int)(size_t)model[0].parameters.get_num_groups(); + BOOST_OUTCOME_TRY(save_result(extrapolated_rki, region, num_groups, path_join(dir, "Results_rki.h5"))); + + auto extrapolated_rki_data_sum = sum_nodes(std::vector>>{extrapolated_rki}); + BOOST_OUTCOME_TRY( + save_result({extrapolated_rki_data_sum[0][0]}, {0}, num_groups, path_join(dir, "Results_rki_sum.h5"))); + + return success(); +} + +template +IOResult export_input_data_county_timeseries( + std::vector&& model, const std::string& dir, std::vector const& region, Date date, + const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, + const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, + bool set_vaccination_data, const std::string& vaccination_data_path, const std::string& immunity_data_path) +{ + if (set_vaccination_data) { + BOOST_OUTCOME_TRY(details::set_vaccination_data(model, vaccination_data_path, date, region, num_days)); + } + + BOOST_OUTCOME_TRY(export_input_data_county_timeseries( + model, dir, region, date, scaling_factor_inf, scaling_factor_icu, num_days, divi_data_path, + confirmed_cases_path, population_data_path, immunity_data_path)); + + return success(); +} + +#endif //MEMILIO_HAS_HDF5 + +/** + * Reads compartments for German counties at a specified date from data files. + * Estimates all compartments from available data using the model parameters, so the + * model parameters must be set before calling this function. + * Uses data files that contain centered 7-day moving average. + * @param model Vector of SECIRS-type models, one per county. + * @param date Date for which the data should be read. + * @param county Ids of the counties. + * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. + * @param scaling_factor_icu Factor of ICU cases to account for underreporting. + * @param dir Directory that contains the data files. + * @param num_days Number of days to be simulated; required to load data for vaccinations during the simulation. + * @param export_time_series If true, reads data for each day of simulation and writes it in the same directory as the input files. + */ +template +IOResult read_input_data_county(std::vector& model, Date date, const std::vector& county, + const std::vector& scaling_factor_inf, double scaling_factor_icu, + const std::string& dir, int num_days, bool export_time_series = false) +{ + BOOST_OUTCOME_TRY(details::set_vaccination_data( + model, path_join(dir, "pydata/Germany", "all_county_ageinf_vacc_ma7.json"), date, county, num_days)); + + // TODO: Reuse more code, e.g., set_divi_data (in secir) and a set_divi_data (here) only need a different ModelType. + // TODO: add option to set ICU data from confirmed cases if DIVI or other data is not available. + if (date > Date(2020, 4, 23)) { + BOOST_OUTCOME_TRY(details::set_divi_data(model, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), + county, date, scaling_factor_icu)); + } + else { + log_warning("No DIVI data available for this date"); + } + + BOOST_OUTCOME_TRY(details::set_confirmed_cases_data( + model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf, + path_join(dir, "pydata/Germany", "immunity_population.txt"))); + BOOST_OUTCOME_TRY( + details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), county, + path_join(dir, "pydata/Germany", "immunity_population.txt"))); + + if (export_time_series) { + // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! + // Run time equals run time of the previous functions times the num_days ! + // (This only represents the vectorization of the previous function over all simulation days...) + log_warning("Exporting time series of extrapolated real data. This may take some minutes. " + "For simulation runs over the same time period, deactivate it."); + BOOST_OUTCOME_TRY( + export_input_data_county_timeseries(model, dir, county, date, scaling_factor_inf, scaling_factor_icu, + num_days, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), + path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), + path_join(dir, "pydata/Germany", "county_current_population.json"), + path_join(dir, "pydata/Germany", "immunity_population.txt"))); + } + + return success(); +} + +/** + * Reads compartments for German counties at a specified date from data files. + * Estimates all compartments from available data using the model parameters, so the + * model parameters must be set before calling this function. + * Uses data files that contain centered 7-day moving average. + * @param model Vector of SECIRS-type models, one per county. + * @param date Date for which the data should be read. + * @param county Ids of the counties. + * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. + * @param scaling_factor_icu Factor of ICU cases to account for underreporting. + * @param dir Directory that contains the data files. + * @param num_days Number of days to be simulated; required to load data for vaccinations during the simulation. + * @param export_time_series If true, reads data for each day of simulation and writes it in the same directory as the input files. + */ +template +IOResult read_input_data(std::vector& model, Date date, const std::vector& node_ids, + const std::vector& scaling_factor_inf, double scaling_factor_icu, + const std::string& data_dir, int num_days, bool export_time_series = false) +{ + + BOOST_OUTCOME_TRY( + details::set_vaccination_data(model, path_join(data_dir, "vaccination_data.json"), date, node_ids, num_days)); + + // TODO: Reuse more code, e.g., set_divi_data (in secir) and a set_divi_data (here) only need a different ModelType. + // TODO: add option to set ICU data from confirmed cases if DIVI or other data is not available. + if (date > Date(2020, 4, 23)) { + BOOST_OUTCOME_TRY(details::set_divi_data(model, path_join(data_dir, "critical_cases.json"), node_ids, date, + scaling_factor_icu)); + } + else { + log_warning("No DIVI data available for this date"); + } + + BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, + date, scaling_factor_inf, + path_join(data_dir, "immunity_population.txt"))); + BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, + path_join(data_dir, "immunity_population.txt"))); + + if (export_time_series) { + // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! + // Run time equals run time of the previous functions times the num_days ! + // (This only represents the vectorization of the previous function over all simulation days...) + log_warning("Exporting time series of extrapolated real data. This may take some minutes. " + "For simulation runs over the same time period, deactivate it."); + BOOST_OUTCOME_TRY(export_input_data_county_timeseries( + model, data_dir, node_ids, date, scaling_factor_inf, scaling_factor_icu, num_days, + path_join(data_dir, "critical_cases.json"), path_join(data_dir, "confirmed_cases.json"), + path_join(data_dir, "population_data.json"), path_join(data_dir, "immunity_population.txt"))); + } + + return success(); +} + +} // namespace osecirts +} // namespace mio + +#endif // MEMILIO_HAS_JSONCPP + +#endif // ODESECIRTS_PARAMETERS_IO_H diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index e30b6f52e2..364f64631a 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -14,6 +14,7 @@ set(TESTSOURCES test_damping.cpp test_odesecir.cpp test_odesecirvvs.cpp + test_odesecirts.cpp test_mobility.cpp test_date.cpp test_eigen_util.cpp @@ -84,7 +85,7 @@ endif() add_executable(memilio-test ${TESTSOURCES}) target_include_directories(memilio-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(memilio-test PRIVATE memilio ode_secir ode_seir ode_secirvvs ide_seir ide_secir lct_secir abm gtest_main) +target_link_libraries(memilio-test PRIVATE memilio ode_secir ode_seir ode_secirvvs ode_secirts ide_seir ide_secir lct_secir abm gtest_main) target_compile_options(memilio-test PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) # make unit tests find the test data files diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp new file mode 100644 index 0000000000..efd2b4e510 --- /dev/null +++ b/cpp/tests/test_odesecirts.cpp @@ -0,0 +1,1294 @@ +/* +* Copyright (C) 2020-2024 MEmilio +* +* Authors: Daniel Abele +* +* Contact: Martin J. Kuehn +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "matchers.h" +#include "temp_file_register.h" +#include "test_data_dir.h" +#include "memilio/data/analyze_result.h" +#include "memilio/epidemiology/contact_matrix.h" +#include "memilio/epidemiology/damping.h" +#include "memilio/epidemiology/damping_sampling.h" +#include "memilio/epidemiology/simulation_day.h" +#include "memilio/io/io.h" +#include "memilio/io/result_io.h" +#include "memilio/mobility/graph.h" +#include "memilio/utils/stl_util.h" +#include "memilio/epidemiology/age_group.h" +#include "memilio/mobility/metapopulation_mobility_instant.h" +#include "memilio/utils/custom_index_array.h" +#include "memilio/utils/parameter_distributions.h" +#include "memilio/utils/parameter_set.h" +#include "memilio/utils/random_number_generator.h" +#include "memilio/utils/uncertain_value.h" +#include "ode_secirts/infection_state.h" +#include "ode_secirts/model.h" +#include "ode_secirts/parameter_space.h" +#include "ode_secirts/parameters.h" +#include "ode_secirts/parameters_io.h" +#include "ode_secirts/analyze_result.h" + +#include "gtest/gtest.h" +#include "gmock/gmock-matchers.h" +#include +#include +#include + +TEST(TestOdeSECIRTS, simulateDefault) +{ + double t0 = 0; + double tmax = 1; + double dt = 0.1; + + mio::osecirts::Model model(1); + model.populations.set_total(10); + model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirts::InfectionState::SusceptibleNaive}, + 10); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); + mio::TimeSeries result = simulate(t0, tmax, dt, model); + + EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); +} + +TEST(TestOdeSECIRTS, overflow_vaccinations) +{ + const double t0 = 0; + const double tmax = 1; + const double dt = 1; + + // init simple model + mio::osecirts::Model model(1); + model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleNaive}] = 10.; + model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptiblePartialImmunity}] = 10.; + model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleImprovedImmunity}] = 10.; + model.parameters.get()[mio::AgeGroup(0)] = 0.0; + + // set vaccination rates higher than total population for each layer + const size_t daily_vaccinations = 100; + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + for (size_t i = 0; i <= tmax; ++i) { + auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + num_vaccinations; + } + + // simulate one step with explicit Euler + auto integrator = std::make_shared(); + auto result = simulate_flows(t0, tmax, dt, model, integrator); + + // get the flow indices for each type of vaccination and also the indices of the susceptible compartments + auto flow_indx_partial_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + auto flow_indx_full_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + auto flow_indx_booster_vaccination = + model.get_flat_flow_index({mio::AgeGroup(0)}); + auto indx_S_naive = + model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleNaive}); + auto indx_S_partial = + model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptiblePartialImmunity}); + auto indx_S_improved = model.populations.get_flat_index( + {mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleImprovedImmunity}); + + // check that the number of vaccinated people is never higher than the total number of susceptible people + EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(0)[indx_S_naive], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(0)[indx_S_partial], 1e-10); + EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(0)[indx_S_improved], + 1e-10); +} + +TEST(TestOdeSECIRTS, smooth_vaccination_rate) +{ + const ScalarType tmax = 2.; + + // init simple model + mio::osecirts::Model model(1); + auto& daily_vaccinations = model.parameters.get(); + daily_vaccinations.resize(mio::SimulationDay(tmax + 1)); + + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(1)}] = 10; + daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(2)}] = 110; + + const auto eps1 = 0.15; + + // test when t is out of the range + Eigen::VectorXd result = model.vaccinations_at(5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 0, 1e-12); + + // test when t i below the lower bound + result = model.vaccinations_at(0.5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 10, 1e-12); + + result = model.vaccinations_at(1.5, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 100, 1e-12); + + // test when t is withing the range of the smoothing + result = model.vaccinations_at(0.85, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 10.0, 1e-12); + + result = model.vaccinations_at(0.90, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 32.5, 1e-12); + + result = model.vaccinations_at(0.95, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 77.5, 1e-12); + + result = model.vaccinations_at(1.0, daily_vaccinations, eps1); + EXPECT_NEAR(result[0], 100.0, 1e-12); + + // Test also with a different epsilon + const auto eps2 = 0.4; + result = model.vaccinations_at(0.6, daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 10.0, 1e-12); + + result = model.vaccinations_at(0.8, daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 55, 1e-12); + + result = model.vaccinations_at(1., daily_vaccinations, eps2); + EXPECT_NEAR(result[0], 100.0, 1e-12); +} + +void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) +{ + auto invalid_initial = max == 0 ? 1.0 : max * 1.001; + auto valid_initial = (max + min) * 0.5; + auto initial = set_invalid_initial_value ? invalid_initial : valid_initial; + p = mio::UncertainValue(initial); + p.set_distribution(mio::ParameterDistributionUniform(min, max)); +} + +template +void array_assign_uniform_distribution(mio::CustomIndexArray& array, + const double (&min)[N], const double (&max)[N], bool set_invalid_initial_value) +{ + for (auto i = mio::AgeGroup(0); i < array.size(); ++i) { + assign_uniform_distribution(array[i], min[size_t(i)], max[size_t(i)], set_invalid_initial_value); + } +} + +void array_assign_uniform_distribution(mio::CustomIndexArray& array, double min, + double max, bool set_invalid_initial_value) +{ + for (auto i = mio::AgeGroup(0); i < array.size(); ++i) { + assign_uniform_distribution(array[i], min, max, set_invalid_initial_value); + } +} + +void set_synthetic_population_data(mio::osecirts::Model::Populations& populations, bool set_invalid_initial_value) +{ + for (mio::AgeGroup i = 0; i < mio::get(populations.size()); i++) { + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::ExposedNaive}], 10, 20, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::ExposedImprovedImmunity}], 10, 21, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::ExposedPartialImmunity}], 10, 22, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaive}], 1, 10, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity}], + 2, 10, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity}], + 3, 10, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaive}], 4, 10, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}], 5, + 10, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}], + 6, 10, set_invalid_initial_value); + + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}], + 5, 11, set_invalid_initial_value); + assign_uniform_distribution( + populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}], 5, 12, + set_invalid_initial_value); + assign_uniform_distribution( + populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}], 5, 13, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed}], 5, + 14, set_invalid_initial_value); + assign_uniform_distribution( + populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed}], 5, 15, + set_invalid_initial_value); + assign_uniform_distribution( + populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}], 5, 16, + set_invalid_initial_value); + + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSevereNaive}], 1, 2, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSevereImprovedImmunity}], 1, + 3, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedSeverePartialImmunity}], 1, + 4, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedCriticalNaive}], 1, 5, + set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedCriticalPartialImmunity}], 1, + 6, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::InfectedCriticalImprovedImmunity}], + 1, 7, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::SusceptibleImprovedImmunity}], 200, + 300, set_invalid_initial_value); + assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::SusceptiblePartialImmunity}], 200, + 400, set_invalid_initial_value); + populations.set_difference_from_group_total({i, mio::osecirts::InfectionState::SusceptibleNaive}, + 1000); + } +} + +void set_demographic_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) +{ + assign_uniform_distribution(parameters.get(), 20, 50, set_invalid_initial_value); + assign_uniform_distribution(parameters.get(), 100, 200, + set_invalid_initial_value); + parameters.get().resize(mio::SimulationDay(size_t(1000))); + parameters.get().array().setConstant(5); + parameters.get().resize(mio::SimulationDay(size_t(1000))); + parameters.get().array().setConstant(3); + parameters.get().resize(mio::SimulationDay(size_t(1000))); + parameters.get().array().setConstant(3); +} + +void set_contact_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) +{ + auto& contacts = parameters.get(); + auto& contact_matrix = contacts.get_cont_freq_mat(); + contact_matrix[0].get_baseline().setConstant(0.5); + contact_matrix[0].get_baseline().diagonal().setConstant(5.0); + contact_matrix[0].add_damping(0.3, mio::SimulationTime(5.0)); + + auto& npis = parameters.get(); + auto npi_groups = Eigen::VectorXd::Ones(contact_matrix[0].get_num_groups()); + auto npi_value = mio::UncertainValue(0.5); + assign_uniform_distribution(npi_value, 0.25, 0.75, set_invalid_initial_value); + npis.set_threshold(10.0, {mio::DampingSampling(npi_value, mio::DampingLevel(0), mio::DampingType(0), + mio::SimulationTime(0), {0}, npi_groups)}); + npis.set_base_value(100'000); + npis.set_interval(mio::SimulationTime(3.0)); + npis.set_duration(mio::SimulationTime(14.0)); + parameters.get_end_dynamic_npis() = 10.0; //required for dynamic NPIs to have effect in this model +} + +void set_covid_parameters(mio::osecirts::Model::ParameterSet& params, bool set_invalid_initial_value) +{ + //times + const double timeExposedMin = 2.67; + const double timeExposedMax = 4.; + const double timeInfectedNoSymptomsMin = 1.2; + const double timeInfectedNoSymptomsMax = 2.53; + const double timeInfectedSymptomsMin[] = {5.6255, 5.6255, 5.6646, 5.5631, 5.501, 5.465}; + const double timeInfectedSymptomsMax[] = {8.427, 8.427, 8.4684, 8.3139, 8.169, 8.085}; + const double timeInfectedSevereMin[] = {3.925, 3.925, 4.85, 6.4, 7.2, 9.}; + const double timeInfectedSevereMax[] = {6.075, 6.075, 7., 8.7, 9.8, 13.}; + const double timeInfectedCriticalMin[] = {4.95, 4.95, 4.86, 14.14, 14.4, 10.}; + const double timeInfectedCriticalMax[] = {8.95, 8.95, 8.86, 20.58, 19.8, 13.2}; + + array_assign_uniform_distribution(params.get(), timeExposedMin, timeExposedMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), timeInfectedNoSymptomsMin, + timeInfectedNoSymptomsMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), timeInfectedSymptomsMin, + timeInfectedSymptomsMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), timeInfectedSevereMin, + timeInfectedSevereMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), timeInfectedCriticalMin, + timeInfectedCriticalMax, set_invalid_initial_value); + + //probabilities + double fac_variant = 1.4; + const double transmissionProbabilityOnContactMin[] = {0.02 * fac_variant, 0.05 * fac_variant, 0.05 * fac_variant, + 0.05 * fac_variant, 0.08 * fac_variant, 0.1 * fac_variant}; + + const double transmissionProbabilityOnContactMax[] = {0.04 * fac_variant, 0.07 * fac_variant, 0.07 * fac_variant, + 0.07 * fac_variant, 0.10 * fac_variant, 0.15 * fac_variant}; + const double relativeTransmissionNoSymptomsMin = 0.5; + const double relativeTransmissionNoSymptomsMax = 0.5; + // The precise value between Risk* (situation under control) and MaxRisk* (situation not under control) + // depends on incidence and test and trace capacity + const double riskOfInfectionFromSymptomaticMin = 0.0; + const double riskOfInfectionFromSymptomaticMax = 0.2; + const double maxRiskOfInfectionFromSymptomaticMin = 0.4; + const double maxRiskOfInfectionFromSymptomaticMax = 0.5; + const double recoveredPerInfectedNoSymptomsMin[] = {0.2, 0.2, 0.15, 0.15, 0.15, 0.15}; + const double recoveredPerInfectedNoSymptomsMax[] = {0.3, 0.3, 0.25, 0.25, 0.25, 0.25}; + const double severePerInfectedSymptomsMin[] = {0.006, 0.006, 0.015, 0.049, 0.15, 0.20}; + const double severePerInfectedSymptomsMax[] = {0.009, 0.009, 0.023, 0.074, 0.18, 0.25}; + const double criticalPerSevereMin[] = {0.05, 0.05, 0.05, 0.10, 0.25, 0.35}; + const double criticalPerSevereMax[] = {0.10, 0.10, 0.10, 0.20, 0.35, 0.45}; + const double deathsPerCriticalMin[] = {0.00, 0.00, 0.10, 0.10, 0.30, 0.5}; + const double deathsPerCriticalMax[] = {0.10, 0.10, 0.18, 0.18, 0.50, 0.7}; + + const double reducExposedPartialImmunityMin = 0.75; + const double reducExposedPartialImmunityMax = 0.85; + const double reducExposedImprovedImmunityMin = 0.281; + const double reducExposedImprovedImmunityMax = 0.381; + const double reducInfectedSymptomsPartialImmunityMin = 0.6; + const double reducInfectedSymptomsPartialImmunityMax = 0.7; + const double reducInfectedSymptomsImprovedImmunityMin = 0.193; + const double reducInfectedSymptomsImprovedImmunityMax = 0.293; + const double reducInfectedSevereCriticalDeadPartialImmunityMin = 0.05; + const double reducInfectedSevereCriticalDeadPartialImmunityMax = 0.15; + const double reducInfectedSevereCriticalDeadImprovedImmunityMin = 0.041; + const double reducInfectedSevereCriticalDeadImprovedImmunityMax = 0.141; + const double reducTimeInfectedMildMin = 0.8; + const double reducTimeInfectedMildMax = 1.0; + + array_assign_uniform_distribution(params.get(), + transmissionProbabilityOnContactMin, transmissionProbabilityOnContactMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + relativeTransmissionNoSymptomsMin, relativeTransmissionNoSymptomsMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + riskOfInfectionFromSymptomaticMin, riskOfInfectionFromSymptomaticMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + maxRiskOfInfectionFromSymptomaticMin, maxRiskOfInfectionFromSymptomaticMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + recoveredPerInfectedNoSymptomsMin, recoveredPerInfectedNoSymptomsMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + severePerInfectedSymptomsMin, severePerInfectedSymptomsMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), criticalPerSevereMin, + criticalPerSevereMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), deathsPerCriticalMin, + deathsPerCriticalMax, set_invalid_initial_value); + + array_assign_uniform_distribution(params.get(), + reducExposedPartialImmunityMin, reducExposedPartialImmunityMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + reducExposedImprovedImmunityMin, reducExposedImprovedImmunityMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + reducInfectedSymptomsPartialImmunityMin, reducInfectedSymptomsPartialImmunityMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + reducInfectedSymptomsImprovedImmunityMin, + reducInfectedSymptomsImprovedImmunityMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + reducInfectedSevereCriticalDeadPartialImmunityMin, + reducInfectedSevereCriticalDeadPartialImmunityMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), + reducInfectedSevereCriticalDeadImprovedImmunityMin, + reducInfectedSevereCriticalDeadImprovedImmunityMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get(), reducTimeInfectedMildMin, + reducTimeInfectedMildMax, set_invalid_initial_value); + + //sasonality + const double seasonality_min = 0.1; + const double seasonality_max = 0.3; + + assign_uniform_distribution(params.get(), seasonality_min, seasonality_max, + set_invalid_initial_value); +} + +mio::osecirts::Model make_model(int num_age_groups, bool set_invalid_initial_value = false) +{ + assert(num_age_groups <= 6 && "Provide more values in functions above to test more age groups."); + mio::osecirts::Model model(num_age_groups); + set_covid_parameters(model.parameters, set_invalid_initial_value); + set_synthetic_population_data(model.populations, set_invalid_initial_value); + set_demographic_parameters(model.parameters, set_invalid_initial_value); + set_contact_parameters(model.parameters, set_invalid_initial_value); + model.parameters.apply_constraints(); + return model; +} + +TEST(TestOdeSECIRTS, draw_sample_graph) +{ + mio::log_thread_local_rng_seeds(mio::LogLevel::warn); + + mio::Graph graph; + + auto num_age_groups = 6; + //create model with invalid initials so the test fails if no sampling is done + graph.add_node(0, make_model(num_age_groups, /*set_invalid_initial_value*/ true)); + graph.add_node(0, make_model(num_age_groups, /*set_invalid_initial_value*/ true)); + graph.add_edge(0, 1, Eigen::VectorXd::Constant(num_age_groups, num_age_groups)); + + auto sampled_graph = mio::osecirts::draw_sample(graph); + + ASSERT_EQ(sampled_graph.nodes().size(), graph.nodes().size()); + ASSERT_EQ(sampled_graph.edges().size(), graph.edges().size()); + + // spot check for sampling + auto& parameters0 = sampled_graph.nodes()[0].property.parameters; + auto& populations0 = sampled_graph.nodes()[0].property.populations; + auto& timeInfectedCritical = parameters0.get()[mio::AgeGroup(1)]; + ASSERT_GE(double(timeInfectedCritical), 4.95); + ASSERT_LE(double(timeInfectedCritical), 8.95); + auto& param_exp_factor = parameters0.get()[mio::AgeGroup(0)]; + ASSERT_GE(double(param_exp_factor), 0.75); + ASSERT_LE(double(param_exp_factor), 0.85); + auto& compartment_inf = + populations0[{mio::AgeGroup(2), mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}]; + ASSERT_GE(double(compartment_inf), 5.0); + ASSERT_LE(double(compartment_inf), 10.0); + auto& npi_value = + parameters0.get().get_thresholds()[0].second[0].get_value(); + ASSERT_GE(double(npi_value), 0.25); + ASSERT_LE(double(npi_value), 0.75); + + // special cases + ASSERT_NEAR(populations0.get_total(), 1000 * num_age_groups, 1e-2); + ASSERT_TRUE((parameters0.get().array(), + parameters0.get().array() * 1.0) //using high variant + .all()); + + // spot check for parameters that should be equal or different between nodes + auto& parameters1 = sampled_graph.nodes()[1].property.parameters; + auto& populations1 = sampled_graph.nodes()[1].property.populations; + ASSERT_EQ(parameters1.get().get_thresholds()[0].second[0].get_value(), + parameters0.get().get_thresholds()[0].second[0].get_value()); + ASSERT_TRUE((parameters1.get().array() == + parameters0.get().array()) + .all()); + //these could fail in very(!) rare cases if they are randomly sampled to the same value + ASSERT_NE(parameters1.get(), parameters0.get()) + << "Failure might be spurious, check RNG seeds."; + ASSERT_FALSE((populations1.array() == populations0.array()).all()) << "Failure might be spurious, check RNG seeds."; +} + +TEST(TestOdeSECIRTS, draw_sample_model) +{ + mio::log_thread_local_rng_seeds(mio::LogLevel::warn); + + auto num_age_groups = 6; + auto model = make_model(num_age_groups, /*set_invalid_initial_value*/ true); + mio::osecirts::draw_sample(model); + + // spot check for sampling + auto& parameters = model.parameters; + auto& populations = model.populations; + auto& timeInfectedCritical = parameters.get()[mio::AgeGroup(1)]; + ASSERT_GE(double(timeInfectedCritical), 4.95); + ASSERT_LE(double(timeInfectedCritical), 8.95); + auto& param_exp_factor = parameters.get()[mio::AgeGroup(0)]; + ASSERT_GE(double(param_exp_factor), 0.75); + ASSERT_LE(double(param_exp_factor), 0.85); + auto& compartment_inf = + populations[{mio::AgeGroup(2), mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}]; + ASSERT_GE(double(compartment_inf), 5.0); + ASSERT_LE(double(compartment_inf), 10.0); + + // special cases + ASSERT_NEAR(populations.get_total(), 1000 * num_age_groups, 1e-2); + ASSERT_TRUE((parameters.get().array(), + parameters.get().array() * 1.0) + .all()); +} + +TEST(TestOdeSECIRTS, checkPopulationConservation) +{ + auto num_age_groups = 2; + auto model = make_model(num_age_groups); + auto num_days = 30; + + auto result = mio::osecirts::simulate(0, num_days, 0.1, model); + + double num_persons = 0.0; + for (auto i = 0; i < result.get_last_value().size(); i++) { + EXPECT_GE(result.get_last_value()[i], -1e-3); + num_persons += result.get_last_value()[i]; + } + EXPECT_NEAR(num_persons, model.populations.get_total(), 1e-10); +} + +#if defined(MEMILIO_HAS_HDF5) && defined(MEMILIO_HAS_JSONCPP) + +TEST(TestOdeSECIRTS, read_confirmed_cases) +{ + auto num_age_groups = 6; //reading data requires RKI data age groups + auto model = std::vector({make_model(num_age_groups)}); + std::vector region{1002}; + auto path = mio::path_join(TEST_DATA_DIR, "pydata/Germany/cases_all_county_age_ma7.json"); + std::vector> t_Exposed(1); + std::vector> t_InfectedNoSymptoms(1); + std::vector> t_InfectedSymptoms(1); + std::vector> t_InfectedSevere(1); + std::vector> t_InfectedCritical(1); + std::vector> t_imm_interval1(1); + + std::vector> mu_C_R(1); + std::vector> mu_I_H(1); + std::vector> mu_H_U(1); + + std::vector> num_InfectedSymptoms(1); + std::vector> num_death(1); + std::vector> num_timm(1); + std::vector> num_Exposed(1); + std::vector> num_InfectedNoSymptoms(1); + std::vector> num_InfectedSevere(1); + std::vector> num_icu(1); + + num_InfectedSymptoms[0] = std::vector(num_age_groups, 0.0); + num_death[0] = std::vector(num_age_groups, 0.0); + num_timm[0] = std::vector(num_age_groups, 0.0); + num_Exposed[0] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[0] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[0] = std::vector(num_age_groups, 0.0); + num_icu[0] = std::vector(num_age_groups, 0.0); + for (size_t group = 0; group < static_cast(num_age_groups); group++) { + + t_Exposed[0].push_back(static_cast( + std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_InfectedNoSymptoms[0].push_back(static_cast(std::round( + model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_InfectedSymptoms[0].push_back(static_cast( + std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_InfectedSevere[0].push_back(static_cast( + std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_InfectedCritical[0].push_back(static_cast( + std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + t_imm_interval1[0].push_back(static_cast(std::round( + model[0].parameters.template get()[(mio::AgeGroup)group]))); + + mu_C_R[0].push_back( + model[0].parameters.template get()[(mio::AgeGroup)group]); + mu_I_H[0].push_back( + model[0].parameters.template get()[(mio::AgeGroup)group]); + mu_H_U[0].push_back(model[0].parameters.template get()[(mio::AgeGroup)group]); + } + + auto read = mio::osecirts::details::read_confirmed_cases_data( + path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, + num_icu, num_death, num_timm, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); + + ASSERT_THAT(read, IsSuccess()); +} + +TEST(TestOdeSECIRTS, read_data) +{ + auto num_age_groups = 6; //reading data requires RKI data age groups + auto model1 = std::vector({make_model(num_age_groups)}); + auto model2 = std::vector({make_model(num_age_groups)}); + auto model3 = std::vector({make_model(num_age_groups)}); + + auto read_result1 = mio::osecirts::read_input_data_county( + model1, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), 1.0, TEST_DATA_DIR, 10); + + auto read_result2 = mio::osecirts::read_input_data( + model2, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), 1.0, TEST_DATA_DIR, 10); + + auto read_result_district = + mio::osecirts::read_input_data(model3, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), + 1.0, mio::path_join(TEST_DATA_DIR, "pydata/District"), 10); + + ASSERT_THAT(read_result1, IsSuccess()); + ASSERT_THAT(read_result2, IsSuccess()); + ASSERT_THAT(read_result_district, IsSuccess()); + + // values were generated by the tested function; can only check stability of the implementation, not correctness + auto expected_values = + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 410.72, 3630.45, + 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 2893.07, 0, 0, 0, 2652.78, 714.319, 763.188, 8032.87, + 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, 0.0132265, + 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 5916.15, 0, 0, 0, 3658.05, 799.805, 5554.16, 43483, 5.32163, + 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, 0.56467, 0.071343, + 0.0777408, 0.0753594, 3.5, 4, 21861.8, 0, 0, 0, 2589.83, 845.38, 6617.66, 48070, 5.33096, 40.6794, 9.01336, + 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, 1.78101, 0.218787, 0.234499, 0.487853, + 3.5, 4, 24154, 0, 0, 0, 3367.68, 774.244, 1528.03, 21414.7, 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, + 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, 0.328498, 2.61775, 3.5, 4, 16069.9, 0, + 0, 0, 4038.53, 836.776, 144.225, 1979.35, 0.22575, 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, + 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, 0.146922, 4.75954, 3.5, 4, 8288.72, 0, 0, 0, + 4447.91, 823.157) + .finished(); + + ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), + MatrixNear(print_wrap(model2[0].populations.array().cast()), 1e-5, 1e-5)); + + ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), + MatrixNear(print_wrap(model3[0].populations.array().cast()), 1e-5, 1e-5)); + + ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), + MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); + ASSERT_THAT(print_wrap(model2[0].populations.array().cast()), + MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); + ASSERT_THAT(print_wrap(model3[0].populations.array().cast()), + MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); + + // some more tests which are actually not necessary but can help if the previous tests fails or needs to get changed + for (mio::AgeGroup i = 0; i < model1[0].parameters.get_num_groups(); i++) { + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaive}]), 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaive}]), 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaive}]), 0); + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaive}]), 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaive}]), 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaive}]), 0); + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity}]), + 0); + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}]), + 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity}]), 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity}]), 0); + + // currently dead and confirmed after commuting compartments are initialized as zero + EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), + 0); + EXPECT_EQ(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), + 0); + EXPECT_EQ(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), + 0); + EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed}]), 0); + EXPECT_EQ(double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed}]), 0); + EXPECT_EQ(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed}]), 0); + EXPECT_EQ( + double( + model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double(model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model2[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model3[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model1[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model2[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ( + double( + model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}]), + 0); + EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::DeadNaive}]), 0); + EXPECT_EQ(double(model2[0].populations[{i, mio::osecirts::InfectionState::DeadNaive}]), 0); + EXPECT_EQ(double(model3[0].populations[{i, mio::osecirts::InfectionState::DeadNaive}]), 0); + EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::DeadPartialImmunity}]), 0); + EXPECT_EQ(double(model2[0].populations[{i, mio::osecirts::InfectionState::DeadPartialImmunity}]), 0); + EXPECT_EQ(double(model3[0].populations[{i, mio::osecirts::InfectionState::DeadPartialImmunity}]), 0); + EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::DeadImprovedImmunity}]), 0); + EXPECT_EQ(double(model2[0].populations[{i, mio::osecirts::InfectionState::DeadImprovedImmunity}]), 0); + EXPECT_EQ(double(model3[0].populations[{i, mio::osecirts::InfectionState::DeadImprovedImmunity}]), 0); + } +} + +TEST(TestOdeSECIRTS, export_time_series_init) +{ + TempFileRegister temp_file_register; + auto tmp_results_dir = temp_file_register.get_unique_path(); + ASSERT_THAT(mio::create_directory(tmp_results_dir), IsSuccess()); + + auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups + auto model = make_model(num_age_groups); + + // Test exporting time series + ASSERT_THAT(mio::osecirts::export_input_data_county_timeseries( + std::vector{model}, tmp_results_dir, {0}, {2020, 12, 01}, + std::vector(size_t(num_age_groups), 1.0), 1.0, 2, + mio::path_join(TEST_DATA_DIR, "county_divi_ma7.json"), + mio::path_join(TEST_DATA_DIR, "cases_all_county_age_ma7.json"), + mio::path_join(TEST_DATA_DIR, "county_current_population.json"), true, + mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json"), + mio::path_join(TEST_DATA_DIR, "immunity_population.txt")), + IsSuccess()); + + auto data_extrapolated = mio::read_result(mio::path_join(tmp_results_dir, "Results_rki.h5")); + ASSERT_THAT(data_extrapolated, IsSuccess()); + + // Values were generated by the tested function export_input_data_county_timeseries; + // can only check stability of the implementation, not correctness + auto expected_results = + mio::read_result(mio::path_join(TEST_DATA_DIR, "export_time_series_initialization_osecirts.h5")).value(); + + ASSERT_THAT(print_wrap(data_extrapolated.value()[0].get_groups().matrix()), + MatrixNear(print_wrap(expected_results[0].get_groups().matrix()), 1e-5, 1e-5)); +} + +// Model initialization should return same start values as export time series on that day +TEST(TestOdeSECIRTS, model_initialization) +{ + auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups + auto model = make_model(num_age_groups); + // Vector assignment necessary as read_input_data_county changes model + auto model_vector = std::vector{model}; + + ASSERT_THAT(mio::osecirts::read_input_data_county(model_vector, {2020, 12, 01}, {0}, + std::vector(size_t(num_age_groups), 1.0), 1.0, + TEST_DATA_DIR, 2, false), + IsSuccess()); + + // Values from data/export_time_series_init_osecirts.h5, for reading in comparison + // operator for return of mio::read_result and model population needed. + auto expected_values = + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 138748, 2.11327e+06, + 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 1.21334e+06, 0, 0, 0, 2652.78, 714.319, 309974, + 4.7235e+06, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, + 0.0132265, 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 2.71151e+06, 0, 0, 0, 3658.05, 799.805, 1.44128e+06, + 1.19121e+07, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, + 0.56467, 0.071343, 0.0777408, 0.0753594, 3.5, 4, 5.86047e+06, 0, 0, 0, 2589.83, 845.38, 2.40269e+06, + 1.86176e+07, 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, + 1.78101, 0.218787, 0.234499, 0.487853, 3.5, 4, 9.00942e+06, 0, 0, 0, 3367.68, 774.244, 578004, 9.57445e+06, + 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, + 0.223414, 0.328498, 2.61775, 3.5, 4, 6.35731e+06, 0, 0, 0, 4038.53, 836.776, 61810.3, 2.53029e+06, 0.22575, + 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, + 0.046887, 0.146922, 4.75954, 3.5, 4, 3.58492e+06, 0, 0, 0, 4447.91, 823.157) + .finished(); + + ASSERT_THAT(print_wrap(model_vector[0].populations.array().cast()), + MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); +} + +TEST(TestOdeSECIRTS, run_simulation) +{ + auto num_age_groups = 3; + auto model = make_model(num_age_groups); + auto num_days = 30; + + auto result = mio::osecirts::simulate(0, num_days, 0.1, model); + result = mio::interpolate_simulation_result(result); // Reduce influence of time steps chosen by the integrator. + + // Load result of a previous run; only tests stability, not correctness. + auto expected_result = + mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirts.h5")).value()[0].get_groups(); + + ASSERT_THAT(print_wrap(result.matrix()), MatrixNear(print_wrap(expected_result.matrix()), 1e-5, 1e-5)); +} + +#endif + +TEST(TestOdeSECIRTS, parameter_percentiles) +{ + mio::log_thread_local_rng_seeds(mio::LogLevel::warn); + + //build small graph + auto model = make_model(5); + auto graph = mio::Graph(); + graph.add_node(0, model); + + //sample a few times + auto sampled_graphs = std::vector>(); + std::generate_n(std::back_inserter(sampled_graphs), 10, [&graph]() { + return mio::osecirts::draw_sample(graph); + }); + + //extract nodes from graph + auto sampled_nodes = std::vector>(); + std::transform(sampled_graphs.begin(), sampled_graphs.end(), std::back_inserter(sampled_nodes), [](auto&& g) { + auto models = std::vector(); + std::transform(g.nodes().begin(), g.nodes().end(), std::back_inserter(models), [](auto&& n) { + return n.property; + }); + return models; + }); + + //compute percentiles + auto percentile_params = mio::osecirts::ensemble_params_percentile(sampled_nodes, 0.6)[0].parameters; + + //spot check parameters + auto p = double(percentile_params.get()[mio::AgeGroup(2)]); + auto samples = std::vector(); + std::transform(sampled_nodes.begin(), sampled_nodes.end(), std::back_inserter(samples), + [](const std::vector& nodes) { + return nodes[0].parameters.get()[mio::AgeGroup(2)]; + }); + + std::nth_element(samples.begin(), samples.begin() + 6, samples.end()); + ASSERT_THAT(p, samples[6]); + + p = double(percentile_params.get()[mio::AgeGroup(2)]); + samples = std::vector(); + std::transform(sampled_nodes.begin(), sampled_nodes.end(), std::back_inserter(samples), + [](const std::vector& nodes) { + return nodes[0].parameters.get()[mio::AgeGroup(2)]; + }); + std::nth_element(samples.begin(), samples.begin() + 6, samples.end()); + ASSERT_THAT(p, samples[6]); +} + +TEST(TestOdeSECIRTS, get_infections_relative) +{ + auto model = make_model(2); + auto sim = mio::osecirts::Simulation<>(model); + auto y = sim.get_result()[0]; + + auto relative_infections = get_infections_relative(sim, 0.0, y); + + // see model population init to obtain sum 105=2*(7+7.5+8+9.5+10+10.5) + ASSERT_DOUBLE_EQ(relative_infections, 105 / model.populations.get_total()); +} + +TEST(TestOdeSECIRTS, get_migration_factors) +{ + auto num_age_groups = 2; + auto model = make_model(num_age_groups); + auto sim = mio::osecirts::Simulation<>(model); + auto y = sim.get_result()[0]; + + auto migration_factors = get_migration_factors(sim, 0.0, y); + + auto expected_values = (Eigen::VectorXd(Eigen::Index(mio::osecirts::InfectionState::Count) * num_age_groups) << 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + .finished(); + ASSERT_THAT(print_wrap(migration_factors), MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); +} + +TEST(TestOdeSECIRTS, test_commuters) +{ + auto model = make_model(2); + auto migration_factor = 0.1; + auto non_detection_factor = 0.3; + model.parameters.get_start_commuter_detection() = 0.0; + model.parameters.get_end_commuter_detection() = 20.0; + model.parameters.get_commuter_nondetection() = non_detection_factor; + auto sim = mio::osecirts::Simulation<>(model); + auto before_testing = sim.get_result().get_last_value().eval(); + auto migrated = (sim.get_result().get_last_value() * migration_factor).eval(); + auto migrated_tested = migrated.eval(); + + test_commuters(sim, migrated_tested, 0.0); + + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaive)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaive)] * non_detection_factor, + 1e-5); + ASSERT_NEAR( + sim.get_result().get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaiveConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaive)] * (1 - non_detection_factor), + 1e-5); + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity)] * + non_detection_factor, + 1e-5); + ASSERT_NEAR( + sim.get_result() + .get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsPartialImmunityConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsPartialImmunity)] * + (1 - non_detection_factor), + 1e-5); + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity)] * + non_detection_factor, + 1e-5); + ASSERT_NEAR( + sim.get_result() + .get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunityConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity)] * + (1 - non_detection_factor), + 1e-5); + + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsNaive)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsNaive)] * non_detection_factor, + 1e-5); + ASSERT_NEAR(sim.get_result() + .get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsNaive)] * + (1 - non_detection_factor), + 1e-5); + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity)] * + non_detection_factor, + 1e-5); + ASSERT_NEAR( + sim.get_result() + .get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsPartialImmunity)] * + (1 - non_detection_factor), + 1e-5); + ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity)], + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity)] * + non_detection_factor, + 1e-5); + ASSERT_NEAR( + sim.get_result() + .get_last_value()[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed)], + before_testing[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed)] + + migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedNoSymptomsImprovedImmunity)] * + (1 - non_detection_factor), + 1e-5); +} + +TEST(TestOdeSECIRTS, check_constraints_parameters) +{ + auto model = mio::osecirts::Model(1); + ASSERT_EQ(model.parameters.check_constraints(), 0); + + mio::set_log_level(mio::LogLevel::off); + model.parameters.set(-0.2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.2); + model.parameters.set(-2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(2); + model.parameters.set(-2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(2); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(5); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(2); + model.parameters.set(-1); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(2); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(10.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(90.); + model.parameters.set(-20.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(90.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(100.); + model.parameters.set(0.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(200); + model.parameters.set(2.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-1.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(3.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-0.8); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-0.1); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-1.0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(1.1); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(0.2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(2); + model.parameters.set(-2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(7); + model.parameters.set(-0.2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(7); + model.parameters.set(-2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(7); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-0.2); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(0.); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-4); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(-4); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(0.5); + model.parameters.set(0); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set(1); + model.parameters.set(-4); + ASSERT_EQ(model.parameters.check_constraints(), 1); + + mio::set_log_level(mio::LogLevel::warn); +} + +TEST(TestOdeSECIRTS, apply_constraints_parameters) +{ + const double tol_times = 1e-1; + auto model = mio::osecirts::Model(1); + auto indx_agegroup = mio::AgeGroup(0); + EXPECT_EQ(model.parameters.apply_constraints(), 0); + + mio::set_log_level(mio::LogLevel::off); + + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get(), 0); + + model.parameters.set(-2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get(), 0); + + model.parameters.set(-2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(1e-10); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + + model.parameters.set(2.0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_NEAR(model.parameters.get()[indx_agegroup], 0.0, 1e-14); + + model.parameters.set(-1.0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(3.0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-0.8); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-0.1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-1.0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(1.1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(-0.2); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(0.); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(-4); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(-4); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(0); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + model.parameters.set(-4); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + + mio::set_log_level(mio::LogLevel::warn); +} + +TEST(TestOdeSECIRTS, apply_variant_function) +{ + auto model = mio::osecirts::Model(1); + model.parameters.set(0.2); + + model.parameters.set(0); + model.parameters.set(10); + model.parameters.set(2.0); + auto sim = mio::osecirts::Simulation<>(model); + + // test that the transmission probability is not changed due to calling the advance function + sim.advance(0.01); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.2, 1e-10); + + // test if the transmission probability is set to the correct value after applying the variant. + // The referece values are calculated using equation (36) in doi.org/10.1371/journal.pcbi.1010054 + auto base_infectiousness = sim.get_model().parameters.get(); + + // however, the parameter should stay unchanged if the new variant is not present in the population. + sim.apply_variant(0, base_infectiousness); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.2, 1e-10); + + sim.apply_variant(9, base_infectiousness); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.2, 1e-10); + + sim.apply_variant(10, base_infectiousness); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.99 * base_infectiousness[mio::AgeGroup(0)] + + 0.01 * base_infectiousness[mio::AgeGroup(0)] * + sim.get_model().parameters.get()[mio::AgeGroup(0)], + 1e-10); + + sim.apply_variant(45, base_infectiousness); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.68 * base_infectiousness[mio::AgeGroup(0)] + + 0.32 * base_infectiousness[mio::AgeGroup(0)] * + sim.get_model().parameters.get()[mio::AgeGroup(0)], + 1e-10); + + sim.apply_variant(1000, base_infectiousness); + EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], + 0.4, 1e-10); +} \ No newline at end of file From 4b4e685cf404c31740bad96c33839d68a9581423 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 May 2024 08:38:52 +0200 Subject: [PATCH 26/60] reset changes vvs, adjust tests, naming --- cpp/CMakeLists.txt | 1 + cpp/examples/ode_secirvvs.cpp | 4 +- cpp/models/ode_secirts/analyze_result.h | 2 +- cpp/models/ode_secirts/parameters.h | 2 +- cpp/models/ode_secirts/parameters_io.cpp | 8 +- cpp/models/ode_secirts/parameters_io.h | 19 +- cpp/models/ode_secirvvs/analyze_result.h | 10 +- cpp/models/ode_secirvvs/infection_state.h | 4 +- cpp/models/ode_secirvvs/model.h | 261 +++--- cpp/models/ode_secirvvs/parameter_space.cpp | 98 +-- cpp/models/ode_secirvvs/parameter_space.h | 2 +- cpp/models/ode_secirvvs/parameters.h | 255 +----- cpp/models/ode_secirvvs/parameters_io.cpp | 253 +++--- cpp/models/ode_secirvvs/parameters_io.h | 808 ++++++++++-------- cpp/simulations/CMakeLists.txt | 7 +- cpp/tests/CMakeLists.txt | 2 +- cpp/tests/test_epi_data_io.cpp | 28 +- cpp/tests/test_odesecirts.cpp | 6 + cpp/tests/test_odesecirvvs.cpp | 371 ++++---- .../examples/simulation/osecirvvs_simple.py | 4 +- .../memilio/simulation_test/test_osecirvvs.py | 4 +- 21 files changed, 953 insertions(+), 1196 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index e7a3306c24..8a82e73bbd 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -118,6 +118,7 @@ add_subdirectory(memilio) if(MEMILIO_BUILD_MODELS) add_subdirectory(models/abm) add_subdirectory(models/ode_secir) + add_subdirectory(models/ode_secirts) add_subdirectory(models/ode_secirvvs) add_subdirectory(models/lct_secir) add_subdirectory(models/ide_secir) diff --git a/cpp/examples/ode_secirvvs.cpp b/cpp/examples/ode_secirvvs.cpp index 03a791e8c4..c6500979c9 100644 --- a/cpp/examples/ode_secirvvs.cpp +++ b/cpp/examples/ode_secirvvs.cpp @@ -67,11 +67,11 @@ int main() model.parameters.get() = 100; model.parameters.get() = 0.0143; const size_t daily_vaccinations = 10; - model.parameters.get().resize(mio::SimulationDay((size_t)tmax + 1)); + model.parameters.get().resize(mio::SimulationDay((size_t)tmax + 1)); model.parameters.get().resize(mio::SimulationDay((size_t)tmax + 1)); for (size_t i = 0; i < tmax + 1; ++i) { auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index 12a766b15f..eb97e0dd6b 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -29,7 +29,7 @@ namespace mio { -namespace osecirvvs +namespace osecirts { /** * @brief computes the p percentile of the parameters for each node. diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index f710b216e5..b55cea5af1 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -1192,7 +1192,7 @@ class Parameters : public ParametersBase template static IOResult deserialize(IOContext& io) { - BOOST_OUTCOME_TRY(base, ParametersBase::deserialize(io)); + BOOST_OUTCOME_TRY(auto&& base, ParametersBase::deserialize(io)); return success(Parameters(std::move(base))); } diff --git a/cpp/models/ode_secirts/parameters_io.cpp b/cpp/models/ode_secirts/parameters_io.cpp index 6f8d65c86f..7f82c61d17 100644 --- a/cpp/models/ode_secirts/parameters_io.cpp +++ b/cpp/models/ode_secirts/parameters_io.cpp @@ -73,7 +73,7 @@ IOResult read_confirmed_cases_data( const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) { - BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); + BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); return read_confirmed_cases_data( rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, vnum_InfectedSevere, vnum_icu, vnum_death, vnum_timm_i, vt_Exposed, vt_InfectedNoSymptoms, vt_InfectedSymptoms, vt_InfectedSevere, @@ -264,7 +264,7 @@ IOResult>> read_immunity_population(const std::s IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, std::vector& vnum_icu) { - BOOST_OUTCOME_TRY(divi_data, mio::read_divi_data(path)); + BOOST_OUTCOME_TRY(auto&& divi_data, mio::read_divi_data(path)); return read_divi_data(divi_data, vregion, date, vnum_icu); } @@ -301,7 +301,7 @@ IOResult read_divi_data(const std::vector& divi_data, const std IOResult>> read_population_data(const std::string& path, const std::vector& vregion) { - BOOST_OUTCOME_TRY(population_data, mio::read_population_data(path)); + BOOST_OUTCOME_TRY(auto&& population_data, mio::read_population_data(path)); return read_population_data(population_data, vregion); } @@ -340,7 +340,7 @@ IOResult>> read_population_data(const std::vecto IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, const std::vector& vregion, int num_days) { - BOOST_OUTCOME_TRY(vacc_data, read_vaccination_data(path)); + BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); auto num_groups = model[0].parameters.get_num_groups(); diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 8b7b2c5717..a99aae4dd1 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -101,9 +101,9 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std assert(scaling_factor_inf.size() == num_age_groups); //TODO: allow vector or scalar valued scaling factors assert(ConfirmedCasesDataEntry::age_group_names.size() == num_age_groups); - BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + BOOST_OUTCOME_TRY(auto&& immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); - BOOST_OUTCOME_TRY(rki_data, mio::read_confirmed_cases_data(path)); + BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); std::vector> t_Exposed{model.size()}; std::vector> t_InfectedNoSymptoms{model.size()}; @@ -491,10 +491,10 @@ template IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, const std::string& immunity_data_path) { - BOOST_OUTCOME_TRY(num_population, read_population_data(path, vregion)); + BOOST_OUTCOME_TRY(auto&& num_population, read_population_data(path, vregion)); auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); - BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + BOOST_OUTCOME_TRY(auto&& immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); for (size_t region = 0; region < vregion.size(); region++) { if (std::accumulate(num_population[region].begin(), num_population[region].end(), 0.0) > 0) { @@ -583,15 +583,16 @@ IOResult export_input_data_county_timeseries( const std::string& immunity_data_path) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); - BOOST_OUTCOME_TRY(immunity_population, details::read_immunity_population(immunity_data_path, num_age_groups)); + BOOST_OUTCOME_TRY(auto&& immunity_population, + details::read_immunity_population(immunity_data_path, num_age_groups)); assert(scaling_factor_inf.size() == num_age_groups); assert(num_age_groups == ConfirmedCasesDataEntry::age_group_names.size()); assert(model.size() == region.size()); - BOOST_OUTCOME_TRY(rki_data, read_confirmed_cases_data(confirmed_cases_path)); - BOOST_OUTCOME_TRY(population_data, read_population_data(population_data_path)); - BOOST_OUTCOME_TRY(divi_data, read_divi_data(divi_data_path)); + BOOST_OUTCOME_TRY(auto&& rki_data, read_confirmed_cases_data(confirmed_cases_path)); + BOOST_OUTCOME_TRY(auto&& population_data, read_population_data(population_data_path)); + BOOST_OUTCOME_TRY(auto&& divi_data, read_divi_data(divi_data_path)); /* functionality copy from set_confirmed_cases_data() here splitted in params */ /* which do not need to be reset for each day and compartments sizes that are */ @@ -872,7 +873,7 @@ IOResult export_input_data_county_timeseries( } // read population basics - BOOST_OUTCOME_TRY(num_population, details::read_population_data(population_data, region)); + BOOST_OUTCOME_TRY(auto&& num_population, details::read_population_data(population_data, region)); for (size_t county = 0; county < region.size(); county++) { if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index 0f7a2dfe9f..6d6f874649 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -22,7 +22,6 @@ #include "ode_secirvvs/model.h" #include "memilio/data/analyze_result.h" -#include "ode_secirvvs/parameters.h" #include #include @@ -66,7 +65,6 @@ std::vector ensemble_params_percentile(const std::vector().resize(num_days); percentile[node].parameters.template get().resize(num_days); - percentile[node].parameters.template get().resize(num_days); for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { //Population @@ -149,11 +147,11 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get()[i]; }); for (auto day = SimulationDay(0); day < num_days; ++day) { @@ -165,10 +163,6 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get()[{i, day}]; }); - param_percentil( - node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get()[{i, day}]; - }); } //virus variants param_percentil( diff --git a/cpp/models/ode_secirvvs/infection_state.h b/cpp/models/ode_secirvvs/infection_state.h index 93b171ff79..1b475288e4 100644 --- a/cpp/models/ode_secirvvs/infection_state.h +++ b/cpp/models/ode_secirvvs/infection_state.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -62,8 +62,6 @@ enum class InfectionState DeadNaive, DeadPartialImmunity, DeadImprovedImmunity, - TemporaryImmunPartialImmunity, - TemporaryImmunImprovedImmunity, Count }; diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 8300b9953a..18d5d92d62 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -1,7 +1,7 @@ /* -* * Copyright (C) 2020-2024 MEmilio +* Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -37,63 +37,52 @@ namespace osecirvvs using Flows = TypeList< //naive Flow, - Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, - Flow, + Flow, //partial immunity Flow, - Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, //improved immunity Flow, - Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, - - // waning - Flow, - Flow, - Flow, - Flow>; - + Flow>; // clang-format on class Model : public FlowModel, Parameters, Flows> @@ -135,11 +124,6 @@ class Model : public FlowModelpopulations.get_from(pop, {i, InfectionState::InfectedCriticalImprovedImmunity}); } - // get vaccinations - auto const partial_vaccination = vaccinations_at(t, this->parameters.get()); - auto const full_vaccination = vaccinations_at(t, this->parameters.get()); - auto const booster_vaccination = vaccinations_at(t, this->parameters.get()); - for (auto i = AgeGroup(0); i < n_agegroups; i++) { size_t SNi = this->populations.get_flat_index({i, InfectionState::SusceptibleNaive}); @@ -174,8 +158,6 @@ class Model : public FlowModelpopulations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); size_t ISyIICi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); - size_t TImm1 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunPartialImmunity}); - size_t TImm2 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunImprovedImmunity}); size_t SIIi = this->populations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); @@ -248,7 +230,7 @@ class Model : public FlowModel 0) ? 1.0 / Nj : 0; + double divNj = 1.0 / Nj; // precompute 1.0/Nj double ext_inf_force_dummy = cont_freq_eff * divNj * params.template get()[(AgeGroup)i] * @@ -269,26 +251,6 @@ class Model : public FlowModel({i})] += dummy_SII; } - // vaccinations - flows[get_flat_flow_index( - {i})] = - std::min( - y[SNi] - - flows[get_flat_flow_index({i})], - partial_vaccination[static_cast(i)]); - - flows[get_flat_flow_index({i})] = - std::min(y[SPIi] - flows[get_flat_flow_index({i})], - full_vaccination[static_cast(i)]); - - flows[get_flat_flow_index({i})] = - std::min(y[SIIi] - flows[get_flat_flow_index({i})], - booster_vaccination[static_cast(i)]); - // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere // is different for different vaccination status. This is not the case here and in addition, ICUCapacity @@ -306,9 +268,8 @@ class Model : public FlowModel({i})] = - params.get()[i] * (1 / params.get()[i]) * - y[INSNi]; + InfectionState::SusceptibleImprovedImmunity>({i})] = + params.get()[i] / params.get()[i] * y[INSNi]; flows[get_flat_flow_index( {i})] = (1 - params.get()[i]) / params.get()[i] * y[INSNi]; @@ -317,16 +278,15 @@ class Model : public FlowModel()[i]) / params.get()[i] * y[INSNCi]; flows[get_flat_flow_index({i})] = - params.get()[i] * (1 / params.get()[i]) * - y[INSNCi]; + InfectionState::SusceptibleImprovedImmunity>({i})] = + params.get()[i] / params.get()[i] * y[INSNCi]; - // // InfectedSymptoms + // InfectedSymptoms flows[get_flat_flow_index( {i})] = params.get()[i] / params.get()[i] * y[ISyNi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ISyNi]; flows[get_flat_flow_index()[i] / params.get()[i] * y[ISyNCi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ISyNCi]; // InfectedSevere flows[get_flat_flow_index( {i})] = criticalPerSevereAdjusted / params.get()[i] * y[ISevNi]; - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; + flows[get_flat_flow_index( + {i})] = (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; flows[get_flat_flow_index({i})] = deathsPerSevereAdjusted / params.get()[i] * y[ISevNi]; + // InfectedCritical flows[get_flat_flow_index({i})] = params.get()[i] / params.get()[i] * y[ICrNi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - params.get()[i]) / params.get()[i] * y[ICrNi]; - // Waning immunity - flows[get_flat_flow_index( - {i})] = 1 / params.get()[i] * y[SPIi]; - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[TImm1]; - - // /**** path of partially immune ***/ - + // /**** path of partially immune (e.g., one dose of vaccination) ***/ // Exposed flows[get_flat_flow_index({i})] += @@ -371,7 +323,7 @@ class Model : public FlowModel({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.get()[i])) / (params.get()[i] * reducTimeInfectedMild) * y[INSPIi]; @@ -386,7 +338,7 @@ class Model : public FlowModel()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.get()[i])) / (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; @@ -399,7 +351,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyPIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; @@ -411,7 +363,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyPICi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; @@ -423,7 +375,7 @@ class Model : public FlowModel()[i] * y[ISevPIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.get()[i]) / params.get()[i] * y[ISevPIi]; @@ -432,6 +384,7 @@ class Model : public FlowModel({i})] = (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * deathsPerSevereAdjusted / params.get()[i] * y[ISevPIi]; + // InfectedCritical flows[get_flat_flow_index({i})] = @@ -439,12 +392,12 @@ class Model : public FlowModel()[i] / params.get()[i] * y[ICrPIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.get()[i]) / params.get()[i] * y[ICrPIi]; - // /**** path of improved immunity ***/ + // /**** path of twice vaccinated, here called immune although reinfection is possible now ***/ // Exposed flows[get_flat_flow_index({i})] += @@ -452,7 +405,7 @@ class Model : public FlowModel({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.get()[i])) / (params.get()[i] * reducTimeInfectedMild) * y[INSIIi]; @@ -467,7 +420,7 @@ class Model : public FlowModel()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.get()[i])) / (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; @@ -480,7 +433,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyIIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; @@ -492,7 +445,7 @@ class Model : public FlowModel()[i] * reducTimeInfectedMild) * y[ISyIICi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.get()[i]) / (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; @@ -504,7 +457,7 @@ class Model : public FlowModel()[i] * y[ISevIIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.get()[i]) / @@ -522,64 +475,14 @@ class Model : public FlowModel()[i] / params.get()[i] * y[ICrIIi]; flows[get_flat_flow_index({i})] = + InfectionState::SusceptibleImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.get()[i]) / params.get()[i] * y[ICrIIi]; - - // Waning immunity - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[TImm2]; - - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[SIIi]; } } - Eigen::VectorXd vaccinations_at(const ScalarType t, - const CustomIndexArray& daily_vaccinations, - const ScalarType eps = 0.15) const - { - auto const& params = this->parameters; - const ScalarType ub = (size_t)t + 1.0; - const ScalarType lb = ub - eps; - - Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); - smoothed_vaccinations.setZero(); - - if (t > ub) { - mio::log_warning("Vaccination time is out of bounds"); - } - - if (static_cast(daily_vaccinations.size()) <= (size_t)t) { - return smoothed_vaccinations; - } - // check if t is in the range of the interval [lb,ub] - if (t >= lb) { - // need a eigen vector of size params.get_num_groups() to store the number of vaccinations per age group - - // ToDo: Find a way to Iterate over all three vaccination types - for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { - const auto num_vaccinations_ub = - daily_vaccinations[{age, SimulationDay(ub + 1)}] - daily_vaccinations[{age, SimulationDay(ub)}]; - const auto num_vaccinations_lb = - daily_vaccinations[{age, SimulationDay(lb + 1)}] - daily_vaccinations[{age, SimulationDay(lb)}]; - smoothed_vaccinations[(size_t)age] = - smoother_cosine(t, lb, ub, num_vaccinations_lb, num_vaccinations_ub); - } - } - else { - for (auto age = AgeGroup(0); age < params.get_num_groups(); age++) { - smoothed_vaccinations[(size_t)age] = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - - daily_vaccinations[{age, SimulationDay((size_t)t)}]; - } - } - return smoothed_vaccinations; - } - /** * serialize this. * @see mio::serialize @@ -609,7 +512,7 @@ class Model : public FlowModel> @@ -620,13 +523,13 @@ class Simulation; * @param model the compartment model with initial values. * @param t current simulation time. * @param y current value of compartments. -* @tparam Base simulation type that uses the SECIRS-type compartment model. see Simulation. +* @tparam Base simulation type that uses a secir compartment model. see Simulation. */ template > double get_infections_relative(const Simulation& model, double t, const Eigen::Ref& y); /** - * specialization of compartment model simulation for the SECIRS-type model. + * specialization of compartment model simulation for the SECIRVVS model. * @tparam BaseT simulation type, default mio::Simulation. For testing purposes only! */ template @@ -676,6 +579,55 @@ class Simulation : public BaseT } } + void apply_vaccination(double t) + { + auto t_idx = SimulationDay((size_t)t); + auto& params = this->get_model().parameters; + size_t num_groups = (size_t)params.get_num_groups(); + auto last_value = this->get_result().get_last_value(); + + auto count = (size_t)InfectionState::Count; + auto S = (size_t)InfectionState::SusceptibleNaive; + auto SV = (size_t)InfectionState::SusceptiblePartialImmunity; + auto R = (size_t)InfectionState::SusceptibleImprovedImmunity; + + for (size_t i = 0; i < num_groups; ++i) { + + double first_vacc; + double full_vacc; + if (t_idx == SimulationDay(0)) { + first_vacc = params.template get()[{(AgeGroup)i, t_idx}]; + full_vacc = params.template get()[{(AgeGroup)i, t_idx}]; + } + else { + first_vacc = params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; + full_vacc = params.template get()[{(AgeGroup)i, t_idx}] - + params.template get()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; + } + + if (last_value(count * i + S) - first_vacc < 0) { + auto corrected = 0.99 * last_value(count * i + S); + log_warning("too many first vaccinated at time {}: setting first_vacc from {} to {}", t, first_vacc, + corrected); + first_vacc = corrected; + } + + last_value(count * i + S) -= first_vacc; + last_value(count * i + SV) += first_vacc; + + if (last_value(count * i + SV) - full_vacc < 0) { + auto corrected = 0.99 * last_value(count * i + SV); + log_warning("too many fully vaccinated at time {}: setting full_vacc from {} to {}", t, full_vacc, + corrected); + full_vacc = corrected; + } + + last_value(count * i + SV) -= full_vacc; + last_value(count * i + R) += full_vacc; + } + } + /** * @brief advance simulation to tmax. * Overwrites Simulation::advance and includes a check for dynamic NPIs in regular intervals. @@ -704,8 +656,13 @@ class Simulation : public BaseT dt_eff = 1.0; } + if (t == 0) { + //this->apply_vaccination(t); // done in init now? + this->apply_variant(t, base_infectiousness); + } BaseT::advance(t + dt_eff); if (t + 0.5 + dt_eff - std::floor(t + 0.5) >= 1) { + this->apply_vaccination(t + 0.5 + dt_eff); this->apply_variant(t, base_infectiousness); } @@ -758,12 +715,12 @@ class Simulation : public BaseT }; /** - * @brief Specialization of simulate for SECIRS-type models using Simulation. + * @brief Specialization of simulate for SECIRVVS models using Simulation. * * @param[in] t0 start time. * @param[in] tmax end time. * @param[in] dt time step. - * @param[in] model SECIRS-type model to simulate. + * @param[in] model SECIRVVS model to simulate. * @param[in] integrator optional integrator, uses rk45 if nullptr. * * @return Returns the result of the simulation. @@ -775,12 +732,12 @@ inline auto simulate(double t0, double tmax, double dt, const Model& model, } /** - * @brief Specialization of simulate for SECIRS-type models using the FlowSimulation. + * @brief Specialization of simulate for SECIRVVS models using the FlowSimulation. * * @param[in] t0 start time. * @param[in] tmax end time. * @param[in] dt time step. - * @param[in] model SECIRS-type model to simulate. + * @param[in] model SECIRVVS model to simulate. * @param[in] integrator optional integrator, uses rk45 if nullptr. * * @return Returns the result of the Flowsimulation. @@ -819,7 +776,7 @@ double get_infections_relative(const Simulation& sim, double /*t*/, const * @param t current simulation time. * @param y current value of compartments. * @return vector expression, same size as y, with migration factors per compartment. - * @tparam Base simulation type that uses a SECIRS-type compartment model. see Simulation. + * @tparam Base simulation type that uses a secir compartment model. see Simulation. */ template > auto get_migration_factors(const Simulation& sim, double /*t*/, const Eigen::Ref& y) diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index b2992256bc..577a475399 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -23,10 +23,6 @@ #include "ode_secirvvs/infection_state.h" #include "ode_secirvvs/model.h" -#include -#include -#include - namespace mio { namespace osecirvvs @@ -37,73 +33,32 @@ void draw_sample_demographics(Model& model) model.parameters.get().draw_sample(); model.parameters.get().draw_sample(); - const static std::vector naive_immunity_states = { - InfectionState::SusceptibleNaive, - InfectionState::ExposedNaive, - InfectionState::InfectedNoSymptomsNaive, - InfectionState::InfectedNoSymptomsNaiveConfirmed, - InfectionState::InfectedSymptomsNaive, - InfectionState::InfectedSymptomsNaiveConfirmed, - InfectionState::InfectedSevereNaive, - InfectionState::InfectedCriticalNaive, - InfectionState::DeadNaive, - }; - - const static std::vector partial_immunity_states = { - InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, - InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, - InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, - InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, - InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, - }; - - const static std::vector improved_immunity_states = { - InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, - InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, - InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, - InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, - InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, - }; - - // helper function to calculate the total population of a layer for a given age group - auto calculate_layer_total = [&model](const std::vector& states, AgeGroup ageGroup) { - return std::accumulate(states.begin(), states.end(), 0.0, - [&model, &ageGroup](double sum, const InfectionState& state) { - return sum + model.populations[{ageGroup, state}]; - }); - }; - - // helper function to adjust the susceptible population of a layer for a given age group - auto adjust_susceptible_population = [&model](AgeGroup i, double diff, InfectionState susceptibleState) { - model.populations[{i, susceptibleState}] += diff; - if (model.populations[{i, susceptibleState}] < 0) { - mio::log_warning("Negative population in State " + std::to_string(static_cast(susceptibleState)) + - " for age group " + std::to_string(static_cast(i)) + ". Setting to 0."); - model.populations[{i, susceptibleState}] = 0; - } - }; - for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { - - const double group_naive_total = calculate_layer_total(naive_immunity_states, i); - const double group_partial_total = calculate_layer_total(partial_immunity_states, i); - const double group_improved_total = calculate_layer_total(improved_immunity_states, i); + double group_total = model.populations.get_group_total(i); //sample initial compartments (with exceptions) for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { - if (inf_state != InfectionState::DeadNaive && //not sampled, fixed from data + if (inf_state != InfectionState::SusceptibleNaive && //not sampled, fixed after sampling everything else + inf_state != InfectionState::DeadNaive && //not sampled, fixed from data inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data model.populations[{i, inf_state}].draw_sample(); } } - const double diff_naive = group_naive_total - calculate_layer_total(naive_immunity_states, i); - const double diff_partial = group_partial_total - calculate_layer_total(partial_immunity_states, i); - const double diff_improved = group_improved_total - calculate_layer_total(improved_immunity_states, i); - adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); - adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); - adjust_susceptible_population(i, diff_improved, InfectionState::SusceptibleImprovedImmunity); + //set susceptibles so the total number stays the same as before sampling. + //if the new total without susceptibles is already bigger than the previous total + //subtract the overflow from SusceptibleImprovedImmunity, susceptibles will then be approximately zero. + model.populations[{i, InfectionState::SusceptibleNaive}] = 0; + double diff = model.populations.get_group_total(i) - group_total; + if (diff > 0) { + model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] -= diff; + if (model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] < 0.0) { + log_error("Negative Compartment after sampling."); + } + assert(std::abs(group_total - model.populations.get_group_total(i)) < 1e-10 && "Sanity check."); + } + model.populations.set_difference_from_group_total({i, InfectionState::SusceptibleNaive}, group_total); } } @@ -117,8 +72,6 @@ void draw_sample_infection(Model& model) model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); model.parameters.get()[AgeGroup(0)].draw_sample(); @@ -174,7 +127,7 @@ void draw_sample(Model& model) model.apply_constraints(); } -Graph draw_sample(Graph& graph) +Graph draw_sample(Graph& graph, bool variant_high) { Graph sampled_graph; @@ -186,6 +139,19 @@ Graph draw_sample(Graph& auto& shared_dynamic_npis = shared_params_model.parameters.template get(); shared_dynamic_npis.draw_sample(); + double delta_fac; + if (variant_high) { + delta_fac = 1.6; + } + else { + delta_fac = 1.4; + } + + //infectiousness of virus variants is not sampled independently but depend on base infectiousness + for (auto i = AgeGroup(0); i < shared_params_model.parameters.get_num_groups(); ++i) { + shared_params_model.parameters.template get()[i] = delta_fac; + } + for (auto& params_node : graph.nodes()) { auto& node_model = params_node.property; @@ -199,14 +165,12 @@ Graph draw_sample(Graph& auto local_holidays = node_model.parameters.template get().get_school_holidays(); auto local_daily_v1 = node_model.parameters.template get(); auto local_daily_v2 = node_model.parameters.template get(); - auto local_daily_v3 = node_model.parameters.template get(); node_model.parameters = shared_params_model.parameters; node_model.parameters.template get() = local_icu_capacity; node_model.parameters.template get() = local_tnt_capacity; node_model.parameters.template get().get_school_holidays() = local_holidays; node_model.parameters.template get() = local_daily_v1; node_model.parameters.template get() = local_daily_v2; - node_model.parameters.template get() = local_daily_v3; node_model.parameters.template get().make_matrix(); node_model.apply_constraints(); diff --git a/cpp/models/ode_secirvvs/parameter_space.h b/cpp/models/ode_secirvvs/parameter_space.h index 88286e085d..a883cc482a 100644 --- a/cpp/models/ode_secirvvs/parameter_space.h +++ b/cpp/models/ode_secirvvs/parameter_space.h @@ -61,7 +61,7 @@ void draw_sample(Model& model); * @param variant_high If true, use high value for infectiousness of variant. * @return Graph with nodes and edges from the input graph sampled. */ -Graph draw_sample(Graph& graph); +Graph draw_sample(Graph& graph, bool variant_high); } // namespace osecirvvs } // namespace mio diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 566f7258df..930cc9143c 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -38,7 +38,7 @@ namespace osecirvvs { /** -* @brief the start day in the SECIRS-type model +* @brief the start day in the SECIRVVS model * The start day defines in which season the simulation can be started * If the start day is 180 and simulation takes place from t0=0 to * tmax=100 the days 180 to 280 of the year are simulated @@ -56,7 +56,7 @@ struct StartDay { }; /** -* @brief the start day of a new variant in the SECIRS-type model +* @brief the start day of a new variant in the SECIRVVS model * The start day of the new variant defines in which day of the simulation the new variant is introduced. * Starting on this day, the new variant will impact the transmission probability depending on the * infectiousness of the new variant in the parameter InfectiousnessNewVariant. @@ -74,7 +74,7 @@ struct StartDayNewVariant { }; /** -* @brief the seasonality in the SECIRS-type model +* @brief the seasonality in the SECIR model * the seasonality is given as (1+k*sin()) where the sine * curve is below one in summer and above one in winter */ @@ -91,7 +91,7 @@ struct Seasonality { }; /** -* @brief the icu capacity in the SECIRS-type model +* @brief the icu capacity in the SECIR model */ struct ICUCapacity { using Type = UncertainValue; @@ -183,7 +183,7 @@ struct TimeInfectedNoSymptoms { /** * @brief the infectious time for symptomatic cases that are infected but -* who do not need to be hsopitalized in the SECIRS-type model in day unit +* who do not need to be hsopitalized in the SECIR model in day unit */ struct TimeInfectedSymptoms { using Type = CustomIndexArray; @@ -214,7 +214,7 @@ struct TimeInfectedSevere { }; /** - * @brief the time people are treated by ICU before returning home in the SECIRS-type model + * @brief the time people are treated by ICU before returning home in the SECIR model * in day unit */ struct TimeInfectedCritical { @@ -229,67 +229,6 @@ struct TimeInfectedCritical { } }; -/** - * @brief Time in days to describe waning immunity to get person from S_PI -> S - */ -struct TimeWaningPartialImmunity { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 90.0); - } - static std::string name() - { - return "TimeWaningPartialImmunity"; - } -}; - -/** - * @brief Time in days to describe waning immunity to get person from SII -> SPI - */ -struct TimeWaningImprovedImmunity { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 90.0); - } - static std::string name() - { - return "TimeWaningImprovedImmunity"; - } -}; - -/** - * @brief the time people stays immune after infection or vaccination located in S - in the model in day unit - */ -struct TimeTemporaryImmunityPI { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 1.); - } - static std::string name() - { - return "TimeTemporaryImmunityPI"; - } -}; - -/** - * @brief the time people stays immune after infection or vaccination located in S_PI or S_II - in the model in day unit - */ -struct TimeTemporaryImmunityII { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 1.); - } - static std::string name() - { - return "TimeTemporaryImmunityII"; - } -}; /** * @brief probability of getting infected from a contact */ @@ -321,7 +260,7 @@ struct RelativeTransmissionNoSymptoms { }; /** -* @brief the percentage of asymptomatic cases in the SECIRS-type model +* @brief the percentage of asymptomatic cases in the SECIR model */ struct RecoveredPerInfectedNoSymptoms { using Type = CustomIndexArray; @@ -336,7 +275,7 @@ struct RecoveredPerInfectedNoSymptoms { }; /** -* @brief the risk of infection from symptomatic cases in the SECIRS-type model +* @brief the risk of infection from symptomatic cases in the SECIR model */ struct RiskOfInfectionFromSymptomatic { using Type = CustomIndexArray; @@ -366,7 +305,7 @@ struct MaxRiskOfInfectionFromSymptomatic { }; /** -* @brief the percentage of hospitalized patients per infected patients in the SECIRS-type model +* @brief the percentage of hospitalized patients per infected patients in the SECIR model */ struct SeverePerInfectedSymptoms { using Type = CustomIndexArray; @@ -381,7 +320,7 @@ struct SeverePerInfectedSymptoms { }; /** -* @brief the percentage of ICU patients per hospitalized patients in the SECIRS-type model +* @brief the percentage of ICU patients per hospitalized patients in the SECIR model */ struct CriticalPerSevere { using Type = CustomIndexArray; @@ -396,7 +335,7 @@ struct CriticalPerSevere { }; /** -* @brief the percentage of dead patients per ICU patients in the SECIRS-type model +* @brief the percentage of dead patients per ICU patients in the SECIR model */ struct DeathsPerCritical { using Type = CustomIndexArray; @@ -428,7 +367,7 @@ struct VaccinationGap { /** * @brief Time in days until first vaccine dose takes full effect. */ -struct DaysUntilEffectivePartialVaccination { +struct DaysUntilEffectivePartialImmunity { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -436,29 +375,14 @@ struct DaysUntilEffectivePartialVaccination { } static std::string name() { - return "DaysUntilEffectivePartialVaccination"; + return "DaysUntilEffectivePartialImmunity"; } }; /** * @brief Time in days until second vaccine dose takes full effect. */ -struct DaysUntilEffectiveImprovedVaccination { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type(size, 7.0); - } - static std::string name() - { - return "DaysUntilEffectiveImprovedVaccination"; - } -}; - -/** - * @brief Time in days until booster vaccine dose takes full effect. - */ -struct DaysUntilEffectiveBoosterImmunity { +struct DaysUntilEffectiveImprovedImmunity { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -466,7 +390,7 @@ struct DaysUntilEffectiveBoosterImmunity { } static std::string name() { - return "DaysUntilEffectiveBoosterImmunity"; + return "DaysUntilEffectiveImprovedImmunity"; } }; @@ -500,21 +424,6 @@ struct DailyFullVaccination { } }; -/** -* @brief Total number of full vaccinations up to the given day. -*/ -struct DailyBoosterVaccination { - using Type = CustomIndexArray; - static Type get_default(AgeGroup size) - { - return Type({size, SimulationDay(0)}); - } - static std::string name() - { - return "DailyBoosterVaccination"; - } -}; - /** * @brief Factor to reduce infection risk for persons with partial immunity. */ @@ -641,18 +550,15 @@ using ParametersBase = TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, TimeInfectedSevere, TimeInfectedCritical, TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, - CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialVaccination, - DaysUntilEffectiveImprovedVaccination, DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, - DailyBoosterVaccination, DailyPartialVaccination, ReducExposedPartialImmunity, - ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, + CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, + DaysUntilEffectiveImprovedImmunity, DailyFullVaccination, DailyPartialVaccination, + ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, - ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, StartDayNewVariant, - InfectiousnessNewVariant, TimeWaningPartialImmunity, TimeWaningImprovedImmunity, - TimeTemporaryImmunityPI, TimeTemporaryImmunityII>; + ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, + StartDayNewVariant>; /** - * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over -time. + * @brief Parameters of an age-resolved SECIR/SECIHURD model with paths for partial and improved immunity through vaccination. */ class Parameters : public ParametersBase { @@ -795,42 +701,6 @@ class Parameters : public ParametersBase corrected = true; } - if (this->get()[i] < tol_times) { - log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {} to {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; - } - - if (this->get()[i] < tol_times) { - log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {} to {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; - } - - if (this->get()[i] < tol_times) { - log_warning("Constraint check: Parameter TimeWaningPartialImmunity changed from {} to {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; - } - - if (this->get()[i] < tol_times) { - log_warning("Constraint check: Parameter TimeWaningImprovedImmunity changed from {} to {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; - } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_warning("Constraint check: Parameter TransmissionProbabilityOnContact changed from {} to {} ", @@ -883,26 +753,18 @@ class Parameters : public ParametersBase corrected = true; } - if (this->get()[i] < 0.0) { + if (this->get()[i] < 0.0) { log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; - } - - if (this->get()[i] < 0.0) { - log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; - } - - if (this->get()[i] < 0.0) { - log_warning("Constraint check: Parameter DaysUntilEffectiveBoosterImmunity changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; + this->get()[i], 0); + this->get()[i] = 0; corrected = true; } + if (this->get()[i] < 0.0) { + log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity changed from {} to {}", + this->get()[i], 0); + this->get()[i] = 0; + corrected = true; + } if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { @@ -1030,38 +892,6 @@ class Parameters : public ParametersBase return true; } - if (this->get()[i] < tol_times) { - log_error("Constraint check: Parameter TimeTemporaryImmunityPI {} smaller {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - return true; - } - - if (this->get()[i] < tol_times) { - log_error("Constraint check: Parameter TimeTemporaryImmunityII {} smaller {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - return true; - } - - if (this->get()[i] < tol_times) { - log_error("Constraint check: Parameter TimeWaningPartialImmunity {} smaller {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - return true; - } - - if (this->get()[i] < tol_times) { - log_error("Constraint check: Parameter TimeWaningImprovedImmunity {} smaller {}. Please " - "note that unreasonably small compartment stays lead to massively increased run time. " - "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - return true; - } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { log_error("Constraint check: Parameter TransmissionProbabilityOnContact smaller {} or larger {}", 0, 1); @@ -1105,18 +935,12 @@ class Parameters : public ParametersBase return true; } - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectivePartialVaccination smaller {}", 0); + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectivePartialImmunity smaller {}", 0); return true; } - - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); - return true; - } - - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); + if (this->get()[i] < 0.0) { + log_error("Constraint check: Parameter DaysUntilEffectiveImprovedImmunity smaller {}", 0); return true; } @@ -1164,15 +988,6 @@ class Parameters : public ParametersBase log_error("Constraint check: Parameter InfectiousnessNewVariant smaller {}", 0); return true; } - - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter TimeTemporaryImmunityPI smaller {:d}", 0); - return true; - } - if (this->get()[i] < 0.0) { - log_error("Constraint check: Parameter TimeTemporaryImmunityII smaller {:d}", 0); - return true; - } } return false; } diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index 241983ecac..a31c886388 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -21,7 +21,6 @@ #include "ode_secirvvs/parameters_io.h" #include "memilio/geography/regions.h" #include "memilio/io/io.h" -#include "ode_secirvvs/parameters.h" #ifdef MEMILIO_HAS_JSONCPP @@ -66,12 +65,12 @@ IOResult read_confirmed_cases_data( std::string const& path, std::vector const& vregion, Date date, std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, - std::vector>& vnum_death, std::vector>& vnum_timm_i, + std::vector>& vnum_death, std::vector>& vnum_rec, const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, - const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) + const std::vector>& vt_InfectedCritical, const std::vector>& vmu_C_R, + const std::vector>& vmu_I_H, const std::vector>& vmu_H_U, + const std::vector& scaling_factor_inf) { BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); return read_confirmed_cases_data(rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, @@ -85,12 +84,12 @@ IOResult read_confirmed_cases_data( std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, std::vector>& vnum_death, - std::vector>& vnum_timm_i, const std::vector>& vt_Exposed, + std::vector>& vnum_rec, const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, - const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) + const std::vector>& vt_InfectedCritical, const std::vector>& vmu_C_R, + const std::vector>& vmu_I_H, const std::vector>& vmu_H_U, + const std::vector& scaling_factor_inf) { auto max_date_entry = std::max_element(rki_data.begin(), rki_data.end(), [](auto&& a, auto&& b) { return a.date < b.date; @@ -125,26 +124,25 @@ IOResult read_confirmed_cases_data( auto& t_InfectedSymptoms = vt_InfectedSymptoms[region_idx]; auto& t_InfectedSevere = vt_InfectedSevere[region_idx]; auto& t_InfectedCritical = vt_InfectedCritical[region_idx]; - auto& t_imm_interval_i = vt_imm_interval_i[region_idx]; auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_rec = vnum_rec[region_idx]; auto& num_Exposed = vnum_Exposed[region_idx]; auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; auto& num_death = vnum_death[region_idx]; auto& num_icu = vnum_icu[region_idx]; - auto& num_imm = vnum_timm_i[region_idx]; auto& mu_C_R = vmu_C_R[region_idx]; auto& mu_I_H = vmu_I_H[region_idx]; auto& mu_H_U = vmu_H_U[region_idx]; - bool read_icu = false; + bool read_icu = false; // params.populations.get({age, SecirCompartments::U}) == 0; auto age = (size_t)entry.age_group; if (entry.date == offset_date_by_days(date, 0)) { num_InfectedSymptoms[age] += scaling_factor_inf[age] * entry.num_confirmed; - num_imm[age] += entry.num_confirmed; + num_rec[age] += entry.num_confirmed; } if (entry.date == offset_date_by_days(date, t_InfectedNoSymptoms[age] + days_surplus)) { num_InfectedNoSymptoms[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; @@ -173,9 +171,6 @@ IOResult read_confirmed_cases_data( num_icu[age] -= mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; } } - if (entry.date == offset_date_by_days(date, 0 - t_imm_interval_i[age])) { - num_imm[age] -= entry.num_confirmed; - } } } @@ -184,14 +179,22 @@ IOResult read_confirmed_cases_data( auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_rec = vnum_rec[region_idx]; auto& num_Exposed = vnum_Exposed[region_idx]; auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; auto& num_death = vnum_death[region_idx]; auto& num_icu = vnum_icu[region_idx]; - auto& num_timm_i = vnum_timm_i[region_idx]; size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); for (size_t i = 0; i < num_groups; i++) { + // subtract infected confirmed cases which are not yet recovered + // and remove dark figure scaling factor + num_rec[i] -= num_InfectedSymptoms[i] / scaling_factor_inf[i]; + num_rec[i] -= num_InfectedSevere[i] / scaling_factor_inf[i]; + num_rec[i] -= + num_icu[i] / + scaling_factor_inf[i]; // TODO: this has to be adapted for scaling_factor_inf != 1 or != ***_icu + num_rec[i] -= num_death[i] / scaling_factor_inf[i]; auto try_fix_constraints = [region, i](double& value, double error, auto str) { if (value < error) { // this should probably return a failure @@ -210,22 +213,22 @@ IOResult read_confirmed_cases_data( } }; - const double tol_error = -1e-8; - try_fix_constraints(num_InfectedSymptoms[i], tol_error, "InfectedSymptoms"); - try_fix_constraints(num_InfectedNoSymptoms[i], tol_error, "InfectedNoSymptoms"); - try_fix_constraints(num_Exposed[i], tol_error, "Exposed"); - try_fix_constraints(num_InfectedSevere[i], tol_error, "InfectedSevere"); - try_fix_constraints(num_death[i], tol_error, "Dead"); - try_fix_constraints(num_icu[i], tol_error, "InfectedCritical"); - try_fix_constraints(num_timm_i[i], tol_error, "Recently Recovered"); + try_fix_constraints(num_InfectedSymptoms[i], -5, "InfectedSymptoms"); + try_fix_constraints(num_InfectedNoSymptoms[i], -5, "InfectedNoSymptoms"); + try_fix_constraints(num_Exposed[i], -5, "Exposed"); + try_fix_constraints(num_InfectedSevere[i], -5, "InfectedSevere"); + try_fix_constraints(num_death[i], -5, "Dead"); + try_fix_constraints(num_icu[i], -5, "InfectedCritical"); + try_fix_constraints(num_rec[i], -20, "Recovered or vaccinated"); } } return success(); } -IOResult>> read_immunity_population(const std::string& path, - const size_t& num_age_groups) +IOResult read_confirmed_cases_data_fix_recovered(std::string const& path, std::vector const& vregion, + Date date, std::vector>& vnum_rec, + double delay) { BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); return read_confirmed_cases_data_fix_recovered(rki_data, vregion, date, vnum_rec, delay); @@ -242,32 +245,60 @@ IOResult read_confirmed_cases_data_fix_recovered(const std::vectordate; + if (max_date < date) { + log_error("Specified date does not exist in RKI data"); + return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); + } + + // shifts the initilization to the recent past if simulation starts + // around current day and data of the future would be required. + // Only needed for preinfection compartments, exposed and InfectedNoSymptoms. + auto days_surplus = get_offset_in_days(max_date, date) - 6; // 6 > T_E^C + T_C^I + if (days_surplus > 0) { + days_surplus = 0; + } + + for (auto&& rki_entry : rki_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&rki_entry](auto r) { + return r == 0 || get_region_id(rki_entry) == r; + }); + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + if (rki_entry.date == offset_date_by_days(date, int(-delay))) { + vnum_rec[region_idx][size_t(rki_entry.age_group)] = rki_entry.num_confirmed; } - linenumber++; } - immunity_file.close(); //close the file object. } - // assert that the sum of the cols is 1 (tolerance 1-10) - for (size_t i = 0; i < 6; ++i) { - assert(std::abs(ans[0][i] + ans[1][i] + ans[2][i] - 1.0) < 1e-10); + for (size_t region_idx = 0; region_idx < vregion.size(); ++region_idx) { + auto region = vregion[region_idx]; + auto& num_rec = vnum_rec[region_idx]; + + size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); + for (size_t i = 0; i < num_groups; i++) { + auto try_fix_constraints = [region, i](double& value, double error, auto str) { + if (value < error) { + // this should probably return a failure + // but the algorithm is not robust enough to avoid large negative + // values and there are tests that rely on it + log_error("{:s} for age group {:s} is {:.4f} for region {:d}, " + "exceeds expected negative value.", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + else if (value < 0) { + log_info("{:s} for age group {:s} is {:.4f} for region {:d}, " + "automatically corrected", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + }; + try_fix_constraints(num_rec[i], 0, "Recovered"); + } } - return ans; + return success(); } IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, @@ -353,12 +384,11 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto num_groups = model[0].parameters.get_num_groups(); - auto days_until_effective_n = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto days_until_effective_pi = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto days_until_effective_ii = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto days_until_effective1 = (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto days_until_effective2 = + (int)(double)model[0].parameters.get()[AgeGroup(0)]; + auto vaccination_distance = (int)(double)model[0].parameters.get()[AgeGroup(0)]; + // iterate over regions (e.g., counties) for (size_t i = 0; i < model.size(); ++i) { // iterate over age groups in region @@ -366,11 +396,9 @@ IOResult set_vaccination_data(std::vector& model, const std::string model[i].parameters.template get().resize(SimulationDay(num_days + 1)); model[i].parameters.template get().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get().resize(SimulationDay(num_days + 1)); for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { model[i].parameters.template get()[{g, d}] = 0.0; model[i].parameters.template get()[{g, d}] = 0.0; - model[i].parameters.template get()[{g, d}] = 0.0; } } } @@ -382,10 +410,6 @@ IOResult set_vaccination_data(std::vector& model, const std::string return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); } auto max_date = max_date_entry->date; - if (max_date < offset_date_by_days(date, num_days)) { - log_error("Vaccination data does not contain all dates. After the last day the data, vaccinations per day are " - "set to 0."); - } for (auto&& vacc_data_entry : vacc_data) { auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { @@ -396,80 +420,75 @@ IOResult set_vaccination_data(std::vector& model, const std::string auto date_df = vacc_data_entry.date; if (it != vregion.end()) { auto region_idx = size_t(it - vregion.begin()); - AgeGroup age = vacc_data_entry.age_group; - - // initialize the temporary immunity states - if (date_df >= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age])) && - date_df <= - offset_date_by_days( - date, static_cast( - -model[region_idx] - .parameters.template get()[age]))) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += - vacc_data_entry.num_vaccinations_completed; - } - - if (date_df >= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age])) && - date_df <= - offset_date_by_days( - date, static_cast( - -model[region_idx].parameters.template get()[age])) - - ) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; - } + auto age = vacc_data_entry.age_group; - // get daily vaccinations for each layer for (size_t d = 0; d < (size_t)num_days + 1; ++d) { - auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); + int days_plus; + // In the following, second dose means previous 'full immunization', now 'Grundimmunisierung'. + // --- + // date: start_date of the simulation (Input from IO call read_input_data_county_vaccmodel()) + // d: day of simulation, counted from 0 to num_days (for which we need (approximated) vaccination numbers) + // root[i]["Vacc_completed"]: accumulated number of total second doses up to day date_df; + // taken from input dataframe, single value, per county and age group + // ---- + // An averaged distance between first and second doses (vaccination_distance) is assumed in the following + // and the first doses are computed based on the second doses given 'vaccination_distance' days later. + // ---- + // a person whose second dose is reported at start_date + simulation_day - days_until_effective1 + vaccination_distance + // had the first dose on start_date + simulation_day - days_until_effective1. Furthermore, he/she has the full protection + // of the first dose at day X = start_date + simulation_day + // Storing its value in get() will eventually (in the simulation) + // transfer the difference (between get() at d and d-1) of + // N susceptible individuals to 'Susceptible Partially Vaccinated' state at day d; see secir_vaccinated.h + auto offset_first_date = + offset_date_by_days(date, (int)d - days_until_effective1 + vaccination_distance); if (max_date >= offset_first_date) { + // Option 1: considered offset_first_date is available in input data frame if (date_df == offset_first_date) { model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_partial; + vacc_data_entry.num_vaccinations_completed; } } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - 0; + else { // offset_first_date > max_date + // Option 2: considered offset_first_date is NOT available in input data frame + // Here, a constant number of first and second doses is assumed, i.e., + // the the number of vaccinationes at day d (N days after max_date) will be: + // total number of vaccinations up to day max_date + N * number of vaccinations ON max_date + // (where the latter is computed as the difference between the total number at max_date and max_date-1) + days_plus = get_offset_in_days(offset_first_date, max_date); + if (date_df == offset_date_by_days(max_date, -1)) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= + days_plus * vacc_data_entry.num_vaccinations_completed; + } + else if (date_df == max_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += + (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; } } - auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); + // a person whose second dose is reported at start_date + simulation_day - days_until_effective2 + // has the full protection of the second dose at day X = start_date + simulation_day + // Storing its value in get() will eventually (in the simulation) + // transfer the difference (between get() at d and d-1) of + // N susceptible, partially vaccinated individuals to 'SusceptibleImprovedImmunity' state at day d; see secir_vaccinated.h + auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective2); if (max_date >= offset_full_date) { + // Option 1: considered offset_full_date is available in input data frame if (date_df == offset_full_date) { model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_completed; } } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = 0; + else { // offset_full_date > max_full_date + // Option 2: considered offset_full_date is NOT available in input data frame + days_plus = get_offset_in_days(offset_full_date, max_date); + if (date_df == offset_date_by_days(max_date, -1)) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= + days_plus * vacc_data_entry.num_vaccinations_completed; } - } - - auto offset_booster_date = offset_date_by_days(date, (int)d - days_until_effective_ii); - if (max_date >= offset_booster_date) { - if (date_df == offset_booster_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; - } - } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - 0; + else if (date_df == max_date) { + model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += + (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; } } } diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index e8ce79c4e1..7cb743ab7b 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * @@ -59,43 +59,56 @@ IOResult read_confirmed_cases_data( std::string const& path, std::vector const& vregion, Date date, std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, std::vector>& num_icu, - std::vector>& num_death, std::vector>& vnum_timm_i, + std::vector>& num_death, std::vector>& num_rec, const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, - const std::vector>& t_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& mu_C_R, const std::vector>& mu_I_H, - const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); + const std::vector>& t_InfectedCritical, const std::vector>& mu_C_R, + const std::vector>& mu_I_H, const std::vector>& mu_H_U, + const std::vector& scaling_factor_inf); IOResult read_confirmed_cases_data( const std::vector& rki_data, std::vector const& vregion, Date date, std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, std::vector>& num_icu, std::vector>& num_death, - std::vector>& vnum_timm_i, const std::vector>& t_Exposed, + std::vector>& num_rec, const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, const std::vector>& t_InfectedCritical, - const std::vector>& vt_imm_interval_i, const std::vector>& mu_C_R, - const std::vector>& mu_I_H, const std::vector>& mu_H_U, - const std::vector& scaling_factor_inf); + const std::vector>& mu_C_R, const std::vector>& mu_I_H, + const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); /**@}*/ -IOResult>> read_immunity_population(const std::string& path, - const size_t& num_age_groups); +/** + * @brief Reads confirmed cases data and translates data of day t0-delay to recovered compartment, + * @param path Path to RKI confirmed cases file. + * @param vregion vector of keys of the region of interest + * @param date Date for which the arrays are initialized + * @param num_rec output vector for number of people in the compartement recovered + * @param delay number of days in the past the are used to set recovered compartment. + * @see mio::read_confirmed_cases_data + * @{ + */ +IOResult read_confirmed_cases_data_fix_recovered(const std::vector& rki_data, + std::vector const& vregion, Date date, + std::vector>& vnum_rec, double delay = 14.); +IOResult read_confirmed_cases_data_fix_recovered(std::string const& path, std::vector const& vregion, + Date date, std::vector>& vnum_rec, + double delay = 14.); /**@}*/ /** - * @brief sets infected and immun compartment(s) from a transformed RKI cases file into a Model. + * @brief sets populations data from a transformed RKI cases file into a Model. * @param model vector of objects in which the data is set * @param path Path to transformed RKI cases file * @param region vector of keys of the region of interest * @param date Date for which the arrays are initialized * @param scaling_factor_inf factors by which to scale the confirmed cases of - * @param immunity_data_path Path to immunity data file + * rki data */ template -IOResult -set_confirmed_cases_data(std::vector& model, const std::string& path, std::vector const& region, Date date, - const std::vector& scaling_factor_inf, const std::string& immunity_data_path) +IOResult set_confirmed_cases_data(std::vector& model, const std::string& path, + std::vector const& region, Date date, + const std::vector& scaling_factor_inf) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); assert(scaling_factor_inf.size() == num_age_groups); //TODO: allow vector or scalar valued scaling factors @@ -108,8 +121,6 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std std::vector> t_InfectedSymptoms{model.size()}; std::vector> t_InfectedSevere{model.size()}; std::vector> t_InfectedCritical{model.size()}; - std::vector> t_imm_interval1{model.size()}; - std::vector> t_imm_interval2{model.size()}; std::vector> mu_C_R{model.size()}; std::vector> mu_I_H{model.size()}; @@ -117,28 +128,21 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std std::vector> num_InfectedSymptoms(model.size()); std::vector> num_death(model.size()); + std::vector> num_rec(model.size()); std::vector> num_Exposed(model.size()); std::vector> num_InfectedNoSymptoms(model.size()); std::vector> num_InfectedSevere(model.size()); std::vector> num_icu(model.size()); - std::vector> num_timm1(model.size()); - std::vector> num_timm2(model.size()); - - std::vector denom_E(num_age_groups, 0.0); - std::vector denom_I_NS(num_age_groups, 0.0); - std::vector denom_I_Sy(num_age_groups, 0.0); - std::vector denom_I_Sev(num_age_groups, 0.0); /*----------- UNVACCINATED -----------*/ for (size_t county = 0; county < model.size(); county++) { num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); + num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); num_icu[county] = std::vector(num_age_groups, 0.0); - num_timm1[county] = std::vector(num_age_groups, 0.0); - num_timm2[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { t_Exposed[county].push_back( @@ -151,71 +155,34 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std std::round(model[county].parameters.template get()[(AgeGroup)group]))); t_InfectedCritical[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_imm_interval1[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); - t_imm_interval2[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); mu_C_R[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); mu_I_H[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); mu_H_U[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); - - // calculate the denominators to split the reported case numbers to the different immunity layers. - denom_E[group] = - 1 / (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); - - denom_I_NS[group] = - 1 / (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); - - denom_I_Sy[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); - - denom_I_Sev[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county] - .parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county] - .parameters.template get()[(AgeGroup)group]); } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, + num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, + t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = - immunity_population[0][i] * denom_E[i] * num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaive}] = - immunity_population[0][i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; + num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaive}] = - immunity_population[0][i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereNaive}] = - immunity_population[0][i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; + num_InfectedSevere[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::SusceptibleImprovedImmunity}] = num_rec[county][i]; } // } @@ -240,6 +207,7 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); + num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); @@ -281,38 +249,24 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, + num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, + t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = - immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunity}] = - immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunity}] = - immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * - denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSeverePartialImmunity}] = - immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * - denom_I_Sev[i] * num_InfectedSevere[county][i]; - // the += is necessary because we already set the previous vaccinated individuals - model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += - immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_timm1[county][i]; + num_InfectedSevere[county][i]; } // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { @@ -336,6 +290,7 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); num_death[county] = std::vector(num_age_groups, 0.0); + num_rec[county] = std::vector(num_age_groups, 0.0); num_Exposed[county] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); @@ -377,38 +332,24 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm2, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval2, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(read_confirmed_cases_data(rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, + num_InfectedSymptoms, num_InfectedSevere, num_icu, num_death, num_rec, + t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); for (size_t county = 0; county < model.size(); county++) { // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { - model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = - immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_Exposed[county][i]; + model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunity}] = - immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunity}] = - immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * - denom_I_Sy[i] * num_InfectedSymptoms[county][i]; + num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereImprovedImmunity}] = - immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * - denom_I_Sev[i] * num_InfectedSevere[county][i]; - // the += is necessary because we already set the previous vaccinated individuals - model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += - immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_timm2[county][i]; + num_InfectedSevere[county][i]; } // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { @@ -486,46 +427,156 @@ IOResult>> read_population_data(const std::vecto /**@}*/ template -IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, - const std::string& immunity_data_path) +IOResult set_population_data(std::vector& model, const std::string& path, const std::string& path_rki, + const std::vector& vregion, Date date) { BOOST_OUTCOME_TRY(auto&& num_population, read_population_data(path, vregion)); auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); - BOOST_OUTCOME_TRY(immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); + std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); + + BOOST_OUTCOME_TRY(read_confirmed_cases_data_fix_recovered(path_rki, vregion, date, num_rec, 14.)); for (size_t region = 0; region < vregion.size(); region++) { if (std::accumulate(num_population[region].begin(), num_population[region].end(), 0.0) > 0) { auto num_groups = model[region].parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; i++) { - double SN = num_population[region][size_t(i)] * immunity_population[0][size_t(i)]; - double SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; - double SII = num_population[region][size_t(i)] - SN - SPI; + double S_v = + std::min(model[region].parameters.template get()[{i, SimulationDay(0)}] + + num_rec[region][size_t(i)], + num_population[region][size_t(i)]); + double S_pv = + std::max(model[region].parameters.template get()[{i, SimulationDay(0)}] - + model[region].parameters.template get()[{i, SimulationDay(0)}], + 0.0); // use std::max with 0 + double S; + if (num_population[region][size_t(i)] - S_pv - S_v < 0.0) { + log_warning("Number of vaccinated persons greater than population in county {}, age group {}.", + region, size_t(i)); + S = 0.0; + S_v = num_population[region][size_t(i)] - S_pv; + } + else { + S = num_population[region][size_t(i)] - S_pv - S_v; + } + + double denom_E = + 1 / (S + S_pv * model[region].parameters.template get()[i] + + S_v * model[region].parameters.template get()[i]); + double denom_C = + 1 / (S + S_pv * model[region].parameters.template get()[i] + + S_v * model[region].parameters.template get()[i]); + double denom_I = + 1 / (S + S_pv * model[region].parameters.template get()[i] + + S_v * model[region].parameters.template get()[i]); + double denom_HU = + 1 / + (S + + S_pv * model[region].parameters.template get()[i] + + S_v * model[region].parameters.template get()[i]); + + model[region].populations[{i, InfectionState::ExposedNaive}] = + S * model[region].populations[{i, InfectionState::ExposedNaive}] * denom_E; + model[region].populations[{i, InfectionState::ExposedPartialImmunity}] = + S_pv * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::ExposedPartialImmunity}] * denom_E; + model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] = + S_v * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] * denom_E; + + model[region].populations[{i, InfectionState::InfectedNoSymptomsNaive}] = + S * model[region].populations[{i, InfectionState::InfectedNoSymptomsNaive}] * denom_C; + model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] = + S_pv * model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] * denom_C; + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] = + S_v * model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] * denom_C; + + model[region].populations[{i, InfectionState::InfectedNoSymptomsNaiveConfirmed}] = + S * model[region].populations[{i, InfectionState::InfectedNoSymptomsNaiveConfirmed}] * denom_C; + model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = + S_pv * model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] * + denom_C; + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = + S_v * model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] * + denom_C; + + model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] = + S * model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] * denom_I; + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] = + S_pv * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] * denom_I; + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] = + S_v * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] * denom_I; + + model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] = + S * model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] * denom_I; + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = + S_pv * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] * denom_I; + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = + S_v * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] * denom_I; + + model[region].populations[{i, InfectionState::InfectedSevereNaive}] = + S * model[region].populations[{i, InfectionState::InfectedSevereNaive}] * denom_HU; + model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] = + S_pv * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] * denom_HU; + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] = + S_v * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] * denom_HU; + + model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] = + S_pv * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] = + S_v * model[region].parameters.template get()[i] * + model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; + model[region].populations[{i, InfectionState::InfectedCriticalNaive}] = + S * model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = - SII - (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + - model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + - model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]); + model[region].parameters.template get()[{i, SimulationDay(0)}] + + model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] - + (model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] + + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsNaiveConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereNaive}] + + model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalNaive}] + + model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadNaive}] + + model[region].populations[{i, InfectionState::DeadPartialImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}]); model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::min( - SII, + S_v - model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] - + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] - + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] - + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] - + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] - + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] - + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] - + model[region].populations[{i, InfectionState::DeadImprovedImmunity}], std::max(0.0, double(model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, - SPI - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] - + S_pv - model[region].populations[{i, InfectionState::ExposedPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] - model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunityConfirmed}] - model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] - model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] - - model[region].populations[{i, InfectionState::DeadPartialImmunity}] - - model[region].populations[{i, InfectionState::TemporaryImmunPartialImmunity}]); + model[region].populations[{i, InfectionState::DeadPartialImmunity}]); model[region].populations.template set_difference_from_group_total( {i, InfectionState::SusceptibleNaive}, num_population[region][size_t(i)]); @@ -571,18 +622,14 @@ IOResult set_vaccination_data(std::vector& model, const std::string * @param divi_data_path path to divi data file * @param confirmed_cases_path path to confirmed cases file * @param population_data_path path to population data file - * @param immunity_data_path path to immunity data file */ template IOResult export_input_data_county_timeseries( const std::vector& model, const std::string& dir, std::vector const& region, Date start_date, const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, - const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, - const std::string& immunity_data_path) + const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); - BOOST_OUTCOME_TRY(immunity_population, details::read_immunity_population(immunity_data_path, num_age_groups)); - assert(scaling_factor_inf.size() == num_age_groups); assert(num_age_groups == ConfirmedCasesDataEntry::age_group_names.size()); assert(model.size() == region.size()); @@ -598,51 +645,46 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_n{model.size()}; - std::vector> t_Exposed_n{model.size()}; - std::vector> t_InfectedSymptoms_n{model.size()}; - std::vector> t_InfectedSevere_n{model.size()}; - std::vector> t_InfectedCritical_n{model.size()}; - std::vector> t_imm_interval1{model.size()}; - std::vector> t_imm_interval2{model.size()}; - - std::vector> mu_C_R_n{model.size()}; - std::vector> mu_I_H_n{model.size()}; - std::vector> mu_H_U_n{model.size()}; + std::vector> t_InfectedNoSymptoms_uv{model.size()}; + std::vector> t_Exposed_uv{model.size()}; + std::vector> t_InfectedSymptoms_uv{model.size()}; + std::vector> t_InfectedSevere_uv{model.size()}; + std::vector> t_InfectedCritical_uv{model.size()}; + + std::vector> mu_C_R_uv{model.size()}; + std::vector> mu_I_H_uv{model.size()}; + std::vector> mu_H_U_uv{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_n(model.size(), 0); - std::vector> mu_I_U_n{model.size()}; + std::vector sum_mu_I_U_uv(model.size(), 0); + std::vector> mu_I_U_uv{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - t_Exposed_n[county].push_back( + t_Exposed_uv[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_n[county].push_back(static_cast( + t_InfectedNoSymptoms_uv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedSymptoms_n[county].push_back(static_cast( + t_InfectedSymptoms_uv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedSevere_n[county].push_back(static_cast( + t_InfectedSevere_uv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_n[county].push_back(static_cast( + t_InfectedCritical_uv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_imm_interval1[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); - t_imm_interval2[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); - mu_C_R_n[county].push_back( + mu_C_R_uv[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); - mu_I_H_n[county].push_back( + mu_I_H_uv[county].push_back( model[county].parameters.template get()[(AgeGroup)group]); - mu_H_U_n[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U_uv[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); /* begin: NOT in set_confirmed_cases_data() */ - sum_mu_I_U_n[county] += model[county].parameters.template get()[AgeGroup(group)] * - model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_n[county].push_back( + sum_mu_I_U_uv[county] += + model[county].parameters.template get()[AgeGroup(group)] * + model[county].parameters.template get()[AgeGroup(group)]; + mu_I_U_uv[county].push_back( model[county].parameters.template get()[AgeGroup(group)] * model[county].parameters.template get()[AgeGroup(group)]); /* end: NOT in set_confirmed_cases_data() */ @@ -653,34 +695,34 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_pi{model.size()}; - std::vector> t_Exposed_pi{model.size()}; - std::vector> t_InfectedSymptoms_pi{model.size()}; - std::vector> t_InfectedSevere_pi{model.size()}; - std::vector> t_InfectedCritical_pi{model.size()}; + std::vector> t_InfectedNoSymptoms_pv{model.size()}; + std::vector> t_Exposed_pv{model.size()}; + std::vector> t_InfectedSymptoms_pv{model.size()}; + std::vector> t_InfectedSevere_pv{model.size()}; + std::vector> t_InfectedCritical_pv{model.size()}; - std::vector> mu_C_R_pi{model.size()}; - std::vector> mu_I_H_pi{model.size()}; - std::vector> mu_H_U_pi{model.size()}; + std::vector> mu_C_R_pv{model.size()}; + std::vector> mu_I_H_pv{model.size()}; + std::vector> mu_H_U_pv{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_pi(model.size(), 0); - std::vector> mu_I_U_pi{model.size()}; + std::vector sum_mu_I_U_pv(model.size(), 0); + std::vector> mu_I_U_pv{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_pi[county].push_back( + t_Exposed_pv[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_pi[county].push_back(static_cast(std::round( + t_InfectedNoSymptoms_pv[county].push_back(static_cast(std::round( model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_pi[county].push_back(static_cast( + t_InfectedSymptoms_pv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_pi[county].push_back(static_cast( + t_InfectedSevere_pv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_pi[county].push_back(static_cast( + t_InfectedCritical_pv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); double exp_fact_part_immune = @@ -693,23 +735,23 @@ IOResult export_input_data_county_timeseries( double icu_fact_part_immune = model[county] .parameters.template get()[(AgeGroup)group]; - mu_C_R_pi[county].push_back( + mu_C_R_pv[county].push_back( (1 - inf_fact_part_immune / exp_fact_part_immune * (1 - model[county].parameters.template get()[(AgeGroup)group]))); - mu_I_H_pi[county].push_back( + mu_I_H_pv[county].push_back( hosp_fact_part_immune / inf_fact_part_immune * model[county].parameters.template get()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_pi[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * + mu_H_U_pv[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[(AgeGroup)group]); - sum_mu_I_U_pi[county] += + sum_mu_I_U_pv[county] += icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / inf_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_pi[county].push_back( + mu_I_U_pv[county].push_back( icu_fact_part_immune / hosp_fact_part_immune * model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / inf_fact_part_immune * @@ -721,33 +763,33 @@ IOResult export_input_data_county_timeseries( // data needs to be int, because access to data-specific confirmed cases // is done with these parameters. TODO: Rounding instead // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_ii{model.size()}; - std::vector> t_Exposed_ii{model.size()}; - std::vector> t_InfectedSymptoms_ii{model.size()}; - std::vector> t_InfectedSevere_ii{model.size()}; - std::vector> t_InfectedCritical_ii{model.size()}; - - std::vector> mu_C_R_ii{model.size()}; - std::vector> mu_I_H_ii{model.size()}; - std::vector> mu_H_U_ii{model.size()}; + std::vector> t_InfectedNoSymptoms_fv{model.size()}; + std::vector> t_Exposed_fv{model.size()}; + std::vector> t_InfectedSymptoms_fv{model.size()}; + std::vector> t_InfectedSevere_fv{model.size()}; + std::vector> t_InfectedCritical_fv{model.size()}; + + std::vector> mu_C_R_fv{model.size()}; + std::vector> mu_I_H_fv{model.size()}; + std::vector> mu_H_U_fv{model.size()}; // ICU data is not age-resolved. Use a partition of unity defined by // the age-dependent probability I->H->U divided by the sum over all // age groups of all of these probabilities. - std::vector sum_mu_I_U_ii(model.size(), 0); - std::vector> mu_I_U_ii{model.size()}; + std::vector sum_mu_I_U_fv(model.size(), 0); + std::vector> mu_I_U_fv{model.size()}; for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_ii[county].push_back( + t_Exposed_fv[county].push_back( static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedNoSymptoms_ii[county].push_back(static_cast(std::round( + t_InfectedNoSymptoms_fv[county].push_back(static_cast(std::round( model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_ii[county].push_back(static_cast( + t_InfectedSymptoms_fv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_ii[county].push_back(static_cast( + t_InfectedSevere_fv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_InfectedCritical_ii[county].push_back(static_cast( + t_InfectedCritical_fv[county].push_back(static_cast( std::round(model[county].parameters.template get()[(AgeGroup)group]))); double reduc_immune_exp = @@ -760,22 +802,22 @@ IOResult export_input_data_county_timeseries( double reduc_immune_icu = model[county] .parameters.template get()[(AgeGroup)group]; - mu_C_R_ii[county].push_back( + mu_C_R_fv[county].push_back( (1 - reduc_immune_inf / reduc_immune_exp * (1 - model[county].parameters.template get()[(AgeGroup)group]))); - mu_I_H_ii[county].push_back( + mu_I_H_fv[county].push_back( reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_ii[county].push_back(reduc_immune_icu / reduc_immune_hosp * + mu_H_U_fv[county].push_back(reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[(AgeGroup)group]); - sum_mu_I_U_ii[county] += + sum_mu_I_U_fv[county] += reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]; - mu_I_U_ii[county].push_back( + mu_I_U_fv[county].push_back( reduc_immune_icu / reduc_immune_hosp * model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]); @@ -788,74 +830,75 @@ IOResult export_input_data_county_timeseries( auto date = offset_date_by_days(start_date, int(day)); // unvaccinated - std::vector> num_Exposed_n(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_n(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_Exposed_uv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_uv(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptoms_uv(model.size(), + std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_n(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_n(model.size(), - std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptomsConfirmed_uv(model.size(), + std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSymptomsConfirmed_uv(model.size(), + std::vector(num_age_groups, 0.0)); // end TODO - std::vector> num_InfectedSevere_n(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_death_n(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_rec_uv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_uv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_death_uv(model.size(), std::vector(num_age_groups, 0.0)); std::vector> dummy_icu(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> dummy_timm(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_timm1(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_timm2(model.size(), std::vector(num_age_groups, 0.0)); BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_n, num_InfectedNoSymptoms_n, num_InfectedSymptoms_n, - num_InfectedSevere_n, dummy_icu, num_death_n, dummy_timm, t_Exposed_n, t_InfectedNoSymptoms_n, - t_InfectedSymptoms_n, t_InfectedSevere_n, t_InfectedCritical_n, t_imm_interval1, mu_C_R_n, mu_I_H_n, - mu_H_U_n, scaling_factor_inf)); + rki_data, region, date, num_Exposed_uv, num_InfectedNoSymptoms_uv, num_InfectedSymptoms_uv, + num_InfectedSevere_uv, dummy_icu, num_death_uv, num_rec_uv, t_Exposed_uv, t_InfectedNoSymptoms_uv, + t_InfectedSymptoms_uv, t_InfectedSevere_uv, t_InfectedCritical_uv, mu_C_R_uv, mu_I_H_uv, mu_H_U_uv, + scaling_factor_inf)); // partially vaccinated - std::vector> num_Exposed_pi(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_pi(model.size(), + std::vector> num_Exposed_pv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_pv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_pi(model.size(), + std::vector> num_InfectedSymptoms_pv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSevere_pi(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_pv(model.size(), std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_pi(model.size(), + std::vector> num_InfectedNoSymptomsConfirmed_pv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_pi(model.size(), + std::vector> num_InfectedSymptomsConfirmed_pv(model.size(), std::vector(num_age_groups, 0.0)); // end TODO std::vector> dummy_death(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> dummy_rec(model.size(), std::vector(num_age_groups, 0.0)); for (size_t county = 0; county < model.size(); county++) { dummy_death[county] = std::vector(num_age_groups, 0.0); dummy_icu[county] = std::vector(num_age_groups, 0.0); } BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_pi, num_InfectedNoSymptoms_pi, num_InfectedSymptoms_pi, - num_InfectedSevere_pi, dummy_icu, dummy_death, num_timm1, t_Exposed_pi, t_InfectedNoSymptoms_pi, - t_InfectedSymptoms_pi, t_InfectedSevere_pi, t_InfectedCritical_pi, t_imm_interval1, mu_C_R_pi, mu_I_H_pi, - mu_H_U_pi, scaling_factor_inf)); + rki_data, region, date, num_Exposed_pv, num_InfectedNoSymptoms_pv, num_InfectedSymptoms_pv, + num_InfectedSevere_pv, dummy_icu, dummy_death, dummy_rec, t_Exposed_pv, t_InfectedNoSymptoms_pv, + t_InfectedSymptoms_pv, t_InfectedSevere_pv, t_InfectedCritical_pv, mu_C_R_pv, mu_I_H_pv, mu_H_U_pv, + scaling_factor_inf)); // fully vaccinated - std::vector> num_Exposed_ii(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_ii(model.size(), + std::vector> num_Exposed_fv(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedNoSymptoms_fv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_ii(model.size(), + std::vector> num_InfectedSymptoms_fv(model.size(), std::vector(num_age_groups, 0.0)); // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_ii(model.size(), + std::vector> num_InfectedNoSymptomsConfirmed_fv(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_ii(model.size(), + std::vector> num_InfectedSymptomsConfirmed_fv(model.size(), std::vector(num_age_groups, 0.0)); // end TODO - std::vector> num_InfectedSevere_ii(model.size(), std::vector(num_age_groups, 0.0)); + std::vector> num_InfectedSevere_fv(model.size(), std::vector(num_age_groups, 0.0)); for (size_t county = 0; county < model.size(); county++) { + dummy_rec[county] = std::vector(num_age_groups, 0.0); dummy_death[county] = std::vector(num_age_groups, 0.0); dummy_icu[county] = std::vector(num_age_groups, 0.0); } BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_ii, num_InfectedNoSymptoms_ii, num_InfectedSymptoms_ii, - num_InfectedSevere_ii, dummy_icu, dummy_death, num_timm2, t_Exposed_ii, t_InfectedNoSymptoms_ii, - t_InfectedSymptoms_ii, t_InfectedSevere_ii, t_InfectedCritical_ii, t_imm_interval2, mu_C_R_ii, mu_I_H_ii, - mu_H_U_ii, scaling_factor_inf)); + rki_data, region, date, num_Exposed_fv, num_InfectedNoSymptoms_fv, num_InfectedSymptoms_fv, + num_InfectedSevere_fv, dummy_icu, dummy_death, dummy_rec, t_Exposed_fv, t_InfectedNoSymptoms_fv, + t_InfectedSymptoms_fv, t_InfectedSevere_fv, t_InfectedCritical_fv, mu_C_R_fv, mu_I_H_fv, mu_H_U_fv, + scaling_factor_inf)); // ICU only read for compartment InfectionState::InfectedCritical and then distributed later std::vector dummy_icu2(model.size(), 0.0); @@ -865,16 +908,20 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < region.size(); county++) { for (size_t age = 0; age < num_age_groups; age++) { num_icu[county][age] = - scaling_factor_icu * dummy_icu2[county] * mu_I_U_n[county][age] / sum_mu_I_U_n[county]; + scaling_factor_icu * dummy_icu2[county] * mu_I_U_uv[county][age] / sum_mu_I_U_uv[county]; } } // read population basics BOOST_OUTCOME_TRY(auto&& num_population, details::read_population_data(population_data, region)); + std::vector> num_rec(model.size(), std::vector(num_age_groups, 0.0)); + BOOST_OUTCOME_TRY(details::read_confirmed_cases_data_fix_recovered(rki_data, region, date, num_rec, 14.)); + for (size_t county = 0; county < region.size(); county++) { if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { for (size_t age = 0; age < num_age_groups; age++) { + auto age_group_offset = age * (size_t)InfectionState::Count; double S_v = std::min( model[county] @@ -883,7 +930,7 @@ IOResult export_input_data_county_timeseries( num_population[county][age]); double S_pv = std::max( model[county] - .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] - + .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] - model[county] .parameters.template get()[{AgeGroup(age), SimulationDay(day)}], 0.0); // use std::max with 0 @@ -901,196 +948,235 @@ IOResult export_input_data_county_timeseries( double denom_E = 1 / - (SN + - SPI * model[county].parameters.template get()[AgeGroup(age)] + - SII * model[county].parameters.template get()[AgeGroup(age)]); + (S + + S_pv * model[county].parameters.template get()[AgeGroup(age)] + + S_v * model[county].parameters.template get()[AgeGroup(age)]); double denom_C = 1 / - (SN + - SPI * model[county].parameters.template get()[AgeGroup(age)] + - SII * model[county].parameters.template get()[AgeGroup(age)]); + (S + + S_pv * model[county].parameters.template get()[AgeGroup(age)] + + S_v * model[county].parameters.template get()[AgeGroup(age)]); double denom_I = 1 / - (SN + - SPI * model[county] - .parameters.template get()[AgeGroup(age)] + - SII * model[county] + (S + + S_pv * model[county] + .parameters.template get()[AgeGroup(age)] + + S_v * model[county] .parameters.template get()[AgeGroup(age)]); double denom_HU = - 1 / (SN + - SPI * model[county] - .parameters - .template get()[AgeGroup(age)] + - SII * model[county] + 1 / (S + + S_pv * model[county] + .parameters + .template get()[AgeGroup(age)] + + S_v * model[county] .parameters .template get()[AgeGroup(age)]); extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) = - SN * denom_E * num_Exposed_n[county][age]; + S * denom_E * num_Exposed_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) = - SPI * model[county].parameters.template get()[AgeGroup(age)] * - denom_E * num_Exposed_pi[county][age]; + S_pv * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) = - SII * model[county].parameters.template get()[AgeGroup(age)] * - denom_E * num_Exposed_ii[county][age]; + S_v * model[county].parameters.template get()[AgeGroup(age)] * + denom_E * num_Exposed_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + age_group_offset) = - SN * denom_C * num_InfectedNoSymptoms_n[county][age]; + S * denom_C * num_InfectedNoSymptoms_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + age_group_offset) = - SPI * denom_C * num_InfectedNoSymptoms_pi[county][age]; + S_pv * denom_C * num_InfectedNoSymptoms_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + age_group_offset) = - SII * denom_C * num_InfectedNoSymptoms_ii[county][age]; + S_v * denom_C * num_InfectedNoSymptoms_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaiveConfirmed + age_group_offset) = - SN * denom_C * num_InfectedNoSymptomsConfirmed_n[county][age]; + S * denom_C * num_InfectedNoSymptomsConfirmed_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + age_group_offset) = - SPI * denom_C * num_InfectedNoSymptomsConfirmed_pi[county][age]; + S_pv * denom_C * num_InfectedNoSymptomsConfirmed_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + age_group_offset) = - SII * denom_C * num_InfectedNoSymptomsConfirmed_ii[county][age]; + S_v * denom_C * num_InfectedNoSymptomsConfirmed_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) = - SN * denom_I * num_InfectedSymptoms_n[county][age]; + S * denom_I * num_InfectedSymptoms_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) = - SPI * + S_pv * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_pi[county][age]; + denom_I * num_InfectedSymptoms_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) = - SII * + S_v * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_ii[county][age]; + denom_I * num_InfectedSymptoms_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + age_group_offset) = - SN * denom_I * num_InfectedSymptomsConfirmed_n[county][age]; + S * denom_I * num_InfectedSymptomsConfirmed_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) = - SPI * + S_pv * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_pi[county][age]; + denom_I * num_InfectedSymptomsConfirmed_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) = - SII * + S_v * model[county].parameters.template get()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_ii[county][age]; + denom_I * num_InfectedSymptomsConfirmed_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) = - SN * denom_HU * num_InfectedSevere_n[county][age]; + S * denom_HU * num_InfectedSevere_uv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + age_group_offset) = - SPI * + S_pv * model[county] .parameters.template get()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_pi[county][age]; + denom_HU * num_InfectedSevere_pv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) = - SII * + S_v * model[county] .parameters.template get()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_ii[county][age]; + denom_HU * num_InfectedSevere_fv[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) = - SN * denom_HU * num_icu[county][age]; + S * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + age_group_offset) = - SPI * + S_pv * model[county] .parameters.template get()[AgeGroup(age)] * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) = - SII * + S_v * model[county] .parameters.template get()[AgeGroup(age)] * denom_HU * num_icu[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunPartialImmunity + - age_group_offset) = - num_timm1[county][age] * immunity_population[0][size_t(age)]; - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + - age_group_offset) = - num_timm2[county][age] * immunity_population[1][size_t(age)] + - immunity_population[2][size_t(age)] * immunity_population[2][size_t(age)]; - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) = - SII - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + model[county] + .parameters.template get()[{AgeGroup(age), SimulationDay(day)}] + + num_rec_uv[county][age] - + (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + age_group_offset) + + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + extrapolated_rki[county][day]( (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)); extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) = std::min( - SII - (extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)), + S_v - + extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + + age_group_offset) - + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + + age_group_offset) - + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + + age_group_offset) - + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + + age_group_offset) - + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset), std::max(0.0, double(extrapolated_rki[county][day]( (size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset)))); - ///////////////// extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + age_group_offset) = - SPI - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + std::max(0.0, + S_pv - + extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedNoSymptomsPartialImmunity + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedSeverePartialImmunity + age_group_offset) - + extrapolated_rki[county][day]( + (size_t)InfectionState::InfectedCriticalPartialImmunity + age_group_offset) - + extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + + age_group_offset)); + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = + num_population[county][age] - + (extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + + extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + + extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + - age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + - age_group_offset) = - std::min(SPI, std::max(0.0, double(extrapolated_rki[county][day]( - (size_t)InfectionState::SusceptiblePartialImmunity + - age_group_offset)))); - - ///////////////// - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = - SPI - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + + age_group_offset) + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = - std::min(SN, std::max(0.0, double(extrapolated_rki[county][day]( - (size_t)InfectionState::SusceptibleNaive + age_group_offset)))); + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + + extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + + age_group_offset)); // in set_confirmed_cases_data initilization, deaths are now set to 0. In order to visualize // the extrapolated real number of deaths, they have to be set here. In the comparison of data @@ -1100,7 +1186,7 @@ IOResult export_input_data_county_timeseries( // available here. // Do only add deaths after substraction. extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) = - num_death_n[county][age]; + num_death_uv[county][age]; } } else { @@ -1122,19 +1208,20 @@ IOResult export_input_data_county_timeseries( } template -IOResult export_input_data_county_timeseries( - std::vector&& model, const std::string& dir, std::vector const& region, Date date, - const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, - const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, - bool set_vaccination_data, const std::string& vaccination_data_path, const std::string& immunity_data_path) +IOResult +export_input_data_county_timeseries(std::vector&& model, const std::string& dir, std::vector const& region, + Date date, const std::vector& scaling_factor_inf, double scaling_factor_icu, + int num_days, const std::string& divi_data_path, + const std::string& confirmed_cases_path, const std::string& population_data_path, + bool set_vaccination_data, const std::string& vaccination_data_path) { if (set_vaccination_data) { BOOST_OUTCOME_TRY(details::set_vaccination_data(model, vaccination_data_path, date, region, num_days)); } - BOOST_OUTCOME_TRY(export_input_data_county_timeseries( - model, dir, region, date, scaling_factor_inf, scaling_factor_icu, num_days, divi_data_path, - confirmed_cases_path, population_data_path, immunity_data_path)); + BOOST_OUTCOME_TRY(export_input_data_county_timeseries(model, dir, region, date, scaling_factor_inf, + scaling_factor_icu, num_days, divi_data_path, + confirmed_cases_path, population_data_path)); return success(); } @@ -1164,7 +1251,7 @@ IOResult export_input_data_county_timeseries(std::vector&&, const s * Estimates all compartments from available data using the model parameters, so the * model parameters must be set before calling this function. * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRS-type models, one per county. + * @param model Vector of SECIRVVS models, one per county. * @param date Date for which the data should be read. * @param county Ids of the counties. * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. @@ -1192,11 +1279,10 @@ IOResult read_input_data_county(std::vector& model, Date date, cons } BOOST_OUTCOME_TRY(details::set_confirmed_cases_data( - model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf, - path_join(dir, "pydata/Germany", "immunity_population.txt"))); + model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf)); BOOST_OUTCOME_TRY( - details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), county, - path_join(dir, "pydata/Germany", "immunity_population.txt"))); + details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), + path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date)); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! @@ -1208,8 +1294,7 @@ IOResult read_input_data_county(std::vector& model, Date date, cons export_input_data_county_timeseries(model, dir, county, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), - path_join(dir, "pydata/Germany", "county_current_population.json"), - path_join(dir, "pydata/Germany", "immunity_population.txt"))); + path_join(dir, "pydata/Germany", "county_current_population.json"))); } return success(); @@ -1220,7 +1305,7 @@ IOResult read_input_data_county(std::vector& model, Date date, cons * Estimates all compartments from available data using the model parameters, so the * model parameters must be set before calling this function. * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRS-type models, one per county. + * @param model Vector of SECIRVVS models, one per county. * @param date Date for which the data should be read. * @param county Ids of the counties. * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. @@ -1249,10 +1334,9 @@ IOResult read_input_data(std::vector& model, Date date, const std:: } BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, - date, scaling_factor_inf, - path_join(data_dir, "immunity_population.txt"))); - BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, - path_join(data_dir, "immunity_population.txt"))); + date, scaling_factor_inf)); + BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), + path_join(data_dir, "confirmed_cases.json"), node_ids, date)); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! @@ -1263,7 +1347,7 @@ IOResult read_input_data(std::vector& model, Date date, const std:: BOOST_OUTCOME_TRY(export_input_data_county_timeseries( model, data_dir, node_ids, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(data_dir, "critical_cases.json"), path_join(data_dir, "confirmed_cases.json"), - path_join(data_dir, "population_data.json"), path_join(data_dir, "immunity_population.txt"))); + path_join(data_dir, "population_data.json"))); } return success(); diff --git a/cpp/simulations/CMakeLists.txt b/cpp/simulations/CMakeLists.txt index adcf494d0f..170feee470 100644 --- a/cpp/simulations/CMakeLists.txt +++ b/cpp/simulations/CMakeLists.txt @@ -3,9 +3,10 @@ if(MEMILIO_HAS_JSONCPP AND MEMILIO_HAS_HDF5) target_link_libraries(2020_npis_wildtype PRIVATE memilio ode_secir Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(2020_npis_wildtype PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) - # add_executable(2021_vaccination_delta 2021_vaccination_sarscov2_delta_germany.cpp) - # target_link_libraries(2021_vaccination_delta PRIVATE memilio ode_secirvvs Boost::filesystem ${HDF5_C_LIBRARIES}) - # target_compile_options(2021_vaccination_delta PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) + add_executable(2021_vaccination_delta 2021_vaccination_sarscov2_delta_germany.cpp) + target_link_libraries(2021_vaccination_delta PRIVATE memilio ode_secirvvs Boost::filesystem ${HDF5_C_LIBRARIES}) + target_compile_options(2021_vaccination_delta PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) + add_executable(abm_simulation abm.cpp) target_link_libraries(abm_simulation PRIVATE memilio abm Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(abm_simulation PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index 16855eec07..4c0619e1eb 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -90,7 +90,7 @@ endif() add_executable(memilio-test ${TESTSOURCES}) target_include_directories(memilio-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(memilio-test PRIVATE memilio ode_secir ode_seir ode_secirvvs ode_secirts ide_seir ide_secir lct_secir abm gtest_main) +target_link_libraries(memilio-test PRIVATE memilio ode_secir ode_seir ode_secirts ode_secirvvs ide_seir ide_secir lct_secir abm gtest_main) target_compile_options(memilio-test PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) # make unit tests find the test data files diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index f0fbe879b4..3411b198de 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -28,8 +28,8 @@ #include "test_data_dir.h" #include "gtest/gtest.h" #include "json/value.h" -#include "ode_secirvvs/model.h" -#include "ode_secirvvs/parameters_io.h" +#include "ode_secirts/model.h" +#include "ode_secirts/parameters_io.h" #include "memilio/utils/stl_util.h" #include "boost/optional/optional_io.hpp" #include @@ -390,16 +390,16 @@ TEST(TestEpiData, set_vaccination_data) auto num_days = 9; std::vector county_ids = {1001}; - mio::osecirvvs::Model model(num_age_groups); - model.parameters.set(3); - model.parameters.set(1); - model.parameters.set(2); - model.parameters.set(1); - std::vector model_vector{model}; + mio::osecirts::Model model(num_age_groups); + model.parameters.set(3); + model.parameters.set(1); + model.parameters.set(2); + model.parameters.set(1); + std::vector model_vector{model}; - auto f = mio::osecirvvs::details::set_vaccination_data(model_vector, - mio::path_join(TEST_DATA_DIR, "vaccination_test.json"), - mio::Date(2022, 4, 15), county_ids, num_days); + auto f = mio::osecirts::details::set_vaccination_data(model_vector, + mio::path_join(TEST_DATA_DIR, "vaccination_test.json"), + mio::Date(2022, 4, 15), county_ids, num_days); auto expected_values_PI = (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 7, 10, 20, 15, 10, 5, 2, 15, 8, 0).finished(); @@ -410,11 +410,11 @@ TEST(TestEpiData, set_vaccination_data) auto expected_values_B = (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 5, 7, 9, 11, 13, 9, 7, 5, 5, 0).finished(); - ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), MatrixNear(print_wrap(expected_values_PI), 1e-8, 1e-8)); - ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), MatrixNear(print_wrap(expected_values_II), 1e-8, 1e-8)); - ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), + ASSERT_THAT(print_wrap(model_vector[0].parameters.template get().array()), MatrixNear(print_wrap(expected_values_B), 1e-8, 1e-8)); } diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index efd2b4e510..18c1419394 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -181,6 +181,8 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) EXPECT_NEAR(result[0], 100.0, 1e-12); } +namespace +{ void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) { auto invalid_initial = max == 0 ? 1.0 : max * 1.001; @@ -206,6 +208,7 @@ void array_assign_uniform_distribution(mio::CustomIndexArray().array().setConstant(0); model.parameters.get().resize(mio::SimulationDay(size_t(1000))); model.parameters.get().array().setConstant(0); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); mio::TimeSeries result = simulate(t0, tmax, dt, model); EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); } -TEST(TestOdeSECIRVVS, overflow_vaccinations) +TEST(TestOdeSECIRVVS, reduceToSecirAndCompareWithPreviousRun) { - const double t0 = 0; - const double tmax = 1; - const double dt = 1; + // double t0 = 0; + // double tmax = 50; - // init simple model mio::osecirvvs::Model model(1); - model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}] = 10.; - model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 10.; - model.populations[{mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = 10.; - model.parameters.get()[mio::AgeGroup(0)] = 0.0; - - // set vaccination rates higher than total population for each layer - const size_t daily_vaccinations = 100; - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); - for (size_t i = 0; i <= tmax; ++i) { - auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = - num_vaccinations; - } - - // simulate one step with explicit Euler - auto integrator = std::make_shared(); - auto result = simulate_flows(t0, tmax, dt, model, integrator); - - // get the flow indices for each type of vaccination and also the indices of the susceptible compartments - auto flow_indx_partial_vaccination = - model.get_flat_flow_index({mio::AgeGroup(0)}); - auto flow_indx_full_vaccination = - model.get_flat_flow_index({mio::AgeGroup(0)}); - auto flow_indx_booster_vaccination = - model.get_flat_flow_index({mio::AgeGroup(0)}); - auto indx_S_naive = - model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}); - auto indx_S_partial = model.populations.get_flat_index( - {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}); - auto indx_S_improved = model.populations.get_flat_index( - {mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}); - - // check that the number of vaccinated people is never higher than the total number of susceptible people - EXPECT_NEAR(result[1].get_last_value()[flow_indx_partial_vaccination], result[0].get_value(0)[indx_S_naive], 1e-10); - EXPECT_NEAR(result[1].get_last_value()[flow_indx_full_vaccination], result[0].get_value(0)[indx_S_partial], 1e-10); - EXPECT_NEAR(result[1].get_last_value()[flow_indx_booster_vaccination], result[0].get_value(0)[indx_S_improved], - 1e-10); -} - -TEST(TestOdeSECIRVVS, smooth_vaccination_rate) -{ - const ScalarType tmax = 2.; - - // init simple model - mio::osecirvvs::Model model(1); - auto& daily_vaccinations = model.parameters.get(); - daily_vaccinations.resize(mio::SimulationDay(tmax + 1)); - daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; - daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(1)}] = 10; - daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(2)}] = 110; - - const auto eps1 = 0.15; - - // test when t is out of the range - Eigen::VectorXd result = model.vaccinations_at(5, daily_vaccinations, eps1); - EXPECT_EQ(result.size(), 1); - EXPECT_NEAR(result[0], 0, 1e-12); - - // test when t i below the lower bound - result = model.vaccinations_at(0.5, daily_vaccinations, eps1); - EXPECT_EQ(result.size(), 1); - EXPECT_NEAR(result[0], 10, 1e-12); - - result = model.vaccinations_at(1.5, daily_vaccinations, eps1); - EXPECT_EQ(result.size(), 1); - EXPECT_NEAR(result[0], 100, 1e-12); - - // test when t is withing the range of the smoothing - result = model.vaccinations_at(0.85, daily_vaccinations, eps1); - EXPECT_NEAR(result[0], 10.0, 1e-12); - - result = model.vaccinations_at(0.90, daily_vaccinations, eps1); - EXPECT_NEAR(result[0], 32.5, 1e-12); - - result = model.vaccinations_at(0.95, daily_vaccinations, eps1); - EXPECT_NEAR(result[0], 77.5, 1e-12); + double nb_total_t0 = 10000, nb_exp_t0 = 100, nb_inf_t0 = 50, nb_car_t0 = 50, nb_hosp_t0 = 20, nb_icu_t0 = 10, + nb_rec_t0 = 10; + + model.populations.set_total(nb_total_t0); + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedNaive}] = nb_exp_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedImprovedImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::ExposedPartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive}] = nb_car_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = + 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = + 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsNaive}] = nb_inf_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = + 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSevereNaive}] = nb_hosp_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSevereImprovedImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedSeverePartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalNaive}] = nb_icu_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalPartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::InfectedCriticalImprovedImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleImprovedImmunity}] = nb_rec_t0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptiblePartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadNaive}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadPartialImmunity}] = 0; + model.populations[{(mio::AgeGroup)0, mio::osecirvvs::InfectionState::DeadImprovedImmunity}] = 0; + model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleNaive}, + nb_total_t0); - result = model.vaccinations_at(1.0, daily_vaccinations, eps1); - EXPECT_NEAR(result[0], 100.0, 1e-12); + model.parameters.get() = 10000; + model.parameters.get() = 10000; + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); + model.parameters.get().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get().array().setConstant(0); - // Test also with a different epsilon - const auto eps2 = 0.4; - result = model.vaccinations_at(0.6, daily_vaccinations, eps2); - EXPECT_NEAR(result[0], 10.0, 1e-12); + auto& contacts = model.parameters.get(); + auto& contact_matrix = contacts.get_cont_freq_mat(); + contact_matrix[0] = mio::ContactMatrix(Eigen::MatrixXd::Constant(1, 1, 10)); + contact_matrix[0].add_damping(0.7, mio::SimulationTime(30.)); - result = model.vaccinations_at(0.8, daily_vaccinations, eps2); - EXPECT_NEAR(result[0], 55, 1e-12); + //times + model.parameters.get()[mio::AgeGroup(0)] = 3.2; + model.parameters.get()[mio::AgeGroup(0)] = 2.; + model.parameters.get()[mio::AgeGroup(0)] = 5; + model.parameters.get()[mio::AgeGroup(0)] = 10; + model.parameters.get()[mio::AgeGroup(0)] = 8; - result = model.vaccinations_at(1., daily_vaccinations, eps2); - EXPECT_NEAR(result[0], 100.0, 1e-12); + //probabilities + model.parameters.get()[mio::AgeGroup(0)] = 0.05; + model.parameters.get()[mio::AgeGroup(0)] = 1; + model.parameters.get()[mio::AgeGroup(0)] = 0.25; + model.parameters.get()[mio::AgeGroup(0)] = 0.09; + model.parameters.get()[mio::AgeGroup(0)] = 0.2; + model.parameters.get()[mio::AgeGroup(0)] = 0.25; + model.parameters.get()[mio::AgeGroup(0)] = 0.3; + + // TODO: Reduction not possible like this, division by zero! + model.parameters.get()[mio::AgeGroup(0)] = 1.0; + model.parameters.get()[mio::AgeGroup(0)] = 1.0; + model.parameters.get()[mio::AgeGroup(0)] = 1.0; + model.parameters.get()[mio::AgeGroup(0)] = 0; + model.parameters.get()[mio::AgeGroup(0)] = 0; + model.parameters.get()[mio::AgeGroup(0)] = 0; + model.parameters.get()[mio::AgeGroup(0)] = 1; + + model.parameters.get() = 0.2; + + mio::set_log_level(mio::LogLevel::err); + model.apply_constraints(); + mio::set_log_level(mio::LogLevel::warn); + // TODO: gets stuck by division by zero!! + // auto integrator = std::make_shared(); + // integrator->set_dt_min(0.3); + // integrator->set_dt_max(1.0); + // integrator->set_rel_tolerance(1e-4); + // integrator->set_abs_tolerance(1e-1); + // mio::TimeSeries secihurd = simulate(t0, tmax, 0.1, model, integrator); + + // auto compare = load_test_data_csv("secihurd-compare.csv"); + + // ASSERT_EQ(compare.size(), static_cast(secihurd.get_num_time_points())); + // for (size_t i = 0; i < compare.size(); i++) { + // ASSERT_EQ(compare[i].size(), static_cast(secihurd.get_num_elements()) + 1) << "at row " << i; + // EXPECT_NEAR(secihurd.get_time(i), compare[i][0], 1e-10) << "at row " << i; + // for (size_t j = 1; j < compare[i].size(); j++) { + // // TODO: extract naive compartments + // EXPECT_NEAR(secihurd.get_value(i)[j - 1], compare[i][j], 1e-10) << " at row " << i; + // } + // } } void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) @@ -277,8 +271,6 @@ void set_demographic_parameters(mio::osecirvvs::Model::ParameterSet& parameters, parameters.get().array().setConstant(5); parameters.get().resize(mio::SimulationDay(size_t(1000))); parameters.get().array().setConstant(3); - parameters.get().resize(mio::SimulationDay(size_t(1000))); - parameters.get().array().setConstant(3); } void set_contact_parameters(mio::osecirvvs::Model::ParameterSet& parameters, bool set_invalid_initial_value) @@ -429,7 +421,7 @@ mio::osecirvvs::Model make_model(int num_age_groups, bool set_invalid_initial_va return model; } -TEST(TestOdeSECIRVVS, draw_sample_graph) +TEST(TestOdeSECIRVVS, draw_sample) { mio::log_thread_local_rng_seeds(mio::LogLevel::warn); @@ -441,7 +433,7 @@ TEST(TestOdeSECIRVVS, draw_sample_graph) graph.add_node(0, make_model(num_age_groups, /*set_invalid_initial_value*/ true)); graph.add_edge(0, 1, Eigen::VectorXd::Constant(num_age_groups, num_age_groups)); - auto sampled_graph = mio::osecirvvs::draw_sample(graph); + auto sampled_graph = mio::osecirvvs::draw_sample(graph, true); ASSERT_EQ(sampled_graph.nodes().size(), graph.nodes().size()); ASSERT_EQ(sampled_graph.edges().size(), graph.edges().size()); @@ -484,35 +476,6 @@ TEST(TestOdeSECIRVVS, draw_sample_graph) ASSERT_FALSE((populations1.array() == populations0.array()).all()) << "Failure might be spurious, check RNG seeds."; } -TEST(TestOdeSECIRVVS, draw_sample_model) -{ - mio::log_thread_local_rng_seeds(mio::LogLevel::warn); - - auto num_age_groups = 6; - auto model = make_model(num_age_groups, /*set_invalid_initial_value*/ true); - mio::osecirvvs::draw_sample(model); - - // spot check for sampling - auto& parameters = model.parameters; - auto& populations = model.populations; - auto& timeInfectedCritical = parameters.get()[mio::AgeGroup(1)]; - ASSERT_GE(double(timeInfectedCritical), 4.95); - ASSERT_LE(double(timeInfectedCritical), 8.95); - auto& param_exp_factor = parameters.get()[mio::AgeGroup(0)]; - ASSERT_GE(double(param_exp_factor), 0.75); - ASSERT_LE(double(param_exp_factor), 0.85); - auto& compartment_inf = - populations[{mio::AgeGroup(2), mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity}]; - ASSERT_GE(double(compartment_inf), 5.0); - ASSERT_LE(double(compartment_inf), 10.0); - - // special cases - ASSERT_NEAR(populations.get_total(), 1000 * num_age_groups, 1e-2); - ASSERT_TRUE((parameters.get().array(), - parameters.get().array() * 1.0) - .all()); -} - TEST(TestOdeSECIRVVS, checkPopulationConservation) { auto num_age_groups = 2; @@ -542,7 +505,6 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::vector> t_InfectedSymptoms(1); std::vector> t_InfectedSevere(1); std::vector> t_InfectedCritical(1); - std::vector> t_imm_interval1(1); std::vector> mu_C_R(1); std::vector> mu_I_H(1); @@ -550,7 +512,7 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::vector> num_InfectedSymptoms(1); std::vector> num_death(1); - std::vector> num_timm(1); + std::vector> num_rec(1); std::vector> num_Exposed(1); std::vector> num_InfectedNoSymptoms(1); std::vector> num_InfectedSevere(1); @@ -558,7 +520,7 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) num_InfectedSymptoms[0] = std::vector(num_age_groups, 0.0); num_death[0] = std::vector(num_age_groups, 0.0); - num_timm[0] = std::vector(num_age_groups, 0.0); + num_rec[0] = std::vector(num_age_groups, 0.0); num_Exposed[0] = std::vector(num_age_groups, 0.0); num_InfectedNoSymptoms[0] = std::vector(num_age_groups, 0.0); num_InfectedSevere[0] = std::vector(num_age_groups, 0.0); @@ -575,8 +537,6 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); t_InfectedCritical[0].push_back(static_cast(std::round( model[0].parameters.template get()[(mio::AgeGroup)group]))); - t_imm_interval1[0].push_back(static_cast(std::round( - model[0].parameters.template get()[(mio::AgeGroup)group]))); mu_C_R[0].push_back( model[0].parameters.template get()[(mio::AgeGroup)group]); @@ -588,8 +548,8 @@ TEST(TestOdeSECIRVVS, read_confirmed_cases) auto read = mio::osecirvvs::details::read_confirmed_cases_data( path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, - num_icu, num_death, num_timm, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); + num_icu, num_death, num_rec, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, + t_InfectedCritical, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); ASSERT_THAT(read, IsSuccess()); } @@ -617,19 +577,19 @@ TEST(TestOdeSECIRVVS, read_data) // values were generated by the tested function; can only check stability of the implementation, not correctness auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 410.72, 3630.45, - 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, - 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 2893.07, 0, 0, 0, 2652.78, 714.319, 763.188, 8032.87, - 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, 0.0132265, - 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 5916.15, 0, 0, 0, 3658.05, 799.805, 5554.16, 43483, 5.32163, - 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, 0.56467, 0.071343, - 0.0777408, 0.0753594, 3.5, 4, 21861.8, 0, 0, 0, 2589.83, 845.38, 6617.66, 48070, 5.33096, 40.6794, 9.01336, - 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, 1.78101, 0.218787, 0.234499, 0.487853, - 3.5, 4, 24154, 0, 0, 0, 3367.68, 774.244, 1528.03, 21414.7, 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, - 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, 0.328498, 2.61775, 3.5, 4, 16069.9, 0, - 0, 0, 4038.53, 836.776, 144.225, 1979.35, 0.22575, 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, - 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, 0.146922, 4.75954, 3.5, 4, 8288.72, 0, 0, 0, - 4447.91, 823.157) + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 8792.15, 175.889, + 3.21484, 0.0633116, 0.221057, 1.42882, 0.0351731, 0.29682, 0, 0, 0, 6.93838, 0.0725173, 0.206715, 0, 0, 0, + 0.0337498, 1.23324e-05, 0.000208293, 0.0292822, 5.8568e-05, 0.000406386, 1340.42, 0, 0, 0, 17067.6, 220.137, + 7.64078, 0.0970237, 0.381933, 4.91193, 0.0779655, 0.741778, 0, 0, 0, 11.7286, 0.0890643, 0.286235, 0, 0, 0, + 0.0434344, 8.40756e-06, 0.000160098, 0.0294125, 3.7932e-05, 0.000296738, 1891.19, 0, 0, 0, 72501, 176.267, + 47.227, 0.113013, 0.490073, 24.4094, 0.0730141, 0.765246, 0, 0, 0, 64.6789, 0.0855947, 0.303032, 0, 0, 0, + 1.23754, 4.5968e-05, 0.000964262, 0.0751837, 1.82724e-05, 0.000157466, 1670.26, 0, 0, 0, 80790.1, 184.645, + 44.5477, 0.100229, 0.50512, 23.6881, 0.0666206, 0.811467, 0, 0, 0, 58.9805, 0.0758111, 0.31192, 0, 0, 0, + 3.75961, 0.000136175, 0.00331973, 0.486628, 0.000111199, 0.00111367, 2022.58, 0, 0, 0, 41581, 177.478, 9.27393, + 0.0389771, 0.216151, 5.77433, 0.030336, 0.4066, 0, 0, 0, 13.3664, 0.0312302, 0.141394, 0, 0, 0, 3.119, + 0.000209444, 0.00561852, 2.60439, 0.00111169, 0.0122515, 2136.6, 0, 0, 0, 13223.8, 216.037, 11.1838, 0.179986, + 0.863926, 3.50537, 0.0705169, 0.818075, 0, 0, 0, 3.52982, 0.0331744, 0.130002, 0, 0, 0, 0.695168, 0.000190699, + 0.00442784, 4.67895, 0.00764769, 0.0729502, 2253.61, 0, 0, 0) .finished(); ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), @@ -677,9 +637,6 @@ TEST(TestOdeSECIRVVS, read_data) 0); EXPECT_GE(double(model3[0].populations[{i, mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity}]), 0); - EXPECT_GE(double(model2[0].populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunPartialImmunity}]), 0); - EXPECT_GE(double(model3[0].populations[{i, mio::osecirvvs::InfectionState::TemporaryImmunImprovedImmunity}]), - 0); // currently dead and confirmed after commuting compartments are initialized as zero EXPECT_EQ(double(model1[0].populations[{i, mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), @@ -770,8 +727,7 @@ TEST(TestOdeSECIRVVS, export_time_series_init) mio::path_join(TEST_DATA_DIR, "county_divi_ma7.json"), mio::path_join(TEST_DATA_DIR, "cases_all_county_age_ma7.json"), mio::path_join(TEST_DATA_DIR, "county_current_population.json"), true, - mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json"), - mio::path_join(TEST_DATA_DIR, "immunity_population.txt")), + mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json")), IsSuccess()); auto data_extrapolated = mio::read_result(mio::path_join(tmp_results_dir, "Results_rki.h5")); @@ -780,7 +736,7 @@ TEST(TestOdeSECIRVVS, export_time_series_init) // Values were generated by the tested function export_input_data_county_timeseries; // can only check stability of the implementation, not correctness auto expected_results = - mio::read_result(mio::path_join(TEST_DATA_DIR, "export_time_series_initialization_osecirts.h5")).value(); + mio::read_result(mio::path_join(TEST_DATA_DIR, "export_time_series_initialization_osecirvvs.h5")).value(); ASSERT_THAT(print_wrap(data_extrapolated.value()[0].get_groups().matrix()), MatrixNear(print_wrap(expected_results[0].get_groups().matrix()), 1e-5, 1e-5)); @@ -802,19 +758,20 @@ TEST(TestOdeSECIRVVS, model_initialization) // Values from data/export_time_series_init_osecirvvs.h5, for reading in comparison // operator for return of mio::read_result and model population needed. auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 138748, 2.11327e+06, - 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, - 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 1.21334e+06, 0, 0, 0, 2652.78, 714.319, 309974, - 4.7235e+06, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, - 0.0132265, 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 2.71151e+06, 0, 0, 0, 3658.05, 799.805, 1.44128e+06, - 1.19121e+07, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, - 0.56467, 0.071343, 0.0777408, 0.0753594, 3.5, 4, 5.86047e+06, 0, 0, 0, 2589.83, 845.38, 2.40269e+06, - 1.86176e+07, 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, - 1.78101, 0.218787, 0.234499, 0.487853, 3.5, 4, 9.00942e+06, 0, 0, 0, 3367.68, 774.244, 578004, 9.57445e+06, - 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, - 0.223414, 0.328498, 2.61775, 3.5, 4, 6.35731e+06, 0, 0, 0, 4038.53, 836.776, 61810.3, 2.53029e+06, 0.22575, - 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, - 0.046887, 0.146922, 4.75954, 3.5, 4, 3.58492e+06, 0, 0, 0, 4447.91, 823.157) + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirvvs::InfectionState::Count)) << 3.46722e+06, 176.06, + 3.42799, 0.00017139, 0.00059842, 1.52355, 9.52168e-05, 0.000803518, 0, 0, 0, 7.28479, 0.000193296, 0.000551002, + 0, 0, 0, 0.0342843, 3.1805e-08, 5.37183e-07, 0.029746, 1.51045e-07, 1.04806e-06, 1340.35, 0, 0, 0, 7.74734e+06, + 220.4, 7.99917, 0.000224064, 0.000882024, 5.14232, 0.000180051, 0.00171304, 0, 0, 0, 12.1419, 0.000203391, + 0.000653659, 0, 0, 0, 0.0439275, 1.87568e-08, 3.5717e-07, 0.0297464, 8.46241e-08, 6.62006e-07, 1891.15, 0, 0, + 0, 1.92155e+07, 176.538, 47.6768, 0.00043128, 0.00187022, 24.642, 0.000278636, 0.00292033, 0, 0, 0, 65.1411, + 0.000325876, 0.0011537, 0, 0, 0, 1.24042, 1.74173e-07, 3.65358e-06, 0.0753588, 6.9234e-08, 5.96637e-07, + 1671.81, 0, 0, 0, 3.00317e+07, 184.888, 44.9988, 0.000272769, 0.00137466, 23.9279, 0.000181305, 0.00220837, 0, + 0, 0, 59.4274, 0.000205796, 0.000846734, 0, 0, 0, 3.76905, 3.67799e-07, 8.9664e-06, 0.48785, 3.00341e-07, + 3.00797e-06, 2022.51, 0, 0, 0, 1.65123e+07, 177.579, 9.4638, 0.000100211, 0.00055573, 5.89255, 7.79946e-05, + 0.00104538, 0, 0, 0, 13.5709, 7.98864e-05, 0.000361685, 0, 0, 0, 3.13496, 5.30384e-07, 1.4228e-05, 2.61772, + 2.81518e-06, 3.1025e-05, 2136.56, 0, 0, 0, 6.17983e+06, 216.328, 11.9625, 0.000412312, 0.00197908, 3.74944, + 0.00016154, 0.00187405, 0, 0, 0, 3.71387, 7.47535e-05, 0.000292941, 0, 0, 0, 0.707117, 4.15435e-07, + 9.64602e-06, 4.75937, 1.66604e-05, 0.000158922, 2253.59, 0, 0, 0) .finished(); ASSERT_THAT(print_wrap(model_vector[0].populations.array().cast()), @@ -832,7 +789,7 @@ TEST(TestOdeSECIRVVS, run_simulation) // Load result of a previous run; only tests stability, not correctness. auto expected_result = - mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirts.h5")).value()[0].get_groups(); + mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirvvs.h5")).value()[0].get_groups(); ASSERT_THAT(print_wrap(result.matrix()), MatrixNear(print_wrap(expected_result.matrix()), 1e-5, 1e-5)); } @@ -851,7 +808,7 @@ TEST(TestOdeSECIRVVS, parameter_percentiles) //sample a few times auto sampled_graphs = std::vector>(); std::generate_n(std::back_inserter(sampled_graphs), 10, [&graph]() { - return mio::osecirvvs::draw_sample(graph); + return mio::osecirvvs::draw_sample(graph, true); }); //extract nodes from graph @@ -911,7 +868,7 @@ TEST(TestOdeSECIRVVS, get_migration_factors) auto expected_values = (Eigen::VectorXd(Eigen::Index(mio::osecirvvs::InfectionState::Count) * num_age_groups) << 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .finished(); ASSERT_THAT(print_wrap(migration_factors), MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); } @@ -1028,23 +985,7 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) model.parameters.set(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(10.); - model.parameters.set(0.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set(90.); - model.parameters.set(-20.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set(90.); - model.parameters.set(0.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set(100.); - model.parameters.set(0.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set(200); + model.parameters.set(2); model.parameters.set(2.0); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1077,18 +1018,14 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(2); - model.parameters.set(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set(7); - model.parameters.set(-0.2); + model.parameters.set(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); - model.parameters.set(-2); + model.parameters.set(30); + model.parameters.set(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); + model.parameters.set(30); model.parameters.set(0); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1113,7 +1050,7 @@ TEST(TestOdeSECIRVVS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(0.5); - model.parameters.set(0); + model.parameters.set(-0); ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set(1); @@ -1160,22 +1097,6 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); - model.parameters.set(0); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); - - model.parameters.set(0); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); - - model.parameters.set(0); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); - - model.parameters.set(0); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); - model.parameters.set(2.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_NEAR(model.parameters.get()[indx_agegroup], 0.0, 1e-14); @@ -1208,17 +1129,13 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); - model.parameters.set(-2); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); - - model.parameters.set(-0.2); + model.parameters.set(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); - model.parameters.set(-0.2); + model.parameters.set(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); model.parameters.set(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); diff --git a/pycode/examples/simulation/osecirvvs_simple.py b/pycode/examples/simulation/osecirvvs_simple.py index b118d81f45..915c2ce73e 100644 --- a/pycode/examples/simulation/osecirvvs_simple.py +++ b/pycode/examples/simulation/osecirvvs_simple.py @@ -99,13 +99,13 @@ def run_secirvvs_simulation(show_plot=True): model.parameters.ICUCapacity.value = 100 model.parameters.TestAndTraceCapacity.value = 0.0143 - model.parameters.DailyFirstVaccination.resize_SimulationDay( + model.parameters.DailyPartialVaccination.resize_SimulationDay( SimulationDay(tmax + 1)) model.parameters.DailyFullVaccination.resize_SimulationDay( SimulationDay(tmax + 1)) daily_vaccinations = 10 for i, num_vaccinations in enumerate(range(0, daily_vaccinations * (tmax + 1), daily_vaccinations)): - model.parameters.DailyFirstVaccination[AgeGroup( + model.parameters.DailyPartialVaccination[AgeGroup( 0), SimulationDay(i)] = num_vaccinations model.parameters.DailyFullVaccination[AgeGroup( 0), SimulationDay(i)] = num_vaccinations diff --git a/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py b/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py index d0580c5987..44c8b61656 100644 --- a/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py +++ b/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py @@ -92,9 +92,9 @@ def setUp(self): model.parameters.ICUCapacity.value = 10000 model.parameters.TestAndTraceCapacity.value = 10000 - model.parameters.DailyFirstVaccination.resize_SimulationDay( + model.parameters.DailyPartialVaccination.resize_SimulationDay( SimulationDay(1000)) - model.parameters.DailyFirstVaccination[:, :] = 0 + model.parameters.DailyPartialVaccination[:, :] = 0 model.parameters.DailyFullVaccination.resize_SimulationDay( SimulationDay(1000)) model.parameters.DailyFullVaccination[:, :] = 0 From 30a7977167fae794669dd5d6a9333ebb96d9c3e3 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 May 2024 08:59:38 +0200 Subject: [PATCH 27/60] [ci skip] reset readme secirvvs --- cpp/models/ode_secirvvs/README.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/cpp/models/ode_secirvvs/README.md b/cpp/models/ode_secirvvs/README.md index df32b3175a..ddda94bbad 100644 --- a/cpp/models/ode_secirvvs/README.md +++ b/cpp/models/ode_secirvvs/README.md @@ -1,14 +1,14 @@ -# SECIRS-type model including multi-layer waning immunity +# SECIR model with COVID-19 variants and vaccinations -This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. +This model extends the basic SECIR model by adding vaccinations and allowing the implicit modeling of a newly arriving variant that takes hold. -In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. +Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyFirstVaccination` and `DailyFullVaccination`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. -For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v1). +The ratio of two variants can change over time, which affects the average transmissiblity of the disease. Infectiousness of different variants can be set in the parameters. Below is an overview of the model architecture and its compartments. -![SECIRVVS_model](https://github.com/SciCompMod/memilio/assets/69154294/6dec331f-bd91-410f-be5e-c8cf6eb0572b) +![SECIRVVS_model](https://github.com/SciCompMod/memilio/assets/69154294/5d1b72ec-2f45-44a4-8eba-b77533c9e6cf) | Mathematical variable | C++ variable name | Description | |---------------------------- | --------------- | -------------------------------------------------------------------------------------------------- | | $\lambda_{N,i} = \rho_{N,i} \sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `ext_inf_force_dummy` | Force of infection for susceptibles located in the naive immunity level. | @@ -24,12 +24,19 @@ Below is an overview of the model architecture and its compartments. | $T_{I_{Sy}}$ | `TimeInfectedSymptoms` | Time in days an individual stays in the InfectedSymptoms compartment. | | $T_{I_{Sev}}$ | `TimeInfectedSevere` | Time in days an individual stays in the InfectedSevere compartment. | | $T_{I_{Cr}}$ | `TimeInfectedCritical` | Time in days an individual stays in the InfectedCritical compartment. | -| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunPartialImmunity compartment. | -| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmunImprovedImmunity compartment. | -| $T_{W_{PI}}$ | `TimeWaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | -| $T_{W_{II}}$ | `TimeWaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | | $\mu_{I_{NS}}^{I_{Sy}}$ | `1 - RecoveredPerInfectedNoSymptoms` | Probability of transition from compartment InfectedNoSymptoms to InfectedSymptoms. | | $\mu_{I_{Sy}}^{I_{Sev}}$ | `SeverePerInfectedSymptoms` | Probability of transition from compartment InfectedSymptoms to InfectedSevere. | | $\mu_{I_{Sev}}^{I_{Cr}}$ | `CriticalPerSevere` | Probability of transition from compartment InfectedSevere to InfectedCritical. | | $\mu_{I_{Cr}}^{D}$ | `DeathsPerCritical` | Probability of dying when located in compartment InfectedCritical. | -| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | \ No newline at end of file +| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | + +## Examples + +The extended model is used in the 2021_vaccination_sarscov2_delta_germany simulation. +An easier example can be found in [examples/ode_secirvvs.cpp](../../examples/ode_secirvvs.cpp) + +Examples of the basic SECIR model can be found at: + +- examples/ode_secir.cpp +- examples/ode_secir_ageres.cpp +- examples/ode_secir_parameter_study.cpp \ No newline at end of file From 40910b5e6a45198fa117d8e0d0cb88aec1d3e83a Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 May 2024 11:47:11 +0200 Subject: [PATCH 28/60] fix test data, static cast for msvc --- cpp/models/ode_secirts/model.h | 8 +- cpp/tests/data/vacc_county_ageinf_ma7.json | 1305 ++++++++++++++++++++ 2 files changed, 1309 insertions(+), 4 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index d25cf78a55..6a77258489 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -563,10 +563,10 @@ class Model : public FlowModel(ub + 1))}] - + daily_vaccinations[{age, SimulationDay(static_cast(ub))}]; + const auto num_vaccinations_lb = daily_vaccinations[{age, SimulationDay(static_cast(lb + 1))}] - + daily_vaccinations[{age, SimulationDay(static_cast(lb))}]; smoothed_vaccinations[(size_t)age] = smoother_cosine(t, lb, ub, num_vaccinations_lb, num_vaccinations_ub); } diff --git a/cpp/tests/data/vacc_county_ageinf_ma7.json b/cpp/tests/data/vacc_county_ageinf_ma7.json index 5900d0a515..0716826088 100644 --- a/cpp/tests/data/vacc_county_ageinf_ma7.json +++ b/cpp/tests/data/vacc_county_ageinf_ma7.json @@ -1,4 +1,1309 @@ [ + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14093.5670993244, + "Vacc_completed": 1058.2133302677, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14094.6780758432, + "Vacc_completed": 1058.2386490178, + "Vacc_refreshed": 3.9480185817, + "Vacc_refreshed_2": 1.97400929085 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14102.3458622773, + "Vacc_completed": 1063.1811826304, + "Vacc_refreshed": 7.8235846725, + "Vacc_refreshed_2": 3.91179233625 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14106.0158477852, + "Vacc_completed": 1071.0829580916, + "Vacc_refreshed": 13.0365435255, + "Vacc_refreshed_2": 6.51827176275 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14115.8958402416, + "Vacc_completed": 1072.5136218055, + "Vacc_refreshed": 15.4582843201, + "Vacc_refreshed_2": 7.72914216005 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14116.0603009948, + "Vacc_completed": 1080.8706574256, + "Vacc_refreshed": 22.3037298829, + "Vacc_refreshed_2": 11.15186494145 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14124.4849162097, + "Vacc_completed": 1087.4957123195, + "Vacc_refreshed": 27.7666004775, + "Vacc_refreshed_2": 13.88330023875 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14132.812800891, + "Vacc_completed": 1094.2936630058, + "Vacc_refreshed": 29.4212640594, + "Vacc_refreshed_2": 14.7106320297 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14139.2772895404, + "Vacc_completed": 1100.1665827188, + "Vacc_refreshed": 29.4568827793, + "Vacc_refreshed_2": 14.72844138965 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14145.4868397119, + "Vacc_completed": 1105.3345419667, + "Vacc_refreshed": 34.7217238502, + "Vacc_refreshed_2": 17.3608619251 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14147.7480966959, + "Vacc_completed": 1111.2289166538, + "Vacc_refreshed": 34.771310214, + "Vacc_refreshed_2": 17.385655107 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14154.5204084505, + "Vacc_completed": 1114.7870563855, + "Vacc_refreshed": 41.8898823514, + "Vacc_refreshed_2": 20.9449411757 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14155.4472543415, + "Vacc_completed": 1124.6385432496, + "Vacc_refreshed": 48.6348857735, + "Vacc_refreshed_2": 24.31744288675 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14162.2764203336, + "Vacc_completed": 1128.54825128, + "Vacc_refreshed": 48.7694054724, + "Vacc_refreshed_2": 24.3847027362 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14163.6229511244, + "Vacc_completed": 1128.7143765883, + "Vacc_refreshed": 53.2059941772, + "Vacc_refreshed_2": 26.6029970886 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14170.704731349, + "Vacc_completed": 1138.0466956792, + "Vacc_refreshed": 59.0394633797, + "Vacc_refreshed_2": 29.51973168985 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14177.9754226866, + "Vacc_completed": 1144.8391611423, + "Vacc_refreshed": 68.7607294969, + "Vacc_refreshed_2": 34.38036474845 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14180.6917277285, + "Vacc_completed": 1145.8477444825, + "Vacc_refreshed": 68.9221667424, + "Vacc_refreshed_2": 34.4610833712 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14183.6510488722, + "Vacc_completed": 1148.5261706572, + "Vacc_refreshed": 74.1781085786, + "Vacc_refreshed_2": 37.0890542893 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14187.685478561, + "Vacc_completed": 1156.317724845, + "Vacc_refreshed": 82.4605426733, + "Vacc_refreshed_2": 41.23027133665 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14190.8756861073, + "Vacc_completed": 1158.3230049846, + "Vacc_refreshed": 85.9686058349, + "Vacc_refreshed_2": 42.98430291745 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14194.7125443701, + "Vacc_completed": 1162.8869701267, + "Vacc_refreshed": 86.9745448839, + "Vacc_refreshed_2": 43.48727244195 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14198.1736788429, + "Vacc_completed": 1172.5122981568, + "Vacc_refreshed": 87.3520867387, + "Vacc_refreshed_2": 43.67604336935 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14200.0337444888, + "Vacc_completed": 1173.9022323601, + "Vacc_refreshed": 96.1323881978, + "Vacc_refreshed_2": 48.0661940989 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14209.9091251899, + "Vacc_completed": 1180.4819879148, + "Vacc_refreshed": 102.8081520102, + "Vacc_refreshed_2": 51.4040760051 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14215.7510791988, + "Vacc_completed": 1187.6749019896, + "Vacc_refreshed": 111.0676626302, + "Vacc_refreshed_2": 55.5338313151 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14216.891975169, + "Vacc_completed": 1194.8246181318, + "Vacc_refreshed": 112.2172983632, + "Vacc_refreshed_2": 56.1086491816 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14226.1128719795, + "Vacc_completed": 1199.3288757923, + "Vacc_refreshed": 115.0035825103, + "Vacc_refreshed_2": 57.50179125515 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14234.2678640476, + "Vacc_completed": 1200.3667784603, + "Vacc_refreshed": 122.2552339507, + "Vacc_refreshed_2": 61.12761697535 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14236.1003192184, + "Vacc_completed": 1204.1967603181, + "Vacc_refreshed": 127.0429292216, + "Vacc_refreshed_2": 63.5214646108 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14242.538633822, + "Vacc_completed": 1212.5454877324, + "Vacc_refreshed": 134.6939665016, + "Vacc_refreshed_2": 67.3469832508 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14244.3387278104, + "Vacc_completed": 1213.6034702862, + "Vacc_refreshed": 136.0920891424, + "Vacc_refreshed_2": 68.0460445712 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14251.4120506037, + "Vacc_completed": 1216.4725302456, + "Vacc_refreshed": 140.2813449601, + "Vacc_refreshed_2": 70.14067248005 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14260.7111088561, + "Vacc_completed": 1223.9349650326, + "Vacc_refreshed": 144.4607939662, + "Vacc_refreshed_2": 72.2303969831 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.4310619138, + "Vacc_completed": 1230.2964929538, + "Vacc_refreshed": 149.281965675, + "Vacc_refreshed_2": 74.6409828375 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14264.8430243455, + "Vacc_completed": 1233.791799902, + "Vacc_refreshed": 152.843700775, + "Vacc_refreshed_2": 76.4218503875 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14270.6723528208, + "Vacc_completed": 1235.7852283109, + "Vacc_refreshed": 158.6087157945, + "Vacc_refreshed_2": 79.30435789725 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14276.398217781, + "Vacc_completed": 1244.1189399585, + "Vacc_refreshed": 161.780101215, + "Vacc_refreshed_2": 80.8900506075 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14282.7632141243, + "Vacc_completed": 1252.4246776385, + "Vacc_refreshed": 164.4087953839, + "Vacc_refreshed_2": 82.20439769195 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14285.2172118541, + "Vacc_completed": 1253.0967186007, + "Vacc_refreshed": 165.7333648079, + "Vacc_refreshed_2": 82.86668240395 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14288.3981413127, + "Vacc_completed": 1261.2285273698, + "Vacc_refreshed": 175.6751183454, + "Vacc_refreshed_2": 87.8375591727 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14296.6990830234, + "Vacc_completed": 1261.8928424603, + "Vacc_refreshed": 181.3746988194, + "Vacc_refreshed_2": 90.6873494097 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14304.9324135674, + "Vacc_completed": 1268.1858225933, + "Vacc_refreshed": 182.8207287588, + "Vacc_refreshed_2": 91.4103643794 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14312.7990335985, + "Vacc_completed": 1270.8693167453, + "Vacc_refreshed": 192.6352794711, + "Vacc_refreshed_2": 96.31763973555 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14316.0317804647, + "Vacc_completed": 1276.8328604136, + "Vacc_refreshed": 199.109084232, + "Vacc_refreshed_2": 99.554542116 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14317.8224126817, + "Vacc_completed": 1285.9345839202, + "Vacc_refreshed": 204.9564534429, + "Vacc_refreshed_2": 102.47822672145 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14319.969225103, + "Vacc_completed": 1292.0814432843, + "Vacc_refreshed": 209.3116185701, + "Vacc_refreshed_2": 104.65580928505 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14325.5010146205, + "Vacc_completed": 1296.8562638588, + "Vacc_refreshed": 214.164106287, + "Vacc_refreshed_2": 107.0820531435 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14334.64723979, + "Vacc_completed": 1299.2846390455, + "Vacc_refreshed": 215.8187786169, + "Vacc_refreshed_2": 107.90938930845 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14341.3416549169, + "Vacc_completed": 1307.3997120401, + "Vacc_refreshed": 220.1718442512, + "Vacc_refreshed_2": 110.0859221256 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14349.3146443239, + "Vacc_completed": 1309.8026404332, + "Vacc_refreshed": 222.9315364644, + "Vacc_refreshed_2": 111.4657682322 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14359.2839765392, + "Vacc_completed": 1313.6592234511, + "Vacc_refreshed": 226.6469703335, + "Vacc_refreshed_2": 113.32348516675 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14365.2176903694, + "Vacc_completed": 1319.2137305156, + "Vacc_refreshed": 227.7079880211, + "Vacc_refreshed_2": 113.85399401055 + }, + { + "Date": "2020-11-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14372.2949635005, + "Vacc_completed": 1325.3928078641, + "Vacc_refreshed": 234.0214496372, + "Vacc_refreshed_2": 117.0107248186 + }, + { + "Date": "2020-11-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14377.1100641854, + "Vacc_completed": 1326.7384263101, + "Vacc_refreshed": 242.1400638609, + "Vacc_refreshed_2": 121.07003193045 + }, + { + "Date": "2020-11-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14381.7559278649, + "Vacc_completed": 1329.4413693873, + "Vacc_refreshed": 246.2374710913, + "Vacc_refreshed_2": 123.11873554565 + }, + { + "Date": "2020-11-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14385.7162526455, + "Vacc_completed": 1338.1839321545, + "Vacc_refreshed": 252.0149200475, + "Vacc_refreshed_2": 126.00746002375 + }, + { + "Date": "2020-11-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14389.4326934411, + "Vacc_completed": 1345.9094675595, + "Vacc_refreshed": 256.9046042339, + "Vacc_refreshed_2": 128.45230211695 + }, + { + "Date": "2020-11-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14391.2007554132, + "Vacc_completed": 1348.71606757, + "Vacc_refreshed": 258.1776032516, + "Vacc_refreshed_2": 129.0888016258 + }, + { + "Date": "2020-11-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14394.8621297613, + "Vacc_completed": 1354.2416050796, + "Vacc_refreshed": 267.8589065036, + "Vacc_refreshed_2": 133.9294532518 + }, + { + "Date": "2020-11-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.3456243909, + "Vacc_completed": 1359.868800934, + "Vacc_refreshed": 270.9855298163, + "Vacc_refreshed_2": 135.49276490815 + }, + { + "Date": "2020-12-01", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14398.4645205246, + "Vacc_completed": 1363.0538159145, + "Vacc_refreshed": 275.840425604, + "Vacc_refreshed_2": 137.920212802 + }, + { + "Date": "2020-12-02", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14399.1657319944, + "Vacc_completed": 1365.5993182323, + "Vacc_refreshed": 277.5856365007, + "Vacc_refreshed_2": 138.79281825035 + }, + { + "Date": "2020-12-03", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14402.7230837573, + "Vacc_completed": 1368.6201543223, + "Vacc_refreshed": 286.3361695339, + "Vacc_refreshed_2": 143.16808476695 + }, + { + "Date": "2020-12-04", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14403.1500082752, + "Vacc_completed": 1371.4419603277, + "Vacc_refreshed": 291.9429549926, + "Vacc_refreshed_2": 145.9714774963 + }, + { + "Date": "2020-12-05", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14409.601025491, + "Vacc_completed": 1375.0385110041, + "Vacc_refreshed": 294.4838831323, + "Vacc_refreshed_2": 147.24194156615 + }, + { + "Date": "2020-12-06", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.5992098988, + "Vacc_completed": 1379.7282797993, + "Vacc_refreshed": 304.3709721295, + "Vacc_refreshed_2": 152.18548606475 + }, + { + "Date": "2020-12-07", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14412.7379664054, + "Vacc_completed": 1388.4437755617, + "Vacc_refreshed": 310.9469195789, + "Vacc_refreshed_2": 155.47345978945 + }, + { + "Date": "2020-12-08", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14413.0256783966, + "Vacc_completed": 1395.0228908154, + "Vacc_refreshed": 316.1322991564, + "Vacc_refreshed_2": 158.0661495782 + }, + { + "Date": "2020-12-09", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14418.5923400284, + "Vacc_completed": 1395.4421160716, + "Vacc_refreshed": 324.326203234, + "Vacc_refreshed_2": 162.163101617 + }, + { + "Date": "2020-12-10", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14427.1006875636, + "Vacc_completed": 1400.9550416303, + "Vacc_refreshed": 326.1675291407, + "Vacc_refreshed_2": 163.08376457035 + }, + { + "Date": "2020-12-11", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14428.1259159444, + "Vacc_completed": 1401.6589165675, + "Vacc_refreshed": 336.1473853823, + "Vacc_refreshed_2": 168.07369269115 + }, + { + "Date": "2020-12-12", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14429.6710322591, + "Vacc_completed": 1406.4316961423, + "Vacc_refreshed": 338.7341080527, + "Vacc_refreshed_2": 169.36705402635 + }, + { + "Date": "2020-12-13", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14435.5405186058, + "Vacc_completed": 1406.8193757343, + "Vacc_refreshed": 348.5515447081, + "Vacc_refreshed_2": 174.27577235405 + }, + { + "Date": "2020-12-14", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14440.6128511884, + "Vacc_completed": 1406.8790930463, + "Vacc_refreshed": 349.9224707035, + "Vacc_refreshed_2": 174.96123535175 + }, + { + "Date": "2020-12-15", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14448.1553470558, + "Vacc_completed": 1407.8576900416, + "Vacc_refreshed": 354.7521313753, + "Vacc_refreshed_2": 177.37606568765 + }, + { + "Date": "2020-12-16", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14456.4196110425, + "Vacc_completed": 1411.7530351787, + "Vacc_refreshed": 361.5526839017, + "Vacc_refreshed_2": 180.77634195085 + }, + { + "Date": "2020-12-17", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14466.1757833279, + "Vacc_completed": 1412.4941157515, + "Vacc_refreshed": 364.0766791828, + "Vacc_refreshed_2": 182.0383395914 + }, + { + "Date": "2020-12-18", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14472.9152722164, + "Vacc_completed": 1421.7399661156, + "Vacc_refreshed": 371.2418954122, + "Vacc_refreshed_2": 185.6209477061 + }, + { + "Date": "2020-12-19", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14474.3971159945, + "Vacc_completed": 1423.8796012137, + "Vacc_refreshed": 378.3445685688, + "Vacc_refreshed_2": 189.1722842844 + }, + { + "Date": "2020-12-20", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14482.9259977884, + "Vacc_completed": 1428.8212618966, + "Vacc_refreshed": 382.6712538747, + "Vacc_refreshed_2": 191.33562693735 + }, + { + "Date": "2020-12-21", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14491.6837567491, + "Vacc_completed": 1430.1481016913, + "Vacc_refreshed": 392.5489632959, + "Vacc_refreshed_2": 196.27448164795 + }, + { + "Date": "2020-12-22", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14499.5728298642, + "Vacc_completed": 1439.468906008, + "Vacc_refreshed": 397.6649554861, + "Vacc_refreshed_2": 198.83247774305 + }, + { + "Date": "2020-12-23", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14500.4884339857, + "Vacc_completed": 1447.6074532094, + "Vacc_refreshed": 404.4236802991, + "Vacc_refreshed_2": 202.21184014955 + }, + { + "Date": "2020-12-24", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14508.6628209678, + "Vacc_completed": 1449.1955087396, + "Vacc_refreshed": 413.1290507873, + "Vacc_refreshed_2": 206.56452539365 + }, + { + "Date": "2020-12-25", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14509.0177335192, + "Vacc_completed": 1457.0313439789, + "Vacc_refreshed": 418.6984801264, + "Vacc_refreshed_2": 209.3492400632 + }, + { + "Date": "2020-12-26", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14518.7925361684, + "Vacc_completed": 1462.4055060107, + "Vacc_refreshed": 419.6070699812, + "Vacc_refreshed_2": 209.8035349906 + }, + { + "Date": "2020-12-27", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14522.121758092, + "Vacc_completed": 1468.1811367429, + "Vacc_refreshed": 425.9772045183, + "Vacc_refreshed_2": 212.98860225915 + }, + { + "Date": "2020-12-28", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14528.5474917037, + "Vacc_completed": 1473.5164593205, + "Vacc_refreshed": 435.7810319021, + "Vacc_refreshed_2": 217.89051595105 + }, + { + "Date": "2020-12-29", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14536.5601109176, + "Vacc_completed": 1481.2704120463, + "Vacc_refreshed": 438.2410199432, + "Vacc_refreshed_2": 219.1205099716 + }, + { + "Date": "2020-12-30", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14542.1473955627, + "Vacc_completed": 1482.7064631605, + "Vacc_refreshed": 445.3488141502, + "Vacc_refreshed_2": 222.6744070751 + }, + { + "Date": "2020-12-31", + "ID_County": 1002, + "Age_RKI": "0-4", + "Vacc_partially": 14544.5952478081, + "Vacc_completed": 1486.0552178086, + "Vacc_refreshed": 446.1812966093, + "Vacc_refreshed_2": 223.09064830465 + }, + { + "Date": "2020-10-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10765.9941189788, + "Vacc_completed": 1603.3500569399, + "Vacc_refreshed": 0, + "Vacc_refreshed_2": 0.0 + }, + { + "Date": "2020-10-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.3717745702, + "Vacc_completed": 1605.3068408797, + "Vacc_refreshed": 3.6283182226, + "Vacc_refreshed_2": 1.8141591113 + }, + { + "Date": "2020-10-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10773.4956401429, + "Vacc_completed": 1610.6119068185, + "Vacc_refreshed": 6.1967396209, + "Vacc_refreshed_2": 3.09836981045 + }, + { + "Date": "2020-10-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10774.4184508751, + "Vacc_completed": 1613.016161978, + "Vacc_refreshed": 15.7069691534, + "Vacc_refreshed_2": 7.8534845767 + }, + { + "Date": "2020-10-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10780.8073818373, + "Vacc_completed": 1622.1917795654, + "Vacc_refreshed": 20.1697274397, + "Vacc_refreshed_2": 10.08486371985 + }, + { + "Date": "2020-10-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10785.5287460006, + "Vacc_completed": 1625.0602525893, + "Vacc_refreshed": 22.4671684217, + "Vacc_refreshed_2": 11.23358421085 + }, + { + "Date": "2020-10-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10790.1084610651, + "Vacc_completed": 1627.3787523231, + "Vacc_refreshed": 28.5217462646, + "Vacc_refreshed_2": 14.2608731323 + }, + { + "Date": "2020-10-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10796.2300309, + "Vacc_completed": 1630.4363483664, + "Vacc_refreshed": 35.3070676184, + "Vacc_refreshed_2": 17.6535338092 + }, + { + "Date": "2020-10-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10801.7222904172, + "Vacc_completed": 1638.725087864, + "Vacc_refreshed": 43.7679344272, + "Vacc_refreshed_2": 21.8839672136 + }, + { + "Date": "2020-10-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10804.7724722766, + "Vacc_completed": 1646.4905335365, + "Vacc_refreshed": 44.1718542676, + "Vacc_refreshed_2": 22.0859271338 + }, + { + "Date": "2020-10-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10814.3453353804, + "Vacc_completed": 1650.9992837124, + "Vacc_refreshed": 49.5204655539, + "Vacc_refreshed_2": 24.76023277695 + }, + { + "Date": "2020-10-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10821.6255112157, + "Vacc_completed": 1656.4335840831, + "Vacc_refreshed": 52.7009855172, + "Vacc_refreshed_2": 26.3504927586 + }, + { + "Date": "2020-10-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10830.9379325639, + "Vacc_completed": 1657.186187271, + "Vacc_refreshed": 56.5428649986, + "Vacc_refreshed_2": 28.2714324993 + }, + { + "Date": "2020-10-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10838.202902864, + "Vacc_completed": 1662.1470499364, + "Vacc_refreshed": 58.6277824858, + "Vacc_refreshed_2": 29.3138912429 + }, + { + "Date": "2020-10-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10840.8786753296, + "Vacc_completed": 1670.6860254071, + "Vacc_refreshed": 58.7593924743, + "Vacc_refreshed_2": 29.37969623715 + }, + { + "Date": "2020-10-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10843.7453960183, + "Vacc_completed": 1673.6372365137, + "Vacc_refreshed": 61.8595630166, + "Vacc_refreshed_2": 30.9297815083 + }, + { + "Date": "2020-10-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10849.1151892515, + "Vacc_completed": 1675.1066023109, + "Vacc_refreshed": 64.6020615007, + "Vacc_refreshed_2": 32.30103075035 + }, + { + "Date": "2020-10-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10850.9329685403, + "Vacc_completed": 1679.1505675366, + "Vacc_refreshed": 72.0237510859, + "Vacc_refreshed_2": 36.01187554295 + }, + { + "Date": "2020-10-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10854.4610677614, + "Vacc_completed": 1681.5473018047, + "Vacc_refreshed": 75.0145349272, + "Vacc_refreshed_2": 37.5072674636 + }, + { + "Date": "2020-10-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10858.0662824418, + "Vacc_completed": 1688.7179113019, + "Vacc_refreshed": 82.7641475111, + "Vacc_refreshed_2": 41.38207375555 + }, + { + "Date": "2020-10-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10867.8357803799, + "Vacc_completed": 1688.741478882, + "Vacc_refreshed": 92.1411476813, + "Vacc_refreshed_2": 46.07057384065 + }, + { + "Date": "2020-10-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10877.245759177, + "Vacc_completed": 1696.3354153291, + "Vacc_refreshed": 93.5350586202, + "Vacc_refreshed_2": 46.7675293101 + }, + { + "Date": "2020-10-23", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10878.9277486403, + "Vacc_completed": 1704.5169058825, + "Vacc_refreshed": 99.9257252117, + "Vacc_refreshed_2": 49.96286260585 + }, + { + "Date": "2020-10-24", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10881.5163902637, + "Vacc_completed": 1704.5184844203, + "Vacc_refreshed": 104.0563799981, + "Vacc_refreshed_2": 52.02818999905 + }, + { + "Date": "2020-10-25", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10882.0628121233, + "Vacc_completed": 1710.1811092467, + "Vacc_refreshed": 110.998904559, + "Vacc_refreshed_2": 55.4994522795 + }, + { + "Date": "2020-10-26", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10884.1868939764, + "Vacc_completed": 1711.6669667815, + "Vacc_refreshed": 119.5835613879, + "Vacc_refreshed_2": 59.79178069395 + }, + { + "Date": "2020-10-27", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10890.26315895, + "Vacc_completed": 1712.8219244738, + "Vacc_refreshed": 126.203975023, + "Vacc_refreshed_2": 63.1019875115 + }, + { + "Date": "2020-10-28", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10894.6858788747, + "Vacc_completed": 1721.7467435031, + "Vacc_refreshed": 135.9649739788, + "Vacc_refreshed_2": 67.9824869894 + }, + { + "Date": "2020-10-29", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10897.5575288795, + "Vacc_completed": 1721.7787127468, + "Vacc_refreshed": 145.614673399, + "Vacc_refreshed_2": 72.8073366995 + }, + { + "Date": "2020-10-30", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10903.1231721286, + "Vacc_completed": 1724.7269587992, + "Vacc_refreshed": 149.6717929743, + "Vacc_refreshed_2": 74.83589648715 + }, + { + "Date": "2020-10-31", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10911.1763853993, + "Vacc_completed": 1726.3071857535, + "Vacc_refreshed": 158.0496522084, + "Vacc_refreshed_2": 79.0248261042 + }, + { + "Date": "2020-11-01", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10919.5582023277, + "Vacc_completed": 1727.9236223535, + "Vacc_refreshed": 160.5751263702, + "Vacc_refreshed_2": 80.2875631851 + }, + { + "Date": "2020-11-02", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10920.4962369047, + "Vacc_completed": 1730.7211296321, + "Vacc_refreshed": 162.2038531114, + "Vacc_refreshed_2": 81.1019265557 + }, + { + "Date": "2020-11-03", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10930.0062994591, + "Vacc_completed": 1733.2273616859, + "Vacc_refreshed": 164.6178844659, + "Vacc_refreshed_2": 82.30894223295 + }, + { + "Date": "2020-11-04", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10931.0781786076, + "Vacc_completed": 1743.0639116966, + "Vacc_refreshed": 171.6949336111, + "Vacc_refreshed_2": 85.84746680555 + }, + { + "Date": "2020-11-05", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10936.2371584575, + "Vacc_completed": 1743.4973637943, + "Vacc_refreshed": 173.1954991423, + "Vacc_refreshed_2": 86.59774957115 + }, + { + "Date": "2020-11-06", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10937.1969149599, + "Vacc_completed": 1752.0043206175, + "Vacc_refreshed": 173.4521249531, + "Vacc_refreshed_2": 86.72606247655 + }, + { + "Date": "2020-11-07", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10942.5829785849, + "Vacc_completed": 1758.5438162851, + "Vacc_refreshed": 175.0971428389, + "Vacc_refreshed_2": 87.54857141945 + }, + { + "Date": "2020-11-08", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10945.8458051779, + "Vacc_completed": 1765.593119461, + "Vacc_refreshed": 184.781293552, + "Vacc_refreshed_2": 92.390646776 + }, + { + "Date": "2020-11-09", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10955.2619609788, + "Vacc_completed": 1766.7516696253, + "Vacc_refreshed": 194.3279051811, + "Vacc_refreshed_2": 97.16395259055 + }, + { + "Date": "2020-11-10", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0529992794, + "Vacc_completed": 1774.4096958807, + "Vacc_refreshed": 199.3585168564, + "Vacc_refreshed_2": 99.6792584282 + }, + { + "Date": "2020-11-11", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10963.0740456643, + "Vacc_completed": 1776.7353479155, + "Vacc_refreshed": 200.2783085421, + "Vacc_refreshed_2": 100.13915427105 + }, + { + "Date": "2020-11-12", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7647446192, + "Vacc_completed": 1786.1838226639, + "Vacc_refreshed": 202.522841172, + "Vacc_refreshed_2": 101.261420586 + }, + { + "Date": "2020-11-13", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10972.7950553291, + "Vacc_completed": 1788.5013884886, + "Vacc_refreshed": 205.1107008609, + "Vacc_refreshed_2": 102.55535043045 + }, + { + "Date": "2020-11-14", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10973.1049316279, + "Vacc_completed": 1790.2712267193, + "Vacc_refreshed": 214.0688577867, + "Vacc_refreshed_2": 107.03442889335 + }, + { + "Date": "2020-11-15", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10976.2696576646, + "Vacc_completed": 1797.8582422894, + "Vacc_refreshed": 219.0460187772, + "Vacc_refreshed_2": 109.5230093886 + }, + { + "Date": "2020-11-16", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10984.9161656634, + "Vacc_completed": 1801.5924446935, + "Vacc_refreshed": 227.656626047, + "Vacc_refreshed_2": 113.8283130235 + }, + { + "Date": "2020-11-17", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10994.063273181, + "Vacc_completed": 1802.6817444812, + "Vacc_refreshed": 235.6032823069, + "Vacc_refreshed_2": 117.80164115345 + }, + { + "Date": "2020-11-18", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 10996.8771305673, + "Vacc_completed": 1802.9071097171, + "Vacc_refreshed": 237.7242073629, + "Vacc_refreshed_2": 118.86210368145 + }, + { + "Date": "2020-11-19", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11002.0527900673, + "Vacc_completed": 1809.5395950318, + "Vacc_refreshed": 241.3631599251, + "Vacc_refreshed_2": 120.68157996255 + }, + { + "Date": "2020-11-20", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11007.1528572096, + "Vacc_completed": 1813.9025489723, + "Vacc_refreshed": 245.5305344153, + "Vacc_refreshed_2": 122.76526720765 + }, + { + "Date": "2020-11-21", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11013.1337350258, + "Vacc_completed": 1821.5275057931, + "Vacc_refreshed": 250.3168579858, + "Vacc_refreshed_2": 125.1584289929 + }, + { + "Date": "2020-11-22", + "ID_County": 1002, + "Age_RKI": "5-14", + "Vacc_partially": 11015.6696905796, + "Vacc_completed": 1822.9598630397, + "Vacc_refreshed": 255.6335351411, + "Vacc_refreshed_2": 127.81676757055 + }, { "Date": "2020-11-23", "ID_County": 1002, From dcb27b1c025e115d4835bc97bc096489266ea839 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 May 2024 12:01:38 +0200 Subject: [PATCH 29/60] some more casts --- cpp/tests/test_odesecirts.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 18c1419394..6df2f8a837 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -86,9 +86,12 @@ TEST(TestOdeSECIRTS, overflow_vaccinations) // set vaccination rates higher than total population for each layer const size_t daily_vaccinations = 100; - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); - model.parameters.get().resize(mio::SimulationDay(tmax + 1)); + model.parameters.get().resize( + mio::SimulationDay(static_cast(tmax + 1))); + model.parameters.get().resize( + mio::SimulationDay(static_cast(tmax + 1))); + model.parameters.get().resize( + mio::SimulationDay(static_cast(tmax + 1))); for (size_t i = 0; i <= tmax; ++i) { auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = From d216878306b6526a9c58ddcfeb0d9434d5324c72 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 13 May 2024 14:50:00 +0200 Subject: [PATCH 30/60] again --- cpp/tests/test_odesecirts.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 6df2f8a837..83302f5e3f 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -137,7 +137,7 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) // init simple model mio::osecirts::Model model(1); auto& daily_vaccinations = model.parameters.get(); - daily_vaccinations.resize(mio::SimulationDay(tmax + 1)); + daily_vaccinations.resize(mio::SimulationDay(static_cast(tmax + 1))); daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(1)}] = 10; From f67eaf7433098c7e53780b956ac02edeb1061006 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 14 May 2024 10:07:07 +0200 Subject: [PATCH 31/60] doc --- cpp/models/ode_secirts/model.h | 11 +++++++++++ cpp/models/ode_secirts/parameters_io.h | 20 +++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index 6a77258489..e8a0691dcc 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -539,6 +539,17 @@ class Model : public FlowModel& daily_vaccinations, const ScalarType eps = 0.15) const diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index a99aae4dd1..1e6e6a78f7 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -505,17 +505,15 @@ IOResult set_population_data(std::vector& model, const std::string& double SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; double SII = num_population[region][size_t(i)] - SN - SPI; - model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = - SII - (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + - model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + - model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]); - - model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::min( - SII, - std::max(0.0, double(model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}]))); + model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::max( + 0.0, + double(SII - + (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + + model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, From 1148effb83b6e2ac0cfa02b4a95e4fcb8fa53231 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 14 May 2024 12:44:44 +0200 Subject: [PATCH 32/60] libary in example cmakelist --- cpp/examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/examples/CMakeLists.txt b/cpp/examples/CMakeLists.txt index d81aba000b..e37d952dcb 100644 --- a/cpp/examples/CMakeLists.txt +++ b/cpp/examples/CMakeLists.txt @@ -55,7 +55,7 @@ target_link_libraries(ode_secirvvs_example PRIVATE memilio ode_secirvvs) target_compile_options(ode_secirvvs_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) add_executable(ode_secirts_example ode_secirts.cpp) -target_link_libraries(ode_secirts_example PRIVATE memilio ode_secirvvs) +target_link_libraries(ode_secirts_example PRIVATE memilio ode_secirts) target_compile_options(ode_secirts_example PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) add_executable(ode_secir_ageres_example ode_secir_ageres.cpp) From c77879766de9db1afe7b7fa9ad7b9091a88dff18 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 28 May 2024 14:42:33 +0200 Subject: [PATCH 33/60] add template for params ............. --- cpp/examples/ode_secirts.cpp | 76 +-- cpp/models/ode_secirts/analyze_result.h | 89 ++-- cpp/models/ode_secirts/model.h | 553 +++++++++++--------- cpp/models/ode_secirts/parameter_space.cpp | 208 -------- cpp/models/ode_secirts/parameter_space.h | 232 +++++++- cpp/models/ode_secirts/parameters.h | 539 ++++++++++--------- cpp/models/ode_secirts/parameters_io.cpp | 132 ----- cpp/models/ode_secirts/parameters_io.h | 528 ++++++++++++------- cpp/models/ode_secirvvs/parameter_space.cpp | 172 ------ cpp/models/ode_secirvvs/parameter_space.h | 4 +- cpp/models/ode_secirvvs/parameters_io.cpp | 120 ----- cpp/models/ode_secirvvs/parameters_io.h | 16 +- cpp/tests/test_odesecirts.cpp | 553 ++++++++++---------- 13 files changed, 1535 insertions(+), 1687 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 494c53a7bd..77b0571039 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -33,7 +33,7 @@ int main() mio::log_info("Simulating SECIRTS; t={} ... {} with dt = {}.", t0, tmax, dt); - mio::osecirts::Model model(3); + mio::osecirts::Model model(3); auto nb_groups = model.parameters.get_num_groups(); for (mio::AgeGroup i = 0; i < nb_groups; i++) { @@ -70,55 +70,55 @@ int main() // parameters //times - model.parameters.get()[i] = 3.33; - model.parameters.get()[i] = 1.87; - model.parameters.get()[i] = 7; - model.parameters.get()[i] = 6; - model.parameters.get()[i] = 7; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 60; - model.parameters.get()[i] = 180; - model.parameters.get()[i] = 180; + model.parameters.get>()[i] = 3.33; + model.parameters.get>()[i] = 1.87; + model.parameters.get>()[i] = 7; + model.parameters.get>()[i] = 6; + model.parameters.get>()[i] = 7; + model.parameters.get>()[i] = 60; + model.parameters.get>()[i] = 60; + model.parameters.get>()[i] = 180; + model.parameters.get>()[i] = 180; //probabilities - model.parameters.get()[i] = 0.15; - model.parameters.get()[i] = 0.5; - model.parameters.get()[i] = 0.0; - model.parameters.get()[i] = 0.4; - model.parameters.get()[i] = 0.2; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.1; + model.parameters.get>()[i] = 0.15; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.0; + model.parameters.get>()[i] = 0.4; + model.parameters.get>()[i] = 0.2; + model.parameters.get>()[i] = 0.1; + model.parameters.get>()[i] = 0.1; + model.parameters.get>()[i] = 0.1; - model.parameters.get()[i] = 0.8; - model.parameters.get()[i] = 0.331; - model.parameters.get()[i] = 0.65; - model.parameters.get()[i] = 0.243; - model.parameters.get()[i] = 0.1; - model.parameters.get()[i] = 0.091; - model.parameters.get()[i] = 0.9; + model.parameters.get>()[i] = 0.8; + model.parameters.get>()[i] = 0.331; + model.parameters.get>()[i] = 0.65; + model.parameters.get>()[i] = 0.243; + model.parameters.get>()[i] = 0.1; + model.parameters.get>()[i] = 0.091; + model.parameters.get>()[i] = 0.9; } - model.parameters.get() = 100; - model.parameters.get() = 0.0143; - const size_t daily_vaccinations = 10; - const size_t num_days = 300; - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); - model.parameters.get().resize(mio::SimulationDay(num_days)); + model.parameters.get>() = 100; + model.parameters.get>() = 0.0143; + const size_t daily_vaccinations = 10; + const size_t num_days = 300; + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { for (mio::AgeGroup j = 0; j < nb_groups; ++j) { auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; } } - mio::ContactMatrixGroup& contact_matrix = model.parameters.get(); + mio::ContactMatrixGroup& contact_matrix = model.parameters.get>(); const double cont_freq = 10; const double fact = 1.0 / (double)(size_t)nb_groups; contact_matrix[0] = @@ -126,7 +126,7 @@ int main() contact_matrix.add_damping(Eigen::MatrixXd::Constant((size_t)nb_groups, (size_t)nb_groups, 0.7), mio::SimulationTime(30.)); - model.parameters.get() = 0.2; + model.parameters.get>() = 0.2; model.apply_constraints(); diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index eb97e0dd6b..9cfa9845af 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -45,8 +45,9 @@ std::vector ensemble_params_percentile(const std::vector().template size(); + auto num_days = ensemble_params[0][0] + .parameters.template get>() + .template size(); std::vector single_element_ensemble(num_runs); @@ -64,9 +65,9 @@ std::vector ensemble_params_percentile(const std::vector().resize(num_days); - percentile[node].parameters.template get().resize(num_days); - percentile[node].parameters.template get().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { //Population @@ -78,120 +79,134 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); //probs param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); //vaccinations param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); param_percentil( - node, [i](auto&& model) -> auto& { return model.parameters.template get()[i]; }); + node, [i](auto&& model) -> auto& { + return model.parameters.template get>()[i]; + }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); for (auto day = SimulationDay(0); day < num_days; ++day) { param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); } //virus variants param_percentil( node, [i](auto&& model) -> auto& { - return model.parameters.template get()[i]; + return model.parameters.template get>()[i]; }); } // group independent params param_percentil( - node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + node, [](auto&& model) -> auto& { return model.parameters.template get>(); }); param_percentil( - node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + node, [](auto&& model) -> auto& { return model.parameters.template get>(); }); param_percentil( - node, [](auto&& model) -> auto& { return model.parameters.template get(); }); + node, [](auto&& model) -> auto& { return model.parameters.template get>(); }); for (size_t run = 0; run < num_runs; run++) { auto const& params = ensemble_params[run][node]; single_element_ensemble[run] = - params.parameters.template get() * params.populations.get_total(); + params.parameters.template get>() * params.populations.get_total(); } std::sort(single_element_ensemble.begin(), single_element_ensemble.end()); - percentile[node].parameters.template set( + percentile[node].parameters.template set>( single_element_ensemble[static_cast(num_runs * p)]); } return percentile; diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index e8a0691dcc..fe1489d199 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -96,11 +96,16 @@ using Flows = TypeList< // clang-format on -class Model : public FlowModel, Parameters, Flows> +template +class Model + : public FlowModel, Parameters, Flows> { - using Base = FlowModel, Parameters, Flows>; + using Base = FlowModel, Parameters, Flows>; public: + using typename Base::ParameterSet; + using typename Base::Populations; + Model(const Populations& pop, const ParameterSet& params) : Base(pop, params) { @@ -111,19 +116,20 @@ class Model : public FlowModel pop, Eigen::Ref y, double t, - Eigen::Ref flows) const override + void get_flows(Eigen::Ref> pop, Eigen::Ref> y, FP t, + Eigen::Ref> flows) const override { auto const& params = this->parameters; - AgeGroup n_agegroups = params.get_num_groups(); + AgeGroup n_agegroups = params.template get_num_groups(); - ContactMatrixGroup const& contact_matrix = params.get(); + ContactMatrixGroup const& contact_matrix = params.template get>(); auto icu_occupancy = 0.0; auto test_and_trace_required = 0.0; for (auto i = AgeGroup(0); i < n_agegroups; ++i) { test_and_trace_required += - (1 - params.get()[i]) / params.get()[i] * + (1 - params.template get>()[i]) / + params.template get>()[i] * (this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaive}) + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunity}) + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunity}) + @@ -136,9 +142,9 @@ class Model : public FlowModelparameters.get()); - auto const full_vaccination = vaccinations_at(t, this->parameters.get()); - auto const booster_vaccination = vaccinations_at(t, this->parameters.get()); + auto const partial_vaccination = vaccinations_at(t, params.template get>()); + auto const full_vaccination = vaccinations_at(t, params.template get>()); + auto const booster_vaccination = vaccinations_at(t, params.template get>()); for (auto i = AgeGroup(0); i < n_agegroups; i++) { @@ -179,24 +185,29 @@ class Model : public FlowModelpopulations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); - double reducExposedPartialImmunity = params.get()[i]; - double reducExposedImprovedImmunity = params.get()[i]; - double reducInfectedSymptomsPartialImmunity = params.get()[i]; - double reducInfectedSymptomsImprovedImmunity = params.get()[i]; + double reducExposedPartialImmunity = params.template get>()[i]; + double reducExposedImprovedImmunity = params.template get>()[i]; + double reducInfectedSymptomsPartialImmunity = + params.template get>()[i]; + double reducInfectedSymptomsImprovedImmunity = + params.template get>()[i]; double reducInfectedSevereCriticalDeadPartialImmunity = - params.get()[i]; + params.template get>()[i]; double reducInfectedSevereCriticalDeadImprovedImmunity = - params.get()[i]; - double reducTimeInfectedMild = params.get()[i]; + params.template get>()[i]; + double reducTimeInfectedMild = params.template get>()[i]; //symptomatic are less well quarantined when testing and tracing is overwhelmed so they infect more people - auto riskFromInfectedSymptomatic = smoother_cosine( - test_and_trace_required, params.get(), params.get() * 15, - params.get()[i], params.get()[i]); + auto riskFromInfectedSymptomatic = + smoother_cosine(test_and_trace_required, params.template get>(), + params.template get>() * 15, + params.template get>()[i], + params.template get>()[i]); - auto riskFromInfectedNoSymptoms = smoother_cosine( - test_and_trace_required, params.get(), params.get() * 2, - params.get()[i], 1.0); + auto riskFromInfectedNoSymptoms = + smoother_cosine(test_and_trace_required, params.template get>(), + params.template get>() * 2, + params.template get>()[i], 1.0); for (auto j = AgeGroup(0); j < n_agegroups; j++) { size_t SNj = this->populations.get_flat_index({j, InfectionState::SusceptibleNaive}); @@ -237,8 +248,9 @@ class Model : public FlowModel() * - sin(3.141592653589793 * (std::fmod((params.get() + t), 365.0) / 182.5 + 0.5))); + (1 + params.template get>() * + sin(3.141592653589793 * + (std::fmod((params.template get() + t), 365.0) / 182.5 + 0.5))); double cont_freq_eff = season_val * contact_matrix.get_matrix_at(t)(static_cast((size_t)i), static_cast((size_t)j)); @@ -251,7 +263,7 @@ class Model : public FlowModel 0) ? 1.0 / Nj : 0; double ext_inf_force_dummy = cont_freq_eff * divNj * - params.template get()[(AgeGroup)i] * + params.template get>()[(AgeGroup)i] * (riskFromInfectedNoSymptoms * (pop[INSNj] + pop[INSPIj] + pop[INSIIj]) + riskFromInfectedSymptomatic * (pop[ISyNj] + pop[ISyPIj] + pop[ISyIIj])); @@ -261,281 +273,297 @@ class Model : public FlowModel({i})] += - dummy_SN; - flows[get_flat_flow_index({i})] += dummy_SPI; - flows[get_flat_flow_index({i})] += dummy_SII; + flows[this->template get_flat_flow_index({i})] += dummy_SN; + flows[this->template get_flat_flow_index({i})] += dummy_SPI; + flows[this->template get_flat_flow_index({i})] += dummy_SII; } // vaccinations - flows[get_flat_flow_index( - {i})] = - std::min( - y[SNi] - - flows[get_flat_flow_index({i})], - partial_vaccination[static_cast(i)]); - - flows[get_flat_flow_index({i})] = - std::min(y[SPIi] - flows[get_flat_flow_index({i})], + flows[this->template get_flat_flow_index({i})] = + std::min(y[SNi] - flows[this->template get_flat_flow_index({i})], + partial_vaccination[static_cast(i)]); + + flows[this->template get_flat_flow_index({i})] = + std::min(y[SPIi] - + flows[this->template get_flat_flow_index({i})], full_vaccination[static_cast(i)]); - flows[get_flat_flow_index({i})] = - std::min(y[SIIi] - flows[get_flat_flow_index({i})], + flows[this->template get_flat_flow_index({i})] = + std::min(y[SIIi] - + flows[this->template get_flat_flow_index({i})], booster_vaccination[static_cast(i)]); // ICU capacity shortage is close // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere // is different for different vaccination status. This is not the case here and in addition, ICUCapacity // is set to infinity and this functionality is deactivated, so this is OK for the moment. - double criticalPerSevereAdjusted = - smoother_cosine(icu_occupancy, 0.90 * params.get(), params.get(), - params.get()[i], 0); + double criticalPerSevereAdjusted = smoother_cosine( + icu_occupancy, 0.90 * params.template get>(), params.template get>(), + params.template get>()[i], 0); - double deathsPerSevereAdjusted = params.get()[i] - criticalPerSevereAdjusted; + double deathsPerSevereAdjusted = + params.template get>()[i] - criticalPerSevereAdjusted; /**** path of immune-naive ***/ // Exposed - flows[get_flat_flow_index({i})] += - y[ENi] / params.get()[i]; + flows[this->template get_flat_flow_index({i})] += + y[ENi] / params.template get>()[i]; // InfectedNoSymptoms - flows[get_flat_flow_index({i})] = - params.get()[i] * (1 / params.get()[i]) * - y[INSNi]; - flows[get_flat_flow_index( - {i})] = (1 - params.get()[i]) / - params.get()[i] * y[INSNi]; - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * - y[INSNCi]; - flows[get_flat_flow_index({i})] = - params.get()[i] * (1 / params.get()[i]) * - y[INSNCi]; + flows[this->template get_flat_flow_index({i})] = + params.template get>()[i] * + (1 / params.template get>()[i]) * y[INSNi]; + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[INSNi]; + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[INSNCi]; + flows[this->template get_flat_flow_index({i})] = + params.template get>()[i] * + (1 / params.template get>()[i]) * y[INSNCi]; // // InfectedSymptoms - flows[get_flat_flow_index( - {i})] = params.get()[i] / params.get()[i] * y[ISyNi]; - - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * y[ISyNi]; - - flows[get_flat_flow_index({i})] = - params.get()[i] / params.get()[i] * y[ISyNCi]; - - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * y[ISyNCi]; + flows[this->template get_flat_flow_index({i})] = + params.template get>()[i] / + params.template get>()[i] * y[ISyNi]; + + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[ISyNi]; + + flows[this->template get_flat_flow_index({i})] = + params.template get>()[i] / + params.template get>()[i] * y[ISyNCi]; + + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[ISyNCi]; // InfectedSevere - flows[get_flat_flow_index( - {i})] = criticalPerSevereAdjusted / params.get()[i] * y[ISevNi]; + flows[this->template get_flat_flow_index({i})] = + criticalPerSevereAdjusted / params.template get>()[i] * y[ISevNi]; - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * y[ISevNi]; + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[ISevNi]; - flows[get_flat_flow_index({i})] = - deathsPerSevereAdjusted / params.get()[i] * y[ISevNi]; + flows[this->template get_flat_flow_index( + {i})] = deathsPerSevereAdjusted / params.template get>()[i] * y[ISevNi]; // InfectedCritical - flows[get_flat_flow_index({i})] = - params.get()[i] / params.get()[i] * y[ICrNi]; + flows[this->template get_flat_flow_index( + {i})] = params.template get>()[i] / + params.template get>()[i] * y[ICrNi]; - flows[get_flat_flow_index({i})] = - (1 - params.get()[i]) / params.get()[i] * y[ICrNi]; + flows[this->template get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + params.template get>()[i] * y[ICrNi]; // Waning immunity - flows[get_flat_flow_index( - {i})] = 1 / params.get()[i] * y[SPIi]; - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[TImm1]; + flows[this->template get_flat_flow_index({i})] = + 1 / params.template get>()[i] * y[SPIi]; + flows[this->template get_flat_flow_index({i})] = + 1 / params.template get>()[i] * y[TImm1]; // /**** path of partially immune ***/ // Exposed - flows[get_flat_flow_index({i})] += - y[EPIi] / params.get()[i]; + flows[this->template get_flat_flow_index({i})] += + y[EPIi] / params.template get>()[i]; // InfectedNoSymptoms - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * - (1 - params.get()[i])) / - (params.get()[i] * reducTimeInfectedMild) * y[INSPIi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i])) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSPIi]; + flows[this->template get_flat_flow_index({i})] = (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * - (1 - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[INSPIi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSPIi]; + flows[this->template get_flat_flow_index({i})] = (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * - (1 - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSPICi]; + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * - (1 - params.get()[i])) / - (params.get()[i] * reducTimeInfectedMild) * y[INSPICi]; + (1 - params.template get>()[i])) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSPICi]; // InfectedSymptoms - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity * - params.get()[i] / - (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; + params.template get>()[i] / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[ISyPIi]; + params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity * - params.get()[i] / - (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; + params.template get>()[i] / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPICi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[ISyPICi]; + params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPICi]; // InfectedSevere - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity * - criticalPerSevereAdjusted / params.get()[i] * y[ISevPIi]; + criticalPerSevereAdjusted / params.template get>()[i] * y[ISevPIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * - params.get()[i]) / - params.get()[i] * y[ISevPIi]; + params.template get>()[i]) / + params.template get>()[i] * y[ISevPIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * - deathsPerSevereAdjusted / params.get()[i] * y[ISevPIi]; + deathsPerSevereAdjusted / params.template get>()[i] * y[ISevPIi]; // InfectedCritical - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * - params.get()[i] / params.get()[i] * y[ICrPIi]; + params.template get>()[i] / params.template get>()[i] * + y[ICrPIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * - params.get()[i]) / - params.get()[i] * y[ICrPIi]; + params.template get>()[i]) / + params.template get>()[i] * y[ICrPIi]; // /**** path of improved immunity ***/ // Exposed - flows[get_flat_flow_index({i})] += - y[EIIi] / params.get()[i]; + flows[this->template get_flat_flow_index({i})] += + y[EIIi] / params.template get>()[i]; // InfectedNoSymptoms - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * - (1 - params.get()[i])) / - (params.get()[i] * reducTimeInfectedMild) * y[INSIIi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i])) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSIIi]; + flows[this->template get_flat_flow_index({i})] = (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * - (1 - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[INSIIi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSIIi]; + flows[this->template get_flat_flow_index({i})] = (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * - (1 - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; - flows[get_flat_flow_index({i})] = + (1 - params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSIICi]; + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * - (1 - params.get()[i])) / - (params.get()[i] * reducTimeInfectedMild) * y[INSIICi]; + (1 - params.template get>()[i])) / + (params.template get>()[i] * reducTimeInfectedMild) * y[INSIICi]; // InfectedSymptoms - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity * - params.get()[i] / - (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; + params.template get>()[i] / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[ISyIIi]; + params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity * - params.get()[i] / - (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; + params.template get>()[i] / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIICi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * - params.get()[i]) / - (params.get()[i] * reducTimeInfectedMild) * y[ISyIICi]; + params.template get>()[i]) / + (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIICi]; // InfectedSevere - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity * - criticalPerSevereAdjusted / params.get()[i] * y[ISevIIi]; + criticalPerSevereAdjusted / params.template get>()[i] * y[ISevIIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * - params.get()[i]) / - params.get()[i] * y[ISevIIi]; + params.template get>()[i]) / + params.template get>()[i] * y[ISevIIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * - deathsPerSevereAdjusted / params.get()[i] * y[ISevIIi]; + deathsPerSevereAdjusted / params.template get>()[i] * y[ISevIIi]; // InfectedCritical - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * - params.get()[i] / params.get()[i] * y[ICrIIi]; + params.template get>()[i] / params.template get>()[i] * + y[ICrIIi]; - flows[get_flat_flow_index({i})] = + flows[this->template get_flat_flow_index({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * - params.get()[i]) / - params.get()[i] * y[ICrIIi]; + params.template get>()[i]) / + params.template get>()[i] * y[ICrIIi]; // Waning immunity - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[TImm2]; + flows[this->template get_flat_flow_index({i})] = + 1 / params.template get>()[i] * y[TImm2]; - flows[get_flat_flow_index({i})] = - 1 / params.get()[i] * y[SIIi]; + flows[this->template get_flat_flow_index({i})] = + 1 / params.template get>()[i] * y[SIIi]; } } @@ -558,7 +586,7 @@ class Model : public FlowModel ub) { @@ -570,10 +598,10 @@ class Model : public FlowModel= lb) { - // need a eigen vector of size params.get_num_groups() to store the number of vaccinations per age group + // need a eigen vector of size params.template get_num_groups() to store the number of vaccinations per age group // ToDo: Find a way to Iterate over all three vaccination types - for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { + for (AgeGroup age = AgeGroup(0); age < params.template get_num_groups(); age++) { const auto num_vaccinations_ub = daily_vaccinations[{age, SimulationDay(static_cast(ub + 1))}] - daily_vaccinations[{age, SimulationDay(static_cast(ub))}]; const auto num_vaccinations_lb = daily_vaccinations[{age, SimulationDay(static_cast(lb + 1))}] - @@ -583,7 +611,7 @@ class Model : public FlowModelparameters); + obj.add_element("Populations", this->populations); } /** @@ -623,7 +651,7 @@ class Model : public FlowModel> +template >> class Simulation; /** @@ -633,14 +661,15 @@ class Simulation; * @param y current value of compartments. * @tparam Base simulation type that uses the SECIRS-type compartment model. see Simulation. */ -template > -double get_infections_relative(const Simulation& model, double t, const Eigen::Ref& y); +template >> +FP get_infections_relative(const Simulation& model, FP t, const Eigen::Ref>& y); /** - * specialization of compartment model simulation for the SECIRS-type model. + * specialization of compartment model simulation for the SECIRTS model. + * @tparam FP floating point type, e.g., double. * @tparam BaseT simulation type, default mio::Simulation. For testing purposes only! */ -template +template class Simulation : public BaseT { public: @@ -650,7 +679,7 @@ class Simulation : public BaseT * @param t0 start time * @param dt time steps */ - Simulation(Model const& model, double t0 = 0., double dt = 0.1) + Simulation(mio::osecirts::Model const& model, FP t0 = 0., FP dt = 0.1) : BaseT(model, t0, dt) , m_t_last_npi_check(t0) { @@ -669,7 +698,7 @@ class Simulation : public BaseT * @param [in] base_infectiousness The base infectiousness of the old variant for each age group. */ - void apply_variant(const double t, const CustomIndexArray base_infectiousness) + void apply_variant(const double t, const CustomIndexArray, AgeGroup> base_infectiousness) { auto start_day = this->get_model().parameters.template get(); auto start_day_new_variant = this->get_model().parameters.template get(); @@ -679,10 +708,11 @@ class Simulation : public BaseT const double share_new_variant = std::min(1.0, 0.01 * pow(2, (1. / 7) * days_variant)); const auto num_groups = this->get_model().parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; ++i) { - double new_transmission = (1 - share_new_variant) * base_infectiousness[i] + - share_new_variant * base_infectiousness[i] * - this->get_model().parameters.template get()[i]; - this->get_model().parameters.template get()[i] = new_transmission; + double new_transmission = + (1 - share_new_variant) * base_infectiousness[i] + + share_new_variant * base_infectiousness[i] * + this->get_model().parameters.template get>()[i]; + this->get_model().parameters.template get>()[i] = new_transmission; } } } @@ -697,13 +727,13 @@ class Simulation : public BaseT Eigen::Ref advance(double tmax) { auto& t_end_dyn_npis = this->get_model().parameters.get_end_dynamic_npis(); - auto& dyn_npis = this->get_model().parameters.template get(); - auto& contact_patterns = this->get_model().parameters.template get(); + auto& dyn_npis = this->get_model().parameters.template get>(); + auto& contact_patterns = this->get_model().parameters.template get>(); // const size_t num_groups = (size_t)this->get_model().parameters.get_num_groups(); // in the apply_variant function, we adjust the TransmissionProbabilityOnContact parameter. We need to store // the base value to use it in the apply_variant function and also to reset the parameter after the simulation. - auto base_infectiousness = this->get_model().parameters.template get(); + auto base_infectiousness = this->get_model().parameters.template get>(); double delay_lockdown; auto t = BaseT::get_result().get_last_time(); @@ -731,7 +761,7 @@ class Simulation : public BaseT if (dyn_npis.get_thresholds().size() > 0) { if (floating_point_greater_equal(t, m_t_last_npi_check + dt)) { if (t < t_end_dyn_npis) { - auto inf_rel = get_infections_relative(*this, t, this->get_result().get_last_value()) * + auto inf_rel = get_infections_relative(*this, t, this->get_result().get_last_value()) * dyn_npis.get_base_value(); auto exceeded_threshold = dyn_npis.get_max_exceeded_threshold(inf_rel); if (exceeded_threshold != dyn_npis.get_thresholds().end() && @@ -758,7 +788,7 @@ class Simulation : public BaseT } // reset TransmissionProbabilityOnContact. This is important for the graph simulation where the advance // function is called multiple times for the same model. - this->get_model().parameters.template get() = base_infectiousness; + this->get_model().parameters.template get>() = base_infectiousness; return this->get_result().get_last_value(); } @@ -779,10 +809,11 @@ class Simulation : public BaseT * * @return Returns the result of the simulation. */ -inline auto simulate(double t0, double tmax, double dt, const Model& model, - std::shared_ptr integrator = nullptr) +template +inline auto simulate(FP t0, FP tmax, FP dt, const Model& model, + std::shared_ptr> integrator = nullptr) { - return mio::simulate>(t0, tmax, dt, model, integrator); + return mio::simulate, Simulation>(t0, tmax, dt, model, integrator); } /** @@ -796,15 +827,17 @@ inline auto simulate(double t0, double tmax, double dt, const Model& model, * * @return Returns the result of the Flowsimulation. */ -inline auto simulate_flows(double t0, double tmax, double dt, const Model& model, - std::shared_ptr integrator = nullptr) +template +inline auto simulate_flows(FP t0, FP tmax, FP dt, const Model& model, + std::shared_ptr> integrator = nullptr) { - return mio::simulate_flows>>(t0, tmax, dt, model, integrator); + return mio::simulate_flows, Simulation>>>(t0, tmax, dt, model, + integrator); } //see declaration above. -template -double get_infections_relative(const Simulation& sim, double /*t*/, const Eigen::Ref& y) +template >> +FP get_infections_relative(const Simulation& sim, FP /*t*/, const Eigen::Ref>& y) { double sum_inf = 0; for (auto i = AgeGroup(0); i < sim.get_model().parameters.get_num_groups(); ++i) { @@ -832,46 +865,48 @@ double get_infections_relative(const Simulation& sim, double /*t*/, const * @return vector expression, same size as y, with migration factors per compartment. * @tparam Base simulation type that uses a SECIRS-type compartment model. see Simulation. */ -template > -auto get_migration_factors(const Simulation& sim, double /*t*/, const Eigen::Ref& y) +template , FP>> +auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::Ref>& y) { auto& params = sim.get_model().parameters; //parameters as arrays - auto& p_asymp = params.template get().array().template cast(); - auto& p_inf = params.template get().array().template cast(); - auto& p_inf_max = params.template get().array().template cast(); + auto& p_asymp = params.template get>().array().template cast(); + auto& p_inf = params.template get>().array().template cast(); + auto& p_inf_max = params.template get>().array().template cast(); //slice of InfectedNoSymptoms - auto y_INS = slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsNaive), - Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + - slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsPartialImmunity), - Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + - slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsImprovedImmunity), - Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}); + auto y_INS = + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsNaive), + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsPartialImmunity), + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsImprovedImmunity), + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}); //compute isolation, same as infection risk from main model auto test_and_trace_required = - ((1 - p_asymp) / params.template get().array().template cast() * y_INS.array()) + ((1 - p_asymp) / params.template get>().array().template cast() * + y_INS.array()) .sum(); auto riskFromInfectedSymptomatic = - smoother_cosine(test_and_trace_required, double(params.template get()), - params.template get() * 5, p_inf.matrix(), p_inf_max.matrix()); + smoother_cosine(test_and_trace_required, double(params.template get>()), + params.template get>() * 5, p_inf.matrix(), p_inf_max.matrix()); //set factor for infected auto factors = Eigen::VectorXd::Ones(y.rows()).eval(); - slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsNaive), Eigen::Index(size_t(params.get_num_groups())), - Eigen::Index(InfectionState::Count)}) + slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsNaive), + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsPartialImmunity), - Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsImprovedImmunity), - Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; return factors; } -template > -auto test_commuters(Simulation& sim, Eigen::Ref migrated, double time) +template , FP>> +auto test_commuters(Simulation& sim, Eigen::Ref> migrated, FP time) { auto& model = sim.get_model(); auto nondetection = 1.0; diff --git a/cpp/models/ode_secirts/parameter_space.cpp b/cpp/models/ode_secirts/parameter_space.cpp index 3cd8a16dc9..57947c8270 100644 --- a/cpp/models/ode_secirts/parameter_space.cpp +++ b/cpp/models/ode_secirts/parameter_space.cpp @@ -18,211 +18,3 @@ * limitations under the License. */ #include "ode_secirts/parameter_space.h" -#include "memilio/utils/logging.h" -#include "memilio/utils/parameter_distributions.h" -#include "ode_secirts/infection_state.h" -#include "ode_secirts/model.h" - -#include -#include -#include - -namespace mio -{ -namespace osecirts -{ - -void draw_sample_demographics(Model& model) -{ - model.parameters.get().draw_sample(); - model.parameters.get().draw_sample(); - - const static std::vector naive_immunity_states = { - InfectionState::SusceptibleNaive, - InfectionState::ExposedNaive, - InfectionState::InfectedNoSymptomsNaive, - InfectionState::InfectedNoSymptomsNaiveConfirmed, - InfectionState::InfectedSymptomsNaive, - InfectionState::InfectedSymptomsNaiveConfirmed, - InfectionState::InfectedSevereNaive, - InfectionState::InfectedCriticalNaive, - InfectionState::DeadNaive, - }; - - const static std::vector partial_immunity_states = { - InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, - InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, - InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, - InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, - InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, - }; - - const static std::vector improved_immunity_states = { - InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, - InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, - InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, - InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, - InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, - }; - - // helper function to calculate the total population of a layer for a given age group - auto calculate_layer_total = [&model](const std::vector& states, AgeGroup ageGroup) { - return std::accumulate(states.begin(), states.end(), 0.0, - [&model, &ageGroup](double sum, const InfectionState& state) { - return sum + model.populations[{ageGroup, state}]; - }); - }; - - // helper function to adjust the susceptible population of a layer for a given age group - auto adjust_susceptible_population = [&model](AgeGroup i, double diff, InfectionState susceptibleState) { - model.populations[{i, susceptibleState}] += diff; - if (model.populations[{i, susceptibleState}] < 0) { - mio::log_warning("Negative population in State " + std::to_string(static_cast(susceptibleState)) + - " for age group " + std::to_string(static_cast(i)) + ". Setting to 0."); - model.populations[{i, susceptibleState}] = 0; - } - }; - - for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { - - const double group_naive_total = calculate_layer_total(naive_immunity_states, i); - const double group_partial_total = calculate_layer_total(partial_immunity_states, i); - const double group_improved_total = calculate_layer_total(improved_immunity_states, i); - - //sample initial compartments (with exceptions) - for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { - if (inf_state != InfectionState::DeadNaive && //not sampled, fixed from data - inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data - inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data - model.populations[{i, inf_state}].draw_sample(); - } - } - const double diff_naive = group_naive_total - calculate_layer_total(naive_immunity_states, i); - const double diff_partial = group_partial_total - calculate_layer_total(partial_immunity_states, i); - const double diff_improved = group_improved_total - calculate_layer_total(improved_immunity_states, i); - - adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); - adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); - adjust_susceptible_population(i, diff_improved, InfectionState::SusceptibleImprovedImmunity); - } -} - -void draw_sample_infection(Model& model) -{ - model.parameters.get().draw_sample(); - - //not age dependent - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - model.parameters.get()[AgeGroup(0)].draw_sample(); - - for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { - //not age dependent - model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = - model.parameters.get()[AgeGroup(0)]; - model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; - - //age dependent - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - model.parameters.get()[i].draw_sample(); - } -} - -void draw_sample(Model& model) -{ - draw_sample_infection(model); - draw_sample_demographics(model); - model.parameters.get().draw_sample(); - model.apply_constraints(); -} - -Graph draw_sample(Graph& graph) -{ - Graph sampled_graph; - - //sample global parameters - auto& shared_params_model = graph.nodes()[0].property; - draw_sample_infection(shared_params_model); - auto& shared_contacts = shared_params_model.parameters.template get(); - shared_contacts.draw_sample_dampings(); - auto& shared_dynamic_npis = shared_params_model.parameters.template get(); - shared_dynamic_npis.draw_sample(); - - for (auto& params_node : graph.nodes()) { - auto& node_model = params_node.property; - - //sample local parameters - draw_sample_demographics(params_node.property); - - //copy global parameters - //save demographic parameters so they aren't overwritten - auto local_icu_capacity = node_model.parameters.template get(); - auto local_tnt_capacity = node_model.parameters.template get(); - auto local_holidays = node_model.parameters.template get().get_school_holidays(); - auto local_daily_v1 = node_model.parameters.template get(); - auto local_daily_v2 = node_model.parameters.template get(); - auto local_daily_v3 = node_model.parameters.template get(); - node_model.parameters = shared_params_model.parameters; - node_model.parameters.template get() = local_icu_capacity; - node_model.parameters.template get() = local_tnt_capacity; - node_model.parameters.template get().get_school_holidays() = local_holidays; - node_model.parameters.template get() = local_daily_v1; - node_model.parameters.template get() = local_daily_v2; - node_model.parameters.template get() = local_daily_v3; - - node_model.parameters.template get().make_matrix(); - node_model.apply_constraints(); - - sampled_graph.add_node(params_node.id, node_model); - } - - for (auto& edge : graph.edges()) { - auto edge_params = edge.property; - //no dynamic NPIs - //TODO: add switch to optionally enable dynamic NPIs to edges - sampled_graph.add_edge(edge.start_node_idx, edge.end_node_idx, edge_params); - } - - return sampled_graph; -} - -} // namespace osecirts -} // namespace mio diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index 1b36e2ed87..dccc47f7b6 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -37,31 +37,225 @@ namespace mio namespace osecirts { /** - * draws a sample from the specified distributions for all parameters related to the demographics, e.g. population. - * @param[inout] model Model including contact patterns for alle age groups - */ -void draw_sample_demographics(Model& model); +* draws a sample from the specified distributions for all parameters related to the demographics, e.g. population. +* @tparam FP floating point type, e.g., double +* @param[inout] model Model including contact patterns for alle age groups +*/ +template +void draw_sample_demographics(Model& model) +{ + model.parameters.template get>().draw_sample(); + model.parameters.template get>().draw_sample(); + + const static std::vector naive_immunity_states = { + InfectionState::SusceptibleNaive, + InfectionState::ExposedNaive, + InfectionState::InfectedNoSymptomsNaive, + InfectionState::InfectedNoSymptomsNaiveConfirmed, + InfectionState::InfectedSymptomsNaive, + InfectionState::InfectedSymptomsNaiveConfirmed, + InfectionState::InfectedSevereNaive, + InfectionState::InfectedCriticalNaive, + InfectionState::DeadNaive, + }; + + const static std::vector partial_immunity_states = { + InfectionState::SusceptiblePartialImmunity, InfectionState::ExposedPartialImmunity, + InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, + InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, + InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, + }; + + const static std::vector improved_immunity_states = { + InfectionState::SusceptibleImprovedImmunity, InfectionState::ExposedImprovedImmunity, + InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, + InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, + InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, + }; + + // helper function to calculate the total population of a layer for a given age group + auto calculate_layer_total = [&model](const std::vector& states, AgeGroup ageGroup) { + return std::accumulate(states.begin(), states.end(), 0.0, + [&model, &ageGroup](double sum, const InfectionState& state) { + return sum + model.populations[{ageGroup, state}]; + }); + }; + + // helper function to adjust the susceptible population of a layer for a given age group + auto adjust_susceptible_population = [&model](AgeGroup i, double diff, InfectionState susceptibleState) { + model.populations[{i, susceptibleState}] += diff; + if (model.populations[{i, susceptibleState}] < 0) { + mio::log_warning("Negative population in State " + std::to_string(static_cast(susceptibleState)) + + " for age group " + std::to_string(static_cast(i)) + ". Setting to 0."); + model.populations[{i, susceptibleState}] = 0; + } + }; + + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { + + const double group_naive_total = calculate_layer_total(naive_immunity_states, i); + const double group_partial_total = calculate_layer_total(partial_immunity_states, i); + const double group_improved_total = calculate_layer_total(improved_immunity_states, i); + + //sample initial compartments (with exceptions) + for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { + if (inf_state != InfectionState::DeadNaive && //not sampled, fixed from data + inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data + inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data + model.populations[{i, inf_state}].draw_sample(); + } + } + const double diff_naive = group_naive_total - calculate_layer_total(naive_immunity_states, i); + const double diff_partial = group_partial_total - calculate_layer_total(partial_immunity_states, i); + const double diff_improved = group_improved_total - calculate_layer_total(improved_immunity_states, i); + + adjust_susceptible_population(i, diff_naive, InfectionState::SusceptibleNaive); + adjust_susceptible_population(i, diff_partial, InfectionState::SusceptiblePartialImmunity); + adjust_susceptible_population(i, diff_improved, InfectionState::SusceptibleImprovedImmunity); + } +} /** - * draws a sample from the specified distributions for all parameters related to the infection. - * @param[inout] model Model including contact patterns for alle age groups - */ -void draw_sample_infection(Model& model); +* draws a sample from the specified distributions for all parameters related to the infection. +* @tparam FP floating point type, e.g., double +* @param[inout] model Model including contact patterns for alle age groups +*/ +template +void draw_sample_infection(Model& model) +{ + model.parameters.template get>().draw_sample(); + + //not age dependent + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + model.parameters.template get>()[AgeGroup(0)].draw_sample(); + + for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { + //not age dependent + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + model.parameters.template get>()[i] = + model.parameters.template get>()[AgeGroup(0)]; + + //age dependent + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + model.parameters.template get>()[i].draw_sample(); + } +} /** Draws a sample from Model parameter distributions and stores sample values - * as Parameters parameter values (cf. UncertainValue and Parameters classes) - * @param[inout] model Model including contact patterns for alle age groups - */ -void draw_sample(Model& model); +* as Parameters parameter values (cf. UncertainValue and Parameters classes) +* @tparam FP floating point type, e.g., double +* @param[inout] model Model including contact patterns for alle age groups +*/ +template +void draw_sample(Model& model) +{ + draw_sample_infection(model); + draw_sample_demographics(model); + model.parameters.template get>().draw_sample(); + model.apply_constraints(); +} /** - * Draws samples for each model node in a graph. - * Some parameters are shared between nodes and only sampled once. - * @param graph Graph to be sampled. - * @param variant_high If true, use high value for infectiousness of variant. - * @return Graph with nodes and edges from the input graph sampled. - */ -Graph draw_sample(Graph& graph); +* Draws samples for each model node in a graph. +* Some parameters are shared between nodes and only sampled once. +* @tparam FP floating point type, e.g., double +* @param graph Graph to be sampled. +* @return Graph with nodes and edges from the input graph sampled. +*/ +template +Graph, MigrationParameters> draw_sample(Graph, MigrationParameters>& graph) +{ + Graph, MigrationParameters> sampled_graph; + + //sample global parameters + auto& shared_params_model = graph.nodes()[0].property; + draw_sample_infection(shared_params_model); + auto& shared_contacts = shared_params_model.parameters.template get>(); + shared_contacts.draw_sample_dampings(); + auto& shared_dynamic_npis = shared_params_model.parameters.template get>(); + shared_dynamic_npis.draw_sample(); + + for (auto& params_node : graph.nodes()) { + auto& node_model = params_node.property; + + //sample local parameters + draw_sample_demographics(params_node.property); + + //copy global parameters + //save demographic parameters so they aren't overwritten + auto local_icu_capacity = node_model.parameters.template get>(); + auto local_tnt_capacity = node_model.parameters.template get>(); + auto local_holidays = node_model.parameters.template get>().get_school_holidays(); + auto local_daily_v1 = node_model.parameters.template get>(); + auto local_daily_v2 = node_model.parameters.template get>(); + auto local_daily_v3 = node_model.parameters.template get>(); + node_model.parameters = shared_params_model.parameters; + node_model.parameters.template get>() = local_icu_capacity; + node_model.parameters.template get>() = local_tnt_capacity; + node_model.parameters.template get>().get_school_holidays() = local_holidays; + node_model.parameters.template get>() = local_daily_v1; + node_model.parameters.template get>() = local_daily_v2; + node_model.parameters.template get>() = local_daily_v3; + + node_model.parameters.template get>().make_matrix(); + node_model.apply_constraints(); + + sampled_graph.add_node(params_node.id, node_model); + } + + for (auto& edge : graph.edges()) { + auto edge_params = edge.property; + //no dynamic NPIs + //TODO: add switch to optionally enable dynamic NPIs to edges + sampled_graph.add_edge(edge.start_node_idx, edge.end_node_idx, edge_params); + } + + return sampled_graph; +} } // namespace osecirts } // namespace mio diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index b55cea5af1..760f1fa9b1 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -78,8 +78,9 @@ struct StartDayNewVariant { * the seasonality is given as (1+k*sin()) where the sine * curve is below one in summer and above one in winter */ +template struct Seasonality { - using Type = UncertainValue; + using Type = UncertainValue; static Type get_default(AgeGroup) { return Type(0.); @@ -91,13 +92,14 @@ struct Seasonality { }; /** -* @brief the icu capacity in the SECIRS-type model +* @brief the icu capacity in the SECIR model */ +template struct ICUCapacity { - using Type = UncertainValue; + using Type = UncertainValue; static Type get_default(AgeGroup) { - return Type(std::numeric_limits::max()); + return Type(std::numeric_limits::max()); } static std::string name() { @@ -108,11 +110,12 @@ struct ICUCapacity { /** * @brief capacity to test and trace contacts of infected for quarantine per day. */ +template struct TestAndTraceCapacity { - using Type = UncertainValue; + using Type = UncertainValue; static Type get_default(AgeGroup) { - return Type(std::numeric_limits::max()); + return Type(std::numeric_limits::max()); } static std::string name() { @@ -123,8 +126,9 @@ struct TestAndTraceCapacity { /** * @brief the contact patterns within the society are modelled using an UncertainContactMatrix */ +template struct ContactPatterns { - using Type = UncertainContactMatrix; + using Type = UncertainContactMatrix; static Type get_default(AgeGroup size) { return Type(1, static_cast((size_t)size)); @@ -138,8 +142,9 @@ struct ContactPatterns { /** * @brief the NPIs that are enacted if certain infection thresholds are exceeded. */ +template struct DynamicNPIsInfectedSymptoms { - using Type = DynamicNPIs; + using Type = DynamicNPIs; static Type get_default(AgeGroup /*size*/) { return {}; @@ -153,8 +158,9 @@ struct DynamicNPIsInfectedSymptoms { /** * @brief the (mean) latent time in day unit */ +template struct TimeExposed { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -169,8 +175,9 @@ struct TimeExposed { * @brief the (mean) time in day unit for asymptomatic cases that are infected but * have not yet developed symptoms. */ +template struct TimeInfectedNoSymptoms { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -183,10 +190,11 @@ struct TimeInfectedNoSymptoms { /** * @brief the infectious time for symptomatic cases that are infected but -* who do not need to be hsopitalized in the SECIRS-type model in day unit +* who do not need to be hsopitalized in the SECIR model in day unit */ +template struct TimeInfectedSymptoms { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -201,8 +209,9 @@ struct TimeInfectedSymptoms { * @brief the time people are 'simply' hospitalized before returning home in the SECIR model * in day unit */ +template struct TimeInfectedSevere { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -214,11 +223,12 @@ struct TimeInfectedSevere { }; /** - * @brief the time people are treated by ICU before returning home in the SECIRS-type model + * @brief the time people are treated by ICU before returning home in the SECIR model * in day unit */ +template struct TimeInfectedCritical { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -232,8 +242,9 @@ struct TimeInfectedCritical { /** * @brief Time in days to describe waning immunity to get person from S_PI -> S */ +template struct TimeWaningPartialImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 90.0); @@ -247,8 +258,9 @@ struct TimeWaningPartialImmunity { /** * @brief Time in days to describe waning immunity to get person from SII -> SPI */ +template struct TimeWaningImprovedImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 90.0); @@ -263,8 +275,9 @@ struct TimeWaningImprovedImmunity { * @brief the time people stays immune after infection or vaccination located in S in the model in day unit */ +template struct TimeTemporaryImmunityPI { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -279,8 +292,9 @@ struct TimeTemporaryImmunityPI { * @brief the time people stays immune after infection or vaccination located in S_PI or S_II in the model in day unit */ +template struct TimeTemporaryImmunityII { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -293,8 +307,9 @@ struct TimeTemporaryImmunityII { /** * @brief probability of getting infected from a contact */ +template struct TransmissionProbabilityOnContact { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -308,8 +323,9 @@ struct TransmissionProbabilityOnContact { /** * @brief the relative InfectedNoSymptoms infectability */ +template struct RelativeTransmissionNoSymptoms { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -321,10 +337,11 @@ struct RelativeTransmissionNoSymptoms { }; /** -* @brief the percentage of asymptomatic cases in the SECIRS-type model +* @brief the percentage of asymptomatic cases in the SECIR model */ +template struct RecoveredPerInfectedNoSymptoms { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.); @@ -336,13 +353,14 @@ struct RecoveredPerInfectedNoSymptoms { }; /** -* @brief the risk of infection from symptomatic cases in the SECIRS-type model +* @brief the risk of infection from symptomatic cases in the SECIR model */ +template struct RiskOfInfectionFromSymptomatic { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { - return Type(size, 0.); + return Type(size, 1.); } static std::string name() { @@ -353,8 +371,9 @@ struct RiskOfInfectionFromSymptomatic { /** * @brief risk of infection from symptomatic cases increases as test and trace capacity is exceeded. */ +template struct MaxRiskOfInfectionFromSymptomatic { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.); @@ -366,10 +385,11 @@ struct MaxRiskOfInfectionFromSymptomatic { }; /** -* @brief the percentage of hospitalized patients per infected patients in the SECIRS-type model +* @brief the percentage of hospitalized patients per infected patients in the SECIR model */ +template struct SeverePerInfectedSymptoms { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.); @@ -381,10 +401,11 @@ struct SeverePerInfectedSymptoms { }; /** -* @brief the percentage of ICU patients per hospitalized patients in the SECIRS-type model +* @brief the percentage of ICU patients per hospitalized patients in the SECIR model */ +template struct CriticalPerSevere { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.); @@ -396,10 +417,11 @@ struct CriticalPerSevere { }; /** -* @brief the percentage of dead patients per ICU patients in the SECIRS-type model +* @brief the percentage of dead patients per ICU patients in the SECIR model */ +template struct DeathsPerCritical { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.); @@ -413,8 +435,9 @@ struct DeathsPerCritical { /** * @brief Time in days between first and second vaccine dose. */ +template struct VaccinationGap { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 49.0); @@ -428,8 +451,9 @@ struct VaccinationGap { /** * @brief Time in days until first vaccine dose takes full effect. */ +template struct DaysUntilEffectivePartialVaccination { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 14.0); @@ -443,8 +467,9 @@ struct DaysUntilEffectivePartialVaccination { /** * @brief Time in days until second vaccine dose takes full effect. */ +template struct DaysUntilEffectiveImprovedVaccination { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 7.0); @@ -458,8 +483,9 @@ struct DaysUntilEffectiveImprovedVaccination { /** * @brief Time in days until booster vaccine dose takes full effect. */ +template struct DaysUntilEffectiveBoosterImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 7.0); @@ -473,8 +499,9 @@ struct DaysUntilEffectiveBoosterImmunity { /** * @brief Total number of first vaccinations up to the given day. */ +template struct DailyPartialVaccination { - using Type = CustomIndexArray; + using Type = CustomIndexArray; static Type get_default(AgeGroup size) { return Type({size, SimulationDay(0)}); @@ -488,8 +515,9 @@ struct DailyPartialVaccination { /** * @brief Total number of full vaccinations up to the given day. */ +template struct DailyFullVaccination { - using Type = CustomIndexArray; + using Type = CustomIndexArray; static Type get_default(AgeGroup size) { return Type({size, SimulationDay(0)}); @@ -501,10 +529,11 @@ struct DailyFullVaccination { }; /** -* @brief Total number of full vaccinations up to the given day. +* @brief Total number of booster vaccinations up to the given day. */ +template struct DailyBoosterVaccination { - using Type = CustomIndexArray; + using Type = CustomIndexArray; static Type get_default(AgeGroup size) { return Type({size, SimulationDay(0)}); @@ -518,8 +547,9 @@ struct DailyBoosterVaccination { /** * @brief Factor to reduce infection risk for persons with partial immunity. */ +template struct ReducExposedPartialImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -533,8 +563,9 @@ struct ReducExposedPartialImmunity { /** * @brief Factor to reduce infection risk for persons with improved immunity. */ +template struct ReducExposedImprovedImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -548,8 +579,9 @@ struct ReducExposedImprovedImmunity { /** * @brief Factor to reduce risk of developing symptoms for persons with partial immunity. */ +template struct ReducInfectedSymptomsPartialImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -563,8 +595,9 @@ struct ReducInfectedSymptomsPartialImmunity { /** * @brief Factor to reduce risk of developing symptoms for persons with improved immunity. */ +template struct ReducInfectedSymptomsImprovedImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -579,8 +612,9 @@ struct ReducInfectedSymptomsImprovedImmunity { * @brief Factor to reduce risk of hospitalization for persons with partial immunity. * Also applies to ICU and Death risk. */ +template struct ReducInfectedSevereCriticalDeadPartialImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -594,8 +628,9 @@ struct ReducInfectedSevereCriticalDeadPartialImmunity { /** * @brief Factor to reduce risk of hospitalization for persons with improved immunity. */ +template struct ReducInfectedSevereCriticalDeadImprovedImmunity { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 1.); @@ -609,8 +644,9 @@ struct ReducInfectedSevereCriticalDeadImprovedImmunity { /** * @brief Factor to reduce infectious time of persons with partial or improved immunity. */ +template struct ReducTimeInfectedMild { - using Type = CustomIndexArray; + using Type = CustomIndexArray, AgeGroup>; static Type get_default(AgeGroup size) { return Type(size, 0.5); @@ -624,8 +660,9 @@ struct ReducTimeInfectedMild { /** * @brief Represents the relative infectiousness of a new variant. */ +template struct InfectiousnessNewVariant { - using Type = CustomIndexArray; + using Type = CustomIndexArray; static Type get_default(AgeGroup size) { return Type(size, 1.0); @@ -636,29 +673,31 @@ struct InfectiousnessNewVariant { } }; -using ParametersBase = - ParameterSet; +template +using ParametersBase = ParameterSet< + StartDay, Seasonality, ICUCapacity, TestAndTraceCapacity, ContactPatterns, + DynamicNPIsInfectedSymptoms, TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, + TimeInfectedSevere, TimeInfectedCritical, TimeWaningPartialImmunity, TimeWaningImprovedImmunity, + TimeTemporaryImmunityPI, TimeTemporaryImmunityII, TransmissionProbabilityOnContact, + RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, + MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, + VaccinationGap, DaysUntilEffectivePartialVaccination, DaysUntilEffectiveImprovedVaccination, + DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, DailyPartialVaccination, + DailyBoosterVaccination, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, + ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, + ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, + ReducTimeInfectedMild, InfectiousnessNewVariant, StartDayNewVariant>; /** * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over time. */ -class Parameters : public ParametersBase +template +class Parameters : public ParametersBase { public: Parameters(AgeGroup num_agegroups) - : ParametersBase(num_agegroups) + : ParametersBase(num_agegroups) , m_num_groups{num_agegroups} { } @@ -734,15 +773,17 @@ class Parameters : public ParametersBase bool apply_constraints() { int corrected = false; - if (this->get() < 0.0 || this->get() > 0.5) { - log_warning("Constraint check: Parameter Seasonality changed from {} to {}", this->get(), 0); - this->set(0); + if (this->template get>() < 0.0 || this->template get>() > 0.5) { + log_warning("Constraint check: Parameter Seasonality changed from {} to {}", + this->template get>(), 0); + this->template set>(0); corrected = true; } - if (this->get() < 0.0) { - log_warning("Constraint check: Parameter ICUCapacity changed from {} to {}", this->get(), 0); - this->set(0); + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter ICUCapacity changed from {} to {}", + this->template get>(), 0); + this->template set>(0); corrected = true; } @@ -750,221 +791,225 @@ class Parameters : public ParametersBase for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeExposed changed from {:.4f} to {:.4f}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeInfectedNoSymptoms changed from {:.4f} to {:.4f}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeInfectedSymptoms changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeInfectedSevere changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeInfectedCritical changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeTemporaryImmunityPI changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeTemporaryImmunityII changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeWaningPartialImmunity changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeWaningImprovedImmunity changed from {} to {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); - this->get()[i] = tol_times; - corrected = true; + this->template get>()[i], tol_times); + this->template get>()[i] = tol_times; + corrected = true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter TransmissionProbabilityOnContact changed from {} to {} ", - this->get()[i], 0.0); - this->get()[i] = 0.0; - corrected = true; + this->template get>()[i], 0.0); + this->template get>()[i] = 0.0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter RelativeTransmissionNoSymptoms changed from {} to {} ", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter RecoveredPerInfectedNoSymptoms changed from {} to {} ", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter RiskOfInfectionFromSymptomatic changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter SeverePerInfectedSymptoms changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter CriticalPerSevere changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter DaysUntilEffectiveBoosterImmunity changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducExposedPartialImmunity changed from {} to {}", - this->get()[i], 1); - this->get()[i] = 1; - corrected = true; + this->template get>()[i], 1); + this->template get>()[i] = 1; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducExposedImprovedImmunity changed from {} to {}", - this->get()[i], 1); - this->get()[i] = 1; - corrected = true; + this->template get>()[i], 1); + this->template get>()[i] = 1; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducInfectedSymptomsPartialImmunity changed from {} to {}", - this->get()[i], 1); - this->get()[i] = 1; - corrected = true; + this->template get>()[i], 1); + this->template get>()[i] = 1; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducInfectedSymptomsImprovedImmunity changed from {} to {}", - this->get()[i], 1.0); - this->get()[i] = 1.0; - corrected = true; + this->template get>()[i], 1.0); + this->template get>()[i] = 1.0; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducInfectedSevereCriticalDeadPartialImmunity changed from " "{} to {}", - this->get()[i], 1.0); - this->get()[i] = 1.0; - corrected = true; + this->template get>()[i], 1.0); + this->template get>()[i] = 1.0; + corrected = true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducInfectedSevereCriticalDeadImprovedImmunity changed from " "{} to {}", - this->get()[i], 1.0); - this->get()[i] = 1.0; - corrected = true; + this->template get>()[i], 1.0); + this->template get>()[i] = 1.0; + corrected = true; } - if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_warning("Constraint check: Parameter ReducTimeInfectedMild changed from {} to {}", - this->get()[i], 1.0); - this->get()[i] = 1.0; - corrected = true; + this->template get>()[i], 1.0); + this->template get>()[i] = 1.0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter InfectiousnessNewVariant changed from {} to {}", - this->get()[i], 1.0); - this->get()[i] = 1.0; - corrected = true; + this->template get>()[i], 1.0); + this->template get>()[i] = 1.0; + corrected = true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_warning("Constraint check: Parameter VaccinationGap changed from {} to {}", - this->get()[i], 0); - this->get()[i] = 0; - corrected = true; + this->template get>()[i], 0); + this->template get>()[i] = 0; + corrected = true; } } return corrected; @@ -978,198 +1023,202 @@ class Parameters : public ParametersBase bool check_constraints() const { const double tol_times = 1e-1; // accepted tolerance for compartment stays - if (this->get() < 0.0 || this->get() > 0.5) { + if (this->template get>() < 0.0 || this->template get>() > 0.5) { log_error("Constraint check: Parameter m_seasonality smaller {} or larger {}", 0, 0.5); return true; } - if (this->get() < 0.0) { + if (this->template get>() < 0.0) { log_error("Constraint check: Parameter m_icu_capacity smaller {}", 0); return true; } for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeExposed {:.4f} smaller {:.4f}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeInfectedNoSymptoms {:.4f} smaller {:.4f}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeInfectedSymptoms {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeInfectedSevere {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeInfectedCritical {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeTemporaryImmunityPI {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeTemporaryImmunityII {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeWaningPartialImmunity {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < tol_times) { + if (this->template get>()[i] < tol_times) { log_error("Constraint check: Parameter TimeWaningImprovedImmunity {} smaller {}. Please " "note that unreasonably small compartment stays lead to massively increased run time. " "Consider to cancel and reset parameters.", - this->get()[i], tol_times); + this->template get>()[i], tol_times); return true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter TransmissionProbabilityOnContact smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter RelativeTransmissionNoSymptoms smaller {}", 0); return true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter RecoveredPerInfectedNoSymptoms smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter RiskOfInfectionFromSymptomatic smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter SeverePerInfectedSymptoms smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter CriticalPerSevere smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] < 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter DeathsPerCritical smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 1) { + if (this->template get>()[i] < 1) { log_error("Constraint check: Parameter VaccinationGap smaller {}", 1); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter DaysUntilEffectivePartialVaccination smaller {}", 0); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter DaysUntilEffectiveImprovedVaccination smaller {}", 0); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducExposedPartialImmunity smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducExposedImprovedImmunity smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducInfectedSymptomsPartialImmunity smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducInfectedSymptomsImprovedImmunity smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducInfectedSevereCriticalDeadPartialImmunity smaller {} or " "larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || - this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducInfectedSevereCriticalDeadImprovedImmunity smaller {} or " "larger {}", 0, 1); return true; } - if (this->get()[i] <= 0.0 || this->get()[i] > 1.0) { + if (this->template get>()[i] <= 0.0 || + this->template get>()[i] > 1.0) { log_error("Constraint check: Parameter ReducTimeInfectedMild smaller {} or larger {}", 0, 1); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter InfectiousnessNewVariant smaller {}", 0); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter TimeTemporaryImmunityPI smaller {:d}", 0); return true; } - if (this->get()[i] < 0.0) { + if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter TimeTemporaryImmunityII smaller {:d}", 0); return true; } @@ -1178,9 +1227,9 @@ class Parameters : public ParametersBase } private: - Parameters(ParametersBase&& base) - : ParametersBase(std::move(base)) - , m_num_groups(get().get_cont_freq_mat().get_num_groups()) + Parameters(ParametersBase&& base) + : ParametersBase(std::move(base)) + , m_num_groups(this->template get>().get_cont_freq_mat().get_num_groups()) { } @@ -1192,7 +1241,7 @@ class Parameters : public ParametersBase template static IOResult deserialize(IOContext& io) { - BOOST_OUTCOME_TRY(auto&& base, ParametersBase::deserialize(io)); + BOOST_OUTCOME_TRY(auto&& base, ParametersBase::deserialize(io)); return success(Parameters(std::move(base))); } diff --git a/cpp/models/ode_secirts/parameters_io.cpp b/cpp/models/ode_secirts/parameters_io.cpp index 7f82c61d17..a702143863 100644 --- a/cpp/models/ode_secirts/parameters_io.cpp +++ b/cpp/models/ode_secirts/parameters_io.cpp @@ -337,138 +337,6 @@ IOResult>> read_population_data(const std::vecto return success(vnum_population); } -IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, - const std::vector& vregion, int num_days) -{ - BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); - - auto num_groups = model[0].parameters.get_num_groups(); - - auto days_until_effective_n = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto days_until_effective_pi = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; - auto days_until_effective_ii = - (int)(double)model[0].parameters.get()[AgeGroup(0)]; - // iterate over regions (e.g., counties) - for (size_t i = 0; i < model.size(); ++i) { - // iterate over age groups in region - for (auto g = AgeGroup(0); g < num_groups; ++g) { - - model[i].parameters.template get().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get().resize(SimulationDay(num_days + 1)); - for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { - model[i].parameters.template get()[{g, d}] = 0.0; - model[i].parameters.template get()[{g, d}] = 0.0; - model[i].parameters.template get()[{g, d}] = 0.0; - } - } - } - - auto max_date_entry = std::max_element(vacc_data.begin(), vacc_data.end(), [](auto&& a, auto&& b) { - return a.date < b.date; - }); - if (max_date_entry == vacc_data.end()) { - return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); - } - auto max_date = max_date_entry->date; - if (max_date < offset_date_by_days(date, num_days)) { - log_error("Vaccination data does not contain all dates. After the last day the data, vaccinations per day are " - "set to 0."); - } - - for (auto&& vacc_data_entry : vacc_data) { - auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { - return r == 0 || (vacc_data_entry.county_id && vacc_data_entry.county_id == regions::CountyId(r)) || - (vacc_data_entry.state_id && vacc_data_entry.state_id == regions::StateId(r)) || - (vacc_data_entry.district_id && vacc_data_entry.district_id == regions::DistrictId(r)); - }); - auto date_df = vacc_data_entry.date; - if (it != vregion.end()) { - auto region_idx = size_t(it - vregion.begin()); - AgeGroup age = vacc_data_entry.age_group; - - // initialize the temporary immunity states - if (date_df >= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age])) && - date_df <= - offset_date_by_days( - date, static_cast( - -model[region_idx] - .parameters.template get()[age]))) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += - vacc_data_entry.num_vaccinations_completed; - } - - if (date_df >= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get()[age] - - model[region_idx].parameters.template get()[age])) && - date_df <= - offset_date_by_days( - date, static_cast( - -model[region_idx].parameters.template get()[age])) - - ) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; - } - - // get daily vaccinations for each layer - for (size_t d = 0; d < (size_t)num_days + 1; ++d) { - auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); - if (max_date >= offset_first_date) { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_partial; - } - } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - 0; - } - } - - auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); - if (max_date >= offset_full_date) { - if (date_df == offset_full_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_completed; - } - } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = 0; - } - } - - auto offset_booster_date = offset_date_by_days(date, (int)d - days_until_effective_ii); - if (max_date >= offset_booster_date) { - if (date_df == offset_booster_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; - } - } - else { - if (date_df == offset_first_date) { - model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = - 0; - } - } - } - } - } - return success(); -} - } // namespace details } // namespace osecirts } // namespace mio diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 1e6e6a78f7..cbb767ecce 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -143,59 +143,64 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std num_timm2[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { - t_Exposed[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_Exposed[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_imm_interval1[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); - t_imm_interval2[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); + t_imm_interval1[county].push_back(static_cast( + model[county].parameters.template get>()[(AgeGroup)group])); + t_imm_interval2[county].push_back(static_cast( + model[county].parameters.template get>()[(AgeGroup)group])); mu_C_R[county].push_back( - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); mu_I_H[county].push_back( - model[county].parameters.template get()[(AgeGroup)group]); - mu_H_U[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); + mu_H_U[county].push_back( + model[county].parameters.template get>()[(AgeGroup)group]); // calculate the denominators to split the reported case numbers to the different immunity layers. denom_E[group] = - 1 / (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get>()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get>()[(AgeGroup)group]); denom_I_NS[group] = - 1 / (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); + 1 / + (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get>()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get>()[(AgeGroup)group]); denom_I_Sy[group] = 1 / (immunity_population[0][group] + immunity_population[1][group] * - model[county].parameters.template get()[(AgeGroup)group] + + model[county] + .parameters.template get>()[(AgeGroup)group] + immunity_population[2][group] * - model[county].parameters.template get()[(AgeGroup)group]); + model[county] + .parameters.template get>()[(AgeGroup)group]); denom_I_Sev[group] = 1 / (immunity_population[0][group] + immunity_population[1][group] * - model[county] - .parameters.template get()[(AgeGroup)group] + + model[county].parameters.template get>()[( + AgeGroup)group] + immunity_population[2][group] * - model[county] - .parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[( + AgeGroup)group]); } } @@ -248,38 +253,39 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std num_icu[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { - double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; + t_Exposed[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms[county].push_back(static_cast(std::round( + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); double exp_fac_part_immune = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double inf_fac_part_immune = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double hosp_fac_part_immune = model[county] - .parameters.template get()[(AgeGroup)group]; + .parameters.template get>()[(AgeGroup)group]; double icu_fac_part_immune = model[county] - .parameters.template get()[(AgeGroup)group]; - mu_C_R[county].push_back( - (1 - - inf_fac_part_immune / exp_fac_part_immune * - (1 - model[county].parameters.template get()[(AgeGroup)group]))); + .parameters.template get>()[(AgeGroup)group]; + mu_C_R[county].push_back(( + 1 - inf_fac_part_immune / exp_fac_part_immune * + (1 - model[county] + .parameters.template get>()[(AgeGroup)group]))); mu_I_H[county].push_back( hosp_fac_part_immune / inf_fac_part_immune * - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U[county].push_back(icu_fac_part_immune / hosp_fac_part_immune * - model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U[county].push_back( + icu_fac_part_immune / hosp_fac_part_immune * + model[county].parameters.template get>()[(AgeGroup)group]); } } @@ -294,26 +300,27 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std for (size_t i = 0; i < num_groups; i++) { model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * - num_InfectedNoSymptoms[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * + denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSeverePartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * + model[county] + .parameters.template get>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += immunity_population[1][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_timm1[county][i]; } // } @@ -344,38 +351,39 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std num_icu[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { - double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; + t_Exposed[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms[county].push_back(static_cast(std::round( + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); double reduc_immune_exp = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double reduc_immune_inf = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double reduc_immune_hosp = - model[county] - .parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[( + AgeGroup)group]; double reduc_immune_icu = - model[county] - .parameters.template get()[(AgeGroup)group]; - mu_C_R[county].push_back( - (1 - - reduc_immune_inf / reduc_immune_exp * - (1 - model[county].parameters.template get()[(AgeGroup)group]))); + model[county].parameters.template get>()[( + AgeGroup)group]; + mu_C_R[county].push_back(( + 1 - reduc_immune_inf / reduc_immune_exp * + (1 - model[county] + .parameters.template get>()[(AgeGroup)group]))); mu_I_H[county].push_back( reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U[county].push_back(reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U[county].push_back( + reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get>()[(AgeGroup)group]); } } @@ -390,27 +398,28 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std for (size_t i = 0; i < num_groups; i++) { model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_Exposed[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * + denom_E[i] * num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_I_NS[i] * - num_InfectedNoSymptoms[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * + denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * + model[county] + .parameters.template get>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += immunity_population[2][i] * - model[county].parameters.template get()[(AgeGroup)i] * denom_E[i] * - num_timm2[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * + denom_E[i] * num_timm2[county][i]; } // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { @@ -454,10 +463,10 @@ IOResult set_divi_data(std::vector& model, const std::string& path, for (size_t region = 0; region < vregion.size(); region++) { auto num_groups = model[region].parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; i++) { - sum_mu_I_U[region] += model[region].parameters.template get()[i] * - model[region].parameters.template get()[i]; - mu_I_U[region].push_back(model[region].parameters.template get()[i] * - model[region].parameters.template get()[i]); + sum_mu_I_U[region] += model[region].parameters.template get>()[i] * + model[region].parameters.template get>()[i]; + mu_I_U[region].push_back(model[region].parameters.template get>()[i] * + model[region].parameters.template get>()[i]); } } std::vector num_icu(model.size(), 0.0); @@ -549,8 +558,142 @@ IOResult set_population_data(std::vector& model, const std::string& return success(); } -IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, - const std::vector& vregion, int num_days); +template +IOResult set_vaccination_data(std::vector>& model, const std::string& path, Date date, + const std::vector& vregion, int num_days) +{ + BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); + + auto num_groups = model[0].parameters.get_num_groups(); + + auto days_until_effective_n = + (int)(double)model[0].parameters.template get>()[AgeGroup(0)]; + auto days_until_effective_pi = + (int)(double)model[0].parameters.template get>()[AgeGroup(0)]; + auto days_until_effective_ii = + (int)(double)model[0].parameters.template get>()[AgeGroup(0)]; + // iterate over regions (e.g., counties) + for (size_t i = 0; i < model.size(); ++i) { + // iterate over age groups in region + for (auto g = AgeGroup(0); g < num_groups; ++g) { + + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + } + } + } + + auto max_date_entry = std::max_element(vacc_data.begin(), vacc_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == vacc_data.end()) { + return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < offset_date_by_days(date, num_days)) { + log_error("Vaccination data does not contain all dates. After the last day the data, vaccinations per day are " + "set to 0."); + } + + for (auto&& vacc_data_entry : vacc_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { + return r == 0 || (vacc_data_entry.county_id && vacc_data_entry.county_id == regions::CountyId(r)) || + (vacc_data_entry.state_id && vacc_data_entry.state_id == regions::StateId(r)) || + (vacc_data_entry.district_id && vacc_data_entry.district_id == regions::DistrictId(r)); + }); + auto date_df = vacc_data_entry.date; + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + AgeGroup age = vacc_data_entry.age_group; + + // initialize the temporary immunity states + if (date_df >= + offset_date_by_days( + date, static_cast( + -model[region_idx].parameters.template get>()[age] - + model[region_idx] + .parameters.template get>()[age])) && + date_df <= + offset_date_by_days( + date, static_cast( + -model[region_idx] + .parameters.template get>()[age]))) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += + vacc_data_entry.num_vaccinations_completed; + } + + if (date_df >= + offset_date_by_days( + date, + static_cast( + -model[region_idx].parameters.template get>()[age] - + model[region_idx].parameters.template get>()[age])) && + date_df <= + offset_date_by_days( + date, + static_cast( + -model[region_idx].parameters.template get>()[age])) + + ) { + model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + } + + // get daily vaccinations for each layer + for (size_t d = 0; d < (size_t)num_days + 1; ++d) { + auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); + if (max_date >= offset_first_date) { + if (date_df == offset_first_date) { + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_partial; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = 0; + } + } + + auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); + if (max_date >= offset_full_date) { + if (date_df == offset_full_date) { + model[region_idx].parameters.template get>()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_completed; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx].parameters.template get>()[{age, SimulationDay(d)}] = + 0; + } + } + + auto offset_booster_date = offset_date_by_days(date, (int)d - days_until_effective_ii); + if (max_date >= offset_booster_date) { + if (date_df == offset_booster_date) { + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = + vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + } + } + else { + if (date_df == offset_first_date) { + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = 0; + } + } + } + } + } + return success(); +} } // namespace details #ifdef MEMILIO_HAS_HDF5 @@ -619,33 +762,35 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - t_Exposed_n[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + t_Exposed_n[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms_n[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedSymptoms_n[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedSevere_n[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical_n[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); - t_imm_interval1[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); - t_imm_interval2[county].push_back( - static_cast(model[county].parameters.template get()[(AgeGroup)group])); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); + t_imm_interval1[county].push_back(static_cast( + model[county].parameters.template get>()[(AgeGroup)group])); + t_imm_interval2[county].push_back(static_cast( + model[county].parameters.template get>()[(AgeGroup)group])); mu_C_R_n[county].push_back( - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); mu_I_H_n[county].push_back( - model[county].parameters.template get()[(AgeGroup)group]); - mu_H_U_n[county].push_back(model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); + mu_H_U_n[county].push_back( + model[county].parameters.template get>()[(AgeGroup)group]); /* begin: NOT in set_confirmed_cases_data() */ - sum_mu_I_U_n[county] += model[county].parameters.template get()[AgeGroup(group)] * - model[county].parameters.template get()[AgeGroup(group)]; + sum_mu_I_U_n[county] += + model[county].parameters.template get>()[AgeGroup(group)] * + model[county].parameters.template get>()[AgeGroup(group)]; mu_I_U_n[county].push_back( - model[county].parameters.template get()[AgeGroup(group)] * - model[county].parameters.template get()[AgeGroup(group)]); + model[county].parameters.template get>()[AgeGroup(group)] * + model[county].parameters.template get>()[AgeGroup(group)]); /* end: NOT in set_confirmed_cases_data() */ } } @@ -672,49 +817,50 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_pi[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; + t_Exposed_pi[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms_pi[county].push_back(static_cast(std::round( - model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms_pi[county].push_back(static_cast(std::round( + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); t_InfectedSevere_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); double exp_fact_part_immune = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double inf_fact_part_immune = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double hosp_fact_part_immune = model[county] - .parameters.template get()[(AgeGroup)group]; + .parameters.template get>()[(AgeGroup)group]; double icu_fact_part_immune = model[county] - .parameters.template get()[(AgeGroup)group]; - mu_C_R_pi[county].push_back( - (1 - - inf_fact_part_immune / exp_fact_part_immune * - (1 - model[county].parameters.template get()[(AgeGroup)group]))); + .parameters.template get>()[(AgeGroup)group]; + mu_C_R_pi[county].push_back(( + 1 - inf_fact_part_immune / exp_fact_part_immune * + (1 - model[county] + .parameters.template get>()[(AgeGroup)group]))); mu_I_H_pi[county].push_back( hosp_fact_part_immune / inf_fact_part_immune * - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_pi[county].push_back(icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U_pi[county].push_back( + icu_fact_part_immune / hosp_fact_part_immune * + model[county].parameters.template get>()[(AgeGroup)group]); sum_mu_I_U_pi[county] += icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / - inf_fact_part_immune * - model[county].parameters.template get()[AgeGroup(group)]; + model[county].parameters.template get>()[AgeGroup(group)] * + hosp_fact_part_immune / inf_fact_part_immune * + model[county].parameters.template get>()[AgeGroup(group)]; mu_I_U_pi[county].push_back( icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get()[AgeGroup(group)] * hosp_fact_part_immune / - inf_fact_part_immune * - model[county].parameters.template get()[AgeGroup(group)]); + model[county].parameters.template get>()[AgeGroup(group)] * + hosp_fact_part_immune / inf_fact_part_immune * + model[county].parameters.template get>()[AgeGroup(group)]); } } @@ -739,47 +885,50 @@ IOResult export_input_data_county_timeseries( for (size_t county = 0; county < model.size(); county++) { for (size_t group = 0; group < num_age_groups; group++) { - double reduc_t = model[0].parameters.template get()[(AgeGroup)group]; - t_Exposed_ii[county].push_back( - static_cast(std::round(model[county].parameters.template get()[(AgeGroup)group]))); + double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; + t_Exposed_ii[county].push_back(static_cast( + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedNoSymptoms_ii[county].push_back(static_cast(std::round( - model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group] * reduc_t))); + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); + t_InfectedSymptoms_ii[county].push_back(static_cast(std::round( + model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); t_InfectedSevere_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); t_InfectedCritical_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get()[(AgeGroup)group]))); + std::round(model[county].parameters.template get>()[(AgeGroup)group]))); double reduc_immune_exp = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double reduc_immune_inf = - model[county].parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[(AgeGroup)group]; double reduc_immune_hosp = - model[county] - .parameters.template get()[(AgeGroup)group]; + model[county].parameters.template get>()[( + AgeGroup)group]; double reduc_immune_icu = - model[county] - .parameters.template get()[(AgeGroup)group]; - mu_C_R_ii[county].push_back( - (1 - - reduc_immune_inf / reduc_immune_exp * - (1 - model[county].parameters.template get()[(AgeGroup)group]))); + model[county].parameters.template get>()[( + AgeGroup)group]; + mu_C_R_ii[county].push_back(( + 1 - reduc_immune_inf / reduc_immune_exp * + (1 - model[county] + .parameters.template get>()[(AgeGroup)group]))); mu_I_H_ii[county].push_back( reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get()[(AgeGroup)group]); + model[county].parameters.template get>()[(AgeGroup)group]); // transfer from H to U, D unchanged. - mu_H_U_ii[county].push_back(reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get()[(AgeGroup)group]); + mu_H_U_ii[county].push_back( + reduc_immune_icu / reduc_immune_hosp * + model[county].parameters.template get>()[(AgeGroup)group]); sum_mu_I_U_ii[county] += reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / - reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]; + model[county].parameters.template get>()[AgeGroup(group)] * + reduc_immune_hosp / reduc_immune_inf * + model[county].parameters.template get>()[AgeGroup(group)]; mu_I_U_ii[county].push_back( reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get()[AgeGroup(group)] * reduc_immune_hosp / - reduc_immune_inf * model[county].parameters.template get()[AgeGroup(group)]); + model[county].parameters.template get>()[AgeGroup(group)] * + reduc_immune_hosp / reduc_immune_inf * + model[county].parameters.template get>()[AgeGroup(group)]); } } std::vector> extrapolated_rki( @@ -882,38 +1031,43 @@ IOResult export_input_data_county_timeseries( double SII = num_population[county][size_t(age)] - SN - SPI; double denom_E = - 1 / - (SN + - SPI * model[county].parameters.template get()[AgeGroup(age)] + - SII * model[county].parameters.template get()[AgeGroup(age)]); + 1 / (SN + + SPI * model[county] + .parameters.template get>()[AgeGroup(age)] + + SII * model[county] + .parameters.template get>()[AgeGroup(age)]); double denom_C = - 1 / - (SN + - SPI * model[county].parameters.template get()[AgeGroup(age)] + - SII * model[county].parameters.template get()[AgeGroup(age)]); + 1 / (SN + + SPI * model[county] + .parameters.template get>()[AgeGroup(age)] + + SII * model[county] + .parameters.template get>()[AgeGroup(age)]); double denom_I = - 1 / - (SN + - SPI * model[county] - .parameters.template get()[AgeGroup(age)] + - SII * model[county] - .parameters.template get()[AgeGroup(age)]); - double denom_HU = 1 / (SN + SPI * model[county] .parameters - .template get()[AgeGroup(age)] + + .template get>()[AgeGroup(age)] + SII * model[county] .parameters - .template get()[AgeGroup(age)]); + .template get>()[AgeGroup(age)]); + double denom_HU = + 1 / (SN + + SPI * model[county] + .parameters.template get< + ReducInfectedSevereCriticalDeadPartialImmunity>()[AgeGroup(age)] + + SII * model[county] + .parameters.template get< + ReducInfectedSevereCriticalDeadImprovedImmunity>()[AgeGroup(age)]); extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) = SN * denom_E * num_Exposed_n[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) = - SPI * model[county].parameters.template get()[AgeGroup(age)] * + SPI * + model[county].parameters.template get>()[AgeGroup(age)] * denom_E * num_Exposed_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) = - SII * model[county].parameters.template get()[AgeGroup(age)] * + SII * + model[county].parameters.template get>()[AgeGroup(age)] * denom_E * num_Exposed_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + age_group_offset) = @@ -940,12 +1094,14 @@ IOResult export_input_data_county_timeseries( extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + age_group_offset) = SPI * - model[county].parameters.template get()[AgeGroup(age)] * + model[county] + .parameters.template get>()[AgeGroup(age)] * denom_I * num_InfectedSymptoms_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) = SII * - model[county].parameters.template get()[AgeGroup(age)] * + model[county] + .parameters.template get>()[AgeGroup(age)] * denom_I * num_InfectedSymptoms_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + @@ -954,12 +1110,14 @@ IOResult export_input_data_county_timeseries( extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) = SPI * - model[county].parameters.template get()[AgeGroup(age)] * + model[county] + .parameters.template get>()[AgeGroup(age)] * denom_I * num_InfectedSymptomsConfirmed_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) = SII * - model[county].parameters.template get()[AgeGroup(age)] * + model[county] + .parameters.template get>()[AgeGroup(age)] * denom_I * num_InfectedSymptomsConfirmed_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) = @@ -968,13 +1126,15 @@ IOResult export_input_data_county_timeseries( age_group_offset) = SPI * model[county] - .parameters.template get()[AgeGroup(age)] * + .parameters + .template get>()[AgeGroup(age)] * denom_HU * num_InfectedSevere_pi[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) = SII * model[county] - .parameters.template get()[AgeGroup(age)] * + .parameters + .template get>()[AgeGroup(age)] * denom_HU * num_InfectedSevere_ii[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) = @@ -983,13 +1143,15 @@ IOResult export_input_data_county_timeseries( age_group_offset) = SPI * model[county] - .parameters.template get()[AgeGroup(age)] * + .parameters + .template get>()[AgeGroup(age)] * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) = SII * model[county] - .parameters.template get()[AgeGroup(age)] * + .parameters + .template get>()[AgeGroup(age)] * denom_HU * num_icu[county][age]; extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunPartialImmunity + diff --git a/cpp/models/ode_secirvvs/parameter_space.cpp b/cpp/models/ode_secirvvs/parameter_space.cpp index 21791f6b05..c1e4365a24 100644 --- a/cpp/models/ode_secirvvs/parameter_space.cpp +++ b/cpp/models/ode_secirvvs/parameter_space.cpp @@ -18,175 +18,3 @@ * limitations under the License. */ #include "ode_secirvvs/parameter_space.h" -// #include "memilio/utils/logging.h" -// #include "memilio/utils/parameter_distributions.h" -// #include "ode_secirvvs/infection_state.h" -// #include "ode_secirvvs/model.h" - -// namespace mio -// { -// namespace osecirvvs -// { - -// void draw_sample_demographics(Model& model) -// { -// model.parameters.get().draw_sample(); -// model.parameters.get().draw_sample(); - -// for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { -// double group_total = model.populations.get_group_total(i); - -// //sample initial compartments (with exceptions) -// for (auto inf_state = Index(0); inf_state < InfectionState::Count; ++inf_state) { -// if (inf_state != InfectionState::SusceptibleNaive && //not sampled, fixed after sampling everything else -// inf_state != InfectionState::DeadNaive && //not sampled, fixed from data -// inf_state != InfectionState::DeadPartialImmunity && //not sampled, fixed from data -// inf_state != InfectionState::DeadImprovedImmunity) { //not sampled, fixed from data -// model.populations[{i, inf_state}].draw_sample(); -// } -// } - -// //set susceptibles so the total number stays the same as before sampling. -// //if the new total without susceptibles is already bigger than the previous total -// //subtract the overflow from SusceptibleImprovedImmunity, susceptibles will then be approximately zero. -// model.populations[{i, InfectionState::SusceptibleNaive}] = 0; -// double diff = model.populations.get_group_total(i) - group_total; -// if (diff > 0) { -// model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] -= diff; -// if (model.populations[{i, InfectionState::SusceptibleImprovedImmunity}] < 0.0) { -// log_error("Negative Compartment after sampling."); -// } -// assert(std::abs(group_total - model.populations.get_group_total(i)) < 1e-10 && "Sanity check."); -// } -// model.populations.set_difference_from_group_total({i, InfectionState::SusceptibleNaive}, group_total); -// } -// } - -// void draw_sample_infection(Model& model) -// { -// model.parameters.get().draw_sample(); - -// //not age dependent -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); - -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); -// model.parameters.get()[AgeGroup(0)].draw_sample(); - -// for (auto i = AgeGroup(0); i < model.parameters.get_num_groups(); i++) { -// //not age dependent -// model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; - -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = -// model.parameters.get()[AgeGroup(0)]; -// model.parameters.get()[i] = model.parameters.get()[AgeGroup(0)]; - -// //age dependent -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); - -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); -// model.parameters.get()[i].draw_sample(); -// } -// } - -// void draw_sample(Model& model) -// { -// draw_sample_infection(model); -// draw_sample_demographics(model); -// model.parameters.get().draw_sample(); -// model.apply_constraints(); -// } - -// Graph draw_sample(Graph& graph, bool variant_high) -// { -// Graph sampled_graph; - -// //sample global parameters -// auto& shared_params_model = graph.nodes()[0].property; -// draw_sample_infection(shared_params_model); -// auto& shared_contacts = shared_params_model.parameters.template get(); -// shared_contacts.draw_sample_dampings(); -// auto& shared_dynamic_npis = shared_params_model.parameters.template get(); -// shared_dynamic_npis.draw_sample(); - -// double delta_fac; -// if (variant_high) { -// delta_fac = 1.6; -// } -// else { -// delta_fac = 1.4; -// } - -// //infectiousness of virus variants is not sampled independently but depend on base infectiousness -// for (auto i = AgeGroup(0); i < shared_params_model.parameters.get_num_groups(); ++i) { -// shared_params_model.parameters.template get()[i] = delta_fac; -// } - -// for (auto& params_node : graph.nodes()) { -// auto& node_model = params_node.property; - -// //sample local parameters -// draw_sample_demographics(params_node.property); - -// //copy global parameters -// //save demographic parameters so they aren't overwritten -// auto local_icu_capacity = node_model.parameters.template get(); -// auto local_tnt_capacity = node_model.parameters.template get(); -// auto local_holidays = node_model.parameters.template get().get_school_holidays(); -// auto local_daily_v1 = node_model.parameters.template get(); -// auto local_daily_v2 = node_model.parameters.template get(); -// node_model.parameters = shared_params_model.parameters; -// node_model.parameters.template get() = local_icu_capacity; -// node_model.parameters.template get() = local_tnt_capacity; -// node_model.parameters.template get().get_school_holidays() = local_holidays; -// node_model.parameters.template get() = local_daily_v1; -// node_model.parameters.template get() = local_daily_v2; - -// node_model.parameters.template get().make_matrix(); -// node_model.apply_constraints(); - -// sampled_graph.add_node(params_node.id, node_model); -// } - -// for (auto& edge : graph.edges()) { -// auto edge_params = edge.property; -// //no dynamic NPIs -// //TODO: add switch to optionally enable dynamic NPIs to edges -// sampled_graph.add_edge(edge.start_node_idx, edge.end_node_idx, edge_params); -// } - -// return sampled_graph; -// } - -// } // namespace osecirvvs -// } // namespace mio diff --git a/cpp/models/ode_secirvvs/parameter_space.h b/cpp/models/ode_secirvvs/parameter_space.h index b29ac78e5e..2113f6ad8c 100644 --- a/cpp/models/ode_secirvvs/parameter_space.h +++ b/cpp/models/ode_secirvvs/parameter_space.h @@ -198,13 +198,13 @@ Graph, MigrationParameters> draw_sample(Graph, Migration auto local_icu_capacity = node_model.parameters.template get>(); auto local_tnt_capacity = node_model.parameters.template get>(); auto local_holidays = node_model.parameters.template get>().get_school_holidays(); - auto local_daily_v1 = node_model.parameters.template get>(); + auto local_daily_v1 = node_model.parameters.template get>(); auto local_daily_v2 = node_model.parameters.template get>(); node_model.parameters = shared_params_model.parameters; node_model.parameters.template get>() = local_icu_capacity; node_model.parameters.template get>() = local_tnt_capacity; node_model.parameters.template get>().get_school_holidays() = local_holidays; - node_model.parameters.template get>() = local_daily_v1; + node_model.parameters.template get>() = local_daily_v1; node_model.parameters.template get>() = local_daily_v2; node_model.parameters.template get>().make_matrix(); diff --git a/cpp/models/ode_secirvvs/parameters_io.cpp b/cpp/models/ode_secirvvs/parameters_io.cpp index e5f735602e..35e6903064 100644 --- a/cpp/models/ode_secirvvs/parameters_io.cpp +++ b/cpp/models/ode_secirvvs/parameters_io.cpp @@ -355,126 +355,6 @@ IOResult>> read_population_data(const std::vecto return success(vnum_population); } -// IOResult set_vaccination_data(std::vector& model, const std::string& path, Date date, -// const std::vector& vregion, int num_days) -// { -// BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); - -// auto num_groups = model[0].parameters.get_num_groups(); - -// auto days_until_effective1 = (int)(double)model[0].parameters.get()[AgeGroup(0)]; -// auto days_until_effective2 = -// (int)(double)model[0].parameters.get()[AgeGroup(0)]; -// auto vaccination_distance = (int)(double)model[0].parameters.get()[AgeGroup(0)]; - -// // iterate over regions (e.g., counties) -// for (size_t i = 0; i < model.size(); ++i) { -// // iterate over age groups in region -// for (auto g = AgeGroup(0); g < num_groups; ++g) { - -// model[i].parameters.template get().resize(SimulationDay(num_days + 1)); -// model[i].parameters.template get().resize(SimulationDay(num_days + 1)); -// for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { -// model[i].parameters.template get()[{g, d}] = 0.0; -// model[i].parameters.template get()[{g, d}] = 0.0; -// } -// } -// } - -// auto max_date_entry = std::max_element(vacc_data.begin(), vacc_data.end(), [](auto&& a, auto&& b) { -// return a.date < b.date; -// }); -// if (max_date_entry == vacc_data.end()) { -// return failure(StatusCode::InvalidFileFormat, "Vaccination data file is empty."); -// } -// auto max_date = max_date_entry->date; - -// for (auto&& vacc_data_entry : vacc_data) { -// auto it = std::find_if(vregion.begin(), vregion.end(), [&vacc_data_entry](auto&& r) { -// return r == 0 || (vacc_data_entry.county_id && vacc_data_entry.county_id == regions::CountyId(r)) || -// (vacc_data_entry.state_id && vacc_data_entry.state_id == regions::StateId(r)) || -// (vacc_data_entry.district_id && vacc_data_entry.district_id == regions::DistrictId(r)); -// }); -// auto date_df = vacc_data_entry.date; -// if (it != vregion.end()) { -// auto region_idx = size_t(it - vregion.begin()); -// auto age = vacc_data_entry.age_group; - -// for (size_t d = 0; d < (size_t)num_days + 1; ++d) { -// int days_plus; -// // In the following, second dose means previous 'full immunization', now 'Grundimmunisierung'. -// // --- -// // date: start_date of the simulation (Input from IO call read_input_data_county_vaccmodel()) -// // d: day of simulation, counted from 0 to num_days (for which we need (approximated) vaccination numbers) -// // root[i]["Vacc_completed"]: accumulated number of total second doses up to day date_df; -// // taken from input dataframe, single value, per county and age group -// // ---- -// // An averaged distance between first and second doses (vaccination_distance) is assumed in the following -// // and the first doses are computed based on the second doses given 'vaccination_distance' days later. -// // ---- -// // a person whose second dose is reported at start_date + simulation_day - days_until_effective1 + vaccination_distance -// // had the first dose on start_date + simulation_day - days_until_effective1. Furthermore, he/she has the full protection -// // of the first dose at day X = start_date + simulation_day -// // Storing its value in get() will eventually (in the simulation) -// // transfer the difference (between get() at d and d-1) of -// // N susceptible individuals to 'Susceptible Partially Vaccinated' state at day d; see secir_vaccinated.h -// auto offset_first_date = -// offset_date_by_days(date, (int)d - days_until_effective1 + vaccination_distance); -// if (max_date >= offset_first_date) { -// // Option 1: considered offset_first_date is available in input data frame -// if (date_df == offset_first_date) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = -// vacc_data_entry.num_vaccinations_completed; -// } -// } -// else { // offset_first_date > max_date -// // Option 2: considered offset_first_date is NOT available in input data frame -// // Here, a constant number of first and second doses is assumed, i.e., -// // the the number of vaccinationes at day d (N days after max_date) will be: -// // total number of vaccinations up to day max_date + N * number of vaccinations ON max_date -// // (where the latter is computed as the difference between the total number at max_date and max_date-1) -// days_plus = get_offset_in_days(offset_first_date, max_date); -// if (date_df == offset_date_by_days(max_date, -1)) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= -// days_plus * vacc_data_entry.num_vaccinations_completed; -// } -// else if (date_df == max_date) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += -// (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; -// } -// } - -// // a person whose second dose is reported at start_date + simulation_day - days_until_effective2 -// // has the full protection of the second dose at day X = start_date + simulation_day -// // Storing its value in get() will eventually (in the simulation) -// // transfer the difference (between get() at d and d-1) of -// // N susceptible, partially vaccinated individuals to 'SusceptibleImprovedImmunity' state at day d; see secir_vaccinated.h -// auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective2); -// if (max_date >= offset_full_date) { -// // Option 1: considered offset_full_date is available in input data frame -// if (date_df == offset_full_date) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] = -// vacc_data_entry.num_vaccinations_completed; -// } -// } -// else { // offset_full_date > max_full_date -// // Option 2: considered offset_full_date is NOT available in input data frame -// days_plus = get_offset_in_days(offset_full_date, max_date); -// if (date_df == offset_date_by_days(max_date, -1)) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] -= -// days_plus * vacc_data_entry.num_vaccinations_completed; -// } -// else if (date_df == max_date) { -// model[region_idx].parameters.template get()[{age, SimulationDay(d)}] += -// (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; -// } -// } -// } -// } -// } -// return success(); -// } - } // namespace details } // namespace osecirvvs } // namespace mio diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index bdd523eaac..1dc19a4607 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -625,11 +625,11 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // iterate over age groups in region for (auto g = AgeGroup(0); g < num_groups; ++g) { - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { - model[i].parameters.template get>()[{g, d}] = 0.0; - model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; } } } @@ -668,8 +668,8 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // a person whose second dose is reported at start_date + simulation_day - days_until_effective1 + vaccination_distance // had the first dose on start_date + simulation_day - days_until_effective1. Furthermore, he/she has the full protection // of the first dose at day X = start_date + simulation_day - // Storing its value in get() will eventually (in the simulation) - // transfer the difference (between get() at d and d-1) of + // Storing its value in get() will eventually (in the simulation) + // transfer the difference (between get() at d and d-1) of // N susceptible individuals to 'Susceptible Partially Vaccinated' state at day d; see secir_vaccinated.h auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective1 + vaccination_distance); @@ -677,7 +677,7 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // Option 1: considered offset_first_date is available in input data frame if (date_df == offset_first_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_completed; } } @@ -690,12 +690,12 @@ IOResult set_vaccination_data(std::vector>& model, const std::st days_plus = get_offset_in_days(offset_first_date, max_date); if (date_df == offset_date_by_days(max_date, -1)) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] -= + .parameters.template get>()[{age, SimulationDay(d)}] -= days_plus * vacc_data_entry.num_vaccinations_completed; } else if (date_df == max_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] += + .parameters.template get>()[{age, SimulationDay(d)}] += (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; } } diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 83302f5e3f..11958dce91 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -56,17 +56,17 @@ TEST(TestOdeSECIRTS, simulateDefault) double tmax = 1; double dt = 0.1; - mio::osecirts::Model model(1); + mio::osecirts::Model model(1); model.populations.set_total(10); model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirts::InfectionState::SusceptibleNaive}, 10); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); - model.parameters.get().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get().array().setConstant(0); - mio::TimeSeries result = simulate(t0, tmax, dt, model); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + auto result = mio::simulate>(t0, tmax, dt, model); EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); } @@ -78,33 +78,35 @@ TEST(TestOdeSECIRTS, overflow_vaccinations) const double dt = 1; // init simple model - mio::osecirts::Model model(1); + mio::osecirts::Model model(1); model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleNaive}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptiblePartialImmunity}] = 10.; model.populations[{mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleImprovedImmunity}] = 10.; - model.parameters.get()[mio::AgeGroup(0)] = 0.0; + model.parameters.get>()[mio::AgeGroup(0)] = 0.0; // set vaccination rates higher than total population for each layer const size_t daily_vaccinations = 100; - model.parameters.get().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); - model.parameters.get().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); - model.parameters.get().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); for (size_t i = 0; i <= tmax; ++i) { auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + model.parameters + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + model.parameters.get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + model.parameters + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; } // simulate one step with explicit Euler - auto integrator = std::make_shared(); - auto result = simulate_flows(t0, tmax, dt, model, integrator); + auto integrator = std::make_shared>(); + auto result = mio::simulate_flows>(t0, tmax, dt, model, integrator); // get the flow indices for each type of vaccination and also the indices of the susceptible compartments auto flow_indx_partial_vaccination = @@ -136,7 +138,7 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) // init simple model mio::osecirts::Model model(1); - auto& daily_vaccinations = model.parameters.get(); + auto& daily_vaccinations = model.parameters.get>(); daily_vaccinations.resize(mio::SimulationDay(static_cast(tmax + 1))); daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; @@ -186,7 +188,7 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) namespace { -void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) +void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, bool set_invalid_initial_value) { auto invalid_initial = max == 0 ? 1.0 : max * 1.001; auto valid_initial = (max + min) * 0.5; @@ -196,7 +198,7 @@ void assign_uniform_distribution(mio::UncertainValue& p, double min, double max, } template -void array_assign_uniform_distribution(mio::CustomIndexArray& array, +void array_assign_uniform_distribution(mio::CustomIndexArray, mio::AgeGroup>& array, const double (&min)[N], const double (&max)[N], bool set_invalid_initial_value) { for (auto i = mio::AgeGroup(0); i < array.size(); ++i) { @@ -204,8 +206,8 @@ void array_assign_uniform_distribution(mio::CustomIndexArray& array, double min, - double max, bool set_invalid_initial_value) +void array_assign_uniform_distribution(mio::CustomIndexArray, mio::AgeGroup>& array, + double min, double max, bool set_invalid_initial_value) { for (auto i = mio::AgeGroup(0); i < array.size(); ++i) { assign_uniform_distribution(array[i], min, max, set_invalid_initial_value); @@ -213,7 +215,8 @@ void array_assign_uniform_distribution(mio::CustomIndexArray::Populations& populations, + bool set_invalid_initial_value) { for (mio::AgeGroup i = 0; i < mio::get(populations.size()); i++) { assign_uniform_distribution(populations[{i, mio::osecirts::InfectionState::ExposedNaive}], 10, 20, @@ -273,40 +276,41 @@ void set_synthetic_population_data(mio::osecirts::Model::Populations& population } } -void set_demographic_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) +void set_demographic_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) { - assign_uniform_distribution(parameters.get(), 20, 50, set_invalid_initial_value); - assign_uniform_distribution(parameters.get(), 100, 200, + assign_uniform_distribution(parameters.get>(), 20, 50, + set_invalid_initial_value); + assign_uniform_distribution(parameters.get>(), 100, 200, set_invalid_initial_value); - parameters.get().resize(mio::SimulationDay(size_t(1000))); - parameters.get().array().setConstant(5); - parameters.get().resize(mio::SimulationDay(size_t(1000))); - parameters.get().array().setConstant(3); - parameters.get().resize(mio::SimulationDay(size_t(1000))); - parameters.get().array().setConstant(3); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(5); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(3); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(3); } -void set_contact_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) +void set_contact_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) { - auto& contacts = parameters.get(); + auto& contacts = parameters.get>(); auto& contact_matrix = contacts.get_cont_freq_mat(); contact_matrix[0].get_baseline().setConstant(0.5); contact_matrix[0].get_baseline().diagonal().setConstant(5.0); contact_matrix[0].add_damping(0.3, mio::SimulationTime(5.0)); - auto& npis = parameters.get(); + auto& npis = parameters.get>(); auto npi_groups = Eigen::VectorXd::Ones(contact_matrix[0].get_num_groups()); auto npi_value = mio::UncertainValue(0.5); assign_uniform_distribution(npi_value, 0.25, 0.75, set_invalid_initial_value); - npis.set_threshold(10.0, {mio::DampingSampling(npi_value, mio::DampingLevel(0), mio::DampingType(0), - mio::SimulationTime(0), {0}, npi_groups)}); + npis.set_threshold(10.0, {mio::DampingSampling(npi_value, mio::DampingLevel(0), mio::DampingType(0), + mio::SimulationTime(0), {0}, npi_groups)}); npis.set_base_value(100'000); npis.set_interval(mio::SimulationTime(3.0)); npis.set_duration(mio::SimulationTime(14.0)); parameters.get_end_dynamic_npis() = 10.0; //required for dynamic NPIs to have effect in this model } -void set_covid_parameters(mio::osecirts::Model::ParameterSet& params, bool set_invalid_initial_value) +void set_covid_parameters(mio::osecirts::Model::ParameterSet& params, bool set_invalid_initial_value) { //times const double timeExposedMin = 2.67; @@ -320,16 +324,16 @@ void set_covid_parameters(mio::osecirts::Model::ParameterSet& params, bool set_i const double timeInfectedCriticalMin[] = {4.95, 4.95, 4.86, 14.14, 14.4, 10.}; const double timeInfectedCriticalMax[] = {8.95, 8.95, 8.86, 20.58, 19.8, 13.2}; - array_assign_uniform_distribution(params.get(), timeExposedMin, timeExposedMax, + array_assign_uniform_distribution(params.get>(), timeExposedMin, timeExposedMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), timeInfectedNoSymptomsMin, - timeInfectedNoSymptomsMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), timeInfectedSymptomsMin, - timeInfectedSymptomsMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), timeInfectedSevereMin, + array_assign_uniform_distribution(params.get>(), + timeInfectedNoSymptomsMin, timeInfectedNoSymptomsMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get>(), + timeInfectedSymptomsMin, timeInfectedSymptomsMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get>(), timeInfectedSevereMin, timeInfectedSevereMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), timeInfectedCriticalMin, - timeInfectedCriticalMax, set_invalid_initial_value); + array_assign_uniform_distribution(params.get>(), + timeInfectedCriticalMin, timeInfectedCriticalMax, set_invalid_initial_value); //probabilities double fac_variant = 1.4; @@ -370,61 +374,63 @@ void set_covid_parameters(mio::osecirts::Model::ParameterSet& params, bool set_i const double reducTimeInfectedMildMin = 0.8; const double reducTimeInfectedMildMax = 1.0; - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), transmissionProbabilityOnContactMin, transmissionProbabilityOnContactMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), relativeTransmissionNoSymptomsMin, relativeTransmissionNoSymptomsMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), riskOfInfectionFromSymptomaticMin, riskOfInfectionFromSymptomaticMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), maxRiskOfInfectionFromSymptomaticMin, maxRiskOfInfectionFromSymptomaticMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), recoveredPerInfectedNoSymptomsMin, recoveredPerInfectedNoSymptomsMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), severePerInfectedSymptomsMin, severePerInfectedSymptomsMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), criticalPerSevereMin, + array_assign_uniform_distribution(params.get>(), criticalPerSevereMin, criticalPerSevereMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), deathsPerCriticalMin, + array_assign_uniform_distribution(params.get>(), deathsPerCriticalMin, deathsPerCriticalMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), reducExposedPartialImmunityMin, reducExposedPartialImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), reducExposedImprovedImmunityMin, reducExposedImprovedImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), reducInfectedSymptomsPartialImmunityMin, reducInfectedSymptomsPartialImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), + array_assign_uniform_distribution(params.get>(), reducInfectedSymptomsImprovedImmunityMin, reducInfectedSymptomsImprovedImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), - reducInfectedSevereCriticalDeadPartialImmunityMin, - reducInfectedSevereCriticalDeadPartialImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), - reducInfectedSevereCriticalDeadImprovedImmunityMin, - reducInfectedSevereCriticalDeadImprovedImmunityMax, set_invalid_initial_value); - array_assign_uniform_distribution(params.get(), reducTimeInfectedMildMin, - reducTimeInfectedMildMax, set_invalid_initial_value); + array_assign_uniform_distribution( + params.get>(), + reducInfectedSevereCriticalDeadPartialImmunityMin, reducInfectedSevereCriticalDeadPartialImmunityMax, + set_invalid_initial_value); + array_assign_uniform_distribution( + params.get>(), + reducInfectedSevereCriticalDeadImprovedImmunityMin, reducInfectedSevereCriticalDeadImprovedImmunityMax, + set_invalid_initial_value); + array_assign_uniform_distribution(params.get>(), + reducTimeInfectedMildMin, reducTimeInfectedMildMax, set_invalid_initial_value); //sasonality const double seasonality_min = 0.1; const double seasonality_max = 0.3; - assign_uniform_distribution(params.get(), seasonality_min, seasonality_max, + assign_uniform_distribution(params.get>(), seasonality_min, seasonality_max, set_invalid_initial_value); } namespace { -mio::osecirts::Model make_model(int num_age_groups, bool set_invalid_initial_value = false) +mio::osecirts::Model make_model(int num_age_groups, bool set_invalid_initial_value = false) { assert(num_age_groups <= 6 && "Provide more values in functions above to test more age groups."); mio::osecirts::Model model(num_age_groups); @@ -441,7 +447,7 @@ TEST(TestOdeSECIRTS, draw_sample_graph) { mio::log_thread_local_rng_seeds(mio::LogLevel::warn); - mio::Graph graph; + mio::Graph, mio::MigrationParameters> graph; auto num_age_groups = 6; //create model with invalid initials so the test fails if no sampling is done @@ -457,10 +463,10 @@ TEST(TestOdeSECIRTS, draw_sample_graph) // spot check for sampling auto& parameters0 = sampled_graph.nodes()[0].property.parameters; auto& populations0 = sampled_graph.nodes()[0].property.populations; - auto& timeInfectedCritical = parameters0.get()[mio::AgeGroup(1)]; + auto& timeInfectedCritical = parameters0.get>()[mio::AgeGroup(1)]; ASSERT_GE(double(timeInfectedCritical), 4.95); ASSERT_LE(double(timeInfectedCritical), 8.95); - auto& param_exp_factor = parameters0.get()[mio::AgeGroup(0)]; + auto& param_exp_factor = parameters0.get>()[mio::AgeGroup(0)]; ASSERT_GE(double(param_exp_factor), 0.75); ASSERT_LE(double(param_exp_factor), 0.85); auto& compartment_inf = @@ -468,26 +474,32 @@ TEST(TestOdeSECIRTS, draw_sample_graph) ASSERT_GE(double(compartment_inf), 5.0); ASSERT_LE(double(compartment_inf), 10.0); auto& npi_value = - parameters0.get().get_thresholds()[0].second[0].get_value(); + parameters0.get>().get_thresholds()[0].second[0].get_value(); ASSERT_GE(double(npi_value), 0.25); ASSERT_LE(double(npi_value), 0.75); // special cases ASSERT_NEAR(populations0.get_total(), 1000 * num_age_groups, 1e-2); - ASSERT_TRUE((parameters0.get().array(), - parameters0.get().array() * 1.0) //using high variant - .all()); + ASSERT_TRUE( + (parameters0.get>().array(), + parameters0.get>().array() * 1.0) //using high variant + .all()); // spot check for parameters that should be equal or different between nodes auto& parameters1 = sampled_graph.nodes()[1].property.parameters; auto& populations1 = sampled_graph.nodes()[1].property.populations; - ASSERT_EQ(parameters1.get().get_thresholds()[0].second[0].get_value(), - parameters0.get().get_thresholds()[0].second[0].get_value()); - ASSERT_TRUE((parameters1.get().array() == - parameters0.get().array()) + ASSERT_EQ( + parameters1.get>().get_thresholds()[0].second[0].get_value(), + parameters0.get>() + .get_thresholds()[0] + .second[0] + .get_value()); + ASSERT_TRUE((parameters1.get>().array() == + parameters0.get>().array()) .all()); //these could fail in very(!) rare cases if they are randomly sampled to the same value - ASSERT_NE(parameters1.get(), parameters0.get()) + ASSERT_NE(parameters1.get>(), + parameters0.get>()) << "Failure might be spurious, check RNG seeds."; ASSERT_FALSE((populations1.array() == populations0.array()).all()) << "Failure might be spurious, check RNG seeds."; } @@ -503,10 +515,10 @@ TEST(TestOdeSECIRTS, draw_sample_model) // spot check for sampling auto& parameters = model.parameters; auto& populations = model.populations; - auto& timeInfectedCritical = parameters.get()[mio::AgeGroup(1)]; + auto& timeInfectedCritical = parameters.get>()[mio::AgeGroup(1)]; ASSERT_GE(double(timeInfectedCritical), 4.95); ASSERT_LE(double(timeInfectedCritical), 8.95); - auto& param_exp_factor = parameters.get()[mio::AgeGroup(0)]; + auto& param_exp_factor = parameters.get>()[mio::AgeGroup(0)]; ASSERT_GE(double(param_exp_factor), 0.75); ASSERT_LE(double(param_exp_factor), 0.85); auto& compartment_inf = @@ -516,8 +528,8 @@ TEST(TestOdeSECIRTS, draw_sample_model) // special cases ASSERT_NEAR(populations.get_total(), 1000 * num_age_groups, 1e-2); - ASSERT_TRUE((parameters.get().array(), - parameters.get().array() * 1.0) + ASSERT_TRUE((parameters.get>().array(), + parameters.get>().array() * 1.0) .all()); } @@ -527,7 +539,7 @@ TEST(TestOdeSECIRTS, checkPopulationConservation) auto model = make_model(num_age_groups); auto num_days = 30; - auto result = mio::osecirts::simulate(0, num_days, 0.1, model); + auto result = mio::osecirts::simulate(0, num_days, 0.1, model); double num_persons = 0.0; for (auto i = 0; i < result.get_last_value().size(); i++) { @@ -542,7 +554,7 @@ TEST(TestOdeSECIRTS, checkPopulationConservation) TEST(TestOdeSECIRTS, read_confirmed_cases) { auto num_age_groups = 6; //reading data requires RKI data age groups - auto model = std::vector({make_model(num_age_groups)}); + auto model = std::vector>({make_model(num_age_groups)}); std::vector region{1002}; auto path = mio::path_join(TEST_DATA_DIR, "pydata/Germany/cases_all_county_age_ma7.json"); std::vector> t_Exposed(1); @@ -574,23 +586,24 @@ TEST(TestOdeSECIRTS, read_confirmed_cases) for (size_t group = 0; group < static_cast(num_age_groups); group++) { t_Exposed[0].push_back(static_cast( - std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + std::round(model[0].parameters.template get>()[(mio::AgeGroup)group]))); t_InfectedNoSymptoms[0].push_back(static_cast(std::round( - model[0].parameters.template get()[(mio::AgeGroup)group]))); - t_InfectedSymptoms[0].push_back(static_cast( - std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); - t_InfectedSevere[0].push_back(static_cast( - std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); - t_InfectedCritical[0].push_back(static_cast( - std::round(model[0].parameters.template get()[(mio::AgeGroup)group]))); + model[0].parameters.template get>()[(mio::AgeGroup)group]))); + t_InfectedSymptoms[0].push_back(static_cast(std::round( + model[0].parameters.template get>()[(mio::AgeGroup)group]))); + t_InfectedSevere[0].push_back(static_cast(std::round( + model[0].parameters.template get>()[(mio::AgeGroup)group]))); + t_InfectedCritical[0].push_back(static_cast(std::round( + model[0].parameters.template get>()[(mio::AgeGroup)group]))); t_imm_interval1[0].push_back(static_cast(std::round( - model[0].parameters.template get()[(mio::AgeGroup)group]))); + model[0].parameters.template get>()[(mio::AgeGroup)group]))); - mu_C_R[0].push_back( - model[0].parameters.template get()[(mio::AgeGroup)group]); + mu_C_R[0].push_back(model[0].parameters.template get>()[( + mio::AgeGroup)group]); mu_I_H[0].push_back( - model[0].parameters.template get()[(mio::AgeGroup)group]); - mu_H_U[0].push_back(model[0].parameters.template get()[(mio::AgeGroup)group]); + model[0].parameters.template get>()[(mio::AgeGroup)group]); + mu_H_U[0].push_back( + model[0].parameters.template get>()[(mio::AgeGroup)group]); } auto read = mio::osecirts::details::read_confirmed_cases_data( @@ -604,9 +617,9 @@ TEST(TestOdeSECIRTS, read_confirmed_cases) TEST(TestOdeSECIRTS, read_data) { auto num_age_groups = 6; //reading data requires RKI data age groups - auto model1 = std::vector({make_model(num_age_groups)}); - auto model2 = std::vector({make_model(num_age_groups)}); - auto model3 = std::vector({make_model(num_age_groups)}); + auto model1 = std::vector>({make_model(num_age_groups)}); + auto model2 = std::vector>({make_model(num_age_groups)}); + auto model3 = std::vector>({make_model(num_age_groups)}); auto read_result1 = mio::osecirts::read_input_data_county( model1, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), 1.0, TEST_DATA_DIR, 10); @@ -765,7 +778,7 @@ TEST(TestOdeSECIRTS, export_time_series_init) // Test exporting time series ASSERT_THAT(mio::osecirts::export_input_data_county_timeseries( - std::vector{model}, tmp_results_dir, {0}, {2020, 12, 01}, + std::vector>{model}, tmp_results_dir, {0}, {2020, 12, 01}, std::vector(size_t(num_age_groups), 1.0), 1.0, 2, mio::path_join(TEST_DATA_DIR, "county_divi_ma7.json"), mio::path_join(TEST_DATA_DIR, "cases_all_county_age_ma7.json"), @@ -792,7 +805,7 @@ TEST(TestOdeSECIRTS, model_initialization) auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups auto model = make_model(num_age_groups); // Vector assignment necessary as read_input_data_county changes model - auto model_vector = std::vector{model}; + auto model_vector = std::vector>{model}; ASSERT_THAT(mio::osecirts::read_input_data_county(model_vector, {2020, 12, 01}, {0}, std::vector(size_t(num_age_groups), 1.0), 1.0, @@ -827,7 +840,7 @@ TEST(TestOdeSECIRTS, run_simulation) auto model = make_model(num_age_groups); auto num_days = 30; - auto result = mio::osecirts::simulate(0, num_days, 0.1, model); + auto result = mio::simulate>(0, num_days, 0.1, model); result = mio::interpolate_simulation_result(result); // Reduce influence of time steps chosen by the integrator. // Load result of a previous run; only tests stability, not correctness. @@ -845,19 +858,19 @@ TEST(TestOdeSECIRTS, parameter_percentiles) //build small graph auto model = make_model(5); - auto graph = mio::Graph(); + auto graph = mio::Graph, mio::MigrationParameters>(); graph.add_node(0, model); //sample a few times - auto sampled_graphs = std::vector>(); + auto sampled_graphs = std::vector, mio::MigrationParameters>>(); std::generate_n(std::back_inserter(sampled_graphs), 10, [&graph]() { return mio::osecirts::draw_sample(graph); }); //extract nodes from graph - auto sampled_nodes = std::vector>(); + auto sampled_nodes = std::vector>>(); std::transform(sampled_graphs.begin(), sampled_graphs.end(), std::back_inserter(sampled_nodes), [](auto&& g) { - auto models = std::vector(); + auto models = std::vector>(); std::transform(g.nodes().begin(), g.nodes().end(), std::back_inserter(models), [](auto&& n) { return n.property; }); @@ -868,21 +881,21 @@ TEST(TestOdeSECIRTS, parameter_percentiles) auto percentile_params = mio::osecirts::ensemble_params_percentile(sampled_nodes, 0.6)[0].parameters; //spot check parameters - auto p = double(percentile_params.get()[mio::AgeGroup(2)]); + auto p = double(percentile_params.get>()[mio::AgeGroup(2)]); auto samples = std::vector(); std::transform(sampled_nodes.begin(), sampled_nodes.end(), std::back_inserter(samples), - [](const std::vector& nodes) { - return nodes[0].parameters.get()[mio::AgeGroup(2)]; + [](const std::vector>& nodes) { + return nodes[0].parameters.get>()[mio::AgeGroup(2)]; }); std::nth_element(samples.begin(), samples.begin() + 6, samples.end()); ASSERT_THAT(p, samples[6]); - p = double(percentile_params.get()[mio::AgeGroup(2)]); + p = double(percentile_params.get>()[mio::AgeGroup(2)]); samples = std::vector(); std::transform(sampled_nodes.begin(), sampled_nodes.end(), std::back_inserter(samples), - [](const std::vector& nodes) { - return nodes[0].parameters.get()[mio::AgeGroup(2)]; + [](const std::vector>& nodes) { + return nodes[0].parameters.get>()[mio::AgeGroup(2)]; }); std::nth_element(samples.begin(), samples.begin() + 6, samples.end()); ASSERT_THAT(p, samples[6]); @@ -891,10 +904,10 @@ TEST(TestOdeSECIRTS, parameter_percentiles) TEST(TestOdeSECIRTS, get_infections_relative) { auto model = make_model(2); - auto sim = mio::osecirts::Simulation<>(model); + auto sim = mio::osecirts::Simulation(model); auto y = sim.get_result()[0]; - auto relative_infections = get_infections_relative(sim, 0.0, y); + auto relative_infections = mio::osecirts::get_infections_relative(sim, 0.0, y); // see model population init to obtain sum 105=2*(7+7.5+8+9.5+10+10.5) ASSERT_DOUBLE_EQ(relative_infections, 105 / model.populations.get_total()); @@ -904,10 +917,10 @@ TEST(TestOdeSECIRTS, get_migration_factors) { auto num_age_groups = 2; auto model = make_model(num_age_groups); - auto sim = mio::osecirts::Simulation<>(model); + auto sim = mio::osecirts::Simulation(model); auto y = sim.get_result()[0]; - auto migration_factors = get_migration_factors(sim, 0.0, y); + auto migration_factors = mio::osecirts::get_migration_factors(sim, 0.0, y); auto expected_values = (Eigen::VectorXd(Eigen::Index(mio::osecirts::InfectionState::Count) * num_age_groups) << 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.1, 0.1, 0.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -929,7 +942,7 @@ TEST(TestOdeSECIRTS, test_commuters) auto migrated = (sim.get_result().get_last_value() * migration_factor).eval(); auto migrated_tested = migrated.eval(); - test_commuters(sim, migrated_tested, 0.0); + mio::osecirts::test_commuters(sim, migrated_tested, 0.0); ASSERT_NEAR(migrated_tested[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaive)], migrated[Eigen::Index(mio::osecirts::InfectionState::InfectedSymptomsNaive)] * non_detection_factor, @@ -997,127 +1010,127 @@ TEST(TestOdeSECIRTS, test_commuters) TEST(TestOdeSECIRTS, check_constraints_parameters) { - auto model = mio::osecirts::Model(1); + auto model = mio::osecirts::Model(1); ASSERT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::off); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.2); - model.parameters.set(-2); + model.parameters.set>(0.2); + model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); - model.parameters.set(-2); + model.parameters.set>(2); + model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); - model.parameters.set(0); + model.parameters.set>(2); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(5); - model.parameters.set(0); + model.parameters.set>(5); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); - model.parameters.set(-1); + model.parameters.set>(2); + model.parameters.set>(-1); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); - model.parameters.set(0); + model.parameters.set>(2); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(10.); - model.parameters.set(0.0); + model.parameters.set>(10.); + model.parameters.set>(0.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(90.); - model.parameters.set(-20.0); + model.parameters.set>(90.); + model.parameters.set>(-20.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(90.); - model.parameters.set(0.0); + model.parameters.set>(90.); + model.parameters.set>(0.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(100.); - model.parameters.set(0.0); + model.parameters.set>(100.); + model.parameters.set>(0.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(200); - model.parameters.set(2.0); + model.parameters.set>(200); + model.parameters.set>(2.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-1.0); + model.parameters.set>(0.5); + model.parameters.set>(-1.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(3.0); + model.parameters.set>(0.5); + model.parameters.set>(3.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-0.8); + model.parameters.set>(0.5); + model.parameters.set>(-0.8); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-0.1); + model.parameters.set>(0.5); + model.parameters.set>(-0.1); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-1.0); + model.parameters.set>(0.5); + model.parameters.set>(-1.0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(1.1); + model.parameters.set>(0.5); + model.parameters.set>(1.1); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(0.2); + model.parameters.set>(0.5); + model.parameters.set>(0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(2); - model.parameters.set(-2); + model.parameters.set>(2); + model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); - model.parameters.set(-0.2); + model.parameters.set>(7); + model.parameters.set>(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); - model.parameters.set(-2); + model.parameters.set>(7); + model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(7); - model.parameters.set(0); + model.parameters.set>(7); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-0.2); + model.parameters.set>(0.5); + model.parameters.set>(-0.2); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(0); + model.parameters.set>(0.5); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(0.); + model.parameters.set>(0.5); + model.parameters.set>(0.); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-4); + model.parameters.set>(0.5); + model.parameters.set>(-4); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(-4); + model.parameters.set>(0.5); + model.parameters.set>(-4); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(0.5); - model.parameters.set(0); + model.parameters.set>(0.5); + model.parameters.set>(0); ASSERT_EQ(model.parameters.check_constraints(), 1); - model.parameters.set(1); - model.parameters.set(-4); + model.parameters.set>(1); + model.parameters.set>(-4); ASSERT_EQ(model.parameters.check_constraints(), 1); mio::set_log_level(mio::LogLevel::warn); @@ -1132,172 +1145,184 @@ TEST(TestOdeSECIRTS, apply_constraints_parameters) mio::set_log_level(mio::LogLevel::off); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get(), 0); + EXPECT_EQ(model.parameters.get>(), 0); - model.parameters.set(-2); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get(), 0); + EXPECT_EQ(model.parameters.get>(), 0); - model.parameters.set(-2); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(1e-10); + model.parameters.set>(1e-10); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(-1); + model.parameters.set>(-1); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], tol_times); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); - model.parameters.set(2.0); + model.parameters.set>(2.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_NEAR(model.parameters.get()[indx_agegroup], 0.0, 1e-14); + EXPECT_NEAR(model.parameters.get>()[indx_agegroup], 0.0, + 1e-14); - model.parameters.set(-1.0); + model.parameters.set>(-1.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(3.0); + model.parameters.set>(3.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-0.8); + model.parameters.set>(-0.8); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-0.1); + model.parameters.set>(-0.1); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-1.0); + model.parameters.set>(-1.0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(1.1); + model.parameters.set>(1.1); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-2); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 0); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); - model.parameters.set(-0.2); + model.parameters.set>(-0.2); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); - model.parameters.set(0.); + model.parameters.set>(0.); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); - model.parameters.set(-4); + model.parameters.set>(-4); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ( + model.parameters.get>()[indx_agegroup], + 1); - model.parameters.set(-4); + model.parameters.set>(-4); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ( + model.parameters.get>()[indx_agegroup], + 1); - model.parameters.set(0); + model.parameters.set>(0); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); - model.parameters.set(-4); + model.parameters.set>(-4); EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); mio::set_log_level(mio::LogLevel::warn); } TEST(TestOdeSECIRTS, apply_variant_function) { - auto model = mio::osecirts::Model(1); - model.parameters.set(0.2); + auto model = mio::osecirts::Model(1); + model.parameters.set>(0.2); model.parameters.set(0); model.parameters.set(10); - model.parameters.set(2.0); - auto sim = mio::osecirts::Simulation<>(model); + model.parameters.set>(2.0); + auto sim = mio::osecirts::Simulation(model); // test that the transmission probability is not changed due to calling the advance function sim.advance(0.01); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.2, 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.2, 1e-10); // test if the transmission probability is set to the correct value after applying the variant. // The referece values are calculated using equation (36) in doi.org/10.1371/journal.pcbi.1010054 - auto base_infectiousness = sim.get_model().parameters.get(); + auto base_infectiousness = + sim.get_model().parameters.get>(); // however, the parameter should stay unchanged if the new variant is not present in the population. sim.apply_variant(0, base_infectiousness); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.2, 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.2, 1e-10); sim.apply_variant(9, base_infectiousness); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.2, 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.2, 1e-10); sim.apply_variant(10, base_infectiousness); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.99 * base_infectiousness[mio::AgeGroup(0)] + - 0.01 * base_infectiousness[mio::AgeGroup(0)] * - sim.get_model().parameters.get()[mio::AgeGroup(0)], - 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.99 * base_infectiousness[mio::AgeGroup(0)] + + 0.01 * base_infectiousness[mio::AgeGroup(0)] * + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 1e-10); sim.apply_variant(45, base_infectiousness); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.68 * base_infectiousness[mio::AgeGroup(0)] + - 0.32 * base_infectiousness[mio::AgeGroup(0)] * - sim.get_model().parameters.get()[mio::AgeGroup(0)], - 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.68 * base_infectiousness[mio::AgeGroup(0)] + + 0.32 * base_infectiousness[mio::AgeGroup(0)] * + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 1e-10); sim.apply_variant(1000, base_infectiousness); - EXPECT_NEAR(sim.get_model().parameters.get()[mio::AgeGroup(0)], - 0.4, 1e-10); + EXPECT_NEAR( + sim.get_model().parameters.get>()[mio::AgeGroup(0)], + 0.4, 1e-10); } \ No newline at end of file From 14d2d8be122533612bb7a0b54f4b8461af76f302 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:03:11 +0200 Subject: [PATCH 34/60] fix template args for msvc, rm run_simulation test --- cpp/models/ode_secirts/model.h | 2 +- cpp/tests/test_odesecirts.cpp | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index fe1489d199..db1ce5785b 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -836,7 +836,7 @@ inline auto simulate_flows(FP t0, FP tmax, FP dt, const Model& model, } //see declaration above. -template >> +template FP get_infections_relative(const Simulation& sim, FP /*t*/, const Eigen::Ref>& y) { double sum_inf = 0; diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 11958dce91..e2042ac95f 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -834,22 +834,6 @@ TEST(TestOdeSECIRTS, model_initialization) MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); } -TEST(TestOdeSECIRTS, run_simulation) -{ - auto num_age_groups = 3; - auto model = make_model(num_age_groups); - auto num_days = 30; - - auto result = mio::simulate>(0, num_days, 0.1, model); - result = mio::interpolate_simulation_result(result); // Reduce influence of time steps chosen by the integrator. - - // Load result of a previous run; only tests stability, not correctness. - auto expected_result = - mio::read_result(mio::path_join(TEST_DATA_DIR, "results_osecirts.h5")).value()[0].get_groups(); - - ASSERT_THAT(print_wrap(result.matrix()), MatrixNear(print_wrap(expected_result.matrix()), 1e-5, 1e-5)); -} - #endif TEST(TestOdeSECIRTS, parameter_percentiles) From ebb991f400073f6e0cfc40be255deb5fc98e6a5e Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:40:12 +0200 Subject: [PATCH 35/60] rm template from get_num_groups --- cpp/models/ode_secirts/model.h | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index db1ce5785b..b9336d10f1 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -120,7 +120,7 @@ class Model Eigen::Ref> flows) const override { auto const& params = this->parameters; - AgeGroup n_agegroups = params.template get_num_groups(); + AgeGroup n_agegroups = params.get_num_groups(); ContactMatrixGroup const& contact_matrix = params.template get>(); @@ -586,7 +586,7 @@ class Model const ScalarType ub = (size_t)t + 1.0; const ScalarType lb = ub - eps; - Eigen::VectorXd smoothed_vaccinations((size_t)params.template get_num_groups()); + Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); smoothed_vaccinations.setZero(); if (t > ub) { @@ -598,10 +598,7 @@ class Model } // check if t is in the range of the interval [lb,ub] if (t >= lb) { - // need a eigen vector of size params.template get_num_groups() to store the number of vaccinations per age group - - // ToDo: Find a way to Iterate over all three vaccination types - for (AgeGroup age = AgeGroup(0); age < params.template get_num_groups(); age++) { + for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { const auto num_vaccinations_ub = daily_vaccinations[{age, SimulationDay(static_cast(ub + 1))}] - daily_vaccinations[{age, SimulationDay(static_cast(ub))}]; const auto num_vaccinations_lb = daily_vaccinations[{age, SimulationDay(static_cast(lb + 1))}] - @@ -611,7 +608,7 @@ class Model } } else { - for (auto age = AgeGroup(0); age < params.template get_num_groups(); age++) { + for (auto age = AgeGroup(0); age < params.get_num_groups(); age++) { smoothed_vaccinations[(size_t)age] = daily_vaccinations[{age, SimulationDay((size_t)t + 1)}] - daily_vaccinations[{age, SimulationDay((size_t)t)}]; } @@ -874,13 +871,12 @@ auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::R auto& p_inf = params.template get>().array().template cast(); auto& p_inf_max = params.template get>().array().template cast(); //slice of InfectedNoSymptoms - auto y_INS = - slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsNaive), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + - slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsPartialImmunity), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + - slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsImprovedImmunity), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}); + auto y_INS = slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsNaive), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsPartialImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) + + slice(y, {Eigen::Index(InfectionState::InfectedNoSymptomsImprovedImmunity), + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}); //compute isolation, same as infection risk from main model auto test_and_trace_required = @@ -893,14 +889,14 @@ auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::R //set factor for infected auto factors = Eigen::VectorXd::Ones(y.rows()).eval(); - slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsNaive), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsNaive), Eigen::Index(size_t(params.get_num_groups())), + Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsPartialImmunity), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; slice(factors, {Eigen::Index(InfectionState::InfectedSymptomsImprovedImmunity), - Eigen::Index(size_t(params.template get_num_groups())), Eigen::Index(InfectionState::Count)}) + Eigen::Index(size_t(params.get_num_groups())), Eigen::Index(InfectionState::Count)}) .array() = riskFromInfectedSymptomatic; return factors; } From 1be3faa347ac716a7993f8b1b99c35e77b5259c7 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:53:38 +0200 Subject: [PATCH 36/60] tests for get_flows, sim and flow sim --- cpp/tests/test_odesecirts.cpp | 343 +++++++++++++++++++++++++++++++++- 1 file changed, 342 insertions(+), 1 deletion(-) diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index e2042ac95f..85a5696ee1 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Daniel Abele +* Authors: Henrik Zunker * * Contact: Martin J. Kuehn * @@ -50,6 +50,347 @@ #include #include +const mio::osecirts::Model& osecirts_testing_model() +{ + static mio::osecirts::Model model(1); + model.populations.array().setConstant(1); + auto nb_groups = model.parameters.get_num_groups(); + + for (mio::AgeGroup i = 0; i < nb_groups; i++) { + + // parameters + //times + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + model.parameters.get>()[i] = 1.0; + + //probabilities + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 0.5; + model.parameters.get>()[i] = 1.0; + } + + model.parameters.get>() = 10; + model.parameters.get>() = 1.0; + const size_t daily_vaccinations = 1; + const size_t num_days = 5; + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + for (size_t i = 0; i < num_days; ++i) { + for (mio::AgeGroup j = 0; j < nb_groups; ++j) { + auto num_vaccinations = static_cast(i * daily_vaccinations); + model.parameters.get>()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get>()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters.get>()[{j, mio::SimulationDay(i)}] = + num_vaccinations; + } + } + + mio::ContactMatrixGroup& contact_matrix = model.parameters.get>(); + const double cont_freq = 1; + const double fact = 1.0 / (double)(size_t)nb_groups; + contact_matrix[0] = + mio::ContactMatrix(Eigen::MatrixXd::Constant((size_t)nb_groups, (size_t)nb_groups, fact * cont_freq)); + return model; +} + +TEST(TestOdeSECIRTS, get_flows) +{ + auto& model = osecirts_testing_model(); + + Eigen::VectorXd y = Eigen::VectorXd::Constant(model.get_initial_values().size(), 1.0); + Eigen::VectorXd flows = Eigen::VectorXd::Zero(model.get_initial_flows().size()); + + model.get_flows(y, y, 0.0, flows); + + // // check flows individually + EXPECT_EQ(flows.size(), 53); + + // Check each flow individually + EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.09375); + + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.90625); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.0); + EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + + // Add more EXPECT_EQ statements for the remaining flow entries + + // Partial immunity flows + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.046875); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.953125); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.0); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + + // Improved immunity flows + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.046875); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.953125); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.0); + EXPECT_EQ( + (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 0.5); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 0.5); + + // Waning immunity flows + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ((flows[model.get_flat_flow_index( + {mio::AgeGroup(0)})]), + 1.0); + EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), + 1.0); +} + +TEST(TestOdeSECIRTS, Simulation) +{ + auto integrator = std::make_shared>(); + auto sim = mio::osecirts::Simulation(osecirts_testing_model(), 0, 1); + sim.set_integrator(integrator); + sim.advance(1); + + EXPECT_EQ(sim.get_result().get_num_time_points(), 2); // stores initial value and single step + + Eigen::VectorXd expected_result(29); + expected_result << 1.0, 2.0, 0.09375, 0.046875, 0.046875, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 0.0, 1.5, 1.5, 1.5, 2.90625, 7.90625; + EXPECT_EQ(sim.get_result().get_last_value(), expected_result); +} + +using FlowSim = mio::osecirts::Simulation>>; + +TEST(TestOdeSECIRTS, FlowSimulation) +{ + auto integrator = std::make_shared>(); + FlowSim sim(osecirts_testing_model(), 0, 1); + + sim.set_integrator(integrator); + sim.advance(1); + + EXPECT_EQ(sim.get_result().get_num_time_points(), 2); // stores initial value and single step + + Eigen::VectorXd expected_result(29); + expected_result << 1.0, 2.0, 0.09375, 0.046875, 0.046875, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 0.0, 1.5, 1.5, 1.5, 2.90625, 7.90625; + EXPECT_EQ(sim.get_result().get_last_value(), expected_result); + + Eigen::VectorXd expected_flows(53); + expected_flows << 0.09375, 0.90625, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5, 0.5, 1.0, + 0.046875, 0.953125, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5, 0.5, 0.046875, 0.953125, + 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5, 0.5, 0.0, 1.0, 1.0, 1.0; + EXPECT_EQ(sim.get_flows().get_last_value(), expected_flows); +} + TEST(TestOdeSECIRTS, simulateDefault) { double t0 = 0; From 48dffeda2861b04c014cfd7df247d1a33edd9406 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 28 Jun 2024 13:49:04 +0200 Subject: [PATCH 37/60] clean up infection_states --- cpp/models/ode_secirts/infection_state.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/models/ode_secirts/infection_state.h b/cpp/models/ode_secirts/infection_state.h index 18c96bc2e6..fec7443331 100644 --- a/cpp/models/ode_secirts/infection_state.h +++ b/cpp/models/ode_secirts/infection_state.h @@ -58,7 +58,7 @@ enum class InfectionState InfectedCriticalNaive, InfectedCriticalPartialImmunity, InfectedCriticalImprovedImmunity, - SusceptibleImprovedImmunity, //includes all with improved immunity, either through infection or at least two vaccinations + SusceptibleImprovedImmunity, DeadNaive, DeadPartialImmunity, DeadImprovedImmunity, From 381914a22c5765e51f30c818ccf2f7ed5219ef3b Mon Sep 17 00:00:00 2001 From: Henrik Zunker Date: Thu, 8 Aug 2024 13:12:22 +0200 Subject: [PATCH 38/60] fix init pop --- cpp/models/ode_secirts/parameters_io.h | 55 ++++++-------------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index cbb767ecce..ad06b7a84d 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -516,13 +516,17 @@ IOResult set_population_data(std::vector& model, const std::string& model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::max( 0.0, - double(SII - - (model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + - model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + - model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); + double( + SII - + (model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + + model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, @@ -544,7 +548,7 @@ IOResult set_population_data(std::vector& model, const std::string& for (auto j = Index(0); j < InfectionState::Count; ++j) { if (model[region].populations[{i, j}] < 0) { log_warning("Compartment at age group {}, infection state {}, is negative: {}", size_t(i), - size_t(j), model[region].populations[{i, j}] / num_population[region][size_t(i)]); + size_t(j), model[region].populations[{i, j}]); } } } @@ -611,39 +615,6 @@ IOResult set_vaccination_data(std::vector>& model, const std::st auto region_idx = size_t(it - vregion.begin()); AgeGroup age = vacc_data_entry.age_group; - // initialize the temporary immunity states - if (date_df >= - offset_date_by_days( - date, static_cast( - -model[region_idx].parameters.template get>()[age] - - model[region_idx] - .parameters.template get>()[age])) && - date_df <= - offset_date_by_days( - date, static_cast( - -model[region_idx] - .parameters.template get>()[age]))) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunPartialImmunity}] += - vacc_data_entry.num_vaccinations_completed; - } - - if (date_df >= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get>()[age] - - model[region_idx].parameters.template get>()[age])) && - date_df <= - offset_date_by_days( - date, - static_cast( - -model[region_idx].parameters.template get>()[age])) - - ) { - model[region_idx].populations[{age, InfectionState::TemporaryImmunImprovedImmunity}] += - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; - } - // get daily vaccinations for each layer for (size_t d = 0; d < (size_t)num_days + 1; ++d) { auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective_n); @@ -1305,7 +1276,7 @@ IOResult read_input_data_county(std::vector& model, Date date, cons const std::string& dir, int num_days, bool export_time_series = false) { BOOST_OUTCOME_TRY(details::set_vaccination_data( - model, path_join(dir, "pydata/Germany", "all_county_ageinf_vacc_ma7.json"), date, county, num_days)); + model, path_join(dir, "pydata/Germany", "vacc_county_ageinf_ma7.json"), date, county, num_days)); // TODO: Reuse more code, e.g., set_divi_data (in secir) and a set_divi_data (here) only need a different ModelType. // TODO: add option to set ICU data from confirmed cases if DIVI or other data is not available. From 0f4b1cd0cd802226c52b2fe3ccae902f20bd574a Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 20 Aug 2024 09:32:19 +0200 Subject: [PATCH 39/60] rename params --- cpp/models/ode_secirts/parameter_space.h | 4 ++-- cpp/models/ode_secirts/parameters_io.h | 2 +- cpp/tests/test_odesecirts.cpp | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index dccc47f7b6..af876d06bb 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -207,9 +207,9 @@ void draw_sample(Model& model) * @return Graph with nodes and edges from the input graph sampled. */ template -Graph, MigrationParameters> draw_sample(Graph, MigrationParameters>& graph) +Graph, MobilityParameters> draw_sample(Graph, MobilityParameters>& graph) { - Graph, MigrationParameters> sampled_graph; + Graph, MobilityParameters> sampled_graph; //sample global parameters auto& shared_params_model = graph.nodes()[0].property; diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index ad06b7a84d..9e99a13f86 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -1276,7 +1276,7 @@ IOResult read_input_data_county(std::vector& model, Date date, cons const std::string& dir, int num_days, bool export_time_series = false) { BOOST_OUTCOME_TRY(details::set_vaccination_data( - model, path_join(dir, "pydata/Germany", "vacc_county_ageinf_ma7.json"), date, county, num_days)); + model, path_join(dir, "pydata/Germany", "all_county_ageinf_vacc_ma7.json"), date, county, num_days)); // TODO: Reuse more code, e.g., set_divi_data (in secir) and a set_divi_data (here) only need a different ModelType. // TODO: add option to set ICU data from confirmed cases if DIVI or other data is not available. diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 85a5696ee1..d180e72a97 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -788,7 +788,7 @@ TEST(TestOdeSECIRTS, draw_sample_graph) { mio::log_thread_local_rng_seeds(mio::LogLevel::warn); - mio::Graph, mio::MigrationParameters> graph; + mio::Graph, mio::MobilityParameters> graph; auto num_age_groups = 6; //create model with invalid initials so the test fails if no sampling is done @@ -1183,11 +1183,11 @@ TEST(TestOdeSECIRTS, parameter_percentiles) //build small graph auto model = make_model(5); - auto graph = mio::Graph, mio::MigrationParameters>(); + auto graph = mio::Graph, mio::MobilityParameters>(); graph.add_node(0, model); //sample a few times - auto sampled_graphs = std::vector, mio::MigrationParameters>>(); + auto sampled_graphs = std::vector, mio::MobilityParameters>>(); std::generate_n(std::back_inserter(sampled_graphs), 10, [&graph]() { return mio::osecirts::draw_sample(graph); }); @@ -1650,4 +1650,4 @@ TEST(TestOdeSECIRTS, apply_variant_function) EXPECT_NEAR( sim.get_model().parameters.get>()[mio::AgeGroup(0)], 0.4, 1e-10); -} \ No newline at end of file +} From 4ca0d3e7c54c2ffac65f82266bc65fc5c5241c5d Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Thu, 29 Aug 2024 09:43:18 +0200 Subject: [PATCH 40/60] bound checking vaccinations_at --- cpp/models/ode_secirts/model.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index b9336d10f1..88e8de4449 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -599,7 +599,12 @@ class Model // check if t is in the range of the interval [lb,ub] if (t >= lb) { for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { - const auto num_vaccinations_ub = daily_vaccinations[{age, SimulationDay(static_cast(ub + 1))}] - + // if ub + 1 is out of bounds, we use the value at ub + auto ubp1 = static_cast(ub + 1); + if (static_cast(daily_vaccinations.size()) < ubp1) { + ubp1 = static_cast(ub); + } + const auto num_vaccinations_ub = daily_vaccinations[{age, SimulationDay(static_cast(ubp1))}] - daily_vaccinations[{age, SimulationDay(static_cast(ub))}]; const auto num_vaccinations_lb = daily_vaccinations[{age, SimulationDay(static_cast(lb + 1))}] - daily_vaccinations[{age, SimulationDay(static_cast(lb))}]; From 929988b180448a28fbd26d8a78f76f7c53caae16 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:14:40 +0200 Subject: [PATCH 41/60] vaccination(s) to plural --- cpp/benchmarks/flow_simulation_ode_secirvvs.h | 23 +++---- cpp/benchmarks/graph_simulation.cpp | 8 +-- cpp/examples/ode_secirts.cpp | 12 ++-- cpp/examples/ode_secirvvs.cpp | 8 +-- cpp/models/ode_secirts/analyze_result.h | 14 ++-- cpp/models/ode_secirts/model.h | 6 +- cpp/models/ode_secirts/parameter_space.h | 12 ++-- cpp/models/ode_secirts/parameters.h | 16 ++--- cpp/models/ode_secirts/parameters_io.h | 27 ++++---- cpp/models/ode_secirvvs/README.md | 2 +- cpp/models/ode_secirvvs/analyze_result.h | 10 +-- cpp/models/ode_secirvvs/model.h | 12 ++-- cpp/models/ode_secirvvs/parameter_space.h | 8 +-- cpp/models/ode_secirvvs/parameters.h | 10 +-- cpp/models/ode_secirvvs/parameters_io.h | 47 +++++++------- cpp/tests/test_epi_data_io.cpp | 6 +- cpp/tests/test_odesecirts.cpp | 51 +++++++-------- cpp/tests/test_odesecirvvs.cpp | 64 ++++++++++--------- .../simulation/ode_secirvvs_simple.py | 8 +-- .../memilio/simulation_test/test_osecirvvs.py | 8 +-- 20 files changed, 181 insertions(+), 171 deletions(-) diff --git a/cpp/benchmarks/flow_simulation_ode_secirvvs.h b/cpp/benchmarks/flow_simulation_ode_secirvvs.h index a4c08b8f30..3e3ab07458 100644 --- a/cpp/benchmarks/flow_simulation_ode_secirvvs.h +++ b/cpp/benchmarks/flow_simulation_ode_secirvvs.h @@ -487,16 +487,16 @@ class Simulation : public Base double full_vacc; if (t_idx == SimulationDay(0)) { first_vacc = - params.template get>()[{(AgeGroup)i, t_idx}]; - full_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; + params.template get>()[{(AgeGroup)i, t_idx}]; + full_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; } else { first_vacc = - params.template get>()[{(AgeGroup)i, t_idx}] - - params.template get>()[{(AgeGroup)i, - t_idx - SimulationDay(1)}]; - full_vacc = params.template get>()[{(AgeGroup)i, t_idx}] - - params.template get>()[{ + params.template get>()[{(AgeGroup)i, t_idx}] - + params.template get>()[{(AgeGroup)i, + t_idx - SimulationDay(1)}]; + full_vacc = params.template get>()[{(AgeGroup)i, t_idx}] - + params.template get>()[{ (AgeGroup)i, t_idx - SimulationDay(1)}]; } @@ -667,10 +667,11 @@ void setup_model(Model& model) model.parameters.template get>() = 100; model.parameters.template get>() = 0.0143; - model.parameters.template get>().resize(SimulationDay(size_t(1000))); - model.parameters.template get>().array().setConstant(5); - model.parameters.template get>().resize(SimulationDay(size_t(1000))); - model.parameters.template get>().array().setConstant(3); + model.parameters.template get>().resize( + SimulationDay(size_t(1000))); + model.parameters.template get>().array().setConstant(5); + model.parameters.template get>().resize(SimulationDay(size_t(1000))); + model.parameters.template get>().array().setConstant(3); auto& contacts = model.parameters.template get>(); auto& contact_matrix = contacts.get_cont_freq_mat(); diff --git a/cpp/benchmarks/graph_simulation.cpp b/cpp/benchmarks/graph_simulation.cpp index e02d6ab6e9..dca3eb7260 100644 --- a/cpp/benchmarks/graph_simulation.cpp +++ b/cpp/benchmarks/graph_simulation.cpp @@ -69,10 +69,10 @@ mio::osecirvvs::Model create_model(size_t num_agegroups, const Scala const size_t vacc_full = 5; model.parameters.get>() = 100; model.parameters.get>() = 0.0143; - model.parameters.get>().resize(mio::SimulationDay(tmax)); - model.parameters.get>().array().setConstant(vacc_first); - model.parameters.get>().resize(mio::SimulationDay(tmax)); - model.parameters.get>().array().setConstant(vacc_full); + model.parameters.get>().resize(mio::SimulationDay(tmax)); + model.parameters.get>().array().setConstant(vacc_first); + model.parameters.get>().resize(mio::SimulationDay(tmax)); + model.parameters.get>().array().setConstant(vacc_full); auto& contacts = model.parameters.get>(); auto& contact_matrix = contacts.get_cont_freq_mat(); diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index 77b0571039..dc67da7c70 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -103,17 +103,17 @@ int main() model.parameters.get>() = 0.0143; const size_t daily_vaccinations = 10; const size_t num_days = 300; - model.parameters.get>().resize(mio::SimulationDay(num_days)); - model.parameters.get>().resize(mio::SimulationDay(num_days)); - model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { for (mio::AgeGroup j = 0; j < nb_groups; ++j) { auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; } } diff --git a/cpp/examples/ode_secirvvs.cpp b/cpp/examples/ode_secirvvs.cpp index db31bb1dee..b49b6250fc 100644 --- a/cpp/examples/ode_secirvvs.cpp +++ b/cpp/examples/ode_secirvvs.cpp @@ -67,16 +67,16 @@ int main() model.parameters.get>() = 100; model.parameters.get>() = 0.0143; const size_t daily_vaccinations = 10; - model.parameters.get>().resize( + model.parameters.get>().resize( mio::SimulationDay((size_t)tmax + 1)); - model.parameters.get>().resize(mio::SimulationDay((size_t)tmax + 1)); + model.parameters.get>().resize(mio::SimulationDay((size_t)tmax + 1)); for (size_t i = 0; i < tmax + 1; ++i) { auto num_vaccinations = static_cast(i * daily_vaccinations); model.parameters - .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; model.parameters - .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; } auto& contacts = model.parameters.get>(); diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index 9cfa9845af..f91a5d0673 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -46,7 +46,7 @@ std::vector ensemble_params_percentile(const std::vector>() + .parameters.template get>() .template size(); std::vector single_element_ensemble(num_runs); @@ -65,9 +65,9 @@ std::vector ensemble_params_percentile(const std::vector>().resize(num_days); - percentile[node].parameters.template get>().resize(num_days); - percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { //Population @@ -174,15 +174,15 @@ std::vector ensemble_params_percentile(const std::vector auto& { - return model.parameters.template get>()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get>()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get>()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); } //virus variants diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index 88e8de4449..aa078c4ba8 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -142,9 +142,9 @@ class Model } // get vaccinations - auto const partial_vaccination = vaccinations_at(t, params.template get>()); - auto const full_vaccination = vaccinations_at(t, params.template get>()); - auto const booster_vaccination = vaccinations_at(t, params.template get>()); + auto const partial_vaccination = vaccinations_at(t, params.template get>()); + auto const full_vaccination = vaccinations_at(t, params.template get>()); + auto const booster_vaccination = vaccinations_at(t, params.template get>()); for (auto i = AgeGroup(0); i < n_agegroups; i++) { diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index af876d06bb..bc940c78ca 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -230,16 +230,16 @@ Graph, MobilityParameters> draw_sample(Graph, MobilityPa auto local_icu_capacity = node_model.parameters.template get>(); auto local_tnt_capacity = node_model.parameters.template get>(); auto local_holidays = node_model.parameters.template get>().get_school_holidays(); - auto local_daily_v1 = node_model.parameters.template get>(); - auto local_daily_v2 = node_model.parameters.template get>(); - auto local_daily_v3 = node_model.parameters.template get>(); + auto local_daily_v1 = node_model.parameters.template get>(); + auto local_daily_v2 = node_model.parameters.template get>(); + auto local_daily_v3 = node_model.parameters.template get>(); node_model.parameters = shared_params_model.parameters; node_model.parameters.template get>() = local_icu_capacity; node_model.parameters.template get>() = local_tnt_capacity; node_model.parameters.template get>().get_school_holidays() = local_holidays; - node_model.parameters.template get>() = local_daily_v1; - node_model.parameters.template get>() = local_daily_v2; - node_model.parameters.template get>() = local_daily_v3; + node_model.parameters.template get>() = local_daily_v1; + node_model.parameters.template get>() = local_daily_v2; + node_model.parameters.template get>() = local_daily_v3; node_model.parameters.template get>().make_matrix(); node_model.apply_constraints(); diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index 760f1fa9b1..4bf77d46ad 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -500,7 +500,7 @@ struct DaysUntilEffectiveBoosterImmunity { * @brief Total number of first vaccinations up to the given day. */ template -struct DailyPartialVaccination { +struct DailyPartialVaccinations { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -508,7 +508,7 @@ struct DailyPartialVaccination { } static std::string name() { - return "DailyPartialVaccination"; + return "DailyPartialVaccinations"; } }; @@ -516,7 +516,7 @@ struct DailyPartialVaccination { * @brief Total number of full vaccinations up to the given day. */ template -struct DailyFullVaccination { +struct DailyFullVaccinations { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -524,7 +524,7 @@ struct DailyFullVaccination { } static std::string name() { - return "DailyFullVaccination"; + return "DailyFullVaccinations"; } }; @@ -532,7 +532,7 @@ struct DailyFullVaccination { * @brief Total number of booster vaccinations up to the given day. */ template -struct DailyBoosterVaccination { +struct DailyBoosterVaccinations { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -540,7 +540,7 @@ struct DailyBoosterVaccination { } static std::string name() { - return "DailyBoosterVaccination"; + return "DailyBoosterVaccinations"; } }; @@ -682,8 +682,8 @@ using ParametersBase = ParameterSet< RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialVaccination, DaysUntilEffectiveImprovedVaccination, - DaysUntilEffectiveBoosterImmunity, DailyFullVaccination, DailyPartialVaccination, - DailyBoosterVaccination, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, + DaysUntilEffectiveBoosterImmunity, DailyFullVaccinations, DailyPartialVaccinations, + DailyBoosterVaccinations, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, StartDayNewVariant>; diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 9e99a13f86..b61c33c073 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -581,13 +581,13 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // iterate over age groups in region for (auto g = AgeGroup(0); g < num_groups; ++g) { - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { - model[i].parameters.template get>()[{g, d}] = 0.0; - model[i].parameters.template get>()[{g, d}] = 0.0; - model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; } } } @@ -621,28 +621,29 @@ IOResult set_vaccination_data(std::vector>& model, const std::st if (max_date >= offset_first_date) { if (date_df == offset_first_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_partial; } } else { if (date_df == offset_first_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = 0; + .parameters.template get>()[{age, SimulationDay(d)}] = 0; } } auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective_pi); if (max_date >= offset_full_date) { if (date_df == offset_full_date) { - model[region_idx].parameters.template get>()[{age, SimulationDay(d)}] = + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_completed; } } else { if (date_df == offset_first_date) { - model[region_idx].parameters.template get>()[{age, SimulationDay(d)}] = - 0; + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = 0; } } @@ -650,14 +651,14 @@ IOResult set_vaccination_data(std::vector>& model, const std::st if (max_date >= offset_booster_date) { if (date_df == offset_booster_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; } } else { if (date_df == offset_first_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = 0; + .parameters.template get>()[{age, SimulationDay(d)}] = 0; } } } diff --git a/cpp/models/ode_secirvvs/README.md b/cpp/models/ode_secirvvs/README.md index ddda94bbad..0a6750d2ef 100644 --- a/cpp/models/ode_secirvvs/README.md +++ b/cpp/models/ode_secirvvs/README.md @@ -2,7 +2,7 @@ This model extends the basic SECIR model by adding vaccinations and allowing the implicit modeling of a newly arriving variant that takes hold. -Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyFirstVaccination` and `DailyFullVaccination`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. +Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyFirstVaccination` and `DailyFullVaccinations`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. The ratio of two variants can change over time, which affects the average transmissiblity of the disease. Infectiousness of different variants can be set in the parameters. diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index 469b6cdb82..683e7755ed 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -42,7 +42,7 @@ std::vector ensemble_params_percentile(const std::vector>() + .parameters.template get>() .template size(); std::vector single_element_ensemble(num_runs); @@ -61,8 +61,8 @@ std::vector ensemble_params_percentile(const std::vector>().resize(num_days); - percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); + percentile[node].parameters.template get>().resize(num_days); for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) { //Population @@ -169,11 +169,11 @@ std::vector ensemble_params_percentile(const std::vector auto& { - return model.parameters.template get>()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); param_percentil( node, [ i, day ](auto&& model) -> auto& { - return model.parameters.template get>()[{i, day}]; + return model.parameters.template get>()[{i, day}]; }); } //virus variants diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index bbba6a5651..66705b9ea5 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -626,15 +626,15 @@ class Simulation : public BaseT double first_vacc; double full_vacc; if (t_idx == SimulationDay(0)) { - first_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; - full_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; + first_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; + full_vacc = params.template get>()[{(AgeGroup)i, t_idx}]; } else { first_vacc = - params.template get>()[{(AgeGroup)i, t_idx}] - - params.template get>()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; - full_vacc = params.template get>()[{(AgeGroup)i, t_idx}] - - params.template get>()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; + params.template get>()[{(AgeGroup)i, t_idx}] - + params.template get>()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; + full_vacc = params.template get>()[{(AgeGroup)i, t_idx}] - + params.template get>()[{(AgeGroup)i, t_idx - SimulationDay(1)}]; } if (last_value(count * i + S) - first_vacc < 0) { diff --git a/cpp/models/ode_secirvvs/parameter_space.h b/cpp/models/ode_secirvvs/parameter_space.h index fcf31a26be..eab672bef9 100644 --- a/cpp/models/ode_secirvvs/parameter_space.h +++ b/cpp/models/ode_secirvvs/parameter_space.h @@ -197,14 +197,14 @@ Graph, MobilityParameters> draw_sample(Graph, MobilityPa auto local_icu_capacity = node_model.parameters.template get>(); auto local_tnt_capacity = node_model.parameters.template get>(); auto local_holidays = node_model.parameters.template get>().get_school_holidays(); - auto local_daily_v1 = node_model.parameters.template get>(); - auto local_daily_v2 = node_model.parameters.template get>(); + auto local_daily_v1 = node_model.parameters.template get>(); + auto local_daily_v2 = node_model.parameters.template get>(); node_model.parameters = shared_params_model.parameters; node_model.parameters.template get>() = local_icu_capacity; node_model.parameters.template get>() = local_tnt_capacity; node_model.parameters.template get>().get_school_holidays() = local_holidays; - node_model.parameters.template get>() = local_daily_v1; - node_model.parameters.template get>() = local_daily_v2; + node_model.parameters.template get>() = local_daily_v1; + node_model.parameters.template get>() = local_daily_v2; node_model.parameters.template get>().make_matrix(); node_model.apply_constraints(); diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index e6ddb7fd8f..66950dfa87 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -447,7 +447,7 @@ struct DaysUntilEffectiveImprovedImmunity { * @brief Total number of first vaccinations up to the given day. */ template -struct DailyPartialVaccination { +struct DailyPartialVaccinations { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -455,7 +455,7 @@ struct DailyPartialVaccination { } static std::string name() { - return "DailyPartialVaccination"; + return "DailyPartialVaccinations"; } }; @@ -463,7 +463,7 @@ struct DailyPartialVaccination { * @brief Total number of full vaccinations up to the given day. */ template -struct DailyFullVaccination { +struct DailyFullVaccinations { using Type = CustomIndexArray; static Type get_default(AgeGroup size) { @@ -471,7 +471,7 @@ struct DailyFullVaccination { } static std::string name() { - return "DailyFullVaccination"; + return "DailyFullVaccinations"; } }; @@ -612,7 +612,7 @@ using ParametersBase = ParameterSet< TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, - DaysUntilEffectiveImprovedImmunity, DailyFullVaccination, DailyPartialVaccination, + DaysUntilEffectiveImprovedImmunity, DailyFullVaccinations, DailyPartialVaccinations, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index 1dc19a4607..8d15e53362 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -439,12 +439,12 @@ IOResult set_population_data(std::vector& model, const std::string& for (auto i = AgeGroup(0); i < num_groups; i++) { double S_v = std::min( - model[region].parameters.template get>()[{i, SimulationDay(0)}] + + model[region].parameters.template get>()[{i, SimulationDay(0)}] + num_rec[region][size_t(i)], num_population[region][size_t(i)]); double S_pv = std::max( - model[region].parameters.template get>()[{i, SimulationDay(0)}] - - model[region].parameters.template get>()[{i, SimulationDay(0)}], + model[region].parameters.template get>()[{i, SimulationDay(0)}] - + model[region].parameters.template get>()[{i, SimulationDay(0)}], 0.0); // use std::max with 0 double S; if (num_population[region][size_t(i)] - S_pv - S_v < 0.0) { @@ -544,7 +544,7 @@ IOResult set_population_data(std::vector& model, const std::string& S * model[region].populations[{i, InfectionState::InfectedCriticalNaive}] * denom_HU; model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = - model[region].parameters.template get>()[{i, SimulationDay(0)}] + + model[region].parameters.template get>()[{i, SimulationDay(0)}] + model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] - (model[region].populations[{i, InfectionState::InfectedSymptomsNaive}] + model[region].populations[{i, InfectionState::InfectedSymptomsPartialImmunity}] + @@ -625,11 +625,11 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // iterate over age groups in region for (auto g = AgeGroup(0); g < num_groups; ++g) { - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); - model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); + model[i].parameters.template get>().resize(SimulationDay(num_days + 1)); for (auto d = SimulationDay(0); d < SimulationDay(num_days + 1); ++d) { - model[i].parameters.template get>()[{g, d}] = 0.0; - model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; + model[i].parameters.template get>()[{g, d}] = 0.0; } } } @@ -668,8 +668,8 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // a person whose second dose is reported at start_date + simulation_day - days_until_effective1 + vaccination_distance // had the first dose on start_date + simulation_day - days_until_effective1. Furthermore, he/she has the full protection // of the first dose at day X = start_date + simulation_day - // Storing its value in get() will eventually (in the simulation) - // transfer the difference (between get() at d and d-1) of + // Storing its value in get() will eventually (in the simulation) + // transfer the difference (between get() at d and d-1) of // N susceptible individuals to 'Susceptible Partially Vaccinated' state at day d; see secir_vaccinated.h auto offset_first_date = offset_date_by_days(date, (int)d - days_until_effective1 + vaccination_distance); @@ -677,7 +677,7 @@ IOResult set_vaccination_data(std::vector>& model, const std::st // Option 1: considered offset_first_date is available in input data frame if (date_df == offset_first_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] = + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_completed; } } @@ -690,26 +690,27 @@ IOResult set_vaccination_data(std::vector>& model, const std::st days_plus = get_offset_in_days(offset_first_date, max_date); if (date_df == offset_date_by_days(max_date, -1)) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] -= + .parameters.template get>()[{age, SimulationDay(d)}] -= days_plus * vacc_data_entry.num_vaccinations_completed; } else if (date_df == max_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] += + .parameters.template get>()[{age, SimulationDay(d)}] += (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; } } // a person whose second dose is reported at start_date + simulation_day - days_until_effective2 // has the full protection of the second dose at day X = start_date + simulation_day - // Storing its value in get() will eventually (in the simulation) - // transfer the difference (between get() at d and d-1) of + // Storing its value in get() will eventually (in the simulation) + // transfer the difference (between get() at d and d-1) of // N susceptible, partially vaccinated individuals to 'SusceptibleImprovedImmunity' state at day d; see secir_vaccinated.h auto offset_full_date = offset_date_by_days(date, (int)d - days_until_effective2); if (max_date >= offset_full_date) { // Option 1: considered offset_full_date is available in input data frame if (date_df == offset_full_date) { - model[region_idx].parameters.template get>()[{age, SimulationDay(d)}] = + model[region_idx] + .parameters.template get>()[{age, SimulationDay(d)}] = vacc_data_entry.num_vaccinations_completed; } } @@ -718,12 +719,12 @@ IOResult set_vaccination_data(std::vector>& model, const std::st days_plus = get_offset_in_days(offset_full_date, max_date); if (date_df == offset_date_by_days(max_date, -1)) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] -= + .parameters.template get>()[{age, SimulationDay(d)}] -= days_plus * vacc_data_entry.num_vaccinations_completed; } else if (date_df == max_date) { model[region_idx] - .parameters.template get>()[{age, SimulationDay(d)}] += + .parameters.template get>()[{age, SimulationDay(d)}] += (days_plus + 1) * vacc_data_entry.num_vaccinations_completed; } } @@ -1056,13 +1057,13 @@ IOResult export_input_data_county_timeseries( for (size_t age = 0; age < num_age_groups; age++) { auto age_group_offset = age * (size_t)InfectionState::Count; - double S_v = std::min(model[county].parameters.template get>()[{ + double S_v = std::min(model[county].parameters.template get>()[{ AgeGroup(age), SimulationDay(day)}] + num_rec[county][age], num_population[county][age]); - double S_pv = std::max(model[county].parameters.template get>()[{ + double S_pv = std::max(model[county].parameters.template get>()[{ AgeGroup(age), SimulationDay(day)}] - - model[county].parameters.template get>()[{ + model[county].parameters.template get>()[{ AgeGroup(age), SimulationDay(day)}], 0.0); // use std::max with 0 double S; @@ -1203,8 +1204,8 @@ IOResult export_input_data_county_timeseries( extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset) = - model[county].parameters.template get>()[{AgeGroup(age), - SimulationDay(day)}] + + model[county].parameters.template get>()[{AgeGroup(age), + SimulationDay(day)}] + num_rec_uv[county][age] - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) + diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index cca9e71ec4..f9b0a40694 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -411,13 +411,13 @@ TEST(TestEpiData, set_vaccination_data) (Eigen::ArrayXd(num_age_groups * (num_days + 1)) << 5, 7, 9, 11, 13, 9, 7, 5, 5, 0).finished(); ASSERT_THAT( - print_wrap(model_vector[0].parameters.template get>().array()), + print_wrap(model_vector[0].parameters.template get>().array()), MatrixNear(print_wrap(expected_values_PI), 1e-8, 1e-8)); ASSERT_THAT( - print_wrap(model_vector[0].parameters.template get>().array()), + print_wrap(model_vector[0].parameters.template get>().array()), MatrixNear(print_wrap(expected_values_II), 1e-8, 1e-8)); ASSERT_THAT( - print_wrap(model_vector[0].parameters.template get>().array()), + print_wrap(model_vector[0].parameters.template get>().array()), MatrixNear(print_wrap(expected_values_B), 1e-8, 1e-8)); } diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index d180e72a97..df696e176f 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -93,17 +93,17 @@ const mio::osecirts::Model& osecirts_testing_model() model.parameters.get>() = 1.0; const size_t daily_vaccinations = 1; const size_t num_days = 5; - model.parameters.get>().resize(mio::SimulationDay(num_days)); - model.parameters.get>().resize(mio::SimulationDay(num_days)); - model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); for (size_t i = 0; i < num_days; ++i) { for (mio::AgeGroup j = 0; j < nb_groups; ++j) { auto num_vaccinations = static_cast(i * daily_vaccinations); - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get>()[{j, mio::SimulationDay(i)}] = + model.parameters.get>()[{j, mio::SimulationDay(i)}] = num_vaccinations; } } @@ -401,12 +401,12 @@ TEST(TestOdeSECIRTS, simulateDefault) model.populations.set_total(10); model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirts::InfectionState::SusceptibleNaive}, 10); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); auto result = mio::simulate>(t0, tmax, dt, model); EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); @@ -427,21 +427,22 @@ TEST(TestOdeSECIRTS, overflow_vaccinations) // set vaccination rates higher than total population for each layer const size_t daily_vaccinations = 100; - model.parameters.get>().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); - model.parameters.get>().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); - model.parameters.get>().resize( + model.parameters.get>().resize( mio::SimulationDay(static_cast(tmax + 1))); for (size_t i = 0; i <= tmax; ++i) { auto num_vaccinations = static_cast((i + 1) * daily_vaccinations); model.parameters - .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; - model.parameters.get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + model.parameters + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; model.parameters - .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = + .get>()[{(mio::AgeGroup)0, mio::SimulationDay(i)}] = num_vaccinations; } @@ -479,7 +480,7 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) // init simple model mio::osecirts::Model model(1); - auto& daily_vaccinations = model.parameters.get>(); + auto& daily_vaccinations = model.parameters.get>(); daily_vaccinations.resize(mio::SimulationDay(static_cast(tmax + 1))); daily_vaccinations[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; @@ -623,12 +624,12 @@ void set_demographic_parameters(mio::osecirts::Model::ParameterSet& para set_invalid_initial_value); assign_uniform_distribution(parameters.get>(), 100, 200, set_invalid_initial_value); - parameters.get>().resize(mio::SimulationDay(size_t(1000))); - parameters.get>().array().setConstant(5); - parameters.get>().resize(mio::SimulationDay(size_t(1000))); - parameters.get>().array().setConstant(3); - parameters.get>().resize(mio::SimulationDay(size_t(1000))); - parameters.get>().array().setConstant(3); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(5); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(3); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(3); } void set_contact_parameters(mio::osecirts::Model::ParameterSet& parameters, bool set_invalid_initial_value) diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 3a44a61da6..6a112ed0db 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -60,10 +60,10 @@ TEST(TestOdeSECIRVVS, simulateDefault) model.populations.set_total(10); model.populations.set_difference_from_total({(mio::AgeGroup)0, mio::osecirvvs::InfectionState::SusceptibleNaive}, 10); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); mio::TimeSeries result = simulate(t0, tmax, dt, model); EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); @@ -114,10 +114,10 @@ TEST(TestOdeSECIRVVS, reduceToSecirAndCompareWithPreviousRun) model.parameters.get>() = 10000; model.parameters.get>() = 10000; - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); auto& contacts = model.parameters.get>(); auto& contact_matrix = contacts.get_cont_freq_mat(); @@ -269,10 +269,10 @@ void set_demographic_parameters(mio::osecirvvs::Model::ParameterSet& par { assign_uniform_distribution(parameters.get>(), 20, 50, set_invalid_initial_value); - parameters.get>().resize(mio::SimulationDay(size_t(1000))); - parameters.get>().array().setConstant(5); - parameters.get>().resize(mio::SimulationDay(size_t(1000))); - parameters.get>().array().setConstant(3); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(5); + parameters.get>().resize(mio::SimulationDay(size_t(1000))); + parameters.get>().array().setConstant(3); } void set_contact_parameters(mio::osecirvvs::Model::ParameterSet& parameters, bool set_invalid_initial_value) @@ -899,18 +899,20 @@ TEST(TestOdeSECIRVVS, test_commuters) model.parameters.get_commuter_nondetection() = non_detection_factor; auto sim = mio::osecirvvs::Simulation<>(model); auto before_testing = sim.get_result().get_last_value().eval(); - auto mobile_population = (sim.get_result().get_last_value() * mobility_factor).eval(); - auto mobile_population_tested = mobile_population.eval(); + auto mobile_population = (sim.get_result().get_last_value() * mobility_factor).eval(); + auto mobile_population_tested = mobile_population.eval(); mio::osecirvvs::test_commuters(sim, mobile_population_tested, 0.0); ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaive)], - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaive)] * non_detection_factor, + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaive)] * + non_detection_factor, 1e-5); ASSERT_NEAR( sim.get_result().get_last_value()[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed)], before_testing[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaiveConfirmed)] + - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaive)] * (1 - non_detection_factor), + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsNaive)] * + (1 - non_detection_factor), 1e-5); ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity)], mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity)] * @@ -923,10 +925,11 @@ TEST(TestOdeSECIRVVS, test_commuters) mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsPartialImmunity)] * (1 - non_detection_factor), 1e-5); - ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity)], - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity)] * - non_detection_factor, - 1e-5); + ASSERT_NEAR( + mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity)], + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunity)] * + non_detection_factor, + 1e-5); ASSERT_NEAR( sim.get_result() .get_last_value()[Eigen::Index(mio::osecirvvs::InfectionState::InfectedSymptomsImprovedImmunityConfirmed)], @@ -936,7 +939,8 @@ TEST(TestOdeSECIRVVS, test_commuters) 1e-5); ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive)], - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive)] * non_detection_factor, + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive)] * + non_detection_factor, 1e-5); ASSERT_NEAR(sim.get_result() .get_last_value()[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsNaiveConfirmed)], @@ -944,10 +948,11 @@ TEST(TestOdeSECIRVVS, test_commuters) mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsNaive)] * (1 - non_detection_factor), 1e-5); - ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity)], - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity)] * - non_detection_factor, - 1e-5); + ASSERT_NEAR( + mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity)], + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity)] * + non_detection_factor, + 1e-5); ASSERT_NEAR( sim.get_result() .get_last_value()[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunityConfirmed)], @@ -955,10 +960,11 @@ TEST(TestOdeSECIRVVS, test_commuters) mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsPartialImmunity)] * (1 - non_detection_factor), 1e-5); - ASSERT_NEAR(mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity)], - mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity)] * - non_detection_factor, - 1e-5); + ASSERT_NEAR( + mobile_population_tested[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity)], + mobile_population[Eigen::Index(mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunity)] * + non_detection_factor, + 1e-5); ASSERT_NEAR( sim.get_result().get_last_value()[Eigen::Index( mio::osecirvvs::InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed)], diff --git a/pycode/examples/simulation/ode_secirvvs_simple.py b/pycode/examples/simulation/ode_secirvvs_simple.py index db32a274b8..5102fc6d5c 100644 --- a/pycode/examples/simulation/ode_secirvvs_simple.py +++ b/pycode/examples/simulation/ode_secirvvs_simple.py @@ -99,15 +99,15 @@ def run_ode_secirvvs_simulation(show_plot=True): model.parameters.ICUCapacity.value = 100 model.parameters.TestAndTraceCapacity.value = 0.0143 - model.parameters.DailyPartialVaccination.resize_SimulationDay( + model.parameters.DailyPartialVaccinations.resize_SimulationDay( SimulationDay(tmax + 1)) - model.parameters.DailyFullVaccination.resize_SimulationDay( + model.parameters.DailyFullVaccinations.resize_SimulationDay( SimulationDay(tmax + 1)) daily_vaccinations = 10 for i, num_vaccinations in enumerate(range(0, daily_vaccinations * (tmax + 1), daily_vaccinations)): - model.parameters.DailyPartialVaccination[AgeGroup( + model.parameters.DailyPartialVaccinations[AgeGroup( 0), SimulationDay(i)] = num_vaccinations - model.parameters.DailyFullVaccination[AgeGroup( + model.parameters.DailyFullVaccinations[AgeGroup( 0), SimulationDay(i)] = num_vaccinations # contact patterns diff --git a/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py b/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py index 44c8b61656..f82cc3cce2 100644 --- a/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py +++ b/pycode/memilio-simulation/memilio/simulation_test/test_osecirvvs.py @@ -92,12 +92,12 @@ def setUp(self): model.parameters.ICUCapacity.value = 10000 model.parameters.TestAndTraceCapacity.value = 10000 - model.parameters.DailyPartialVaccination.resize_SimulationDay( + model.parameters.DailyPartialVaccinations.resize_SimulationDay( SimulationDay(1000)) - model.parameters.DailyPartialVaccination[:, :] = 0 - model.parameters.DailyFullVaccination.resize_SimulationDay( + model.parameters.DailyPartialVaccinations[:, :] = 0 + model.parameters.DailyFullVaccinations.resize_SimulationDay( SimulationDay(1000)) - model.parameters.DailyFullVaccination[:, :] = 0 + model.parameters.DailyFullVaccinations[:, :] = 0 model.parameters.TimeExposed[A0] = 3.2 model.parameters.TimeInfectedNoSymptoms[A0] = 2.0 From 158cdba1af8fe8f09e4f2568483787fb270bceab Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:14:28 +0200 Subject: [PATCH 42/60] [ci skip] example description, first and additional vacc --- cpp/examples/ode_secirts.cpp | 3 +++ cpp/memilio/io/epi_data.h | 28 +++++++++++++------------- cpp/models/ode_secirts/parameters_io.h | 3 ++- cpp/tests/test_epi_data_io.cpp | 8 ++++---- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index dc67da7c70..cc52417661 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -25,6 +25,9 @@ int main() { + // This example demonstrates how to simulate a SECIRTS model. + // The SECIRTS model is an extension of the SECIRVVS model that includes waning and temporary immunity. + // After the simulation, the aggregated size of the temporary immunity states are printed. mio::set_log_level(mio::LogLevel::debug); double t0 = 0; diff --git a/cpp/memilio/io/epi_data.h b/cpp/memilio/io/epi_data.h index 07238248a6..8a98f9d7dc 100644 --- a/cpp/memilio/io/epi_data.h +++ b/cpp/memilio/io/epi_data.h @@ -457,8 +457,8 @@ class VaccinationDataEntry public: static std::vector age_group_names; - double num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed, - num_vaccinations_refreshed_2; + double num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed_first, + num_vaccinations_refreshed_additional; Date date; AgeGroup age_group; boost::optional state_id; @@ -468,16 +468,16 @@ class VaccinationDataEntry template static IOResult deserialize(IoContext& io) { - auto obj = io.expect_object("VaccinationDataEntry"); - auto num_vaccinations_partial = obj.expect_element("Vacc_partially", Tag{}); - auto num_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); - auto num_vaccinations_refreshed = obj.expect_element("Vacc_refreshed", Tag{}); - auto num_vaccinations_refreshed_2 = obj.expect_element("Vacc_refreshed_2", Tag{}); - auto date = obj.expect_element("Date", Tag{}); - auto age_group_str = obj.expect_element("Age_RKI", Tag{}); - auto state_id = obj.expect_optional("ID_County", Tag{}); - auto county_id = obj.expect_optional("ID_County", Tag{}); - auto district_id = obj.expect_optional("ID_District", Tag{}); + auto obj = io.expect_object("VaccinationDataEntry"); + auto num_vaccinations_partial = obj.expect_element("Vacc_partially", Tag{}); + auto num_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); + auto num_vaccinations_refreshed_first = obj.expect_element("Vacc_refreshed", Tag{}); + auto num_vaccinations_refreshed_additional = obj.expect_element("Vacc_refreshed_2", Tag{}); + auto date = obj.expect_element("Date", Tag{}); + auto age_group_str = obj.expect_element("Age_RKI", Tag{}); + auto state_id = obj.expect_optional("ID_County", Tag{}); + auto county_id = obj.expect_optional("ID_County", Tag{}); + auto district_id = obj.expect_optional("ID_District", Tag{}); return mio::apply( io, [](auto np, auto nc, auto n_refreshed_1, auto n_refreshed_2, auto d, auto&& a_str, auto sid, auto cid, @@ -492,8 +492,8 @@ class VaccinationDataEntry } return success(VaccinationDataEntry{np, nc, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); }, - num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed, - num_vaccinations_refreshed_2, date, age_group_str, state_id, county_id, district_id); + num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed_first, + num_vaccinations_refreshed_additional, date, age_group_str, state_id, county_id, district_id); } }; diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index b61c33c073..49ac2c9568 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -652,7 +652,8 @@ IOResult set_vaccination_data(std::vector>& model, const std::st if (date_df == offset_booster_date) { model[region_idx] .parameters.template get>()[{age, SimulationDay(d)}] = - vacc_data_entry.num_vaccinations_refreshed + vacc_data_entry.num_vaccinations_refreshed_2; + vacc_data_entry.num_vaccinations_refreshed_first + + vacc_data_entry.num_vaccinations_refreshed_additional; } } else { diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index f9b0a40694..c5d747b108 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -371,8 +371,8 @@ TEST(TestEpiDataIO, read_vaccination_data) ASSERT_EQ(vacc_data[0].district_id, mio::regions::DistrictId(1234)); ASSERT_EQ(vacc_data[0].num_vaccinations_partial, 0.0); ASSERT_EQ(vacc_data[0].num_vaccinations_completed, 5.0); - ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed, 2.0); - ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed_2, 1.0); + ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed_first, 2.0); + ASSERT_EQ(vacc_data[0].num_vaccinations_refreshed_additional, 1.0); ASSERT_EQ(vacc_data[1].date, mio::Date(2022, 4, 15)); ASSERT_EQ(vacc_data[1].age_group, mio::AgeGroup(2)); @@ -380,8 +380,8 @@ TEST(TestEpiDataIO, read_vaccination_data) ASSERT_EQ(vacc_data[1].district_id, mio::regions::DistrictId(1235)); ASSERT_EQ(vacc_data[1].num_vaccinations_partial, 1.0); ASSERT_EQ(vacc_data[1].num_vaccinations_completed, 1.0); - ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed, 4.0); - ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed_2, 3.0); + ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed_first, 4.0); + ASSERT_EQ(vacc_data[1].num_vaccinations_refreshed_additional, 3.0); } TEST(TestEpiData, set_vaccination_data) From 495eab703bca0783e526b3b87754764a54bb8205 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:54:12 +0100 Subject: [PATCH 43/60] complete rework parameters_io.h --- cpp/models/ode_secirts/parameters_io.cpp | 245 --- cpp/models/ode_secirts/parameters_io.h | 1655 +++++++---------- ...ort_time_series_initialization_osecirts.h5 | Bin 10008 -> 10008 bytes cpp/tests/test_odesecirts.cpp | 344 +--- 4 files changed, 773 insertions(+), 1471 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.cpp b/cpp/models/ode_secirts/parameters_io.cpp index a702143863..4f25fee0b3 100644 --- a/cpp/models/ode_secirts/parameters_io.cpp +++ b/cpp/models/ode_secirts/parameters_io.cpp @@ -52,251 +52,6 @@ namespace osecirts { namespace details { -//gets the county or state id of the entry if available, 0 (for whole country) otherwise -//used for comparisons of entry to integer region id -template -int get_region_id(const EpiDataEntry& rki_entry) -{ - return rki_entry.county_id ? rki_entry.county_id->get() - : (rki_entry.state_id ? rki_entry.state_id->get() - : (rki_entry.district_id ? rki_entry.district_id->get() : 0)); -} - -IOResult read_confirmed_cases_data( - std::string const& path, std::vector const& vregion, Date date, std::vector>& vnum_Exposed, - std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, - std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, - std::vector>& vnum_death, std::vector>& vnum_timm_i, - const std::vector>& vt_Exposed, const std::vector>& vt_InfectedNoSymptoms, - const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, - const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) -{ - BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); - return read_confirmed_cases_data( - rki_data, vregion, date, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, vnum_InfectedSevere, - vnum_icu, vnum_death, vnum_timm_i, vt_Exposed, vt_InfectedNoSymptoms, vt_InfectedSymptoms, vt_InfectedSevere, - vt_InfectedCritical, vt_imm_interval_i, vmu_C_R, vmu_I_H, vmu_H_U, scaling_factor_inf); -} - -IOResult read_confirmed_cases_data( - const std::vector& rki_data, std::vector const& vregion, Date date, - std::vector>& vnum_Exposed, std::vector>& vnum_InfectedNoSymptoms, - std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, - std::vector>& vnum_icu, std::vector>& vnum_death, - std::vector>& vnum_timm_i, const std::vector>& vt_Exposed, - const std::vector>& vt_InfectedNoSymptoms, - const std::vector>& vt_InfectedSymptoms, const std::vector>& vt_InfectedSevere, - const std::vector>& vt_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& vmu_C_R, const std::vector>& vmu_I_H, - const std::vector>& vmu_H_U, const std::vector& scaling_factor_inf) -{ - auto max_date_entry = std::max_element(rki_data.begin(), rki_data.end(), [](auto&& a, auto&& b) { - return a.date < b.date; - }); - if (max_date_entry == rki_data.end()) { - log_error("RKI data file is empty."); - return failure(StatusCode::InvalidValue, "RKI data is empty."); - } - auto max_date = max_date_entry->date; - if (max_date < date) { - log_error("Specified date does not exist in RKI data"); - return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); - } - - // shifts the initilization to the recent past if simulation starts - // around current day and data of the future would be required. - // Only needed for preinfection compartments, exposed and InfectedNoSymptoms. - auto days_surplus = get_offset_in_days(max_date, date) - 6; // 6 > T_E + T_C - if (days_surplus > 0) { - days_surplus = 0; - } - - for (auto&& entry : rki_data) { - auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { - return r == 0 || get_region_id(entry) == r; - }); - if (it != vregion.end()) { - auto region_idx = size_t(it - vregion.begin()); - - auto& t_Exposed = vt_Exposed[region_idx]; - auto& t_InfectedNoSymptoms = vt_InfectedNoSymptoms[region_idx]; - auto& t_InfectedSymptoms = vt_InfectedSymptoms[region_idx]; - auto& t_InfectedSevere = vt_InfectedSevere[region_idx]; - auto& t_InfectedCritical = vt_InfectedCritical[region_idx]; - auto& t_imm_interval_i = vt_imm_interval_i[region_idx]; - - auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; - auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; - auto& num_Exposed = vnum_Exposed[region_idx]; - auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; - auto& num_death = vnum_death[region_idx]; - auto& num_icu = vnum_icu[region_idx]; - auto& num_imm = vnum_timm_i[region_idx]; - - auto& mu_C_R = vmu_C_R[region_idx]; - auto& mu_I_H = vmu_I_H[region_idx]; - auto& mu_H_U = vmu_H_U[region_idx]; - - bool read_icu = false; - - auto age = (size_t)entry.age_group; - if (entry.date == offset_date_by_days(date, 0)) { - num_InfectedSymptoms[age] += scaling_factor_inf[age] * entry.num_confirmed; - num_imm[age] += entry.num_confirmed; - } - if (entry.date == offset_date_by_days(date, t_InfectedNoSymptoms[age] + days_surplus)) { - num_InfectedNoSymptoms[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; - num_Exposed[age] -= 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; - } - if (entry.date == offset_date_by_days(date, days_surplus)) { - num_InfectedNoSymptoms[age] -= 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; - } - if (entry.date == offset_date_by_days(date, t_Exposed[age] + t_InfectedNoSymptoms[age] + days_surplus)) { - num_Exposed[age] += 1 / (1 - mu_C_R[age]) * scaling_factor_inf[age] * entry.num_confirmed; - } - if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms[age])) { - num_InfectedSymptoms[age] -= scaling_factor_inf[age] * entry.num_confirmed; - num_InfectedSevere[age] += mu_I_H[age] * scaling_factor_inf[age] * entry.num_confirmed; - } - if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms[age] - t_InfectedSevere[age])) { - num_InfectedSevere[age] -= mu_I_H[age] * scaling_factor_inf[age] * entry.num_confirmed; - if (read_icu) { - num_icu[age] += mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; - } - } - if (entry.date == - offset_date_by_days(date, -t_InfectedSymptoms[age] - t_InfectedSevere[age] - t_InfectedCritical[age])) { - num_death[age] += entry.num_deaths; - if (read_icu) { - num_icu[age] -= mu_I_H[age] * mu_H_U[age] * scaling_factor_inf[age] * entry.num_confirmed; - } - } - if (entry.date == offset_date_by_days(date, 0 - t_imm_interval_i[age])) { - num_imm[age] -= entry.num_confirmed; - } - } - } - - for (size_t region_idx = 0; region_idx < vregion.size(); ++region_idx) { - auto region = vregion[region_idx]; - - auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; - auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; - auto& num_Exposed = vnum_Exposed[region_idx]; - auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; - auto& num_death = vnum_death[region_idx]; - auto& num_icu = vnum_icu[region_idx]; - auto& num_timm_i = vnum_timm_i[region_idx]; - - size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); - for (size_t i = 0; i < num_groups; i++) { - auto try_fix_constraints = [region, i](double& value, double error, auto str) { - if (value < error) { - // this should probably return a failure - // but the algorithm is not robust enough to avoid large negative - // values and there are tests that rely on it - log_error("{:s} for age group {:s} is {:.4f} for region {:d}, " - "exceeds expected negative value.", - str, ConfirmedCasesDataEntry::age_group_names[i], value, region); - value = 0.0; - } - else if (value < 0) { - log_info("{:s} for age group {:s} is {:.4f} for region {:d}, " - "automatically corrected", - str, ConfirmedCasesDataEntry::age_group_names[i], value, region); - value = 0.0; - } - }; - - const double tol_error = -1e-8; - try_fix_constraints(num_InfectedSymptoms[i], tol_error, "InfectedSymptoms"); - try_fix_constraints(num_InfectedNoSymptoms[i], tol_error, "InfectedNoSymptoms"); - try_fix_constraints(num_Exposed[i], tol_error, "Exposed"); - try_fix_constraints(num_InfectedSevere[i], tol_error, "InfectedSevere"); - try_fix_constraints(num_death[i], tol_error, "Dead"); - try_fix_constraints(num_icu[i], tol_error, "InfectedCritical"); - try_fix_constraints(num_timm_i[i], tol_error, "Recently Recovered"); - } - } - - return success(); -} - -IOResult>> read_immunity_population(const std::string& path, - const size_t& num_age_groups) -{ - std::vector> ans(3, std::vector(num_age_groups, 0.0)); - std::fstream immunity_file; - immunity_file.open(path, std::ios::in); - if (immunity_file.fail()) { // checks to see if file opended - return mio::failure(mio::StatusCode::InvalidValue, "Failed to open immunity_population.txt."); - } - if (immunity_file.is_open()) { - std::string tp; - int linenumber = 0; - while (linenumber < 3) { - getline(immunity_file, tp); - // Find the last character that is not a line ending - size_t lastChar = tp.find_last_not_of("\r\n"); - // If such a character was found, reduce the string - if (lastChar != std::string::npos) { - tp = tp.substr(0, lastChar + 1); - } - auto line = split(tp, ' '); - for (size_t i = 0; i < num_age_groups; i++) { - ans[linenumber][i] = std::stod(line[i]); - } - linenumber++; - } - immunity_file.close(); //close the file object. - } - - // assert that the sum of the cols is 1 (tolerance 1-10) - for (size_t i = 0; i < 6; ++i) { - assert(std::abs(ans[0][i] + ans[1][i] + ans[2][i] - 1.0) < 1e-10); - } - - return ans; -} - -IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, - std::vector& vnum_icu) -{ - BOOST_OUTCOME_TRY(auto&& divi_data, mio::read_divi_data(path)); - return read_divi_data(divi_data, vregion, date, vnum_icu); -} - -IOResult read_divi_data(const std::vector& divi_data, const std::vector& vregion, Date date, - std::vector& vnum_icu) -{ - auto max_date_entry = std::max_element(divi_data.begin(), divi_data.end(), [](auto&& a, auto&& b) { - return a.date < b.date; - }); - if (max_date_entry == divi_data.end()) { - log_error("DIVI data is empty."); - return failure(StatusCode::InvalidValue, "DIVI data is empty."); - } - auto max_date = max_date_entry->date; - if (max_date < date) { - log_error("DIVI data does not contain the specified date."); - return failure(StatusCode::OutOfRange, "DIVI data does not contain the specified date."); - } - - for (auto&& entry : divi_data) { - auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { - return r == 0 || r == get_region_id(entry); - }); - auto date_df = entry.date; - if (it != vregion.end() && date_df == date) { - auto region_idx = size_t(it - vregion.begin()); - vnum_icu[region_idx] = entry.num_icu; - } - } - - return success(); -} IOResult>> read_population_data(const std::string& path, const std::vector& vregion) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 49ac2c9568..c42bb91c18 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -43,174 +43,362 @@ namespace osecirts namespace details { + /** - * @brief Reads subpopulations of infection states from transformed RKI cases file. - * @param path Path to transformed RKI cases file. - * @param vregion vector of keys of the region of interest - * @param date Date for which the arrays are initialized - * @param num_* output vector for number of people in the corresponding compartement - * @param t_* average time it takes to get from one compartement to another (vector with one element per age group) - * @param mu_* probabilities to get from one compartement to another (vector with one element per age group) - * @param scaling_factor_inf Factor for scaling the confirmed cases to account for estimated undetected cases. - * @see mio::read_confirmed_cases_data - * @{ - */ -IOResult read_confirmed_cases_data( - std::string const& path, std::vector const& vregion, Date date, std::vector>& num_Exposed, - std::vector>& num_InfectedNoSymptoms, std::vector>& num_InfectedSymptoms, - std::vector>& num_InfectedSevere, std::vector>& num_icu, - std::vector>& num_death, std::vector>& vnum_timm_i, - const std::vector>& t_Exposed, const std::vector>& t_InfectedNoSymptoms, - const std::vector>& t_InfectedSymptoms, const std::vector>& t_InfectedSevere, - const std::vector>& t_InfectedCritical, const std::vector>& vt_imm_interval_i, - const std::vector>& mu_C_R, const std::vector>& mu_I_H, - const std::vector>& mu_H_U, const std::vector& scaling_factor_inf); + * @brief Gets the region ID (county, state, or district) of an EpiDataEntry. + * + * If none are available, it defaults to 0 which is representing the whole country. + * + * @tparam EpiDataEntry The type of the data entry. + * @param data_entry The (RKI) data entry to extract the region ID from. + * @return The region ID as integer, or 0 if no specific region information is available. + */ +template +int get_region_id(const EpiDataEntry& data_entry) +{ + return data_entry.county_id ? data_entry.county_id->get() + : (data_entry.state_id ? data_entry.state_id->get() + : (data_entry.district_id ? data_entry.district_id->get() : 0)); +} -IOResult read_confirmed_cases_data( - const std::vector& rki_data, std::vector const& vregion, Date date, - std::vector>& num_Exposed, std::vector>& num_InfectedNoSymptoms, - std::vector>& num_InfectedSymptoms, std::vector>& num_InfectedSevere, - std::vector>& num_icu, std::vector>& num_death, - std::vector>& vnum_timm_i, const std::vector>& t_Exposed, - const std::vector>& t_InfectedNoSymptoms, const std::vector>& t_InfectedSymptoms, - const std::vector>& t_InfectedSevere, const std::vector>& t_InfectedCritical, - const std::vector>& vt_imm_interval_i, const std::vector>& mu_C_R, - const std::vector>& mu_I_H, const std::vector>& mu_H_U, - const std::vector& scaling_factor_inf); -/**@}*/ +/** + * @brief Computes the distribution of confirmed cases across infection states based on Case (RKI) data. + * + * This function processes case data for given regions and distributes the cases across different + * infection states, considering the corresponding transition times and probabilities defined in the model. + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in] case_data Vector of confirmed case data entries (defined in epi_data.h). + * @param[out] vnum_Exposed Output vector for the number of exposed individuals per age group and region. + * @param[out] vnum_InfectedNoSymptoms Output vector for the number of infected individuals without symptoms. + * @param[out] vnum_InfectedSymptoms Output vector for the number of infected individuals with symptoms. + * @param[out] vnum_InfectedSevere Output vector for the number of severely infected individuals. + * @param[out] vnum_icu Output vector for the number of individuals in critical condition (ICU). + * @param[out] vnum_death Output vector for the number of deaths. + * @param[out] vnum_timm_i Output vector for the number of individuals in temporary immunity state. + * @param[in] vregion Vector of region IDs representing the regions in the model vector. + * @param[in] date Date for which the simulation starts. + * @param[in] model Vector of models, each representing a region and containing the parameters. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases for + * @param[in] layer Specifies the immunity layer: 0 (Naive), 1 (Partial Immunity), 2 (Improved Immunity). + * + * @return An IOResult showing success or failure. + */ +template +IOResult compute_confirmed_cases_data( + const std::vector& case_data, std::vector>& vnum_Exposed, + std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, + std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, + std::vector>& vnum_death, std::vector>& vnum_timm_i, + std::vector const& vregion, Date date, const std::vector& model, + const std::vector& scaling_factor_inf, const size_t layer) +{ + auto max_date_entry = std::max_element(case_data.begin(), case_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == case_data.end()) { + log_error("RKI data file is empty."); + return failure(StatusCode::InvalidValue, "RKI data is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < date) { + log_error("Specified date does not exist in RKI data"); + return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); + } -IOResult>> read_immunity_population(const std::string& path, - const size_t& num_age_groups); -/**@}*/ + // shifts the initilization to the recent past if simulation starts + // around current day and data of the future would be required. + // Only needed for preinfection compartments, exposed and InfectedNoSymptoms. + auto days_surplus = get_offset_in_days(max_date, date) - 6; // 6 > T_E + T_C + if (days_surplus > 0) { + days_surplus = 0; + } + + for (auto&& entry : case_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { + return r == 0 || get_region_id(entry) == r; + }); + if (it != vregion.end()) { + auto region_idx = size_t(it - vregion.begin()); + + auto params_region = model[region_idx].parameters; + auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; + auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_Exposed = vnum_Exposed[region_idx]; + auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; + auto& num_death = vnum_death[region_idx]; + auto& num_icu = vnum_icu[region_idx]; + auto& num_imm = vnum_timm_i[region_idx]; + + bool read_icu = false; + + auto age = (size_t)entry.age_group; + // (rounded) transition times + auto t_exposed = std::round(params_region.template get>()[entry.age_group]); + auto t_InfectedNoSymptoms = + std::round(params_region.template get>()[entry.age_group]); + auto t_InfectedSymptoms = + std::round(params_region.template get>()[entry.age_group]); + auto t_InfectedSevere = std::round(params_region.template get>()[entry.age_group]); + auto t_InfectedCritical = + std::round(params_region.template get>()[entry.age_group]); + auto t_imm_interval_i = + std::round(params_region.template get>()[entry.age_group]); + + // transition probabilities + FP recoveredPerInfectedNoSymptoms = + params_region.template get>()[entry.age_group]; + FP severePerInfectedSymptoms = params_region.template get>()[entry.age_group]; + FP criticalPerSevere = params_region.template get>()[entry.age_group]; + + // if we select a layer with better immunity (layer > 0), we need to adjust the times and transition rates + if (layer > 0) { + t_InfectedNoSymptoms = std::round( + t_InfectedNoSymptoms * params_region.template get>()[entry.age_group]); + t_InfectedSymptoms = std::round( + t_InfectedSymptoms * params_region.template get>()[entry.age_group]); + + const FP red_fact_exp = + layer == 1 ? params_region.template get>()[entry.age_group] + : params_region.template get>()[entry.age_group]; + + const FP red_fact_inf = + layer == 1 + ? params_region.template get>()[entry.age_group] + : params_region.template get>()[entry.age_group]; + + const FP red_fact_sev = + layer == 1 + ? params_region + .template get>()[entry.age_group] + : params_region + .template get>()[entry.age_group]; + + recoveredPerInfectedNoSymptoms = 1 - red_fact_inf / red_fact_exp * (1 - recoveredPerInfectedNoSymptoms); + severePerInfectedSymptoms = red_fact_sev / red_fact_inf * severePerInfectedSymptoms; + } + + if (entry.date == offset_date_by_days(date, 0)) { + num_InfectedSymptoms[age] += scaling_factor_inf[age] * entry.num_confirmed; + num_imm[age] += entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, t_InfectedNoSymptoms + days_surplus)) { + num_InfectedNoSymptoms[age] += + 1 / (1 - recoveredPerInfectedNoSymptoms) * scaling_factor_inf[age] * entry.num_confirmed; + num_Exposed[age] -= + 1 / (1 - recoveredPerInfectedNoSymptoms) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, days_surplus)) { + num_InfectedNoSymptoms[age] -= + 1 / (1 - recoveredPerInfectedNoSymptoms) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, t_exposed + t_InfectedNoSymptoms + days_surplus)) { + num_Exposed[age] += + 1 / (1 - recoveredPerInfectedNoSymptoms) * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms)) { + num_InfectedSymptoms[age] -= scaling_factor_inf[age] * entry.num_confirmed; + num_InfectedSevere[age] += severePerInfectedSymptoms * scaling_factor_inf[age] * entry.num_confirmed; + } + if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms - t_InfectedSevere)) { + num_InfectedSevere[age] -= severePerInfectedSymptoms * scaling_factor_inf[age] * entry.num_confirmed; + if (read_icu) { + num_icu[age] += + severePerInfectedSymptoms * criticalPerSevere * scaling_factor_inf[age] * entry.num_confirmed; + } + } + if (entry.date == offset_date_by_days(date, -t_InfectedSymptoms - t_InfectedSevere - t_InfectedCritical)) { + num_death[age] += entry.num_deaths; + if (read_icu) { + num_icu[age] -= + severePerInfectedSymptoms * criticalPerSevere * scaling_factor_inf[age] * entry.num_confirmed; + } + } + if (entry.date == offset_date_by_days(date, 0 - t_imm_interval_i)) { + num_imm[age] -= entry.num_confirmed; + } + } + } + + for (size_t region_idx = 0; region_idx < vregion.size(); ++region_idx) { + auto region = vregion[region_idx]; + + auto& num_InfectedNoSymptoms = vnum_InfectedNoSymptoms[region_idx]; + auto& num_InfectedSymptoms = vnum_InfectedSymptoms[region_idx]; + auto& num_Exposed = vnum_Exposed[region_idx]; + auto& num_InfectedSevere = vnum_InfectedSevere[region_idx]; + auto& num_death = vnum_death[region_idx]; + auto& num_icu = vnum_icu[region_idx]; + auto& num_timm_i = vnum_timm_i[region_idx]; + + size_t num_groups = ConfirmedCasesDataEntry::age_group_names.size(); + for (size_t i = 0; i < num_groups; i++) { + auto try_fix_constraints = [region, i](FP& value, FP error, auto str) { + if (value < error) { + // this should probably return a failure + // but the algorithm is not robust enough to avoid large negative + // values and there are tests that rely on it + log_error("{:s} for age group {:s} is {:.4f} for region {:d}, " + "exceeds expected negative value.", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + else if (value < 0) { + log_info("{:s} for age group {:s} is {:.4f} for region {:d}, " + "automatically corrected", + str, ConfirmedCasesDataEntry::age_group_names[i], value, region); + value = 0.0; + } + }; + + const FP tol_error = -1e-8; + try_fix_constraints(num_InfectedSymptoms[i], tol_error, "InfectedSymptoms"); + try_fix_constraints(num_InfectedNoSymptoms[i], tol_error, "InfectedNoSymptoms"); + try_fix_constraints(num_Exposed[i], tol_error, "Exposed"); + try_fix_constraints(num_InfectedSevere[i], tol_error, "InfectedSevere"); + try_fix_constraints(num_death[i], tol_error, "Dead"); + try_fix_constraints(num_icu[i], tol_error, "InfectedCritical"); + try_fix_constraints(num_timm_i[i], tol_error, "Recently Recovered or Vaccinated"); + } + } + + return success(); +} /** - * @brief sets infected and immun compartment(s) from a transformed RKI cases file into a Model. - * @param model vector of objects in which the data is set - * @param path Path to transformed RKI cases file - * @param region vector of keys of the region of interest - * @param date Date for which the arrays are initialized - * @param scaling_factor_inf factors by which to scale the confirmed cases of - * @param immunity_data_path Path to immunity data file - */ -template + * @brief Reads confirmed case data from a file and computes the distribution of cases across infection states. + * + * This function reads transformed RKI data from a specified file and processes the confirmed cases + * to distribute them across different infection states and age groups. + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in] path Path to the file containing transformed case (rki) data. + * @param[in] vregion Vector of region IDs to process. + * @param[in] date Date for which the simulation starts. + * @param[out] vnum_Exposed Output vector for the number of exposed individuals per age group and region. + * @param[out] vnum_InfectedNoSymptoms Output vector for the number of infected individuals without symptoms. + * @param[out] vnum_InfectedSymptoms Output vector for the number of infected individuals with symptoms. + * @param[out] vnum_InfectedSevere Output vector for the number of severely infected individuals (Hospitalized). + * @param[out] vnum_icu Output vector for the number of individuals in critical condition (ICU). + * @param[out] vnum_death Output vector for the number of deaths. + * @param[out] vnum_timm_i Output vector for the number of individuals in a temporary immunity state. + * @param[in] model Vector of models, each representing a region and containing the parameters. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases. + * @param[in] layer Specifies the immunity layer: 0 (Naive), 1 (Partial Immunity), 2 (Improved Immunity). + * + * @return An IOResult indicating success or failure. + */ +template +IOResult read_confirmed_cases_data( + std::string const& path, std::vector const& vregion, Date date, std::vector>& vnum_Exposed, + std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, + std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, + std::vector>& vnum_death, std::vector>& vnum_timm_i, + const std::vector& model, const std::vector& scaling_factor_inf, const size_t layer) +{ + BOOST_OUTCOME_TRY(auto&& case_data, mio::read_confirmed_cases_data(path)); + return compute_confirmed_cases_data(case_data, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, + vnum_InfectedSevere, vnum_icu, vnum_death, vnum_timm_i, vregion, date, model, + scaling_factor_inf, layer); +} + +/** + * @brief Sets the confirmed cases data in the model considering different immunity layers. + * + * This function distributes confirmed case data across infection states for regions and age groups + * in the model. It considers different levels of immunity (naive, partial, and improved). + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model Vector of models, each representing a region, where the compartments are updated. + * @param[in] case_data Vector of confirmed case data entries. + * @param[in] region Vector of region IDs for which the data is processed. + * @param[in] date Date for which the confirmed cases are set in the model. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases. + * @param[in] immunity_population Vector containing the immunity distribution for naive, partial, and improved immunity layers. + * + * @return An IOResult indicating success or failure. + */ +template IOResult -set_confirmed_cases_data(std::vector& model, const std::string& path, std::vector const& region, Date date, - const std::vector& scaling_factor_inf, const std::string& immunity_data_path) +set_confirmed_cases_data(std::vector& model, const std::vector& case_data, + std::vector const& region, Date date, const std::vector& scaling_factor_inf, + const std::vector> immunity_population) { auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); assert(scaling_factor_inf.size() == num_age_groups); //TODO: allow vector or scalar valued scaling factors assert(ConfirmedCasesDataEntry::age_group_names.size() == num_age_groups); - BOOST_OUTCOME_TRY(auto&& immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); - - BOOST_OUTCOME_TRY(auto&& rki_data, mio::read_confirmed_cases_data(path)); - - std::vector> t_Exposed{model.size()}; - std::vector> t_InfectedNoSymptoms{model.size()}; - std::vector> t_InfectedSymptoms{model.size()}; - std::vector> t_InfectedSevere{model.size()}; - std::vector> t_InfectedCritical{model.size()}; - std::vector> t_imm_interval1{model.size()}; - std::vector> t_imm_interval2{model.size()}; - - std::vector> mu_C_R{model.size()}; - std::vector> mu_I_H{model.size()}; - std::vector> mu_H_U{model.size()}; - - std::vector> num_InfectedSymptoms(model.size()); - std::vector> num_death(model.size()); - std::vector> num_Exposed(model.size()); - std::vector> num_InfectedNoSymptoms(model.size()); - std::vector> num_InfectedSevere(model.size()); - std::vector> num_icu(model.size()); - std::vector> num_timm1(model.size()); - std::vector> num_timm2(model.size()); - - std::vector denom_E(num_age_groups, 0.0); - std::vector denom_I_NS(num_age_groups, 0.0); - std::vector denom_I_Sy(num_age_groups, 0.0); - std::vector denom_I_Sev(num_age_groups, 0.0); - - /*----------- UNVACCINATED -----------*/ + std::vector> num_InfectedSymptoms(model.size()); + std::vector> num_death(model.size()); + std::vector> num_Exposed(model.size()); + std::vector> num_InfectedNoSymptoms(model.size()); + std::vector> num_InfectedSevere(model.size()); + std::vector> num_icu(model.size()); + std::vector> num_timm1(model.size()); + std::vector> num_timm2(model.size()); + + std::vector denom_E(num_age_groups, 0.0); + std::vector denom_I_NS(num_age_groups, 0.0); + std::vector denom_I_Sy(num_age_groups, 0.0); + std::vector denom_I_Sev(num_age_groups, 0.0); + + /*----------- Naive immunity -----------*/ for (size_t county = 0; county < model.size(); county++) { - num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); - num_death[county] = std::vector(num_age_groups, 0.0); - num_Exposed[county] = std::vector(num_age_groups, 0.0); - num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); - num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); - num_icu[county] = std::vector(num_age_groups, 0.0); - num_timm1[county] = std::vector(num_age_groups, 0.0); - num_timm2[county] = std::vector(num_age_groups, 0.0); + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); + num_timm1[county] = std::vector(num_age_groups, 0.0); + num_timm2[county] = std::vector(num_age_groups, 0.0); for (size_t group = 0; group < num_age_groups; group++) { - - t_Exposed[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedSymptoms[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_imm_interval1[county].push_back(static_cast( - model[county].parameters.template get>()[(AgeGroup)group])); - t_imm_interval2[county].push_back(static_cast( - model[county].parameters.template get>()[(AgeGroup)group])); - - mu_C_R[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - mu_I_H[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - mu_H_U[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - // calculate the denominators to split the reported case numbers to the different immunity layers. denom_E[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get>()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get>()[(AgeGroup)group]); + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get>()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get>()[(AgeGroup)group]); denom_I_NS[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get>()[(AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get>()[(AgeGroup)group]); + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get>()[(AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get>()[(AgeGroup)group]); denom_I_Sy[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county] - .parameters.template get>()[(AgeGroup)group] + - immunity_population[2][group] * - model[county] - .parameters.template get>()[(AgeGroup)group]); + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county] + .parameters.template get>()[(AgeGroup)group] + + immunity_population[2][group] * + model[county] + .parameters.template get>()[(AgeGroup)group]); denom_I_Sev[group] = - 1 / - (immunity_population[0][group] + - immunity_population[1][group] * - model[county].parameters.template get>()[( - AgeGroup)group] + - immunity_population[2][group] * - model[county].parameters.template get>()[( - AgeGroup)group]); + 1 / (immunity_population[0][group] + + immunity_population[1][group] * + model[county].parameters.template get>()[( + AgeGroup)group] + + immunity_population[2][group] * + model[county].parameters.template get>()[( + AgeGroup)group]); } } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(compute_confirmed_cases_data(case_data, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, + num_InfectedSevere, num_icu, num_death, num_timm1, region, date, + model, scaling_factor_inf, 0)); for (size_t county = 0; county < model.size(); county++) { - // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { model[county].populations[{AgeGroup(i), InfectionState::ExposedNaive}] = @@ -224,8 +412,6 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereNaive}] = immunity_population[0][i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; } - - // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { log_warning("No infections for unvaccinated reported on date " + std::to_string(date.year) + "-" + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + @@ -233,97 +419,48 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std } } - /*----------- PARTIALLY VACCINATED -----------*/ + /*----------- PARTIAL Immunity -----------*/ for (size_t county = 0; county < model.size(); county++) { - t_InfectedNoSymptoms[county].clear(); - t_Exposed[county].clear(); - t_InfectedSymptoms[county].clear(); - t_InfectedSevere[county].clear(); - t_InfectedCritical[county].clear(); - - mu_C_R[county].clear(); - mu_I_H[county].clear(); - mu_H_U[county].clear(); - - num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); - num_death[county] = std::vector(num_age_groups, 0.0); - num_Exposed[county] = std::vector(num_age_groups, 0.0); - num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); - num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); - num_icu[county] = std::vector(num_age_groups, 0.0); - for (size_t group = 0; group < num_age_groups; group++) { - - double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; - t_Exposed[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - - double exp_fac_part_immune = - model[county].parameters.template get>()[(AgeGroup)group]; - double inf_fac_part_immune = - model[county].parameters.template get>()[(AgeGroup)group]; - double hosp_fac_part_immune = - model[county] - .parameters.template get>()[(AgeGroup)group]; - double icu_fac_part_immune = - model[county] - .parameters.template get>()[(AgeGroup)group]; - mu_C_R[county].push_back(( - 1 - inf_fac_part_immune / exp_fac_part_immune * - (1 - model[county] - .parameters.template get>()[(AgeGroup)group]))); - mu_I_H[county].push_back( - hosp_fac_part_immune / inf_fac_part_immune * - model[county].parameters.template get>()[(AgeGroup)group]); - // transfer from H to U, D unchanged. - mu_H_U[county].push_back( - icu_fac_part_immune / hosp_fac_part_immune * - model[county].parameters.template get>()[(AgeGroup)group]); - } + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm1, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(compute_confirmed_cases_data(case_data, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, + num_InfectedSevere, num_icu, num_death, num_timm1, region, date, + model, scaling_factor_inf, 1)); for (size_t county = 0; county < model.size(); county++) { - // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { model[county].populations[{AgeGroup(i), InfectionState::ExposedPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get>()[(AgeGroup)i] * - denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_NS[i] * + num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunity}] = immunity_population[1][i] * - model[county].parameters.template get>()[(AgeGroup)i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsPartialImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSeverePartialImmunity}] = immunity_population[1][i] * model[county] - .parameters.template get>()[(AgeGroup)i] * + .parameters.template get>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += immunity_population[1][i] * - model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_timm1[county][i]; } - // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { log_warning("No infections for partially vaccinated reported on date " + std::to_string(date.year) + "-" + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + @@ -331,97 +468,48 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std } } - /*----------- FULLY VACCINATED -----------*/ + /*----------- Improved Immunity -----------*/ for (size_t county = 0; county < model.size(); county++) { - t_InfectedNoSymptoms[county].clear(); - t_Exposed[county].clear(); - t_InfectedSymptoms[county].clear(); - t_InfectedSevere[county].clear(); - t_InfectedCritical[county].clear(); - - mu_C_R[county].clear(); - mu_I_H[county].clear(); - mu_H_U[county].clear(); - - num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); - num_death[county] = std::vector(num_age_groups, 0.0); - num_Exposed[county] = std::vector(num_age_groups, 0.0); - num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); - num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); - num_icu[county] = std::vector(num_age_groups, 0.0); - for (size_t group = 0; group < num_age_groups; group++) { - - double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; - t_Exposed[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - - double reduc_immune_exp = - model[county].parameters.template get>()[(AgeGroup)group]; - double reduc_immune_inf = - model[county].parameters.template get>()[(AgeGroup)group]; - double reduc_immune_hosp = - model[county].parameters.template get>()[( - AgeGroup)group]; - double reduc_immune_icu = - model[county].parameters.template get>()[( - AgeGroup)group]; - mu_C_R[county].push_back(( - 1 - reduc_immune_inf / reduc_immune_exp * - (1 - model[county] - .parameters.template get>()[(AgeGroup)group]))); - mu_I_H[county].push_back( - reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get>()[(AgeGroup)group]); - // transfer from H to U, D unchanged. - mu_H_U[county].push_back( - reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get>()[(AgeGroup)group]); - } + num_InfectedSymptoms[county] = std::vector(num_age_groups, 0.0); + num_death[county] = std::vector(num_age_groups, 0.0); + num_Exposed[county] = std::vector(num_age_groups, 0.0); + num_InfectedNoSymptoms[county] = std::vector(num_age_groups, 0.0); + num_InfectedSevere[county] = std::vector(num_age_groups, 0.0); + num_icu[county] = std::vector(num_age_groups, 0.0); } - BOOST_OUTCOME_TRY(read_confirmed_cases_data( - rki_data, region, date, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, num_icu, - num_death, num_timm2, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, t_InfectedCritical, - t_imm_interval2, mu_C_R, mu_I_H, mu_H_U, scaling_factor_inf)); + BOOST_OUTCOME_TRY(compute_confirmed_cases_data(case_data, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, + num_InfectedSevere, num_icu, num_death, num_timm2, region, date, + model, scaling_factor_inf, 2)); for (size_t county = 0; county < model.size(); county++) { - // if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) > 0) { size_t num_groups = (size_t)model[county].parameters.get_num_groups(); for (size_t i = 0; i < num_groups; i++) { model[county].populations[{AgeGroup(i), InfectionState::ExposedImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get>()[(AgeGroup)i] * - denom_E[i] * num_Exposed[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * + num_Exposed[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get>()[(AgeGroup)i] * - denom_I_NS[i] * num_InfectedNoSymptoms[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_NS[i] * + num_InfectedNoSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunity}] = immunity_population[2][i] * - model[county].parameters.template get>()[(AgeGroup)i] * + model[county].parameters.template get>()[(AgeGroup)i] * denom_I_Sy[i] * num_InfectedSymptoms[county][i]; model[county].populations[{AgeGroup(i), InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] = 0; model[county].populations[{AgeGroup(i), InfectionState::InfectedSevereImprovedImmunity}] = immunity_population[2][i] * model[county] - .parameters.template get>()[(AgeGroup)i] * + .parameters.template get>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += immunity_population[2][i] * - model[county].parameters.template get>()[(AgeGroup)i] * - denom_E[i] * num_timm2[county][i]; + model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * + num_timm2[county][i]; } - // } if (std::accumulate(num_InfectedSymptoms[county].begin(), num_InfectedSymptoms[county].end(), 0.0) == 0) { log_warning("No infections for vaccinated reported on date " + std::to_string(date.year) + "-" + std::to_string(date.month) + "-" + std::to_string(date.day) + " for region " + @@ -432,44 +520,134 @@ set_confirmed_cases_data(std::vector& model, const std::string& path, std } /** - * @brief reads number of ICU patients from DIVI register into Parameters - * @param path Path to transformed DIVI file - * @param vregion Keys of the region of interest - * @param date Date for which the arrays are initialized - * @param vnum_icu number of ICU patients - * @see mio::read_divi_data - * @{ - */ + * @brief Reads confirmed case data from a file and sets it in the model. + * + * This function reads transformed RKI data from the specified file and distributes the confirmed case data + * across different infection states for regions and age groups in the model. It considers naive, partial, + * and improved immunity layers. + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model Vector of models, each representing a region, where the compartments are updated. + * @param[in] path Path to the file containing case (RKI) data. + * @param[in] region Vector of region IDs for which the data is processed. + * @param[in] date Date for which the confirmed cases are set in the model. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases. + * @param[in] immunity_population Vector containing the immunity distribution for naive, partial, and improved immunity layers. + * + * @return An IOResult indicating success or failure. + */ +template +IOResult set_confirmed_cases_data(std::vector& model, const std::string& path, + std::vector const& region, Date date, + const std::vector& scaling_factor_inf, + const std::vector> immunity_population) +{ + BOOST_OUTCOME_TRY(auto&& case_data, mio::read_confirmed_cases_data(path)); + BOOST_OUTCOME_TRY( + set_confirmed_cases_data(model, case_data, region, date, scaling_factor_inf, immunity_population)); + return success(); +} + +/** + * @brief Extracts the number of individuals in critical condition (ICU) for each region + * on a specified date from the provided DIVI data. + * + * @tparam FP Floating point type (default: double). + * + * @param[in] divi_data Vector of DIVI data entries containing date, region, and ICU information. + * @param[in] vregion Vector of region IDs for which the data is computed. + * @param[in] date Date for which the ICU data is computed. + * @param[out] vnum_icu Output vector containing the number of ICU cases for each region. + * + * @return An IOResult indicating success or failure. + */ +template +IOResult compute_divi_data(const std::vector& divi_data, const std::vector& vregion, Date date, + std::vector& vnum_icu) +{ + auto max_date_entry = std::max_element(divi_data.begin(), divi_data.end(), [](auto&& a, auto&& b) { + return a.date < b.date; + }); + if (max_date_entry == divi_data.end()) { + log_error("DIVI data is empty."); + return failure(StatusCode::InvalidValue, "DIVI data is empty."); + } + auto max_date = max_date_entry->date; + if (max_date < date) { + log_error("DIVI data does not contain the specified date."); + return failure(StatusCode::OutOfRange, "DIVI data does not contain the specified date."); + } + + for (auto&& entry : divi_data) { + auto it = std::find_if(vregion.begin(), vregion.end(), [&entry](auto r) { + return r == 0 || r == get_region_id(entry); + }); + auto date_df = entry.date; + if (it != vregion.end() && date_df == date) { + auto region_idx = size_t(it - vregion.begin()); + vnum_icu[region_idx] = entry.num_icu; + } + } + + return success(); +} + +/** + * @brief Reads DIVI data from a file and computes the ICU data for specified regions and date. + * + * @tparam FP Floating point type (default: double). + * + * @param[in] path Path to the file containing DIVI data. + * @param[in] vregion Vector of region IDs for which the data is computed. + * @param[in] date Date for which the ICU data is computed. + * @param[out] vnum_icu Output vector containing the number of ICU cases for each region. + * + * @return An IOResult indicating success or failure. + */ +template IOResult read_divi_data(const std::string& path, const std::vector& vregion, Date date, - std::vector& vnum_icu); -IOResult read_divi_data(const std::vector& divi_data, const std::vector& vregion, Date date, - std::vector& vnum_icu); -/**@}*/ + std::vector& vnum_icu) +{ + BOOST_OUTCOME_TRY(auto&& divi_data, mio::read_divi_data(path)); + return compute_divi_data(divi_data, vregion, date, vnum_icu); +} /** - * @brief sets populations data from DIVI register into Model - * @param model vector of objects in which the data is set - * @param path Path to transformed DIVI file - * @param vregion vector of keys of the regions of interest - * @param date Date for which the arrays are initialized - * @param scaling_factor_icu factor by which to scale the icu cases of divi data - */ -template + * @brief Sets ICU data from DIVI data into the a vector of models, distributed across age groups. + * + * This function reads DIVI data from a file, computes the number of individuals in critical condition (ICU) + * for each region, and sets these values in the model. The ICU cases are distributed across age groups + * using the transition probabilities from severe to critical. + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model Vector of models, each representing a region, where the ICU population is updated. + * @param[in] path Path to the file containing DIVI data. + * @param[in] vregion Vector of region IDs for which the data is computed. + * @param[in] date Date for which the ICU data is computed. + * @param[in] scaling_factor_icu Scaling factor for reported ICU cases. + * + * @return An IOResult indicating success or failure. + */ +template IOResult set_divi_data(std::vector& model, const std::string& path, const std::vector& vregion, - Date date, double scaling_factor_icu) + Date date, FP scaling_factor_icu) { - std::vector sum_mu_I_U(vregion.size(), 0); - std::vector> mu_I_U{model.size()}; + std::vector sum_mu_I_U(vregion.size(), 0); + std::vector> mu_I_U{model.size()}; for (size_t region = 0; region < vregion.size(); region++) { auto num_groups = model[region].parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; i++) { - sum_mu_I_U[region] += model[region].parameters.template get>()[i] * - model[region].parameters.template get>()[i]; - mu_I_U[region].push_back(model[region].parameters.template get>()[i] * - model[region].parameters.template get>()[i]); + sum_mu_I_U[region] += model[region].parameters.template get>()[i] * + model[region].parameters.template get>()[i]; + mu_I_U[region].push_back(model[region].parameters.template get>()[i] * + model[region].parameters.template get>()[i]); } } - std::vector num_icu(model.size(), 0.0); + std::vector num_icu(model.size(), 0.0); BOOST_OUTCOME_TRY(read_divi_data(path, vregion, date, num_icu)); for (size_t region = 0; region < vregion.size(); region++) { @@ -484,49 +662,61 @@ IOResult set_divi_data(std::vector& model, const std::string& path, } /** - * @brief reads population data from census data. - * @param path Path to population data file. - * @param vregion vector of keys of the regions of interest - * @see mio::read_population_data - * @{ - */ +* @brief reads population data from census data. +* @param[in] path Path to the population data file. +* @param[in] population_data Vector of population data entries. +* @param[in] vregion Vector of keys representing the regions of interest. +* @return An IOResult containing a vector of vectors, where each inner vector represents the population +* distribution across age groups for a specific region, or an error if the function fails. +* @see mio::read_population_data +* @{ +*/ IOResult>> read_population_data(const std::string& path, const std::vector& vregion); IOResult>> read_population_data(const std::vector& population_data, const std::vector& vregion); /**@}*/ -template -IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, - const std::string& immunity_data_path) +/** + * @brief Sets the population data for the given models based on the provided population distribution and immunity levels. + * + * @tparam Model The type of the model used. + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model A vector of models for which population data will be set. + * @param[in] num_population A 2D vector where each row represents the age group population distribution for a specific region. + * @param[in] vregion A vector of region identifiers corresponding to the population data. + * @param[in] immunity_population A 2D vector where each row represents the immunity distribution for a specific region + * across different levels of immunity (e.g., naive, partial, improved immunity). + * + * @return An IOResult indicating success or failure. + */ +template +IOResult set_population_data(std::vector& model, const std::vector>& num_population, + const std::vector& vregion, + const std::vector> immunity_population) { - BOOST_OUTCOME_TRY(auto&& num_population, read_population_data(path, vregion)); - - auto num_age_groups = ConfirmedCasesDataEntry::age_group_names.size(); - BOOST_OUTCOME_TRY(auto&& immunity_population, read_immunity_population(immunity_data_path, num_age_groups)); - for (size_t region = 0; region < vregion.size(); region++) { if (std::accumulate(num_population[region].begin(), num_population[region].end(), 0.0) > 0) { auto num_groups = model[region].parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; i++) { - double SN = num_population[region][size_t(i)] * immunity_population[0][size_t(i)]; - double SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; - double SII = num_population[region][size_t(i)] - SN - SPI; + FP SN = num_population[region][size_t(i)] * immunity_population[0][size_t(i)]; + FP SPI = num_population[region][size_t(i)] * immunity_population[1][size_t(i)]; + FP SII = num_population[region][size_t(i)] - SN - SPI; model[region].populations[{i, InfectionState::SusceptibleImprovedImmunity}] = std::max( 0.0, - double( - SII - - (model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + - model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + - model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + - model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + - model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); + FP(SII - + (model[region].populations[{i, InfectionState::ExposedImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}] + + model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + + model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, @@ -562,12 +752,46 @@ IOResult set_population_data(std::vector& model, const std::string& return success(); } -template -IOResult set_vaccination_data(std::vector>& model, const std::string& path, Date date, - const std::vector& vregion, int num_days) +/** + * @brief Reads population data from a file and sets it for the each given model. + * + * @tparam Model The type of the model used. + * + * @param[in,out] model A vector of models for which population data will be set. + * @param[in] path The file path to the population data. + * @param[in] vregion A vector of region identifiers corresponding to the population data. + * @param[in] immunity_population A 2D vector where each row represents the immunity distribution for a specific region + * across different levels of immunity (e.g., naive, partial, improved). + * + * @return An IOResult indicating success or failure. + */ +template +IOResult set_population_data(std::vector& model, const std::string& path, const std::vector& vregion, + const std::vector> immunity_population) { - BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); + BOOST_OUTCOME_TRY(auto&& num_population, details::read_population_data(path, vregion)); + BOOST_OUTCOME_TRY(set_population_data(model, num_population, vregion, immunity_population)); + return success(); +} +/** + * @brief Sets vaccination data for the given models using provided vaccination (partial, full, and booster) data. + * + * + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model A vector of models for which vaccination data will be set. + * @param[in] vacc_data A vector of VaccinationDataEntry objects containing the vaccination data. + * @param[in] date The starting date for the simulation. + * @param[in] vregion A vector of region identifiers corresponding to the vaccination data. + * @param[in] num_days The number of days for which the simulation runs. + * + * @return An IOResult indicating success or failure. + */ +template +IOResult set_vaccination_data(std::vector>& model, const std::vector& vacc_data, + Date date, const std::vector& vregion, int num_days) +{ auto num_groups = model[0].parameters.get_num_groups(); auto days_until_effective_n = @@ -667,615 +891,166 @@ IOResult set_vaccination_data(std::vector>& model, const std::st } return success(); } + +/** + * @brief Sets vaccination data for the given models using vaccination data from a file. + * + * This function reads vaccination data from a specified file, and assigns daily vaccination numbers + * (partial, full, and booster) to each region and age group in the models. + * + * @tparam FP Floating point type (default: double). + * + * @param[in,out] model A vector of models for which vaccination data will be set. + * @param[in] path The file path to the vaccination data. + * @param[in] date The starting date for the simulation. + * @param[in] vregion A vector of region identifiers corresponding to the vaccination data. + * @param[in] num_days The number of days for which the simulation runs. + * + * @return An IOResult indicating success or failure. + */ +template +IOResult set_vaccination_data(std::vector>& model, const std::string& path, Date date, + const std::vector& vregion, int num_days) +{ + BOOST_OUTCOME_TRY(auto&& vacc_data, read_vaccination_data(path)); + BOOST_OUTCOME_TRY(set_vaccination_data(model, vacc_data, date, vregion, num_days)); + return success(); +} + } // namespace details #ifdef MEMILIO_HAS_HDF5 /** - * @brief Exports the time series of extrapolated real data according to - * the extrapolation / approximation method used to initialize the model from - * real world data. - (This is the vector-valued functionality of set_confirmed_cases_data()) - * @param model vector of objects in which the data is set - * @param data_dir Path to transformed RKI cases files - * @param results_dir Path to result files - * @param start_date Start date of the time series to be exported. - * @param region vector of keys of the region of interest - * @param scaling_factor_inf Factor for scaling the confirmed cases to account for an estimated number of undetected cases. - * @param scaling_factor_icu Factor for scaling the reported ICU cases to account for possibly unreported ICU cases. - * @param num_days Number of days for which the time series is exported. - * @param divi_data_path path to divi data file - * @param confirmed_cases_path path to confirmed cases file - * @param population_data_path path to population data file - * @param immunity_data_path path to immunity data file - */ + * @brief Exports extrapolated real-world data time series for specified regions. + * + * This function generates and exports time series data based on the extrapolation and approximation methods + * used to initialize the model with real-world data. The resulting data represents the initialized states of + * the model over the specified time range. + * + * @tparam Model Type of the model used. + * + * @param[in] models A vector of models for which the extrapolated data is set. + * @param[in] results_dir Path to the directory where the extrapolated results will be saved in a h5 file. + * @param[in] counties A vector of region identifiers for which the time series will be exported. + * @param[in] date The starting date of the time series. + * @param[in] scaling_factor_inf A vector of scaling factors applied to confirmed cases. + * @param[in] scaling_factor_icu A scaling factor applied to ICU cases. + * @param[in] num_days The number of days for which will be extrapolated. + * @param[in] divi_data_path Path to the DIVI ICU data file. + * @param[in] confirmed_cases_path Path to the confirmed cases data file. + * @param[in] population_data_path Path to the population data file. + * @param[in] immunity_population A vector of vectors specifying immunity for each age group and immunity layer. + * @param[in] vaccination_data_path Path to the vaccination data file (optional). + * + * @return An IOResult indicating success or failure. + */ template IOResult export_input_data_county_timeseries( - const std::vector& model, const std::string& dir, std::vector const& region, Date start_date, - const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, + std::vector models, const std::string& results_dir, const std::vector& counties, Date date, + const std::vector& scaling_factor_inf, const double scaling_factor_icu, const int num_days, const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, - const std::string& immunity_data_path) + const std::vector> immunity_population, const std::string& vaccination_data_path = "") { - auto num_age_groups = (size_t)model[0].parameters.get_num_groups(); - BOOST_OUTCOME_TRY(auto&& immunity_population, - details::read_immunity_population(immunity_data_path, num_age_groups)); - - assert(scaling_factor_inf.size() == num_age_groups); - assert(num_age_groups == ConfirmedCasesDataEntry::age_group_names.size()); - assert(model.size() == region.size()); - - BOOST_OUTCOME_TRY(auto&& rki_data, read_confirmed_cases_data(confirmed_cases_path)); - BOOST_OUTCOME_TRY(auto&& population_data, read_population_data(population_data_path)); - BOOST_OUTCOME_TRY(auto&& divi_data, read_divi_data(divi_data_path)); - - /* functionality copy from set_confirmed_cases_data() here splitted in params */ - /* which do not need to be reset for each day and compartments sizes that are */ - /* set later for each day */ - /*----------- UNVACCINATED -----------*/ - // data needs to be int, because access to data-specific confirmed cases - // is done with these parameters. TODO: Rounding instead - // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_n{model.size()}; - std::vector> t_Exposed_n{model.size()}; - std::vector> t_InfectedSymptoms_n{model.size()}; - std::vector> t_InfectedSevere_n{model.size()}; - std::vector> t_InfectedCritical_n{model.size()}; - std::vector> t_imm_interval1{model.size()}; - std::vector> t_imm_interval2{model.size()}; - - std::vector> mu_C_R_n{model.size()}; - std::vector> mu_I_H_n{model.size()}; - std::vector> mu_H_U_n{model.size()}; - // ICU data is not age-resolved. Use a partition of unity defined by - // the age-dependent probability I->H->U divided by the sum over all - // age groups of all of these probabilities. - std::vector sum_mu_I_U_n(model.size(), 0); - std::vector> mu_I_U_n{model.size()}; - - for (size_t county = 0; county < model.size(); county++) { - for (size_t group = 0; group < num_age_groups; group++) { - - t_Exposed_n[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms_n[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedSymptoms_n[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedSevere_n[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical_n[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_imm_interval1[county].push_back(static_cast( - model[county].parameters.template get>()[(AgeGroup)group])); - t_imm_interval2[county].push_back(static_cast( - model[county].parameters.template get>()[(AgeGroup)group])); - - mu_C_R_n[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - mu_I_H_n[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - mu_H_U_n[county].push_back( - model[county].parameters.template get>()[(AgeGroup)group]); - - /* begin: NOT in set_confirmed_cases_data() */ - sum_mu_I_U_n[county] += - model[county].parameters.template get>()[AgeGroup(group)] * - model[county].parameters.template get>()[AgeGroup(group)]; - mu_I_U_n[county].push_back( - model[county].parameters.template get>()[AgeGroup(group)] * - model[county].parameters.template get>()[AgeGroup(group)]); - /* end: NOT in set_confirmed_cases_data() */ - } + const auto num_groups = (size_t)models[0].parameters.get_num_groups(); + assert(scaling_factor_inf.size() == num_groups); + assert(num_groups == ConfirmedCasesDataEntry::age_group_names.size()); + assert(models.size() == counties.size()); + std::vector> extrapolated_data( + models.size(), TimeSeries::zero(num_days + 1, (size_t)InfectionState::Count * num_groups)); + + BOOST_OUTCOME_TRY(auto&& case_data, read_confirmed_cases_data(confirmed_cases_path)); + BOOST_OUTCOME_TRY(auto&& population_data, details::read_population_data(population_data_path, counties)); + + // empty vector if set_vaccination_data is not set + std::vector vacc_data; + if (!vaccination_data_path.empty()) { + BOOST_OUTCOME_TRY(vacc_data, read_vaccination_data(vaccination_data_path)); } - /*----------- PARTIALLY VACCINATED -----------*/ - // data needs to be int, because access to data-specific confirmed cases - // is done with these parameters. TODO: Rounding instead - // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_pi{model.size()}; - std::vector> t_Exposed_pi{model.size()}; - std::vector> t_InfectedSymptoms_pi{model.size()}; - std::vector> t_InfectedSevere_pi{model.size()}; - std::vector> t_InfectedCritical_pi{model.size()}; - - std::vector> mu_C_R_pi{model.size()}; - std::vector> mu_I_H_pi{model.size()}; - std::vector> mu_H_U_pi{model.size()}; - - // ICU data is not age-resolved. Use a partition of unity defined by - // the age-dependent probability I->H->U divided by the sum over all - // age groups of all of these probabilities. - std::vector sum_mu_I_U_pi(model.size(), 0); - std::vector> mu_I_U_pi{model.size()}; - for (size_t county = 0; county < model.size(); county++) { - for (size_t group = 0; group < num_age_groups; group++) { + for (int t = 0; t <= num_days; ++t) { + auto offset_day = offset_date_by_days(date, t); - double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; - t_Exposed_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms_pi[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_pi[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical_pi[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - - double exp_fact_part_immune = - model[county].parameters.template get>()[(AgeGroup)group]; - double inf_fact_part_immune = - model[county].parameters.template get>()[(AgeGroup)group]; - double hosp_fact_part_immune = - model[county] - .parameters.template get>()[(AgeGroup)group]; - double icu_fact_part_immune = - model[county] - .parameters.template get>()[(AgeGroup)group]; - mu_C_R_pi[county].push_back(( - 1 - inf_fact_part_immune / exp_fact_part_immune * - (1 - model[county] - .parameters.template get>()[(AgeGroup)group]))); - mu_I_H_pi[county].push_back( - hosp_fact_part_immune / inf_fact_part_immune * - model[county].parameters.template get>()[(AgeGroup)group]); - // transfer from H to U, D unchanged. - mu_H_U_pi[county].push_back( - icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get>()[(AgeGroup)group]); - - sum_mu_I_U_pi[county] += - icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get>()[AgeGroup(group)] * - hosp_fact_part_immune / inf_fact_part_immune * - model[county].parameters.template get>()[AgeGroup(group)]; - mu_I_U_pi[county].push_back( - icu_fact_part_immune / hosp_fact_part_immune * - model[county].parameters.template get>()[AgeGroup(group)] * - hosp_fact_part_immune / inf_fact_part_immune * - model[county].parameters.template get>()[AgeGroup(group)]); + if (!vaccination_data_path.empty()) { + BOOST_OUTCOME_TRY(details::set_vaccination_data(models, vacc_data, offset_day, counties, num_days)); } - } - /*----------- FULLY VACCINATED -----------*/ - // data needs to be int, because access to data-specific confirmed cases - // is done with these parameters. TODO: Rounding instead - // of casting to int should be introduced in the future. - std::vector> t_InfectedNoSymptoms_ii{model.size()}; - std::vector> t_Exposed_ii{model.size()}; - std::vector> t_InfectedSymptoms_ii{model.size()}; - std::vector> t_InfectedSevere_ii{model.size()}; - std::vector> t_InfectedCritical_ii{model.size()}; - - std::vector> mu_C_R_ii{model.size()}; - std::vector> mu_I_H_ii{model.size()}; - std::vector> mu_H_U_ii{model.size()}; - // ICU data is not age-resolved. Use a partition of unity defined by - // the age-dependent probability I->H->U divided by the sum over all - // age groups of all of these probabilities. - std::vector sum_mu_I_U_ii(model.size(), 0); - std::vector> mu_I_U_ii{model.size()}; - for (size_t county = 0; county < model.size(); county++) { - for (size_t group = 0; group < num_age_groups; group++) { - - double reduc_t = model[0].parameters.template get>()[(AgeGroup)group]; - t_Exposed_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedNoSymptoms_ii[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSymptoms_ii[county].push_back(static_cast(std::round( - model[county].parameters.template get>()[(AgeGroup)group] * reduc_t))); - t_InfectedSevere_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - t_InfectedCritical_ii[county].push_back(static_cast( - std::round(model[county].parameters.template get>()[(AgeGroup)group]))); - - double reduc_immune_exp = - model[county].parameters.template get>()[(AgeGroup)group]; - double reduc_immune_inf = - model[county].parameters.template get>()[(AgeGroup)group]; - double reduc_immune_hosp = - model[county].parameters.template get>()[( - AgeGroup)group]; - double reduc_immune_icu = - model[county].parameters.template get>()[( - AgeGroup)group]; - mu_C_R_ii[county].push_back(( - 1 - reduc_immune_inf / reduc_immune_exp * - (1 - model[county] - .parameters.template get>()[(AgeGroup)group]))); - mu_I_H_ii[county].push_back( - reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get>()[(AgeGroup)group]); - // transfer from H to U, D unchanged. - mu_H_U_ii[county].push_back( - reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get>()[(AgeGroup)group]); - - sum_mu_I_U_ii[county] += - reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get>()[AgeGroup(group)] * - reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get>()[AgeGroup(group)]; - mu_I_U_ii[county].push_back( - reduc_immune_icu / reduc_immune_hosp * - model[county].parameters.template get>()[AgeGroup(group)] * - reduc_immune_hosp / reduc_immune_inf * - model[county].parameters.template get>()[AgeGroup(group)]); - } - } - std::vector> extrapolated_rki( - model.size(), TimeSeries::zero(num_days + 1, (size_t)InfectionState::Count * num_age_groups)); - - for (size_t day = 0; day <= static_cast(num_days); day++) { - auto date = offset_date_by_days(start_date, int(day)); - - // unvaccinated - std::vector> num_Exposed_n(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_n(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_n(model.size(), std::vector(num_age_groups, 0.0)); - // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_n(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_n(model.size(), - std::vector(num_age_groups, 0.0)); - // end TODO - std::vector> num_InfectedSevere_n(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_death_n(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> dummy_icu(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> dummy_timm(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_timm1(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_timm2(model.size(), std::vector(num_age_groups, 0.0)); - BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_n, num_InfectedNoSymptoms_n, num_InfectedSymptoms_n, - num_InfectedSevere_n, dummy_icu, num_death_n, dummy_timm, t_Exposed_n, t_InfectedNoSymptoms_n, - t_InfectedSymptoms_n, t_InfectedSevere_n, t_InfectedCritical_n, t_imm_interval1, mu_C_R_n, mu_I_H_n, - mu_H_U_n, scaling_factor_inf)); - - // partially vaccinated - std::vector> num_Exposed_pi(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_pi(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_pi(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSevere_pi(model.size(), std::vector(num_age_groups, 0.0)); - // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_pi(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_pi(model.size(), - std::vector(num_age_groups, 0.0)); - // end TODO - std::vector> dummy_death(model.size(), std::vector(num_age_groups, 0.0)); - for (size_t county = 0; county < model.size(); county++) { - dummy_death[county] = std::vector(num_age_groups, 0.0); - dummy_icu[county] = std::vector(num_age_groups, 0.0); + // TODO: Reuse more code, e.g., set_divi_data (in secir) and a set_divi_data (here) only need a different ModelType. + // TODO: add option to set ICU data from confirmed cases if DIVI or other data is not available. + if (offset_day > Date(2020, 4, 23)) { + BOOST_OUTCOME_TRY(details::set_divi_data(models, divi_data_path, counties, offset_day, scaling_factor_icu)); } - BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_pi, num_InfectedNoSymptoms_pi, num_InfectedSymptoms_pi, - num_InfectedSevere_pi, dummy_icu, dummy_death, num_timm1, t_Exposed_pi, t_InfectedNoSymptoms_pi, - t_InfectedSymptoms_pi, t_InfectedSevere_pi, t_InfectedCritical_pi, t_imm_interval1, mu_C_R_pi, mu_I_H_pi, - mu_H_U_pi, scaling_factor_inf)); - - // fully vaccinated - std::vector> num_Exposed_ii(model.size(), std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedNoSymptoms_ii(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptoms_ii(model.size(), - std::vector(num_age_groups, 0.0)); - // potential TODO: these confirmed are only confirmed by commuting, set to zero here. Adapt if generalized! - std::vector> num_InfectedNoSymptomsConfirmed_ii(model.size(), - std::vector(num_age_groups, 0.0)); - std::vector> num_InfectedSymptomsConfirmed_ii(model.size(), - std::vector(num_age_groups, 0.0)); - // end TODO - std::vector> num_InfectedSevere_ii(model.size(), std::vector(num_age_groups, 0.0)); - for (size_t county = 0; county < model.size(); county++) { - dummy_death[county] = std::vector(num_age_groups, 0.0); - dummy_icu[county] = std::vector(num_age_groups, 0.0); - } - BOOST_OUTCOME_TRY(details::read_confirmed_cases_data( - rki_data, region, date, num_Exposed_ii, num_InfectedNoSymptoms_ii, num_InfectedSymptoms_ii, - num_InfectedSevere_ii, dummy_icu, dummy_death, num_timm2, t_Exposed_ii, t_InfectedNoSymptoms_ii, - t_InfectedSymptoms_ii, t_InfectedSevere_ii, t_InfectedCritical_ii, t_imm_interval2, mu_C_R_ii, mu_I_H_ii, - mu_H_U_ii, scaling_factor_inf)); - - // ICU only read for compartment InfectionState::InfectedCritical and then distributed later - std::vector dummy_icu2(model.size(), 0.0); - BOOST_OUTCOME_TRY(details::read_divi_data(divi_data, region, date, dummy_icu2)); - - std::vector> num_icu(model.size(), std::vector(num_age_groups, 0.0)); - for (size_t county = 0; county < region.size(); county++) { - for (size_t age = 0; age < num_age_groups; age++) { - num_icu[county][age] = - scaling_factor_icu * dummy_icu2[county] * mu_I_U_n[county][age] / sum_mu_I_U_n[county]; - } + else { + log_warning("No DIVI data available for for date: {}-{}-{}", offset_day.day, offset_day.month, + offset_day.year); } - // read population basics - BOOST_OUTCOME_TRY(auto&& num_population, details::read_population_data(population_data, region)); - - for (size_t county = 0; county < region.size(); county++) { - if (std::accumulate(num_population[county].begin(), num_population[county].end(), 0.0) > 0) { - for (size_t age = 0; age < num_age_groups; age++) { - auto age_group_offset = age * (size_t)InfectionState::Count; - double SN = num_population[county][size_t(age)] * immunity_population[0][size_t(age)]; - double SPI = num_population[county][size_t(age)] * immunity_population[1][size_t(age)]; - double SII = num_population[county][size_t(age)] - SN - SPI; - - double denom_E = - 1 / (SN + - SPI * model[county] - .parameters.template get>()[AgeGroup(age)] + - SII * model[county] - .parameters.template get>()[AgeGroup(age)]); - double denom_C = - 1 / (SN + - SPI * model[county] - .parameters.template get>()[AgeGroup(age)] + - SII * model[county] - .parameters.template get>()[AgeGroup(age)]); - double denom_I = - 1 / (SN + - SPI * model[county] - .parameters - .template get>()[AgeGroup(age)] + - SII * model[county] - .parameters - .template get>()[AgeGroup(age)]); - double denom_HU = - 1 / (SN + - SPI * model[county] - .parameters.template get< - ReducInfectedSevereCriticalDeadPartialImmunity>()[AgeGroup(age)] + - SII * model[county] - .parameters.template get< - ReducInfectedSevereCriticalDeadImprovedImmunity>()[AgeGroup(age)]); - - extrapolated_rki[county][day]((size_t)InfectionState::ExposedNaive + age_group_offset) = - SN * denom_E * num_Exposed_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::ExposedPartialImmunity + age_group_offset) = - SPI * - model[county].parameters.template get>()[AgeGroup(age)] * - denom_E * num_Exposed_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::ExposedImprovedImmunity + age_group_offset) = - SII * - model[county].parameters.template get>()[AgeGroup(age)] * - denom_E * num_Exposed_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaive + age_group_offset) = - SN * denom_C * num_InfectedNoSymptoms_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunity + - age_group_offset) = - SPI * denom_C * num_InfectedNoSymptoms_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunity + - age_group_offset) = - SII * denom_C * num_InfectedNoSymptoms_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsNaiveConfirmed + - age_group_offset) = - SN * denom_C * num_InfectedNoSymptomsConfirmed_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsPartialImmunityConfirmed + - age_group_offset) = - SPI * denom_C * num_InfectedNoSymptomsConfirmed_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed + - age_group_offset) = - SII * denom_C * num_InfectedNoSymptomsConfirmed_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + age_group_offset) = - SN * denom_I * num_InfectedSymptoms_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + - age_group_offset) = - SPI * - model[county] - .parameters.template get>()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + - age_group_offset) = - SII * - model[county] - .parameters.template get>()[AgeGroup(age)] * - denom_I * num_InfectedSymptoms_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + - age_group_offset) = - SN * denom_I * num_InfectedSymptomsConfirmed_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + - age_group_offset) = - SPI * - model[county] - .parameters.template get>()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + - age_group_offset) = - SII * - model[county] - .parameters.template get>()[AgeGroup(age)] * - denom_I * num_InfectedSymptomsConfirmed_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) = - SN * denom_HU * num_InfectedSevere_n[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + - age_group_offset) = - SPI * - model[county] - .parameters - .template get>()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_pi[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + - age_group_offset) = - SII * - model[county] - .parameters - .template get>()[AgeGroup(age)] * - denom_HU * num_InfectedSevere_ii[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + age_group_offset) = - SN * denom_HU * num_icu[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + - age_group_offset) = - SPI * - model[county] - .parameters - .template get>()[AgeGroup(age)] * - denom_HU * num_icu[county][age]; - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + - age_group_offset) = - SII * - model[county] - .parameters - .template get>()[AgeGroup(age)] * - denom_HU * num_icu[county][age]; - - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunPartialImmunity + - age_group_offset) = - num_timm1[county][age] * immunity_population[0][size_t(age)]; - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + - age_group_offset) = - num_timm2[county][age] * immunity_population[1][size_t(age)] + - immunity_population[2][size_t(age)] * immunity_population[2][size_t(age)]; - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + - age_group_offset) = - SII - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + - age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleImprovedImmunity + - age_group_offset) = - std::min( - SII - (extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsImprovedImmunityConfirmed + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSevereImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedCriticalImprovedImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadImprovedImmunity + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::TemporaryImmunImprovedImmunity + age_group_offset)), - std::max(0.0, - double(extrapolated_rki[county][day]( - (size_t)InfectionState::SusceptibleImprovedImmunity + age_group_offset)))); - - ///////////////// - extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + - age_group_offset) = - SPI - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]( - (size_t)InfectionState::InfectedSymptomsPartialImmunityConfirmed + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSeverePartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalPartialImmunity + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadPartialImmunity + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::TemporaryImmunImprovedImmunity + - age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptiblePartialImmunity + - age_group_offset) = - std::min(SPI, std::max(0.0, double(extrapolated_rki[county][day]( - (size_t)InfectionState::SusceptiblePartialImmunity + - age_group_offset)))); - - ///////////////// - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = - SPI - - (extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaive + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSymptomsNaiveConfirmed + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedSevereNaive + age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::InfectedCriticalNaive + - age_group_offset) + - extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset)); - - extrapolated_rki[county][day]((size_t)InfectionState::SusceptibleNaive + age_group_offset) = - std::min(SN, std::max(0.0, double(extrapolated_rki[county][day]( - (size_t)InfectionState::SusceptibleNaive + age_group_offset)))); - - // in set_confirmed_cases_data initilization, deaths are now set to 0. In order to visualize - // the extrapolated real number of deaths, they have to be set here. In the comparison of data - // it has to be paid attention to the fact, the the simulation starts with deaths=0 - // while this method starts with deaths=number of reported deaths so far... - // Additionally, we set the number of reported deaths to DeadNaive since no information on that is - // available here. - // Do only add deaths after substraction. - extrapolated_rki[county][day]((size_t)InfectionState::DeadNaive + age_group_offset) = - num_death_n[county][age]; - } - } - else { - log_warning("No population data available for region " + std::to_string(county) + - ". Population data has not been set."); + BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(models, case_data, counties, offset_day, scaling_factor_inf, + immunity_population)); + + BOOST_OUTCOME_TRY(details::set_population_data(models, population_data, counties, immunity_population)); + + for (size_t r = 0; r < counties.size(); r++) { + extrapolated_data[r][t] = models[r].get_initial_values(); + // in set_population_data the number of death individuals is subtracted from the SusceptibleImprovedImmunity compartment. + // Since we should be independent whether we consider them or not, we add them back here before we save the data. + for (size_t age = 0; age < num_groups; age++) { + extrapolated_data[r][t][(size_t)InfectionState::SusceptibleImprovedImmunity + + age * (size_t)InfectionState::Count] += + extrapolated_data[r][t][(size_t)InfectionState::DeadNaive + age * (size_t)InfectionState::Count]; } } - log_info("extrapolated real data for date: {}-{}-{}", date.day, date.month, date.year); } - /* end: similar functionality in set_confirmed_cases_data(), here only for vector of TimeSeries */ - auto num_groups = (int)(size_t)model[0].parameters.get_num_groups(); - BOOST_OUTCOME_TRY(save_result(extrapolated_rki, region, num_groups, path_join(dir, "Results_rki.h5"))); + BOOST_OUTCOME_TRY(save_result(extrapolated_data, counties, static_cast(num_groups), + path_join(results_dir, "Results_rki.h5"))); - auto extrapolated_rki_data_sum = sum_nodes(std::vector>>{extrapolated_rki}); - BOOST_OUTCOME_TRY( - save_result({extrapolated_rki_data_sum[0][0]}, {0}, num_groups, path_join(dir, "Results_rki_sum.h5"))); + auto extrapolated_rki_data_sum = sum_nodes(std::vector>>{extrapolated_data}); + BOOST_OUTCOME_TRY(save_result({extrapolated_rki_data_sum[0][0]}, {0}, static_cast(num_groups), + path_join(results_dir, "Results_rki_sum.h5"))); return success(); } +#else template -IOResult export_input_data_county_timeseries( - std::vector&& model, const std::string& dir, std::vector const& region, Date date, - const std::vector& scaling_factor_inf, double scaling_factor_icu, int num_days, - const std::string& divi_data_path, const std::string& confirmed_cases_path, const std::string& population_data_path, - bool set_vaccination_data, const std::string& vaccination_data_path, const std::string& immunity_data_path) +IOResult export_input_data_county_timeseries(std::vector, const std::string&, const std::vector&, + Date, const std::vector&, const double, const int, + const std::string&, const std::string&, const std::string&, + const std::vector>, const std::string&) { - if (set_vaccination_data) { - BOOST_OUTCOME_TRY(details::set_vaccination_data(model, vaccination_data_path, date, region, num_days)); - } - - BOOST_OUTCOME_TRY(export_input_data_county_timeseries( - model, dir, region, date, scaling_factor_inf, scaling_factor_icu, num_days, divi_data_path, - confirmed_cases_path, population_data_path, immunity_data_path)); - + mio::log_warning("HDF5 not available. Cannot export time series of extrapolated real data."); return success(); } #endif //MEMILIO_HAS_HDF5 /** - * Reads compartments for German counties at a specified date from data files. - * Estimates all compartments from available data using the model parameters, so the - * model parameters must be set before calling this function. - * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRS-type models, one per county. - * @param date Date for which the data should be read. - * @param county Ids of the counties. - * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. - * @param scaling_factor_icu Factor of ICU cases to account for underreporting. - * @param dir Directory that contains the data files. - * @param num_days Number of days to be simulated; required to load data for vaccinations during the simulation. - * @param export_time_series If true, reads data for each day of simulation and writes it in the same directory as the input files. - */ + * @brief Reads input data for specified counties and initializes the model accordingly. + * + * This function loads real-world data for specified counties and initializes + * the corresponding model compartments. Optionally, it can extrapolate real-world data + * using the export_input_data_county_timeseries function. + * + * @tparam Model The model type used. + * + * @param[in,out] model Vector of model objects that will be initialized with the input data. + * @param[in] date The starting date for the simulation. + * @param[in] county Vector of county IDs for which the data is read. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases. + * @param[in] scaling_factor_icu Scaling factor for ICU data. + * @param[in] dir Path to the directory containing input data files. + * @param[in] num_days The number of days for which the simulation runs. + * @param[in] immunity_population Vector of vectors representing immunity proportions for each age group and immunity layer. + * @param[in] export_time_series Boolean flag indicating whether to export time series of extrapolated data (default: false). + * + * @return An IOResult indicating success or failure. + */ template IOResult read_input_data_county(std::vector& model, Date date, const std::vector& county, const std::vector& scaling_factor_inf, double scaling_factor_icu, - const std::string& dir, int num_days, bool export_time_series = false) + const std::string& dir, int num_days, + const std::vector> immunity_population, + bool export_time_series = false) { BOOST_OUTCOME_TRY(details::set_vaccination_data( model, path_join(dir, "pydata/Germany", "all_county_ageinf_vacc_ma7.json"), date, county, num_days)); @@ -1290,12 +1065,11 @@ IOResult read_input_data_county(std::vector& model, Date date, cons log_warning("No DIVI data available for this date"); } - BOOST_OUTCOME_TRY(details::set_confirmed_cases_data( - model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), county, date, scaling_factor_inf, - path_join(dir, "pydata/Germany", "immunity_population.txt"))); BOOST_OUTCOME_TRY( - details::set_population_data(model, path_join(dir, "pydata/Germany", "county_current_population.json"), county, - path_join(dir, "pydata/Germany", "immunity_population.txt"))); + details::set_confirmed_cases_data(model, path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), + county, date, scaling_factor_inf, immunity_population)); + BOOST_OUTCOME_TRY(details::set_population_data( + model, path_join(dir, "pydata/Germany", "county_current_population.json"), county, immunity_population)); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! @@ -1303,35 +1077,42 @@ IOResult read_input_data_county(std::vector& model, Date date, cons // (This only represents the vectorization of the previous function over all simulation days...) log_warning("Exporting time series of extrapolated real data. This may take some minutes. " "For simulation runs over the same time period, deactivate it."); - BOOST_OUTCOME_TRY( - export_input_data_county_timeseries(model, dir, county, date, scaling_factor_inf, scaling_factor_icu, - num_days, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), - path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), - path_join(dir, "pydata/Germany", "county_current_population.json"), - path_join(dir, "pydata/Germany", "immunity_population.txt"))); + BOOST_OUTCOME_TRY(export_input_data_county_timeseries( + model, dir, county, date, scaling_factor_inf, scaling_factor_icu, num_days, + path_join(dir, "pydata/Germany", "county_divi_ma7.json"), + path_join(dir, "pydata/Germany", "cases_all_county_age_ma7.json"), + path_join(dir, "pydata/Germany", "county_current_population.json"), immunity_population, + path_join(dir, "pydata/Germany", "all_county_ageinf_vacc_ma7.json"))); } return success(); } /** - * Reads compartments for German counties at a specified date from data files. - * Estimates all compartments from available data using the model parameters, so the - * model parameters must be set before calling this function. - * Uses data files that contain centered 7-day moving average. - * @param model Vector of SECIRS-type models, one per county. - * @param date Date for which the data should be read. - * @param county Ids of the counties. - * @param scaling_factor_inf Factor of confirmed cases to account for undetected cases in each county. - * @param scaling_factor_icu Factor of ICU cases to account for underreporting. - * @param dir Directory that contains the data files. - * @param num_days Number of days to be simulated; required to load data for vaccinations during the simulation. - * @param export_time_series If true, reads data for each day of simulation and writes it in the same directory as the input files. + * @brief Reads compartments for geographic units at a specified date from data files. + * + * This function estimates all compartments from available data using the provided model parameters. + * + * @tparam Model The type of tmodel used. + * + * @param[in,out] model Vector of models, one per county, to be initialized with data. + * @param[in] date Date for which the data should be read. + * @param[in] node_ids Vector of IDs of the units for which data is read. + * @param[in] scaling_factor_inf Vector of scaling factors for confirmed cases. + * @param[in] scaling_factor_icu Scaling factor for ICU cases. + * @param[in] data_dir Directory containing the input data files. + * @param[in] num_days Number of days to simulate. + * @param[in] immunity_population Matrix containing immunity proportions for each age group and immunity layer. + * @param[in] export_time_series Boolean flag indicating whether to export time series of extrapolated data (default: false). + * + * @return An IOResult indicating success or failure. */ template IOResult read_input_data(std::vector& model, Date date, const std::vector& node_ids, const std::vector& scaling_factor_inf, double scaling_factor_icu, - const std::string& data_dir, int num_days, bool export_time_series = false) + const std::string& data_dir, int num_days, + const std::vector> immunity_population, + bool export_time_series = false) { BOOST_OUTCOME_TRY( @@ -1348,10 +1129,9 @@ IOResult read_input_data(std::vector& model, Date date, const std:: } BOOST_OUTCOME_TRY(details::set_confirmed_cases_data(model, path_join(data_dir, "confirmed_cases.json"), node_ids, - date, scaling_factor_inf, - path_join(data_dir, "immunity_population.txt"))); + date, scaling_factor_inf, immunity_population)); BOOST_OUTCOME_TRY(details::set_population_data(model, path_join(data_dir, "population_data.json"), node_ids, - path_join(data_dir, "immunity_population.txt"))); + immunity_population)); if (export_time_series) { // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! @@ -1362,7 +1142,8 @@ IOResult read_input_data(std::vector& model, Date date, const std:: BOOST_OUTCOME_TRY(export_input_data_county_timeseries( model, data_dir, node_ids, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(data_dir, "critical_cases.json"), path_join(data_dir, "confirmed_cases.json"), - path_join(data_dir, "population_data.json"), path_join(data_dir, "immunity_population.txt"))); + path_join(data_dir, "population_data.json"), immunity_population, + path_join(data_dir, "vaccination_data.json"))); } return success(); diff --git a/cpp/tests/data/export_time_series_initialization_osecirts.h5 b/cpp/tests/data/export_time_series_initialization_osecirts.h5 index 51b3f0967561913060daf922cfecab1782394a29..d8d62c0365123e9de0cc33d3991027571dd295dc 100644 GIT binary patch literal 10008 zcmeI12{ct}|HscU4=I!}!!aa@5aF7h-$8Zcl8ek_%8)TdMKU#zRMM4nLuo*{NM%Y& zR|#Q}G>6JOzLdYQ_nho=yYIF3x&L+7yVm>u*Wb3*`R%=*-}CI>=exgq?`LoE6r)W% zT%ueA+QPv>U?K2+Tc!Ve#TMb!^Lyyq^mZ3)g^0yCEM_y!uMi2eKLSA*+s}uM|K~g_ zi;Wuz)J*#L^oVsMw6o5yanN@x#{X9eP&SgyX~4D^HQl8(n9t~9s9-B}KT_xoe>39w zm%={9OfT7ot2OO4%+(W;J}a|RV=Q@q8b*} zvA6+?8U%t>;2u{$YCpQ~>DPy)*;XT(hw1lC66RZa-k*I;uVXR(s{%v<+q|}za765h zMkLPfz+@$SkHX*b`A7)U9ti5(1of|20xNYdttS%`)3*UQu<@9QQJnKfrav*~xA?J9 zXvtSst9cO!`{o<|L%;LB;`n{G5XHy15IW5%e#UtutT}Tz<2-q+xnKq3Jo@wCz5wGq zEv&gokZ~UUI+AB+oCjEQyAb0%yw)gNGeXZWf&650)-OjE$Wiv)%gYSw&~c^KIQ0}x zsMJ&z8T`_O;&DBin^I$1$;1sadqP{B z+y+p7PR~&=xrbb>&W95NW>9tBqr`^xx43l+4;rhy75>_?6t3lEJu~?4E>8j5rm&4C~^TGJ|xGWA-n? z&FKE%#}6L;{A5>7-c^nq7UW|OKR#e?e2-eBrpCKpio=&a9tzt26}86>o~R3chV(l# zJg=!Nhen?d&7%tAxOJx|2VW#T9Yp8ryw_!wl0cqIqQ<^x1~>nZ)=lYX!2|?8)(Tut zz0tU(2fNwfKwRId2`Gf`FEqmSt@8A=ec}u!9GPV+UZ3{@@rINa(m0zQ37b1mIrHvx z$x8FQN9)VCl#I)WgU^qBeQcR?NI+$9w6~xIh1m|RxfR9_l;ag4rM_dhb$9bwn%p9d zpdND;&t<7na7Ev7DW~cjZoanI`rn-WkD+ADw?%*9+w*4i#(&Kzf^qgBUa?_s8t4A8 z-XMD_XVUF|M7Za)BclyY0Sy}^VWL@)_#%J+ciRTn=Bc-$KHs0R(z=#|&1Oy&g+BcA zd42cuH)l*o(ES|dZ=6ph9T;-n!F)>yz8HAD%NGg%EdO!3Y!|L?U*`F+FyhSgqu4!B zk%nj9v0a>-MsfAUyN@mIUsT}Vp}@j<<^0TsI6p1?eLg9U9gIG|{J#Bn=b5S4JhS9q z-k=xGGrj*EnE&fB{&RYmFPSfLQ4g99)b|jPMLnpWM1OxT(-K?M*9XrWvNwWPa8!78 ztPJFgPgb%M+2EMAjxloAfG)8E%hoEc06Y?n^JJLwo>j~pCPd5+ZlV9isRzSWU3POnPoi}OYn?UooedV(GvLHnKIbHe$ z2gqB?+Eq+z!S?%pCwpTAaqF(7XhQm#byGvGW_wKT41rw-f|^K|;rf(=H}tIlvy zIY0d{nSP7PdF7~ut)iL`D0&pQl%;Kkv8Fu^&x}?VO|8O~jtl6a#7rMldGb~2<8jn~;`y0YPO zGLssc`xtQQx+dM6{c$6RdDcxP+3>-L)6Q3qtPIGi3C^+7RlCSB&N4bZ76LG~qgeK{ zwGs3Qy zWSLgl&H>C5t+_R2nvk|hfo+;y0JrXtnVHh0{Zimde6uBSr6IH_s20{2EPnp?3 ztM;h|jnipawKj>$Ij-Z!tW_xhf>9~!Hr_LW*KDyFUT)Ix$|miNrr{E(GijKleAb59 ztv*EuKMLX2JoW1L&$!~3f>JHB$n0WFp;B@^y2z^f zI3^RHb4H*cj1gzp&aFg)86)`R$VjYA1206e9RF01B}Ja&jtQ7EawBJb4f1R1Z$~RH z#HB=%rNI8e?y@gaEI_{SDtjA$D;n1;UBww80JmRu7CV!sFr5htmNOI=tq;6IDB~D0 zCz4wVM!lU6So9Ncb=kPfV-YVBTVncl zM1pLK>)V!kv9GqQjH2PYNzY`!#xJZbLmvjk6CgRBA=hk36mtEtwW@HvEv($cU3kjK;YV+`e%R zA{Y0HAQ~t5`X8Wi%14JWRU5xY5zY0^>OGRs&764c{0?RaSIvnpn|Y4(kNAVsE+IHQ zqG#n5h5!99VS4J+gw-%&{#?gy7B3A^tM-VRd(!JAELdI_54dHZ0n|p2%^BMYa>^R>!tpSGJ8E{SwT+7wH^aV8~$5_@Le1)Ra zXDrRBoL-y#SuayLAIS;lA9im-n?*D@nr_HKX=q`++!Ijb39$gVT`eva zU;YG_bK8ntPu&=BD)1Ac@+Nsf$?r1te2$?{{o9U=G+B_N$Io{}o;ylD7jJcUQb!)x zO>5G8L>xi>TB9z9h(6f(^NvlYiok;c!_<5oQ}FX#*3HzTgv%LQp7lPVUk%cK@*CbF zV+Y(1Q{-5<)p7F+yE02(+jGHWSc|xiWG6~fo^Y7lMgM;g3G253i(0_c6~V{q6OQZK zp|kNpHD|~WS~qIueQzoB>`e}(ai*1%JP%Sik4g$9Kag1i-9O%pzbN4Z(Ge~&)y4?Y zw#NkJZxRF2rqxrnzUH8@lO%&;RB`KOUE6KGXF?4^lFfNI_3R)e_G_iG1U_fjVK-Zs zNiGBFvn`g8X?r;df|85Rbd;sd1B(MKer(`R4uMw)+-4I_s}gD-Wr=+=<>8>@LV> e>Br?fH@=&j5vPgQ>XzVK2QW~JDzcYa1OEiyf$%E; literal 10008 zcmeI12{cvv9>>o?9AgQYXHirVm6!PakD*Z9UW7sv8E%G*DY>FdxuVI`HKltqrXwPf zDW$lm3=J|RbEs4|iFZ!+aqrFA=e>2;TkE~Io_*HZ|Nq|q@BZ)K=eNIm@BjXv2z}ix z+#Dht1lmF(5m*RIzEJ6y~GY9bS;{#k?1=X%Kxhj={ozB$R^#HBD)zjVQkP23=!%9`G zRKv>kSh;~fFm?Cd=R!S>?tA+EVPgE9F3rRA=cW|qTe|LBAJgMlDF2)RB7t=_w^-tc z*c**VoZW$?mGFBh^i|I*1z7G8L5-83HiHQkQTNi0WMX3a+5rjckC}L!efG@sH|Fft zQmhx6_-xrA)gykh4gaC_tglFOqlM$Vj02(5#4Kg3lfs%)`55a~V9nR~8SCipg9-u0 zI(4kMX&GZ3{XSa3##o22<}N|TI=ogc?`LRij6m)>8UItR93ltr>E|oase`E1E#Ydh z?C8!$W#QK^hhRj0EJby5F(e&M@+Z1Yf&Vyb!6ojufY z45oO;jN{n4|z@INp&fx45pmQ=g^G(w@t-W6w1>CELnMqY9Q6^4A z^znUcy?+EKnFC>H+ifW0C%>+^Lqt}Stou06e87!cXe5lo{#gf9n_AEfzK&Z~o7?aqIJqo++zK>`b(|_oi$EB0`Hi<;eikrh@1F1>#3wCE@y+gi#;RG5OZDe zW^xjwz06YUZSRH-bcNexcqzHpQY*riw38fB-CN1r*a?rNCnx%!ilYxh-1=ZM16?Ox zpRV(4hF_m;MGvP0k>~E3Xr{wF2+uc3=RDJ-etivzbxv#2Z%QEr4vE@5*QanfPpaq3 z1TBjMva^{Y$FENC&cvS0IK+LYq{PEk z+8(zUmowX|wf(%&IFx5Hf90%~v}DM61M@A>GtE7_?;r?WSke2r#AD94-*V1uJ^2eG zPOTDI>T`$!ejASZ5-Ir4OFTa=>|e;hzaskIJW#(wgctHbof4hjm<$j2Y^F)p!? zk3Z%kLwX?}f6Rxi+<#*}W@GyAS*ubP@#*zs>2=Lg)i)i;Pp$TQWV`dpSvK&dkI#xLHZYBbb zS5({_voyo~UUH}%r+zQJ0%^2-tdmm^(K-J%ab*RKQ{rWI>Z|Bw$anLN_QZ)TNd1mq zsa&2M5+q(omN`vA`3GI|ay9`<(65rbLQuhtyH0puC#}}oEx?9PxWINx+PNxJ|t|ICFzC0Az+mByo z$hkg^XDGD~nk#uabt`}8>@Tt;&^Uh%+i9^%RS>PVzh+yKxD`z_d0RH?E=P&0+SE?o z=0waq%bWc!laa~3C;6l6RdM5%yK+xk;;=Mo$qKxczEl@!SXn0GkZB|ZP5~wEB&#a1o;q)`!-k8c0oaraqlSWh z1qprF0NsPvgOvB-`gSB_SDmQr00=pk^(fsIoZ~EeKg2`h6#TCH zOn0*YTA94^!RRAhbVQi5sK{FeX^)yD-s~cwYVXLFqnVnB`Th{4?~XEV+&)uNH_sfA zMhA)QhEbwAs7+CY^57RyTz#3(?l>WdOKeKt5txBlqEbFwENa zJdo)QsI~3CA(BFYAIrHZj5rCVHRi`^`r%gb{qK+1{m%JNf$~nC$~mFo!mM5{fR-JP zU88qf7qzpVNO9aRgPxfuwr|woLVL%gelmKBkYlY)WFhA|+_*;uOC6nOQn?qLiqFY>`DGF#&NfGO`ALmIn8?0p zsM8>XveZ8xDovLr2aJ>#67=?yFV7ruX&UYVv83?WK(aKlO7bfCFv)_nlb&VlTG|3$ zQ3~$c+C@;;g#EenQa)VH3;MR|FPDr$$|+)IAg45X>$LaS&S3(sev60w$D=O8ph9@e z(i&e6r+?OTmtbvymqM#;d) z)ld%!;d}fkt6SjS1&8we?7g5_lk;V9;yB#-^r+(mPcLM(O`T`N`2^#<`VHrvMWj?3 zr()1irW%7z_~B9gUbO*9G{78n<>CQmbW9~PqGYNSn)<_IoT=}@7gIf7x_NTxIJR!)X5bf&We3g`4WJfbD=aKsGFh-mv zixsV+s|w*P$9kLef#2Y_FU@{~%A+X7D`$J2nGX4qh_A-pSM_j7OjeV$Nd_gG%e6`* z38JR9gC7;d^C7B2lYA(K3*A|@JIlao8E)JXm)dt}-Maxzl*OS__XtSR_wd=l@;A8i zjpb$W)!`l#uzs+J^Bge)AiCDTtf2~0eLJ2I_q>2Q7sDT(3rvH&u4c8hH8T=Evm?OS zavOQ*7yYwx2J@fej-w*fc{mU7yqFlMY1cK!*;r7$hsJ4hx5HM zVeT)+ky_%2Rc|!yyR`L^7&PbQZQkidPyplZ3U9x$Ba5pW}s*pRr=Ok={dohSIMAn~kHwuOdmvHyqva=$ zK@h4D%qaNoBNSJ>+~w`afhw$)m{G>rk?64xULpTQL_56Id4@^L+zCvAy2pd}QcVnfC`K-v~>Jc9r=ayDi>h+w@d2?%9`XQ=+ z`~!b3t8`SJ;|zVLr9tCtEKf`)yRAg3fz=7wLDp#Pbol8DZGcYJh-;M$N}~2%)#;n0 z%u&VFiH3=GBV5iSEww3+wy7Zn#nlp4i}xTtE>F|!W$SVEnp%-@r0+OUVo9k_-Q^y5 pq3v}ok7XE_^W*R)BO2%00P5{|V?JlD9F21dZe4rJ@4HC_{R6whym expected_values = {0.09375, 0.90625, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 0.5, 0, 0.5, 0.5, 1, 0.046875, 0.953125, 1, 0.5, 0.5, + 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0.5, 0.5, + 0.046875, 0.953125, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 0.5, 0, 0.5, 0.5, 0, 1, 1, 1}; - // Check each flow individually - EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.09375); + EXPECT_EQ(flows.size(), 53); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.90625); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.0); - EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - - // Add more EXPECT_EQ statements for the remaining flow entries - - // Partial immunity flows - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.046875); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.953125); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.0); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - - // Improved immunity flows - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.046875); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.953125); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.0); - EXPECT_EQ( - (flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 0.5); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 0.5); - - // Waning immunity flows - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ((flows[model.get_flat_flow_index( - {mio::AgeGroup(0)})]), - 1.0); - EXPECT_EQ((flows[model.get_flat_flow_index({mio::AgeGroup(0)})]), - 1.0); + // Compare expected with actual values + for (size_t i = 0; i < expected_values.size(); i++) { + EXPECT_NEAR(flows(i), expected_values[i], 1e-10); + } } TEST(TestOdeSECIRTS, Simulation) @@ -897,18 +684,8 @@ TEST(TestOdeSECIRTS, read_confirmed_cases) { auto num_age_groups = 6; //reading data requires RKI data age groups auto model = std::vector>({make_model(num_age_groups)}); - std::vector region{1002}; + const std::vector region{1002}; auto path = mio::path_join(TEST_DATA_DIR, "pydata/Germany/cases_all_county_age_ma7.json"); - std::vector> t_Exposed(1); - std::vector> t_InfectedNoSymptoms(1); - std::vector> t_InfectedSymptoms(1); - std::vector> t_InfectedSevere(1); - std::vector> t_InfectedCritical(1); - std::vector> t_imm_interval1(1); - - std::vector> mu_C_R(1); - std::vector> mu_I_H(1); - std::vector> mu_H_U(1); std::vector> num_InfectedSymptoms(1); std::vector> num_death(1); @@ -925,33 +702,10 @@ TEST(TestOdeSECIRTS, read_confirmed_cases) num_InfectedNoSymptoms[0] = std::vector(num_age_groups, 0.0); num_InfectedSevere[0] = std::vector(num_age_groups, 0.0); num_icu[0] = std::vector(num_age_groups, 0.0); - for (size_t group = 0; group < static_cast(num_age_groups); group++) { - - t_Exposed[0].push_back(static_cast( - std::round(model[0].parameters.template get>()[(mio::AgeGroup)group]))); - t_InfectedNoSymptoms[0].push_back(static_cast(std::round( - model[0].parameters.template get>()[(mio::AgeGroup)group]))); - t_InfectedSymptoms[0].push_back(static_cast(std::round( - model[0].parameters.template get>()[(mio::AgeGroup)group]))); - t_InfectedSevere[0].push_back(static_cast(std::round( - model[0].parameters.template get>()[(mio::AgeGroup)group]))); - t_InfectedCritical[0].push_back(static_cast(std::round( - model[0].parameters.template get>()[(mio::AgeGroup)group]))); - t_imm_interval1[0].push_back(static_cast(std::round( - model[0].parameters.template get>()[(mio::AgeGroup)group]))); - - mu_C_R[0].push_back(model[0].parameters.template get>()[( - mio::AgeGroup)group]); - mu_I_H[0].push_back( - model[0].parameters.template get>()[(mio::AgeGroup)group]); - mu_H_U[0].push_back( - model[0].parameters.template get>()[(mio::AgeGroup)group]); - } auto read = mio::osecirts::details::read_confirmed_cases_data( path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, - num_icu, num_death, num_timm, t_Exposed, t_InfectedNoSymptoms, t_InfectedSymptoms, t_InfectedSevere, - t_InfectedCritical, t_imm_interval1, mu_C_R, mu_I_H, mu_H_U, std::vector(size_t(num_age_groups), 1.0)); + num_icu, num_death, num_timm, model, std::vector(size_t(num_age_groups), 1.0), 0); ASSERT_THAT(read, IsSuccess()); } @@ -963,15 +717,21 @@ TEST(TestOdeSECIRTS, read_data) auto model2 = std::vector>({make_model(num_age_groups)}); auto model3 = std::vector>({make_model(num_age_groups)}); - auto read_result1 = mio::osecirts::read_input_data_county( - model1, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), 1.0, TEST_DATA_DIR, 10); + const std::vector> immunity_population = {{0.04, 0.04, 0.075, 0.08, 0.035, 0.01}, + {0.61, 0.61, 0.62, 0.62, 0.58, 0.41}, + {0.35, 0.35, 0.305, 0.3, 0.385, 0.58}}; + + auto read_result1 = mio::osecirts::read_input_data_county(model1, {2020, 12, 01}, {1002}, + std::vector(size_t(num_age_groups), 1.0), 1.0, + TEST_DATA_DIR, 10, immunity_population); - auto read_result2 = mio::osecirts::read_input_data( - model2, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), 1.0, TEST_DATA_DIR, 10); + auto read_result2 = + mio::osecirts::read_input_data(model2, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), + 1.0, TEST_DATA_DIR, 10, immunity_population); auto read_result_district = mio::osecirts::read_input_data(model3, {2020, 12, 01}, {1002}, std::vector(size_t(num_age_groups), 1.0), - 1.0, mio::path_join(TEST_DATA_DIR, "pydata/District"), 10); + 1.0, mio::path_join(TEST_DATA_DIR, "pydata/District"), 10, immunity_population); ASSERT_THAT(read_result1, IsSuccess()); ASSERT_THAT(read_result2, IsSuccess()); @@ -979,19 +739,19 @@ TEST(TestOdeSECIRTS, read_data) // values were generated by the tested function; can only check stability of the implementation, not correctness auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 410.72, 3630.45, + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 411.933, 6282.58, 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, - 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 2893.07, 0, 0, 0, 2652.78, 714.319, 763.188, 8032.87, + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 3606.1, 0, 0, 0, 0.649663, 0.0771142, 766.409, 11687.7, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, 0.0132265, - 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 5916.15, 0, 0, 0, 3658.05, 799.805, 5554.16, 43483, 5.32163, + 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 6712.35, 0, 0, 0, 3.24832, 0.385571, 5568.96, 46059.3, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, 0.56467, 0.071343, - 0.0777408, 0.0753594, 3.5, 4, 21861.8, 0, 0, 0, 2589.83, 845.38, 6617.66, 48070, 5.33096, 40.6794, 9.01336, + 0.0777408, 0.0753594, 3.5, 4, 22691, 0, 0, 0, 13.4975, 1.37363, 6631.47, 51423.9, 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, 1.78101, 0.218787, 0.234499, 0.487853, - 3.5, 4, 24154, 0, 0, 0, 3367.68, 774.244, 1528.03, 21414.7, 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, - 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, 0.328498, 2.61775, 3.5, 4, 16069.9, 0, - 0, 0, 4038.53, 836.776, 144.225, 1979.35, 0.22575, 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, - 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, 0.146922, 4.75954, 3.5, 4, 8288.72, 0, 0, 0, - 4447.91, 823.157) + 3.5, 4, 24913, 0, 0, 0, 13.8504, 1.38643, 1532.28, 25449.8, 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, + 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, 0.328498, 2.61775, 3.5, 4, 16901.9, 0, + 0, 0, 3.38605, 0.46498, 151.979, 6426.73, 0.22575, 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, + 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, 0.146922, 4.75954, 3.5, 4, 9103.97, 0, 0, 0, + 0.530478, 0.155246) .finished(); ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), @@ -999,7 +759,6 @@ TEST(TestOdeSECIRTS, read_data) ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), MatrixNear(print_wrap(model3[0].populations.array().cast()), 1e-5, 1e-5)); - ASSERT_THAT(print_wrap(model1[0].populations.array().cast()), MatrixNear(print_wrap(expected_values), 1e-5, 1e-5)); ASSERT_THAT(print_wrap(model2[0].populations.array().cast()), @@ -1118,15 +877,18 @@ TEST(TestOdeSECIRTS, export_time_series_init) auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups auto model = make_model(num_age_groups); + const std::vector> immunity_population = {{0.04, 0.04, 0.075, 0.08, 0.035, 0.01}, + {0.61, 0.61, 0.62, 0.62, 0.58, 0.41}, + {0.35, 0.35, 0.305, 0.3, 0.385, 0.58}}; + // Test exporting time series ASSERT_THAT(mio::osecirts::export_input_data_county_timeseries( std::vector>{model}, tmp_results_dir, {0}, {2020, 12, 01}, std::vector(size_t(num_age_groups), 1.0), 1.0, 2, mio::path_join(TEST_DATA_DIR, "county_divi_ma7.json"), mio::path_join(TEST_DATA_DIR, "cases_all_county_age_ma7.json"), - mio::path_join(TEST_DATA_DIR, "county_current_population.json"), true, - mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json"), - mio::path_join(TEST_DATA_DIR, "immunity_population.txt")), + mio::path_join(TEST_DATA_DIR, "county_current_population.json"), immunity_population, + mio::path_join(TEST_DATA_DIR, "vacc_county_ageinf_ma7.json")), IsSuccess()); auto data_extrapolated = mio::read_result(mio::path_join(tmp_results_dir, "Results_rki.h5")); @@ -1149,27 +911,31 @@ TEST(TestOdeSECIRTS, model_initialization) // Vector assignment necessary as read_input_data_county changes model auto model_vector = std::vector>{model}; + const std::vector> immunity_population = {{0.04, 0.04, 0.075, 0.08, 0.035, 0.01}, + {0.61, 0.61, 0.62, 0.62, 0.58, 0.41}, + {0.35, 0.35, 0.305, 0.3, 0.385, 0.58}}; + ASSERT_THAT(mio::osecirts::read_input_data_county(model_vector, {2020, 12, 01}, {0}, std::vector(size_t(num_age_groups), 1.0), 1.0, - TEST_DATA_DIR, 2, false), + TEST_DATA_DIR, 2, immunity_population, false), IsSuccess()); // Values from data/export_time_series_init_osecirts.h5, for reading in comparison // operator for return of mio::read_result and model population needed. auto expected_values = - (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 138748, 2.11327e+06, + (Eigen::ArrayXd(num_age_groups * Eigen::Index(mio::osecirts::InfectionState::Count)) << 138749, 2.11592e+06, 0.213004, 3.19834, 0.840323, 0.0946686, 1.42149, 0.373477, 0, 0, 0, 0.558774, 4.4528, 0.955134, 0, 0, 0, - 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 1.21334e+06, 0, 0, 0, 2652.78, 714.319, 309974, - 4.7235e+06, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, - 0.0132265, 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 2.71151e+06, 0, 0, 0, 3658.05, 799.805, 1.44128e+06, - 1.19121e+07, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, - 0.56467, 0.071343, 0.0777408, 0.0753594, 3.5, 4, 5.86047e+06, 0, 0, 0, 2589.83, 845.38, 2.40269e+06, - 1.86176e+07, 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, - 1.78101, 0.218787, 0.234499, 0.487853, 3.5, 4, 9.00942e+06, 0, 0, 0, 3367.68, 774.244, 578004, 9.57445e+06, - 0.528786, 8.62793, 2.62254, 0.329244, 5.37211, 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, - 0.223414, 0.328498, 2.61775, 3.5, 4, 6.35731e+06, 0, 0, 0, 4038.53, 836.776, 61810.3, 2.53029e+06, 0.22575, - 9.11334, 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, - 0.046887, 0.146922, 4.75954, 3.5, 4, 3.58492e+06, 0, 0, 0, 4447.91, 823.157) + 0.0103231, 0.00287609, 0.00365536, 0.0297471, 3.5, 4, 1.21406e+06, 0, 0, 0, 0.649663, 0.0771142, 309977, + 4.72715e+06, 0.49701, 7.4628, 1.96075, 0.319507, 4.79751, 1.26048, 0, 0, 0, 0.93129, 8.36257, 1.79379, 0, 0, 0, + 0.0132265, 0.00302746, 0.00384774, 0.0297471, 3.5, 4, 2.71231e+06, 0, 0, 0, 3.24832, 0.385571, 1.44129e+06, + 1.19147e+07, 5.32163, 43.3153, 9.75737, 2.7505, 22.3877, 5.04313, 0, 0, 0, 8.84909, 39.8328, 7.32558, 0, 0, 0, + 0.56467, 0.071343, 0.0777408, 0.0753594, 3.5, 4, 5.8613e+06, 0, 0, 0, 13.4975, 1.37363, 2.4027e+06, 1.8621e+07, + 5.33096, 40.6794, 9.01336, 2.83472, 21.6311, 4.79282, 0, 0, 0, 8.55241, 37.2832, 6.74428, 0, 0, 0, 1.78101, + 0.218787, 0.234499, 0.487853, 3.5, 4, 9.01018e+06, 0, 0, 0, 13.8504, 1.38643, 578008, 9.57848e+06, 0.528786, + 8.62793, 2.62254, 0.329244, 5.37211, 1.6329, 0, 0, 0, 0.939561, 8.52246, 2.1149, 0, 0, 0, 0.856992, 0.223414, + 0.328498, 2.61775, 3.5, 4, 6.35814e+06, 0, 0, 0, 3.38605, 0.46498, 61818.1, 2.53474e+06, 0.22575, 9.11334, + 5.90344, 0.0707574, 2.85642, 1.85033, 0, 0, 0, 0.0889777, 2.09765, 1.10935, 0, 0, 0, 0.0681386, 0.046887, + 0.146922, 4.75954, 3.5, 4, 3.58574e+06, 0, 0, 0, 0.530478, 0.155246) .finished(); ASSERT_THAT(print_wrap(model_vector[0].populations.array().cast()), From d2a39763c63a200354c9047afe78ba7ca6528615 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:54:15 +0100 Subject: [PATCH 44/60] rm old immunity files. Optional args --- cpp/memilio/io/epi_data.h | 10 +++++++--- cpp/tests/data/immunity_population.txt | 3 --- cpp/tests/data/pydata/District/immunity_population.txt | 3 --- cpp/tests/data/pydata/Germany/immunity_population.txt | 3 --- 4 files changed, 7 insertions(+), 12 deletions(-) delete mode 100755 cpp/tests/data/immunity_population.txt delete mode 100755 cpp/tests/data/pydata/District/immunity_population.txt delete mode 100755 cpp/tests/data/pydata/Germany/immunity_population.txt diff --git a/cpp/memilio/io/epi_data.h b/cpp/memilio/io/epi_data.h index 8a98f9d7dc..8c41d31e42 100644 --- a/cpp/memilio/io/epi_data.h +++ b/cpp/memilio/io/epi_data.h @@ -471,8 +471,8 @@ class VaccinationDataEntry auto obj = io.expect_object("VaccinationDataEntry"); auto num_vaccinations_partial = obj.expect_element("Vacc_partially", Tag{}); auto num_vaccinations_completed = obj.expect_element("Vacc_completed", Tag{}); - auto num_vaccinations_refreshed_first = obj.expect_element("Vacc_refreshed", Tag{}); - auto num_vaccinations_refreshed_additional = obj.expect_element("Vacc_refreshed_2", Tag{}); + auto num_vaccinations_refreshed_first = obj.expect_optional("Vacc_refreshed", Tag{}); + auto num_vaccinations_refreshed_additional = obj.expect_optional("Vacc_refreshed_2", Tag{}); auto date = obj.expect_element("Date", Tag{}); auto age_group_str = obj.expect_element("Age_RKI", Tag{}); auto state_id = obj.expect_optional("ID_County", Tag{}); @@ -490,7 +490,11 @@ class VaccinationDataEntry else { return failure(StatusCode::InvalidValue, "Invalid vaccination data age group."); } - return success(VaccinationDataEntry{np, nc, n_refreshed_1, n_refreshed_2, d, a, sid, cid, did}); + // Optional values are 0 if they do not exist. + auto n_refreshed_1_value = n_refreshed_1.value_or(0.0); + auto n_refreshed_2_value = n_refreshed_2.value_or(0.0); + return success( + VaccinationDataEntry{np, nc, n_refreshed_1_value, n_refreshed_2_value, d, a, sid, cid, did}); }, num_vaccinations_partial, num_vaccinations_completed, num_vaccinations_refreshed_first, num_vaccinations_refreshed_additional, date, age_group_str, state_id, county_id, district_id); diff --git a/cpp/tests/data/immunity_population.txt b/cpp/tests/data/immunity_population.txt deleted file mode 100755 index 653b1ae446..0000000000 --- a/cpp/tests/data/immunity_population.txt +++ /dev/null @@ -1,3 +0,0 @@ -0.04 0.04 0.075 0.08 0.035 0.01 -0.61 0.61 0.62 0.62 0.58 0.41 -0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file diff --git a/cpp/tests/data/pydata/District/immunity_population.txt b/cpp/tests/data/pydata/District/immunity_population.txt deleted file mode 100755 index 653b1ae446..0000000000 --- a/cpp/tests/data/pydata/District/immunity_population.txt +++ /dev/null @@ -1,3 +0,0 @@ -0.04 0.04 0.075 0.08 0.035 0.01 -0.61 0.61 0.62 0.62 0.58 0.41 -0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file diff --git a/cpp/tests/data/pydata/Germany/immunity_population.txt b/cpp/tests/data/pydata/Germany/immunity_population.txt deleted file mode 100755 index 653b1ae446..0000000000 --- a/cpp/tests/data/pydata/Germany/immunity_population.txt +++ /dev/null @@ -1,3 +0,0 @@ -0.04 0.04 0.075 0.08 0.035 0.01 -0.61 0.61 0.62 0.62 0.58 0.41 -0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file From f2c4d543da45cab4ca9778f79b62501f61f11874 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:08:49 +0100 Subject: [PATCH 45/60] doc for parameters, rm unused param --- cpp/models/ode_secirts/analyze_result.h | 4 - cpp/models/ode_secirts/parameters.h | 127 +++++++++++++----------- cpp/tests/test_epi_data_io.cpp | 1 - cpp/tests/test_odesecirts.cpp | 8 -- 4 files changed, 68 insertions(+), 72 deletions(-) diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index f91a5d0673..9df5a15c35 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -158,10 +158,6 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get>()[i]; }); - param_percentil( - node, [i](auto&& model) -> auto& { - return model.parameters.template get>()[i]; - }); param_percentil( node, [i](auto&& model) -> auto& { return model.parameters.template get>()[i]; diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index 4bf77d46ad..c0eacb1cbf 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -38,10 +38,10 @@ namespace osecirts { /** -* @brief the start day in the SECIRS-type model +* @brief The start day in the SECIRTS-type model. * The start day defines in which season the simulation can be started * If the start day is 180 and simulation takes place from t0=0 to -* tmax=100 the days 180 to 280 of the year are simulated +* tmax=100 the days 180 to 280 of the year are simulated. */ struct StartDay { using Type = double; @@ -56,7 +56,7 @@ struct StartDay { }; /** -* @brief the start day of a new variant in the SECIRS-type model +* @brief The start day of a new variant in the SECIRTS-type model. * The start day of the new variant defines in which day of the simulation the new variant is introduced. * Starting on this day, the new variant will impact the transmission probability depending on the * infectiousness of the new variant in the parameter InfectiousnessNewVariant. @@ -74,9 +74,10 @@ struct StartDayNewVariant { }; /** -* @brief the seasonality in the SECIRS-type model +* @brief The seasonality in the SECIRTS-type model. * the seasonality is given as (1+k*sin()) where the sine -* curve is below one in summer and above one in winter +* curve is below one in summer and above one in winter. +* @tparam FP The floating-point type (default: double). */ template struct Seasonality { @@ -92,7 +93,8 @@ struct Seasonality { }; /** -* @brief the icu capacity in the SECIR model +* @brief Represents the icu capacity in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct ICUCapacity { @@ -108,7 +110,8 @@ struct ICUCapacity { }; /** - * @brief capacity to test and trace contacts of infected for quarantine per day. + * @brief The Capacity to test and trace contacts of infected for quarantine per day. + * @tparam FP The floating-point type (default: double). */ template struct TestAndTraceCapacity { @@ -124,7 +127,8 @@ struct TestAndTraceCapacity { }; /** - * @brief the contact patterns within the society are modelled using an UncertainContactMatrix + * @brief The contact patterns within the society are modelled using an UncertainContactMatrix. + * @tparam FP The floating-point type (default: double). */ template struct ContactPatterns { @@ -140,7 +144,8 @@ struct ContactPatterns { }; /** - * @brief the NPIs that are enacted if certain infection thresholds are exceeded. + * @brief The NPIs that are enacted if certain infection thresholds are exceeded. + * @tparam FP The floating-point type (default: double). */ template struct DynamicNPIsInfectedSymptoms { @@ -156,7 +161,8 @@ struct DynamicNPIsInfectedSymptoms { }; /** - * @brief the (mean) latent time in day unit + * @brief Represents the mean latent time in days for different age groups. + * @tparam FP The floating-point type (default: double). */ template struct TimeExposed { @@ -172,8 +178,9 @@ struct TimeExposed { }; /** - * @brief the (mean) time in day unit for asymptomatic cases that are infected but + * @brief The (mean) time in day unit for asymptomatic cases that are infected but * have not yet developed symptoms. + * @tparam FP The floating-point type (default: double). */ template struct TimeInfectedNoSymptoms { @@ -189,8 +196,9 @@ struct TimeInfectedNoSymptoms { }; /** -* @brief the infectious time for symptomatic cases that are infected but -* who do not need to be hsopitalized in the SECIR model in day unit +* @brief The infectious time for symptomatic cases that are infected but +* who do not need to be hospitalized in the SECIRTS model in day unit. +* @tparam FP The floating-point type (default: double). */ template struct TimeInfectedSymptoms { @@ -206,8 +214,9 @@ struct TimeInfectedSymptoms { }; /** - * @brief the time people are 'simply' hospitalized before returning home in the SECIR model - * in day unit + * @brief The time people are 'simply' hospitalized before returning home in the SECIRTS model + * in day unit. + * @tparam FP The floating-point type (default: double). */ template struct TimeInfectedSevere { @@ -223,8 +232,9 @@ struct TimeInfectedSevere { }; /** - * @brief the time people are treated by ICU before returning home in the SECIR model - * in day unit + * @brief The time people are treated by ICU before returning home in the SECIRTS model + * in day unit. + * @tparam FP The floating-point type (default: double). */ template struct TimeInfectedCritical { @@ -240,7 +250,8 @@ struct TimeInfectedCritical { }; /** - * @brief Time in days to describe waning immunity to get person from S_PI -> S + * @brief Time in days to describe waning immunity to get susceptible from partial to naive immunity layer. + * @tparam FP The floating-point type (default: double). */ template struct TimeWaningPartialImmunity { @@ -256,7 +267,8 @@ struct TimeWaningPartialImmunity { }; /** - * @brief Time in days to describe waning immunity to get person from SII -> SPI + * @brief Time in days to describe waning immunity to get susceptible from improved to partial immunity layer. + * @tparam FP The floating-point type (default: double). */ template struct TimeWaningImprovedImmunity { @@ -272,8 +284,9 @@ struct TimeWaningImprovedImmunity { }; /** - * @brief the time people stays immune after infection or vaccination located in S - in the model in day unit + * @brief The time people stays immune after infection or vaccination located in naive immunity layer + * in day unit. + * @tparam FP The floating-point type (default: double). */ template struct TimeTemporaryImmunityPI { @@ -289,8 +302,9 @@ struct TimeTemporaryImmunityPI { }; /** - * @brief the time people stays immune after infection or vaccination located in S_PI or S_II - in the model in day unit + * @brief The time people stays immune after infection or vaccination located in the partial or improved immunity layer + * in day unit + * @tparam FP The floating-point type (default: double). */ template struct TimeTemporaryImmunityII { @@ -305,7 +319,8 @@ struct TimeTemporaryImmunityII { } }; /** -* @brief probability of getting infected from a contact +* @brief The probability of getting infected from a single contact. +* @tparam FP The floating-point type (default: double). */ template struct TransmissionProbabilityOnContact { @@ -321,7 +336,8 @@ struct TransmissionProbabilityOnContact { }; /** -* @brief the relative InfectedNoSymptoms infectability +* @brief The relative infectability from individuals located in the InfectedNoSymptoms infection state. +* @tparam FP The floating-point type (default: double). */ template struct RelativeTransmissionNoSymptoms { @@ -337,7 +353,8 @@ struct RelativeTransmissionNoSymptoms { }; /** -* @brief the percentage of asymptomatic cases in the SECIR model +* @brief The percentage of asymptomatic cases in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct RecoveredPerInfectedNoSymptoms { @@ -353,7 +370,8 @@ struct RecoveredPerInfectedNoSymptoms { }; /** -* @brief the risk of infection from symptomatic cases in the SECIR model +* @brief The risk of infection from symptomatic cases in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct RiskOfInfectionFromSymptomatic { @@ -369,7 +387,8 @@ struct RiskOfInfectionFromSymptomatic { }; /** -* @brief risk of infection from symptomatic cases increases as test and trace capacity is exceeded. +* @brief Risk of infection from symptomatic cases increases if test and trace capacity is exceeded. +* @tparam FP The floating-point type (default: double). */ template struct MaxRiskOfInfectionFromSymptomatic { @@ -385,7 +404,8 @@ struct MaxRiskOfInfectionFromSymptomatic { }; /** -* @brief the percentage of hospitalized patients per infected patients in the SECIR model +* @brief The percentage of hospitalized patients per infected patients in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct SeverePerInfectedSymptoms { @@ -401,7 +421,8 @@ struct SeverePerInfectedSymptoms { }; /** -* @brief the percentage of ICU patients per hospitalized patients in the SECIR model +* @brief The percentage of ICU patients per hospitalized patients in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct CriticalPerSevere { @@ -417,7 +438,8 @@ struct CriticalPerSevere { }; /** -* @brief the percentage of dead patients per ICU patients in the SECIR model +* @brief The percentage of dead patients per ICU patients in the SECIRTS model. +* @tparam FP The floating-point type (default: double). */ template struct DeathsPerCritical { @@ -432,24 +454,9 @@ struct DeathsPerCritical { } }; -/** - * @brief Time in days between first and second vaccine dose. - */ -template -struct VaccinationGap { - using Type = CustomIndexArray, AgeGroup>; - static Type get_default(AgeGroup size) - { - return Type(size, 49.0); - } - static std::string name() - { - return "VaccinationGap"; - } -}; - /** * @brief Time in days until first vaccine dose takes full effect. + * @tparam FP The floating-point type (default: double). */ template struct DaysUntilEffectivePartialVaccination { @@ -466,6 +473,7 @@ struct DaysUntilEffectivePartialVaccination { /** * @brief Time in days until second vaccine dose takes full effect. + * @tparam FP The floating-point type (default: double). */ template struct DaysUntilEffectiveImprovedVaccination { @@ -482,6 +490,7 @@ struct DaysUntilEffectiveImprovedVaccination { /** * @brief Time in days until booster vaccine dose takes full effect. + * @tparam FP The floating-point type (default: double). */ template struct DaysUntilEffectiveBoosterImmunity { @@ -498,6 +507,7 @@ struct DaysUntilEffectiveBoosterImmunity { /** * @brief Total number of first vaccinations up to the given day. +* @tparam FP The floating-point type (default: double). */ template struct DailyPartialVaccinations { @@ -514,6 +524,7 @@ struct DailyPartialVaccinations { /** * @brief Total number of full vaccinations up to the given day. +* @tparam FP The floating-point type (default: double). */ template struct DailyFullVaccinations { @@ -530,6 +541,7 @@ struct DailyFullVaccinations { /** * @brief Total number of booster vaccinations up to the given day. +* @tparam FP The floating-point type (default: double). */ template struct DailyBoosterVaccinations { @@ -546,6 +558,7 @@ struct DailyBoosterVaccinations { /** * @brief Factor to reduce infection risk for persons with partial immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducExposedPartialImmunity { @@ -562,6 +575,7 @@ struct ReducExposedPartialImmunity { /** * @brief Factor to reduce infection risk for persons with improved immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducExposedImprovedImmunity { @@ -578,6 +592,7 @@ struct ReducExposedImprovedImmunity { /** * @brief Factor to reduce risk of developing symptoms for persons with partial immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducInfectedSymptomsPartialImmunity { @@ -594,6 +609,7 @@ struct ReducInfectedSymptomsPartialImmunity { /** * @brief Factor to reduce risk of developing symptoms for persons with improved immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducInfectedSymptomsImprovedImmunity { @@ -611,6 +627,7 @@ struct ReducInfectedSymptomsImprovedImmunity { /** * @brief Factor to reduce risk of hospitalization for persons with partial immunity. * Also applies to ICU and Death risk. + * @tparam FP The floating-point type (default: double). */ template struct ReducInfectedSevereCriticalDeadPartialImmunity { @@ -627,6 +644,7 @@ struct ReducInfectedSevereCriticalDeadPartialImmunity { /** * @brief Factor to reduce risk of hospitalization for persons with improved immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducInfectedSevereCriticalDeadImprovedImmunity { @@ -643,6 +661,7 @@ struct ReducInfectedSevereCriticalDeadImprovedImmunity { /** * @brief Factor to reduce infectious time of persons with partial or improved immunity. + * @tparam FP The floating-point type (default: double). */ template struct ReducTimeInfectedMild { @@ -659,6 +678,7 @@ struct ReducTimeInfectedMild { /** * @brief Represents the relative infectiousness of a new variant. + * @tparam FP The floating-point type (default: double). */ template struct InfectiousnessNewVariant { @@ -681,7 +701,7 @@ using ParametersBase = ParameterSet< TimeTemporaryImmunityPI, TimeTemporaryImmunityII, TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, - VaccinationGap, DaysUntilEffectivePartialVaccination, DaysUntilEffectiveImprovedVaccination, + DaysUntilEffectivePartialVaccination, DaysUntilEffectiveImprovedVaccination, DaysUntilEffectiveBoosterImmunity, DailyFullVaccinations, DailyPartialVaccinations, DailyBoosterVaccinations, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, @@ -1005,12 +1025,6 @@ class Parameters : public ParametersBase this->template get>()[i] = 1.0; corrected = true; } - if (this->template get>()[i] < 0.0) { - log_warning("Constraint check: Parameter VaccinationGap changed from {} to {}", - this->template get>()[i], 0); - this->template get>()[i] = 0; - corrected = true; - } } return corrected; } @@ -1148,11 +1162,6 @@ class Parameters : public ParametersBase return true; } - if (this->template get>()[i] < 1) { - log_error("Constraint check: Parameter VaccinationGap smaller {}", 1); - return true; - } - if (this->template get>()[i] < 0.0) { log_error("Constraint check: Parameter DaysUntilEffectivePartialVaccination smaller {}", 0); return true; diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index c5d747b108..6b5e0b684f 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -391,7 +391,6 @@ TEST(TestEpiData, set_vaccination_data) std::vector county_ids = {1001}; mio::osecirts::Model model(num_age_groups); - model.parameters.set>(3); model.parameters.set>(1); model.parameters.set>(2); model.parameters.set>(1); diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index 597fdcd79f..bdcc4e595e 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -1178,10 +1178,6 @@ TEST(TestOdeSECIRTS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); - model.parameters.set>(0.2); - ASSERT_EQ(model.parameters.check_constraints(), 1); - - model.parameters.set>(2); model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1310,10 +1306,6 @@ TEST(TestOdeSECIRTS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set>(-0.2); - EXPECT_EQ(model.parameters.apply_constraints(), 1); - EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); - model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); From 240270d90402844d1be59fca3914de185e7319d8 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:39:10 +0100 Subject: [PATCH 46/60] some doc about the different immunity layers --- cpp/models/ode_secirts/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/models/ode_secirts/README.md b/cpp/models/ode_secirts/README.md index 6156155e06..7ba340a4ae 100644 --- a/cpp/models/ode_secirts/README.md +++ b/cpp/models/ode_secirts/README.md @@ -1,6 +1,7 @@ # SECIRTS-type model including multi-layer waning immunity This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. +We structured the model into three layers of immunity: naive immunity, partial immunity, improved immunity. In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. @@ -32,4 +33,4 @@ Below is an overview of the model architecture and its compartments. | $\mu_{I_{Sy}}^{I_{Sev}}$ | `SeverePerInfectedSymptoms` | Probability of transition from compartment InfectedSymptoms to InfectedSevere. | | $\mu_{I_{Sev}}^{I_{Cr}}$ | `CriticalPerSevere` | Probability of transition from compartment InfectedSevere to InfectedCritical. | | $\mu_{I_{Cr}}^{D}$ | `DeathsPerCritical` | Probability of dying when located in compartment InfectedCritical. | -| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | \ No newline at end of file +| $\kappa$ | `ReducTimeInfectedMild` | Reduction factor for time intervals for specific partial and improved immunity compartments. | From eb6d1818184bc5d15f5d4e7f09f18c1412e428ca Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:54:11 +0100 Subject: [PATCH 47/60] fixes from merge --- cpp/examples/ode_secirvvs.cpp | 4 ++-- cpp/models/ode_secirvvs/README.md | 4 ++-- cpp/models/ode_secirvvs/analyze_result.h | 15 +++++++++------ cpp/models/ode_secirvvs/parameters.h | 2 +- cpp/models/ode_secirvvs/parameters_io.h | 2 +- cpp/tests/test_dynamic_npis.cpp | 24 ++++++++++++------------ cpp/tests/test_odesecirvvs.cpp | 21 +++++++++++---------- 7 files changed, 38 insertions(+), 34 deletions(-) diff --git a/cpp/examples/ode_secirvvs.cpp b/cpp/examples/ode_secirvvs.cpp index bc01829071..53163c7274 100644 --- a/cpp/examples/ode_secirvvs.cpp +++ b/cpp/examples/ode_secirvvs.cpp @@ -67,9 +67,9 @@ int main() model.parameters.get>() = 100; model.parameters.get>() = 0.0143; const size_t daily_vaccinations = 10; - model.parameters.get>().resize( + model.parameters.get>().resize( mio::SimulationDay((size_t)tmax + 1)); - model.parameters.get>().resize(mio::SimulationDay((size_t)tmax + 1)); + model.parameters.get>().resize(mio::SimulationDay((size_t)tmax + 1)); for (size_t i = 0; i < tmax + 1; ++i) { auto num_vaccinations = static_cast(i * daily_vaccinations); model.parameters diff --git a/cpp/models/ode_secirvvs/README.md b/cpp/models/ode_secirvvs/README.md index 0a6750d2ef..327105ef43 100644 --- a/cpp/models/ode_secirvvs/README.md +++ b/cpp/models/ode_secirvvs/README.md @@ -2,7 +2,7 @@ This model extends the basic SECIR model by adding vaccinations and allowing the implicit modeling of a newly arriving variant that takes hold. -Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyFirstVaccination` and `DailyFullVaccinations`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. +Vaccinations are modeled by adding compartments for partially and fully vaccinated persons. `Partially and fully vaccinated` is to be understood in this context as the person having received a first and second vaccine shot as in 2021. These model lines can be reused by resetting parameters. Persons that have recovered from the disease are treated as fully vaccinated from that time forward. Vaccinated persons are added on every day of simulation, see parameters `DailyPartialVaccinations` and `DailyFullVaccinations`. All groups can get an infection or get reinfected. Vaccinated persons are less likely to develop symptoms. E.g., the probability to develop symptoms when carrying the virus is the base probability from the SECIR model multiplied with the `ReducInfectedSymptomsPartialImmunity` parameter. The ratio of two variants can change over time, which affects the average transmissiblity of the disease. Infectiousness of different variants can be set in the parameters. @@ -39,4 +39,4 @@ Examples of the basic SECIR model can be found at: - examples/ode_secir.cpp - examples/ode_secir_ageres.cpp -- examples/ode_secir_parameter_study.cpp \ No newline at end of file +- examples/ode_secir_parameter_study.cpp diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index 29b80e8fcc..3fdd0bd522 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -194,13 +194,16 @@ std::vector ensemble_params_percentile(const std::vector>(); }); - single_element_ensemble[run] = - params.parameters.template get>() * params.populations.get_total(); - } - std::sort(single_element_ensemble.begin(), single_element_ensemble.end()); + for (size_t run = 0; run < num_runs; run++) { + auto const& params = ensemble_params[run][node]; + single_element_ensemble[run] = + params.parameters.template get>() * params.populations.get_total(); + } + std::sort(single_element_ensemble.begin(), single_element_ensemble.end()); + percentile[node].parameters.template set>( single_element_ensemble[static_cast(num_runs * p)]); -} -return percentile; + } + return percentile; } } // namespace osecirvvs diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 0adb4d7f03..059edf80b4 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -629,7 +629,7 @@ using ParametersBase = ParameterSet< RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, DaysUntilEffectiveImprovedImmunity, - DailyFullVaccination, DailyPartialVaccination, ReducExposedPartialImmunity, + DailyFullVaccinations, DailyPartialVaccinations, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index cf2a81c7c1..3cf5765400 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -476,7 +476,7 @@ IOResult set_population_data(std::vector& model, const std::vector< for (auto i = AgeGroup(0); i < num_groups; i++) { double S_v = std::min( - model[region].parameters.template get>()[{i, SimulationDay(0)}] + + model[region].parameters.template get>()[{i, SimulationDay(0)}] + vnum_rec[region][size_t(i)], num_population[region][size_t(i)]); double S_pv = std::max( diff --git a/cpp/tests/test_dynamic_npis.cpp b/cpp/tests/test_dynamic_npis.cpp index 6153744c40..ae32853595 100644 --- a/cpp/tests/test_dynamic_npis.cpp +++ b/cpp/tests/test_dynamic_npis.cpp @@ -480,10 +480,10 @@ TEST(DynamicNPIs, secirvvs_threshold_safe) model.populations.set_difference_from_total({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}, 100.0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); mio::DynamicNPIs npis; npis.set_threshold( @@ -516,10 +516,10 @@ TEST(DynamicNPIs, secirvvs_threshold_exceeded) model.populations.set_difference_from_total({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}, 100); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); mio::DynamicNPIs npis; npis.set_threshold( @@ -553,10 +553,10 @@ TEST(DynamicNPIs, secirvvs_delayed_implementation) model.populations.set_difference_from_total({mio::AgeGroup(0), mio::osecirvvs::InfectionState::SusceptibleNaive}, 100); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); - model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); mio::ContactMatrixGroup& cm = model.parameters.get>(); cm[0] = mio::ContactMatrix(Eigen::MatrixXd::Constant(1, 1, 1.0)); diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 1b13e9d894..695dfd2eef 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -769,8 +769,8 @@ TEST(TestOdeSECIRVVS, export_time_series_init_old_date) auto model = make_model(num_age_groups); // set vaccinations to zero - model.parameters.get>().array().setConstant(0); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); // set all compartments to zero model.populations.array().setConstant(0.0); @@ -847,8 +847,8 @@ TEST(TestOdeSECIRVVS, model_initialization_old_date) constexpr auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups auto model = make_model(num_age_groups); // set vaccinations to zero - model.parameters.get>().array().setConstant(0); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); // set all compartments to zero model.populations.array().setConstant(0.0); @@ -884,8 +884,8 @@ TEST(TestOdeSECIRVVS, model_initialization_old_date_county) constexpr auto num_age_groups = 6; // Data to be read requires RKI confirmed cases data age groups auto model = make_model(num_age_groups); // set vaccinations to zero - model.parameters.get>().array().setConstant(0); - model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().array().setConstant(0); // set all compartments to zero model.populations.array().setConstant(0.0); @@ -923,11 +923,11 @@ TEST(TestOdeSECIRVVS, set_population_data_overflow_vacc) model.populations.array().setConstant(0.0); model.parameters - .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = + .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 1e7 + 1; model.parameters - .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 1e7; + .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 1e7; auto model_vector = std::vector>{model}; @@ -963,10 +963,11 @@ TEST(TestOdeSECIRVVS, set_population_data_no_data_avail) // if the number of vaccinated individuals is greater than the population, we must limit the number of vaccinated. model.parameters - .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; + .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = + 0; model.parameters - .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; + .template get>()[{mio::AgeGroup(0), mio::SimulationDay(0)}] = 0; auto model_vector = std::vector>{model}; From 69d545ac225c503d44681178b15040faa54f7fa7 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:25:07 +0100 Subject: [PATCH 48/60] fix msvc --- cpp/models/ode_secirts/parameters_io.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index c42bb91c18..32f0fffa68 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -138,14 +138,15 @@ IOResult compute_confirmed_cases_data( // (rounded) transition times auto t_exposed = std::round(params_region.template get>()[entry.age_group]); auto t_InfectedNoSymptoms = - std::round(params_region.template get>()[entry.age_group]); + int(std::round(params_region.template get>()[entry.age_group])); auto t_InfectedSymptoms = - std::round(params_region.template get>()[entry.age_group]); - auto t_InfectedSevere = std::round(params_region.template get>()[entry.age_group]); + int(std::round(params_region.template get>()[entry.age_group])); + auto t_InfectedSevere = + int(std::round(params_region.template get>()[entry.age_group])); auto t_InfectedCritical = - std::round(params_region.template get>()[entry.age_group]); + int(std::round(params_region.template get>()[entry.age_group])); auto t_imm_interval_i = - std::round(params_region.template get>()[entry.age_group]); + int(std::round(params_region.template get>()[entry.age_group])); // transition probabilities FP recoveredPerInfectedNoSymptoms = From ce425b31fbba4ca29e9d4ee566b0b2c71d55afd7 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 15 Nov 2024 08:30:35 +0100 Subject: [PATCH 49/60] next try mvsc --- cpp/models/ode_secirts/parameters_io.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 32f0fffa68..c0a3d1f9b9 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -136,17 +136,17 @@ IOResult compute_confirmed_cases_data( auto age = (size_t)entry.age_group; // (rounded) transition times - auto t_exposed = std::round(params_region.template get>()[entry.age_group]); - auto t_InfectedNoSymptoms = - int(std::round(params_region.template get>()[entry.age_group])); - auto t_InfectedSymptoms = - int(std::round(params_region.template get>()[entry.age_group])); - auto t_InfectedSevere = - int(std::round(params_region.template get>()[entry.age_group])); - auto t_InfectedCritical = - int(std::round(params_region.template get>()[entry.age_group])); - auto t_imm_interval_i = - int(std::round(params_region.template get>()[entry.age_group])); + const int t_exposed = std::round(params_region.template get>()[entry.age_group]); + int t_InfectedNoSymptoms = + std::round(params_region.template get>()[entry.age_group]); + int t_InfectedSymptoms = + std::round(params_region.template get>()[entry.age_group]); + const int t_InfectedSevere = + std::round(params_region.template get>()[entry.age_group]); + const int t_InfectedCritical = + std::round(params_region.template get>()[entry.age_group]); + const int t_imm_interval_i = + std::round(params_region.template get>()[entry.age_group]); // transition probabilities FP recoveredPerInfectedNoSymptoms = From 3e165b79f921a562767dd6603bf1b96fcffd9045 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 15 Nov 2024 09:03:12 +0100 Subject: [PATCH 50/60] and again --- cpp/models/ode_secirts/parameters_io.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index c0a3d1f9b9..9dba339781 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -136,17 +136,18 @@ IOResult compute_confirmed_cases_data( auto age = (size_t)entry.age_group; // (rounded) transition times - const int t_exposed = std::round(params_region.template get>()[entry.age_group]); + const int t_exposed = + static_cast(std::round(params_region.template get>()[entry.age_group])); int t_InfectedNoSymptoms = - std::round(params_region.template get>()[entry.age_group]); + static_cast(std::round(params_region.template get>()[entry.age_group])); int t_InfectedSymptoms = - std::round(params_region.template get>()[entry.age_group]); + static_cast(std::round(params_region.template get>()[entry.age_group])); const int t_InfectedSevere = - std::round(params_region.template get>()[entry.age_group]); + static_cast(std::round(params_region.template get>()[entry.age_group])); const int t_InfectedCritical = - std::round(params_region.template get>()[entry.age_group]); - const int t_imm_interval_i = - std::round(params_region.template get>()[entry.age_group]); + static_cast(std::round(params_region.template get>()[entry.age_group])); + const int t_imm_interval_i = static_cast( + std::round(params_region.template get>()[entry.age_group])); // transition probabilities FP recoveredPerInfectedNoSymptoms = @@ -156,10 +157,10 @@ IOResult compute_confirmed_cases_data( // if we select a layer with better immunity (layer > 0), we need to adjust the times and transition rates if (layer > 0) { - t_InfectedNoSymptoms = std::round( - t_InfectedNoSymptoms * params_region.template get>()[entry.age_group]); - t_InfectedSymptoms = std::round( - t_InfectedSymptoms * params_region.template get>()[entry.age_group]); + t_InfectedNoSymptoms = static_cast(std::round( + t_InfectedNoSymptoms * params_region.template get>()[entry.age_group])); + t_InfectedSymptoms = static_cast(std::round( + t_InfectedSymptoms * params_region.template get>()[entry.age_group])); const FP red_fact_exp = layer == 1 ? params_region.template get>()[entry.age_group] From 311ad7739649c470c4729a04129bd82ba64d71b3 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:17:59 +0100 Subject: [PATCH 51/60] rm doubled in check_constraint, bounds in vaccinations --- cpp/models/ode_secirts/model.h | 13 ++++++------- cpp/models/ode_secirts/parameters.h | 9 --------- cpp/tests/test_odesecirts.cpp | 29 +++++++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index aa078c4ba8..e69a2ab296 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -586,22 +586,21 @@ class Model const ScalarType ub = (size_t)t + 1.0; const ScalarType lb = ub - eps; + const auto max_time = static_cast(daily_vaccinations.size()) - 1; + Eigen::VectorXd smoothed_vaccinations((size_t)params.get_num_groups()); smoothed_vaccinations.setZero(); - if (t > ub) { - mio::log_warning("Vaccination time is out of bounds"); - } - - if (static_cast(daily_vaccinations.size()) <= (size_t)t) { + // if daily_vaccinations is not available for the current time point, we return zero vaccinations. + if (max_time <= (size_t)t) { + mio::log_warning("Vaccination data not available for time point ", t, ". Returning zero vaccinations."); return smoothed_vaccinations; } - // check if t is in the range of the interval [lb,ub] if (t >= lb) { for (AgeGroup age = AgeGroup(0); age < params.get_num_groups(); age++) { // if ub + 1 is out of bounds, we use the value at ub auto ubp1 = static_cast(ub + 1); - if (static_cast(daily_vaccinations.size()) < ubp1) { + if (max_time < ubp1) { ubp1 = static_cast(ub); } const auto num_vaccinations_ub = daily_vaccinations[{age, SimulationDay(static_cast(ubp1))}] - diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index c0eacb1cbf..e07010f7d2 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -1222,15 +1222,6 @@ class Parameters : public ParametersBase log_error("Constraint check: Parameter InfectiousnessNewVariant smaller {}", 0); return true; } - - if (this->template get>()[i] < 0.0) { - log_error("Constraint check: Parameter TimeTemporaryImmunityPI smaller {:d}", 0); - return true; - } - if (this->template get>()[i] < 0.0) { - log_error("Constraint check: Parameter TimeTemporaryImmunityII smaller {:d}", 0); - return true; - } } return false; } diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index bdcc4e595e..bc2107753b 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -276,11 +276,16 @@ TEST(TestOdeSECIRTS, smooth_vaccination_rate) const auto eps1 = 0.15; - // test when t is out of the range - Eigen::VectorXd result = model.vaccinations_at(5, daily_vaccinations, eps1); + // test when t is out of bounds + Eigen::VectorXd result = model.vaccinations_at(5.5, daily_vaccinations, eps1); EXPECT_EQ(result.size(), 1); EXPECT_NEAR(result[0], 0, 1e-12); + // test when ub + 1 is out of bounds + result = model.vaccinations_at(1.85, daily_vaccinations, eps1); + EXPECT_EQ(result.size(), 1); + EXPECT_NEAR(result[0], 100, 1e-12); + // test when t i below the lower bound result = model.vaccinations_at(0.5, daily_vaccinations, eps1); EXPECT_EQ(result.size(), 1); @@ -1365,6 +1370,26 @@ TEST(TestOdeSECIRTS, apply_variant_function) model.parameters.set(0); model.parameters.set(10); model.parameters.set>(2.0); + + // set vaccinations + const size_t daily_vaccinations = 1; + const size_t num_days = 5; + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + model.parameters.get>().resize(mio::SimulationDay(num_days)); + for (size_t i = 0; i < num_days; ++i) { + auto num_vaccinations = static_cast(i * daily_vaccinations); + model.parameters + .get>()[{mio::AgeGroup(0), mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters + .get>()[{mio::AgeGroup(0), mio::SimulationDay(i)}] = + num_vaccinations; + model.parameters + .get>()[{mio::AgeGroup(0), mio::SimulationDay(i)}] = + num_vaccinations; + } + auto sim = mio::osecirts::Simulation(model); // test that the transmission probability is not changed due to calling the advance function From 90f1a96f92f09bc211d8b0adb7cd5bf5d9943e4e Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Wed, 20 Nov 2024 09:16:20 +0100 Subject: [PATCH 52/60] some naming, more tests in parameters_io --- cpp/models/ode_secirts/parameters_io.h | 17 ++++++++--------- cpp/tests/test_odesecirts.cpp | 23 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 9dba339781..15e36c7822 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -93,19 +93,19 @@ IOResult compute_confirmed_cases_data( std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, std::vector>& vnum_death, std::vector>& vnum_timm_i, std::vector const& vregion, Date date, const std::vector& model, - const std::vector& scaling_factor_inf, const size_t layer) + const std::vector& scaling_factor_inf, const size_t layer, bool read_icu = false) { auto max_date_entry = std::max_element(case_data.begin(), case_data.end(), [](auto&& a, auto&& b) { return a.date < b.date; }); if (max_date_entry == case_data.end()) { - log_error("RKI data file is empty."); - return failure(StatusCode::InvalidValue, "RKI data is empty."); + log_error("Case data file is empty."); + return failure(StatusCode::InvalidValue, "Case data is empty."); } auto max_date = max_date_entry->date; if (max_date < date) { - log_error("Specified date does not exist in RKI data"); - return failure(StatusCode::OutOfRange, "RKI data does not contain specified date."); + log_error("Specified date does not exist in case data"); + return failure(StatusCode::OutOfRange, "Case data does not contain specified date."); } // shifts the initilization to the recent past if simulation starts @@ -132,8 +132,6 @@ IOResult compute_confirmed_cases_data( auto& num_icu = vnum_icu[region_idx]; auto& num_imm = vnum_timm_i[region_idx]; - bool read_icu = false; - auto age = (size_t)entry.age_group; // (rounded) transition times const int t_exposed = @@ -300,12 +298,13 @@ IOResult read_confirmed_cases_data( std::vector>& vnum_InfectedNoSymptoms, std::vector>& vnum_InfectedSymptoms, std::vector>& vnum_InfectedSevere, std::vector>& vnum_icu, std::vector>& vnum_death, std::vector>& vnum_timm_i, - const std::vector& model, const std::vector& scaling_factor_inf, const size_t layer) + const std::vector& model, const std::vector& scaling_factor_inf, const size_t layer, + bool read_icu = false) { BOOST_OUTCOME_TRY(auto&& case_data, mio::read_confirmed_cases_data(path)); return compute_confirmed_cases_data(case_data, vnum_Exposed, vnum_InfectedNoSymptoms, vnum_InfectedSymptoms, vnum_InfectedSevere, vnum_icu, vnum_death, vnum_timm_i, vregion, date, model, - scaling_factor_inf, layer); + scaling_factor_inf, layer, read_icu); } /** diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index bc2107753b..edd116f3bc 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -708,11 +708,26 @@ TEST(TestOdeSECIRTS, read_confirmed_cases) num_InfectedSevere[0] = std::vector(num_age_groups, 0.0); num_icu[0] = std::vector(num_age_groups, 0.0); - auto read = mio::osecirts::details::read_confirmed_cases_data( - path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, - num_icu, num_death, num_timm, model, std::vector(size_t(num_age_groups), 1.0), 0); + ASSERT_THAT(mio::osecirts::details::read_confirmed_cases_data( + path, region, {2020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, + num_InfectedSevere, num_icu, num_death, num_timm, model, + std::vector(size_t(num_age_groups), 1.0), 0, true), + IsSuccess()); - ASSERT_THAT(read, IsSuccess()); + // read again with invalid date + ASSERT_THAT(mio::osecirts::details::read_confirmed_cases_data( + path, region, {3020, 12, 01}, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, + num_InfectedSevere, num_icu, num_death, num_timm, model, + std::vector(size_t(num_age_groups), 1.0), 0, true), + IsFailure(mio::StatusCode::OutOfRange)); + + // call the compute function with empty case data + const std::vector empty_case_data; + ASSERT_THAT(mio::osecirts::details::compute_confirmed_cases_data( + empty_case_data, num_Exposed, num_InfectedNoSymptoms, num_InfectedSymptoms, num_InfectedSevere, + num_icu, num_death, num_timm, region, {2020, 12, 01}, model, + std::vector(size_t(num_age_groups), 1.0), 0, true), + IsFailure(mio::StatusCode::InvalidValue)); } TEST(TestOdeSECIRTS, read_data) From de4a21d190d82d2c9081fd831c4de7c1472f1b7e Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:18:47 +0100 Subject: [PATCH 53/60] rm old immunity txt file --- data/pydata/Germany/immunity_population.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100755 data/pydata/Germany/immunity_population.txt diff --git a/data/pydata/Germany/immunity_population.txt b/data/pydata/Germany/immunity_population.txt deleted file mode 100755 index 653b1ae446..0000000000 --- a/data/pydata/Germany/immunity_population.txt +++ /dev/null @@ -1,3 +0,0 @@ -0.04 0.04 0.075 0.08 0.035 0.01 -0.61 0.61 0.62 0.62 0.58 0.41 -0.35 0.35 0.305 0.3 0.385 0.58 \ No newline at end of file From 343af7a0662f224ccacca6cf51e6338be39f99ca Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:03:29 +0100 Subject: [PATCH 54/60] rework for review comments --- cpp/models/ode_secirts/README.md | 4 +- cpp/models/ode_secirts/analyze_result.h | 6 +- cpp/models/ode_secirts/infection_state.h | 6 +- cpp/models/ode_secirts/model.h | 117 +++++++++++----------- cpp/models/ode_secirts/parameter_space.h | 50 +++++---- cpp/models/ode_secirts/parameters.h | 6 +- cpp/models/ode_secirts/parameters_io.h | 42 ++++---- cpp/models/ode_secirvvs/analyze_result.h | 6 +- cpp/models/ode_secirvvs/infection_state.h | 6 +- cpp/models/ode_secirvvs/model.h | 6 +- cpp/models/ode_secirvvs/parameter_space.h | 6 +- cpp/models/ode_secirvvs/parameters.h | 6 +- cpp/models/ode_secirvvs/parameters_io.h | 6 +- cpp/tests/test_epi_data_io.cpp | 24 +++-- 14 files changed, 158 insertions(+), 133 deletions(-) diff --git a/cpp/models/ode_secirts/README.md b/cpp/models/ode_secirts/README.md index 7ba340a4ae..dede27f83c 100644 --- a/cpp/models/ode_secirts/README.md +++ b/cpp/models/ode_secirts/README.md @@ -3,9 +3,9 @@ This model extends the SECIRVVS model by adding waning immunity and introducing temporary immunity states that change the meaning of recovery. We structured the model into three layers of immunity: naive immunity, partial immunity, improved immunity. -In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. The parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. +In the model, waning immunity is defined by the parameters `TimeWaningPartialImmunity`, `TimeWaningImprovedImmunity`, `TimeTemporaryImmunityPI`, and `TimeTemporaryImmunityII`. The parameters `TimeWaningPartialImmunity` and `TimeWaningImprovedImmunity` represent the (mean) duration after which an individual transitions from one immunity layer to the next less protected one due to waning immunity, assuming no vaccination or recovery from infection has occurred during this period. Also, the parameters `TimeTemporaryImmunityPI` and `TimeTemporaryImmunityII` denote the (mean) duration of temporary immunity following exposure to the virus, either through vaccination or recovery. During this state of temporary immunity, individuals are protected from reinfection and are incapable of transmitting the virus to others. Should individuals previously reside in the naive or partial immunity layer, their stay in the temporary immunity state results in a transition to the next more protected immunity layer. -For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v1). +For more details about the model, we refer to [1](https://www.medrxiv.org/content/10.1101/2024.03.01.24303602v3). Below is an overview of the model architecture and its compartments. diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index 9df5a15c35..01ed2a94c0 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRTS_ANALYZE_RESULT_H -#define ODESECIRTS_ANALYZE_RESULT_H +#ifndef MIO_ODE_SECIRTS_ANALYZE_RESULT_H +#define MIO_ODE_SECIRTS_ANALYZE_RESULT_H #include "ode_secirts/model.h" #include "memilio/data/analyze_result.h" @@ -211,4 +211,4 @@ std::vector ensemble_params_percentile(const std::vectorpopulations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); - double reducExposedPartialImmunity = params.template get>()[i]; - double reducExposedImprovedImmunity = params.template get>()[i]; - double reducInfectedSymptomsPartialImmunity = + FP reducExposedPartialImmunity = params.template get>()[i]; + FP reducExposedImprovedImmunity = params.template get>()[i]; + FP reducInfectedSymptomsPartialImmunity = params.template get>()[i]; - double reducInfectedSymptomsImprovedImmunity = + FP reducInfectedSymptomsImprovedImmunity = params.template get>()[i]; - double reducInfectedSevereCriticalDeadPartialImmunity = + FP reducInfectedSevereCriticalDeadPartialImmunity = params.template get>()[i]; - double reducInfectedSevereCriticalDeadImprovedImmunity = + FP reducInfectedSevereCriticalDeadImprovedImmunity = params.template get>()[i]; - double reducTimeInfectedMild = params.template get>()[i]; + FP reducTimeInfectedMild = params.template get>()[i]; //symptomatic are less well quarantined when testing and tracing is overwhelmed so they infect more people auto riskFromInfectedSymptomatic = @@ -247,31 +247,29 @@ class Model this->populations.get_flat_index({j, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); // effective contact rate by contact rate between groups i and j and damping j - double season_val = - (1 + params.template get>() * - sin(3.141592653589793 * - (std::fmod((params.template get() + t), 365.0) / 182.5 + 0.5))); - double cont_freq_eff = - season_val * contact_matrix.get_matrix_at(t)(static_cast((size_t)i), - static_cast((size_t)j)); + FP season_val = (1 + params.template get>() * + sin(3.141592653589793 * + (std::fmod((params.template get() + t), 365.0) / 182.5 + 0.5))); + FP cont_freq_eff = season_val * contact_matrix.get_matrix_at(t)(static_cast((size_t)i), + static_cast((size_t)j)); // without died people - double Nj = pop[SNj] + pop[ENj] + pop[INSNj] + pop[ISyNj] + pop[ISevNj] + pop[ICrNj] + pop[INSNCj] + - pop[ISyNCj] + pop[SPIj] + pop[EPIj] + pop[INSPIj] + pop[ISyPIj] + pop[ISevPIj] + - pop[ICrPIj] + pop[INSPICj] + pop[ISyPICj] + pop[SIIj] + pop[EIIj] + pop[INSIIj] + - pop[ISyIIj] + pop[ISevIIj] + pop[ICrIIj] + pop[INSIICj] + pop[ISyIICj]; + FP Nj = pop[SNj] + pop[ENj] + pop[INSNj] + pop[ISyNj] + pop[ISevNj] + pop[ICrNj] + pop[INSNCj] + + pop[ISyNCj] + pop[SPIj] + pop[EPIj] + pop[INSPIj] + pop[ISyPIj] + pop[ISevPIj] + pop[ICrPIj] + + pop[INSPICj] + pop[ISyPICj] + pop[SIIj] + pop[EIIj] + pop[INSIIj] + pop[ISyIIj] + pop[ISevIIj] + + pop[ICrIIj] + pop[INSIICj] + pop[ISyIICj]; - double divNj = (Nj > 0) ? 1.0 / Nj : 0; + FP divNj = (Nj > 0) ? 1.0 / Nj : 0; - double ext_inf_force_dummy = cont_freq_eff * divNj * - params.template get>()[(AgeGroup)i] * - (riskFromInfectedNoSymptoms * (pop[INSNj] + pop[INSPIj] + pop[INSIIj]) + - riskFromInfectedSymptomatic * (pop[ISyNj] + pop[ISyPIj] + pop[ISyIIj])); + FP ext_inf_force_dummy = cont_freq_eff * divNj * + params.template get>()[(AgeGroup)i] * + (riskFromInfectedNoSymptoms * (pop[INSNj] + pop[INSPIj] + pop[INSIIj]) + + riskFromInfectedSymptomatic * (pop[ISyNj] + pop[ISyPIj] + pop[ISyIIj])); - double dummy_SN = y[SNi] * ext_inf_force_dummy; + FP dummy_SN = y[SNi] * ext_inf_force_dummy; - double dummy_SPI = y[SPIi] * reducExposedPartialImmunity * ext_inf_force_dummy; + FP dummy_SPI = y[SPIi] * reducExposedPartialImmunity * ext_inf_force_dummy; - double dummy_SII = y[SIIi] * reducExposedImprovedImmunity * ext_inf_force_dummy; + FP dummy_SII = y[SIIi] * reducExposedImprovedImmunity * ext_inf_force_dummy; flows[this->template get_flat_flow_index({i})] += dummy_SN; @@ -306,12 +304,11 @@ class Model // TODO: if this is used with vaccination model, it has to be adapted if CriticalPerSevere // is different for different vaccination status. This is not the case here and in addition, ICUCapacity // is set to infinity and this functionality is deactivated, so this is OK for the moment. - double criticalPerSevereAdjusted = smoother_cosine( - icu_occupancy, 0.90 * params.template get>(), params.template get>(), - params.template get>()[i], 0); + FP criticalPerSevereAdjusted = smoother_cosine(icu_occupancy, 0.90 * params.template get>(), + params.template get>(), + params.template get>()[i], 0); - double deathsPerSevereAdjusted = - params.template get>()[i] - criticalPerSevereAdjusted; + FP deathsPerSevereAdjusted = params.template get>()[i] - criticalPerSevereAdjusted; /**** path of immune-naive ***/ // Exposed @@ -578,13 +575,13 @@ class Model * @param eps [Default: 0.15] The smoothing factor used in the cosine smoothing function. * @return A vector containing the number of vaccinations for each age group at time t. */ - Eigen::VectorXd vaccinations_at(const ScalarType t, - const CustomIndexArray& daily_vaccinations, - const ScalarType eps = 0.15) const + Eigen::VectorXd vaccinations_at(const FP t, + const CustomIndexArray& daily_vaccinations, + const FP eps = 0.15) const { - auto const& params = this->parameters; - const ScalarType ub = (size_t)t + 1.0; - const ScalarType lb = ub - eps; + auto const& params = this->parameters; + const FP ub = (size_t)t + 1.0; + const FP lb = ub - eps; const auto max_time = static_cast(daily_vaccinations.size()) - 1; @@ -699,20 +696,19 @@ class Simulation : public BaseT * @param [in] base_infectiousness The base infectiousness of the old variant for each age group. */ - void apply_variant(const double t, const CustomIndexArray, AgeGroup> base_infectiousness) + void apply_variant(const FP t, const CustomIndexArray, AgeGroup> base_infectiousness) { auto start_day = this->get_model().parameters.template get(); auto start_day_new_variant = this->get_model().parameters.template get(); if (start_day + t >= start_day_new_variant - 1e-10) { - const double days_variant = t - (start_day_new_variant - start_day); - const double share_new_variant = std::min(1.0, 0.01 * pow(2, (1. / 7) * days_variant)); - const auto num_groups = this->get_model().parameters.get_num_groups(); + const FP days_variant = t - (start_day_new_variant - start_day); + const FP share_new_variant = std::min(1.0, 0.01 * pow(2, (1. / 7) * days_variant)); + const auto num_groups = this->get_model().parameters.get_num_groups(); for (auto i = AgeGroup(0); i < num_groups; ++i) { - double new_transmission = - (1 - share_new_variant) * base_infectiousness[i] + - share_new_variant * base_infectiousness[i] * - this->get_model().parameters.template get>()[i]; + FP new_transmission = (1 - share_new_variant) * base_infectiousness[i] + + share_new_variant * base_infectiousness[i] * + this->get_model().parameters.template get>()[i]; this->get_model().parameters.template get>()[i] = new_transmission; } } @@ -725,7 +721,7 @@ class Simulation : public BaseT * @param tmax next stopping point of simulation * @return value at tmax */ - Eigen::Ref advance(double tmax) + Eigen::Ref advance(FP tmax) { auto& t_end_dyn_npis = this->get_model().parameters.get_end_dynamic_npis(); auto& dyn_npis = this->get_model().parameters.template get>(); @@ -736,7 +732,7 @@ class Simulation : public BaseT // the base value to use it in the apply_variant function and also to reset the parameter after the simulation. auto base_infectiousness = this->get_model().parameters.template get>(); - double delay_lockdown; + FP delay_lockdown; auto t = BaseT::get_result().get_last_time(); const auto dt = dyn_npis.get_interval().get(); while (t < tmax) { @@ -767,12 +763,12 @@ class Simulation : public BaseT auto exceeded_threshold = dyn_npis.get_max_exceeded_threshold(inf_rel); if (exceeded_threshold != dyn_npis.get_thresholds().end() && (exceeded_threshold->first > m_dynamic_npi.first || - t > double(m_dynamic_npi.second))) { //old npi was weaker or is expired + t > FP(m_dynamic_npi.second))) { //old npi was weaker or is expired auto t_start = SimulationTime(t + delay_lockdown); auto t_end = t_start + SimulationTime(dyn_npis.get_duration()); - this->get_model().parameters.get_start_commuter_detection() = (double)t_start; - this->get_model().parameters.get_end_commuter_detection() = (double)t_end; + this->get_model().parameters.get_start_commuter_detection() = (FP)t_start; + this->get_model().parameters.get_end_commuter_detection() = (FP)t_end; m_dynamic_npi = std::make_pair(exceeded_threshold->first, t_end); implement_dynamic_npis(contact_patterns.get_cont_freq_mat(), exceeded_threshold->second, t_start, t_end, [](auto& g) { @@ -795,8 +791,8 @@ class Simulation : public BaseT } private: - double m_t_last_npi_check; - std::pair m_dynamic_npi = {-std::numeric_limits::max(), SimulationTime(0)}; + FP m_t_last_npi_check; + std::pair m_dynamic_npi = {-std::numeric_limits::max(), SimulationTime(0)}; }; /** @@ -840,7 +836,7 @@ inline auto simulate_flows(FP t0, FP tmax, FP dt, const Model& model, template FP get_infections_relative(const Simulation& sim, FP /*t*/, const Eigen::Ref>& y) { - double sum_inf = 0; + FP sum_inf = 0; for (auto i = AgeGroup(0); i < sim.get_model().parameters.get_num_groups(); ++i) { sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsNaive}); sum_inf += sim.get_model().populations.get_from(y, {i, InfectionState::InfectedSymptomsNaiveConfirmed}); @@ -905,6 +901,15 @@ auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::R return factors; } +/** + * @brief Adjusts the state of commuters in a model, accounting for detection and mobility effects. + * + * @tparam FP Floating-point type, e.g., double. + * @tparam Base Simulation type that uses the SECIRTS-type model. see Simulation. + * @param[in,out] sim Simulation object containing the model and result data. + * @param[in,out] migrated Vector representing the number of commuters in each state. + * @param[in] time Current simulation time, used to determine the commuter detection period. + */ template , FP>> auto test_commuters(Simulation& sim, Eigen::Ref> migrated, FP time) { @@ -963,4 +968,4 @@ auto test_commuters(Simulation& sim, Eigen::Ref> migrated, } // namespace osecirts } // namespace mio -#endif //ODESECIRTS_MODEL_H +#endif //MIO_ODE_SECIRTS_MODEL_H diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index bc940c78ca..ae73f1c6a9 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRTS_PARAMETER_SPACE_H -#define ODESECIRTS_PARAMETER_SPACE_H +#ifndef MIO_ODE_SECIRTS_PARAMETER_SPACE_H +#define MIO_ODE_SECIRTS_PARAMETER_SPACE_H #include "memilio/mobility/metapopulation_mobility_instant.h" #include "memilio/utils/memory.h" @@ -37,10 +37,11 @@ namespace mio namespace osecirts { /** -* draws a sample from the specified distributions for all parameters related to the demographics, e.g. population. -* @tparam FP floating point type, e.g., double -* @param[inout] model Model including contact patterns for alle age groups -*/ + * Draws a sample from the specified distributions for all parameters + * related to the demographics, e.g., population. + * @tparam FP Floating point type, e.g., double. + * @param[inout] model Model including contact patterns for all age groups + */ template void draw_sample_demographics(Model& model) { @@ -118,10 +119,12 @@ void draw_sample_demographics(Model& model) } /** -* draws a sample from the specified distributions for all parameters related to the infection. -* @tparam FP floating point type, e.g., double -* @param[inout] model Model including contact patterns for alle age groups -*/ + * Draws a sample from the specified distributions for all parameters + * related to the infection. + * + * @tparam FP Floating point type, e.g., double. + * @param[inout] model Model including contact patterns for all age groups. + */ template void draw_sample_infection(Model& model) { @@ -185,11 +188,13 @@ void draw_sample_infection(Model& model) } } -/** Draws a sample from Model parameter distributions and stores sample values -* as Parameters parameter values (cf. UncertainValue and Parameters classes) -* @tparam FP floating point type, e.g., double -* @param[inout] model Model including contact patterns for alle age groups -*/ +/** + * Draws a sample from model parameter distributions and stores sample values + * as parameters values (cf. UncertainValue and Parameters classes). + * + * @tparam FP Floating point type, e.g., double. + * @param[inout] model Model including contact patterns for all age groups. + */ template void draw_sample(Model& model) { @@ -200,12 +205,13 @@ void draw_sample(Model& model) } /** -* Draws samples for each model node in a graph. -* Some parameters are shared between nodes and only sampled once. -* @tparam FP floating point type, e.g., double -* @param graph Graph to be sampled. -* @return Graph with nodes and edges from the input graph sampled. -*/ + * Draws samples for each model node in a graph. + * Some parameters are shared between nodes and are only sampled once. + * + * @tparam FP Floating point type, e.g., double. + * @param graph Graph to be sampled. + * @return Graph with nodes and edges from the input graph sampled. + */ template Graph, MobilityParameters> draw_sample(Graph, MobilityParameters>& graph) { @@ -260,4 +266,4 @@ Graph, MobilityParameters> draw_sample(Graph, MobilityPa } // namespace osecirts } // namespace mio -#endif // ODESECIRTS_PARAMETER_SPACE_H +#endif // MIO_ODE_SECIRTS_PARAMETER_SPACE_H diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index e07010f7d2..33253a70b6 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRTS_PARAMETERS_H -#define ODESECIRTS_PARAMETERS_H +#ifndef MIO_ODE_SECIRTS_PARAMETERS_H +#define MIO_ODE_SECIRTS_PARAMETERS_H #include "memilio/math/eigen.h" #include "memilio/utils/uncertain_value.h" @@ -1256,4 +1256,4 @@ class Parameters : public ParametersBase } // namespace osecirts } // namespace mio -#endif // ODESECIRTS_PARAMETERS_H +#endif // MIO_ODE_SECIRTS_PARAMETERS_H diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 15e36c7822..06fc45f966 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRTS_PARAMETERS_IO_H -#define ODESECIRTS_PARAMETERS_IO_H +#ifndef MIO_ODE_SECIRTS_PARAMETERS_IO_H +#define MIO_ODE_SECIRTS_PARAMETERS_IO_H #include "memilio/config.h" @@ -663,20 +663,28 @@ IOResult set_divi_data(std::vector& model, const std::string& path, } /** -* @brief reads population data from census data. -* @param[in] path Path to the population data file. -* @param[in] population_data Vector of population data entries. -* @param[in] vregion Vector of keys representing the regions of interest. -* @return An IOResult containing a vector of vectors, where each inner vector represents the population -* distribution across age groups for a specific region, or an error if the function fails. -* @see mio::read_population_data -* @{ -*/ + * @brief Reads population data from census data. + * + * @param[in] path Path to the population data file. + * @param[in] vregion Vector of keys representing the regions of interest. + * @return An IOResult containing a vector of vectors, where each inner vector represents the population + * distribution across age groups for a specific region, or an error if the function fails. + * @see mio::read_population_data + */ IOResult>> read_population_data(const std::string& path, const std::vector& vregion); + +/** + * @brief Reads population data from a vector of population data entries. + * + * @param[in] population_data Vector of population data entries. + * @param[in] vregion Vector of keys representing the regions of interest. + * @return An IOResult containing a vector of vectors, where each inner vector represents the population + * distribution across age groups for a specific region, or an error if the function fails. + * @see mio::read_population_data + */ IOResult>> read_population_data(const std::vector& population_data, const std::vector& vregion); -/**@}*/ /** * @brief Sets the population data for the given models based on the provided population distribution and immunity levels. @@ -1076,8 +1084,8 @@ IOResult read_input_data_county(std::vector& model, Date date, cons // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! // Run time equals run time of the previous functions times the num_days ! // (This only represents the vectorization of the previous function over all simulation days...) - log_warning("Exporting time series of extrapolated real data. This may take some minutes. " - "For simulation runs over the same time period, deactivate it."); + log_info("Exporting time series of extrapolated real data. This may take some minutes. " + "For simulation runs over the same time period, deactivate it."); BOOST_OUTCOME_TRY(export_input_data_county_timeseries( model, dir, county, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(dir, "pydata/Germany", "county_divi_ma7.json"), @@ -1138,8 +1146,8 @@ IOResult read_input_data(std::vector& model, Date date, const std:: // Use only if extrapolated real data is needed for comparison. EXPENSIVE ! // Run time equals run time of the previous functions times the num_days ! // (This only represents the vectorization of the previous function over all simulation days...) - log_warning("Exporting time series of extrapolated real data. This may take some minutes. " - "For simulation runs over the same time period, deactivate it."); + log_info("Exporting time series of extrapolated real data. This may take some minutes. " + "For simulation runs over the same time period, deactivate it."); BOOST_OUTCOME_TRY(export_input_data_county_timeseries( model, data_dir, node_ids, date, scaling_factor_inf, scaling_factor_icu, num_days, path_join(data_dir, "critical_cases.json"), path_join(data_dir, "confirmed_cases.json"), @@ -1155,4 +1163,4 @@ IOResult read_input_data(std::vector& model, Date date, const std:: #endif // MEMILIO_HAS_JSONCPP -#endif // ODESECIRTS_PARAMETERS_IO_H +#endif // MIO_ODE_SECIRTS_PARAMETERS_IO_H diff --git a/cpp/models/ode_secirvvs/analyze_result.h b/cpp/models/ode_secirvvs/analyze_result.h index 3fdd0bd522..3d72ca6a92 100644 --- a/cpp/models/ode_secirvvs/analyze_result.h +++ b/cpp/models/ode_secirvvs/analyze_result.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRVVS_ANALYZE_RESULT_H -#define ODESECIRVVS_ANALYZE_RESULT_H +#ifndef MIO_ODE_SECIRVVS_ANALYZE_RESULT_H +#define MIO_ODE_SECIRVVS_ANALYZE_RESULT_H #include "ode_secirvvs/infection_state.h" #include "ode_secirvvs/parameters.h" @@ -209,4 +209,4 @@ std::vector ensemble_params_percentile(const std::vector& sim, Eigen::Ref> mobile_pop } // namespace osecirvvs } // namespace mio -#endif //ODESECIRVVS_MODEL_H +#endif //MIO_ODE_SECIRVVS_MODEL_H diff --git a/cpp/models/ode_secirvvs/parameter_space.h b/cpp/models/ode_secirvvs/parameter_space.h index e5dc6e7720..049df74f5f 100644 --- a/cpp/models/ode_secirvvs/parameter_space.h +++ b/cpp/models/ode_secirvvs/parameter_space.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRVVS_PARAMETER_SPACE_H -#define ODESECIRVVS_PARAMETER_SPACE_H +#ifndef MIO_ODE_SECIRVVS_PARAMETER_SPACE_H +#define MIO_ODE_SECIRVVS_PARAMETER_SPACE_H #include "memilio/mobility/metapopulation_mobility_instant.h" #include "memilio/utils/logging.h" @@ -226,4 +226,4 @@ Graph, MobilityParameters> draw_sample(Graph, MobilityPa } // namespace osecirvvs } // namespace mio -#endif // ODESECIRVVS_PARAMETER_SPACE_H +#endif // MIO_ODE_SECIRVVS_PARAMETER_SPACE_H diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index 059edf80b4..a69f96bb79 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRVVS_PARAMETERS_H -#define ODESECIRVVS_PARAMETERS_H +#ifndef MIO_ODE_SECIRVVS_PARAMETERS_H +#define MIO_ODE_SECIRVVS_PARAMETERS_H #include "memilio/epidemiology/age_group.h" #include "memilio/epidemiology/dynamic_npis.h" @@ -1158,4 +1158,4 @@ class Parameters : public ParametersBase } // namespace osecirvvs } // namespace mio -#endif // ODESECIRVVS_PARAMETERS_H +#endif // MIO_ODE_SECIRVVS_PARAMETERS_H diff --git a/cpp/models/ode_secirvvs/parameters_io.h b/cpp/models/ode_secirvvs/parameters_io.h index 3cf5765400..dbf0056d26 100644 --- a/cpp/models/ode_secirvvs/parameters_io.h +++ b/cpp/models/ode_secirvvs/parameters_io.h @@ -17,8 +17,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef ODESECIRVVS_PARAMETERS_IO_H -#define ODESECIRVVS_PARAMETERS_IO_H +#ifndef MIO_ODE_SECIRVVS_PARAMETERS_IO_H +#define MIO_ODE_SECIRVVS_PARAMETERS_IO_H #include "memilio/config.h" @@ -1030,4 +1030,4 @@ IOResult read_input_data(std::vector& model, Date date, const std:: #endif // MEMILIO_HAS_JSONCPP -#endif // ODESECIRVVS_PARAMETERS_IO_H +#endif // MIO_ODE_SECIRVVS_PARAMETERS_IO_H diff --git a/cpp/tests/test_epi_data_io.cpp b/cpp/tests/test_epi_data_io.cpp index 6b5e0b684f..ad09c61b15 100644 --- a/cpp/tests/test_epi_data_io.cpp +++ b/cpp/tests/test_epi_data_io.cpp @@ -445,15 +445,21 @@ TEST(TestEpiData, vaccination_data) auto&& vacc_data = r.value(); ASSERT_EQ(vacc_data.size(), 2); - ASSERT_EQ(vacc_data[0].date, mio::Date(2021, 12, 1)); - ASSERT_EQ(vacc_data[0].age_group, mio::AgeGroup(1)); - ASSERT_EQ(vacc_data[0].county_id, mio::regions::CountyId(1011)); - ASSERT_EQ(vacc_data[0].num_vaccinations_completed, 23.05); - - ASSERT_EQ(vacc_data[1].date, mio::Date(2021, 12, 2)); - ASSERT_EQ(vacc_data[1].age_group, mio::AgeGroup(5)); - ASSERT_EQ(vacc_data[1].county_id, mio::regions::CountyId(1012)); - ASSERT_EQ(vacc_data[1].num_vaccinations_completed, 12.0); + EXPECT_EQ(vacc_data[0].date, mio::Date(2021, 12, 1)); + EXPECT_EQ(vacc_data[0].age_group, mio::AgeGroup(1)); + EXPECT_EQ(vacc_data[0].county_id, mio::regions::CountyId(1011)); + EXPECT_EQ(vacc_data[0].num_vaccinations_completed, 23.05); + EXPECT_EQ(vacc_data[0].num_vaccinations_partial, 2.0); + EXPECT_EQ(vacc_data[0].num_vaccinations_refreshed_first, 6.2); + EXPECT_EQ(vacc_data[0].num_vaccinations_refreshed_additional, 10.05); + + EXPECT_EQ(vacc_data[1].date, mio::Date(2021, 12, 2)); + EXPECT_EQ(vacc_data[1].age_group, mio::AgeGroup(5)); + EXPECT_EQ(vacc_data[1].county_id, mio::regions::CountyId(1012)); + EXPECT_EQ(vacc_data[1].num_vaccinations_completed, 12.0); + EXPECT_EQ(vacc_data[1].num_vaccinations_partial, 14.0); + EXPECT_EQ(vacc_data[1].num_vaccinations_refreshed_first, 6.2); + EXPECT_EQ(vacc_data[1].num_vaccinations_refreshed_additional, 0.0); } TEST(TestEpiData, vaccination_data_error_age) From 5d0749c44aeb59fdff8bf8b3c434775324cedea7 Mon Sep 17 00:00:00 2001 From: Henrik Zunker <69154294+HenrZu@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:04:52 +0100 Subject: [PATCH 55/60] Update cpp/simulations/CMakeLists.txt Co-authored-by: reneSchm <49305466+reneSchm@users.noreply.github.com> --- cpp/simulations/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/simulations/CMakeLists.txt b/cpp/simulations/CMakeLists.txt index 170feee470..a784b83ba5 100644 --- a/cpp/simulations/CMakeLists.txt +++ b/cpp/simulations/CMakeLists.txt @@ -6,7 +6,7 @@ if(MEMILIO_HAS_JSONCPP AND MEMILIO_HAS_HDF5) add_executable(2021_vaccination_delta 2021_vaccination_sarscov2_delta_germany.cpp) target_link_libraries(2021_vaccination_delta PRIVATE memilio ode_secirvvs Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(2021_vaccination_delta PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) - + add_executable(abm_simulation abm.cpp) target_link_libraries(abm_simulation PRIVATE memilio abm Boost::filesystem ${HDF5_C_LIBRARIES}) target_compile_options(abm_simulation PRIVATE ${MEMILIO_CXX_FLAGS_ENABLE_WARNING_ERRORS}) From 8039e021de63ec9544c9f512572ddb2cc48bf609 Mon Sep 17 00:00:00 2001 From: Henrik Zunker <69154294+HenrZu@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:05:10 +0100 Subject: [PATCH 56/60] Update cpp/models/ode_secirts/parameters_io.h Co-authored-by: reneSchm <49305466+reneSchm@users.noreply.github.com> --- cpp/models/ode_secirts/parameters_io.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index 06fc45f966..ad0a18d619 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -56,9 +56,16 @@ namespace details template int get_region_id(const EpiDataEntry& data_entry) { - return data_entry.county_id ? data_entry.county_id->get() - : (data_entry.state_id ? data_entry.state_id->get() - : (data_entry.district_id ? data_entry.district_id->get() : 0)); + if (data_entry.county_id) { + return data_entry.county_id->get(); + } + if (data_entry.state_id) { + return data_entry.state_id->get(); + } + if (data_entry.district_id) { + return data_entry.district_id->get(); + } + return 0; } /** From 309f351d53c77152aa3de1df148b7d3ba2a2d843 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:56:32 +0100 Subject: [PATCH 57/60] update author list --- cpp/models/ode_secirts/analyze_result.cpp | 2 +- cpp/models/ode_secirts/analyze_result.h | 2 +- cpp/models/ode_secirts/model.cpp | 2 +- cpp/models/ode_secirts/parameter_space.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp/models/ode_secirts/analyze_result.cpp b/cpp/models/ode_secirts/analyze_result.cpp index 9b50b95f0d..1658276dea 100644 --- a/cpp/models/ode_secirts/analyze_result.cpp +++ b/cpp/models/ode_secirts/analyze_result.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele +* Authors: Henrik Zunker * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index 01ed2a94c0..16a83ac1c4 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirts/model.cpp b/cpp/models/ode_secirts/model.cpp index 5969707b6b..279d85f20b 100644 --- a/cpp/models/ode_secirts/model.cpp +++ b/cpp/models/ode_secirts/model.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker * * Contact: Martin J. Kuehn * diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index ae73f1c6a9..5e24b40569 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2020-2024 MEmilio * -* Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn +* Authors: Henrik Zunker, Wadim Koslow, Daniel Abele, Martin J. Kühn * * Contact: Martin J. Kuehn * From a4f217d1a773811e7875bc37ae5c42957c9f5e18 Mon Sep 17 00:00:00 2001 From: Henrik Zunker <69154294+HenrZu@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:12:19 +0100 Subject: [PATCH 58/60] Update cpp/models/ode_secirts/README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Martin J. Kühn <62713180+mknaranja@users.noreply.github.com> --- cpp/models/ode_secirts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/models/ode_secirts/README.md b/cpp/models/ode_secirts/README.md index dede27f83c..06f8a5e563 100644 --- a/cpp/models/ode_secirts/README.md +++ b/cpp/models/ode_secirts/README.md @@ -15,7 +15,7 @@ Below is an overview of the model architecture and its compartments. | $\lambda_{N,i} = \rho_{N,i} \sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `ext_inf_force_dummy` | Force of infection for susceptibles located in the naive immunity level. | | $\lambda_{PI,i} = \rho_{PI,i}\sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `reducExposedPartialImmunity * ext_inf_force_dummy` | Force of infection for susceptibles located in the partial immunity level. | | $\lambda_{II,i} = \rho_{II}\sum_j \phi_{i,j}\frac{\xi_{I_{NS}} (I_{NS,N,j} + I_{NS,PI,j} + I_{NS,II,j}) + \xi_{I_{Sy}} (I_{Sy,N,j} + I_{Sy,PI,j}+ I_{Sy,II,j})}{N_j^{D^\perp}}$ | `reducExposedImprovedImmunity * ext_inf_force_dummy` | Force of infection for susceptibles located in the improved immunity level. | -| $\phi$ | `ContactPatterns` | Matrix of daily contact rates / number of daily contacts between different age groups. | +| $\phi$ | `ContactPatterns` | Matrix of daily contact rates, i.e., number of daily contacts between different age groups. | | $\rho$ | `TransmissionProbabilityOnContact` | Transmission risk for people located in one of the susceptible compartments. | | $\xi_{I_{NS}}$ | `RelativeTransmissionNoSymptoms` | Proportion of asymptomatically infected people who are not isolated (time-dependent if `TestAndTraceCapacity` used). | | $\xi_{I_{Sy}}$ | `riskFromInfectedSymptomatic` | Proportion of symptomatically infected people who are not isolated (time-dependent if `TestAndTraceCapacity` used). | From 6b7433f6ad320ff6fae26ee61e316cd193c47c57 Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Sat, 7 Dec 2024 19:16:55 +0100 Subject: [PATCH 59/60] rename TIs, PR 982, PR 1104, Factors TT, --- cpp/examples/ode_secirts.cpp | 8 +- cpp/models/ode_secirts/README.md | 4 +- cpp/models/ode_secirts/analyze_result.h | 4 + cpp/models/ode_secirts/infection_state.h | 4 +- cpp/models/ode_secirts/model.h | 117 ++++++++++++----------- cpp/models/ode_secirts/parameter_space.h | 4 +- cpp/models/ode_secirts/parameters.h | 113 ++++++++++++++++++++-- cpp/models/ode_secirts/parameters_io.h | 8 +- cpp/tests/test_odesecirts.cpp | 63 +++++++++++- 9 files changed, 241 insertions(+), 84 deletions(-) diff --git a/cpp/examples/ode_secirts.cpp b/cpp/examples/ode_secirts.cpp index cc52417661..354c4bc087 100644 --- a/cpp/examples/ode_secirts.cpp +++ b/cpp/examples/ode_secirts.cpp @@ -65,8 +65,8 @@ int main() model.populations[{i, mio::osecirts::InfectionState::SusceptibleNaive}] = 1000; model.populations[{i, mio::osecirts::InfectionState::SusceptiblePartialImmunity}] = 1200; model.populations[{i, mio::osecirts::InfectionState::SusceptibleImprovedImmunity}] = 1000; - model.populations[{i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity}] = 60; - model.populations[{i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity}] = 70; + model.populations[{i, mio::osecirts::InfectionState::TemporaryImmunePartialImmunity}] = 60; + model.populations[{i, mio::osecirts::InfectionState::TemporaryImmuneImprovedImmunity}] = 70; model.populations[{i, mio::osecirts::InfectionState::DeadNaive}] = 0; model.populations[{i, mio::osecirts::InfectionState::DeadPartialImmunity}] = 0; model.populations[{i, mio::osecirts::InfectionState::DeadImprovedImmunity}] = 0; @@ -144,9 +144,9 @@ int main() double timm_ii = 0.0; for (mio::AgeGroup i = 0; i < nb_groups; i++) { timm_pi += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( - {i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity})]; + {i, mio::osecirts::InfectionState::TemporaryImmunePartialImmunity})]; timm_ii += result_interpolated.get_value(t_indx)[model.populations.get_flat_index( - {i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity})]; + {i, mio::osecirts::InfectionState::TemporaryImmuneImprovedImmunity})]; } printf("t=%i, timm_pi=%f, timm_ii=%f\n", int(result_interpolated.get_time(t_indx)), timm_pi, timm_ii); } diff --git a/cpp/models/ode_secirts/README.md b/cpp/models/ode_secirts/README.md index 06f8a5e563..0b30349122 100644 --- a/cpp/models/ode_secirts/README.md +++ b/cpp/models/ode_secirts/README.md @@ -25,8 +25,8 @@ Below is an overview of the model architecture and its compartments. | $T_{I_{Sy}}$ | `TimeInfectedSymptoms` | Time in days an individual stays in the InfectedSymptoms compartment. | | $T_{I_{Sev}}$ | `TimeInfectedSevere` | Time in days an individual stays in the InfectedSevere compartment. | | $T_{I_{Cr}}$ | `TimeInfectedCritical` | Time in days an individual stays in the InfectedCritical compartment. | -| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunPartialImmunity compartment. | -| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmunImprovedImmunity compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityPI` | Time in days an individual stays in the TemporaryImmunePartialImmunity compartment. | +| $T_{\mathcal{I}_{PI}}$ | `TimeTemporaryImmunityII` | Time in days an individual stays in the TemporaryImmuneImprovedImmunity compartment. | | $T_{W_{PI}}$ | `TimeWaningPartialImmunity` | Time in days an individual stays in the SusceptiblePartialImmunity compartment before waning to the SusceptibleNaive compartment assuming no exposure occurred during this period. | | $T_{W_{II}}$ | `TimeWaningImprovedImmunity` | Time in days an individual stays in the SusceptibleImprovedImmunity compartment before waning to the SusceptiblePartialImmunity compartment assuming no exposure occurred during this period. | | $\mu_{I_{NS}}^{I_{Sy}}$ | `1 - RecoveredPerInfectedNoSymptoms` | Probability of transition from compartment InfectedNoSymptoms to InfectedSymptoms. | diff --git a/cpp/models/ode_secirts/analyze_result.h b/cpp/models/ode_secirts/analyze_result.h index 16a83ac1c4..20583ed85d 100644 --- a/cpp/models/ode_secirts/analyze_result.h +++ b/cpp/models/ode_secirts/analyze_result.h @@ -194,6 +194,10 @@ std::vector ensemble_params_percentile(const std::vector auto& { return model.parameters.template get>(); }); param_percentil( node, [](auto&& model) -> auto& { return model.parameters.template get>(); }); + param_percentil( + node, [](auto&& model) -> auto& { + return model.parameters.template get>(); + }); for (size_t run = 0; run < num_runs; run++) { diff --git a/cpp/models/ode_secirts/infection_state.h b/cpp/models/ode_secirts/infection_state.h index 319cc0a81b..d2243c3434 100644 --- a/cpp/models/ode_secirts/infection_state.h +++ b/cpp/models/ode_secirts/infection_state.h @@ -62,8 +62,8 @@ enum class InfectionState DeadNaive, DeadPartialImmunity, DeadImprovedImmunity, - TemporaryImmunPartialImmunity, - TemporaryImmunImprovedImmunity, + TemporaryImmunePartialImmunity, + TemporaryImmuneImprovedImmunity, Count }; diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index e3a7a4ad55..0fbda5af91 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -37,63 +37,62 @@ namespace osecirts using Flows = TypeList< //naive Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, - Flow, + Flow, + Flow, //partial immunity Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, //improved immunity Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, - Flow, + Flow, Flow, Flow, - Flow, + Flow, // waning - Flow, - Flow, + Flow, + Flow, Flow, Flow>; - // clang-format on template @@ -180,8 +179,8 @@ class Model this->populations.get_flat_index({i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed}); size_t ISyIICi = this->populations.get_flat_index({i, InfectionState::InfectedSymptomsImprovedImmunityConfirmed}); - size_t TImm1 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunPartialImmunity}); - size_t TImm2 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunImprovedImmunity}); + size_t TImm1 = this->populations.get_flat_index({i, InfectionState::TemporaryImmunePartialImmunity}); + size_t TImm2 = this->populations.get_flat_index({i, InfectionState::TemporaryImmuneImprovedImmunity}); size_t SIIi = this->populations.get_flat_index({i, InfectionState::SusceptibleImprovedImmunity}); @@ -200,13 +199,15 @@ class Model //symptomatic are less well quarantined when testing and tracing is overwhelmed so they infect more people auto riskFromInfectedSymptomatic = smoother_cosine(test_and_trace_required, params.template get>(), - params.template get>() * 15, + params.template get>() * + params.template get>(), params.template get>()[i], params.template get>()[i]); auto riskFromInfectedNoSymptoms = smoother_cosine(test_and_trace_required, params.template get>(), - params.template get>() * 2, + params.template get>() * + params.template get>(), params.template get>()[i], 1.0); for (auto j = AgeGroup(0); j < n_agegroups; j++) { @@ -258,7 +259,7 @@ class Model pop[INSPICj] + pop[ISyPICj] + pop[SIIj] + pop[EIIj] + pop[INSIIj] + pop[ISyIIj] + pop[ISevIIj] + pop[ICrIIj] + pop[INSIICj] + pop[ISyIICj]; - FP divNj = (Nj > 0) ? 1.0 / Nj : 0; + const FP divNj = (Nj < Limits::zero_tolerance()) ? 0.0 : 1.0 / Nj; FP ext_inf_force_dummy = cont_freq_eff * divNj * params.template get>()[(AgeGroup)i] * @@ -281,20 +282,20 @@ class Model // vaccinations flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = std::min(y[SNi] - flows[this->template get_flat_flow_index({i})], partial_vaccination[static_cast(i)]); flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = std::min(y[SPIi] - flows[this->template get_flat_flow_index({i})], full_vaccination[static_cast(i)]); flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = std::min(y[SIIi] - flows[this->template get_flat_flow_index({i})], @@ -318,7 +319,7 @@ class Model // InfectedNoSymptoms flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = params.template get>()[i] * (1 / params.template get>()[i]) * y[INSNi]; flows[this->template get_flat_flow_index>()[i]) / params.template get>()[i] * y[INSNCi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = params.template get>()[i] * (1 / params.template get>()[i]) * y[INSNCi]; @@ -341,7 +342,7 @@ class Model params.template get>()[i] * y[ISyNi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = (1 - params.template get>()[i]) / params.template get>()[i] * y[ISyNi]; @@ -351,7 +352,7 @@ class Model params.template get>()[i] * y[ISyNCi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = (1 - params.template get>()[i]) / params.template get>()[i] * y[ISyNCi]; @@ -361,7 +362,7 @@ class Model criticalPerSevereAdjusted / params.template get>()[i] * y[ISevNi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = (1 - params.template get>()[i]) / params.template get>()[i] * y[ISevNi]; @@ -373,7 +374,7 @@ class Model params.template get>()[i] * y[ICrNi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmunePartialImmunity>({i})] = (1 - params.template get>()[i]) / params.template get>()[i] * y[ICrNi]; @@ -381,7 +382,7 @@ class Model flows[this->template get_flat_flow_index({i})] = 1 / params.template get>()[i] * y[SPIi]; - flows[this->template get_flat_flow_indextemplate get_flat_flow_index({i})] = 1 / params.template get>()[i] * y[TImm1]; @@ -394,7 +395,7 @@ class Model // InfectedNoSymptoms flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.template get>()[i])) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSPIi]; @@ -409,7 +410,7 @@ class Model (1 - params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSPICi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsPartialImmunity / reducExposedPartialImmunity) * (1 - params.template get>()[i])) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSPICi]; @@ -422,7 +423,7 @@ class Model (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPIi]; @@ -434,7 +435,7 @@ class Model (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPICi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSymptomsPartialImmunity) * params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[ISyPICi]; @@ -446,7 +447,7 @@ class Model criticalPerSevereAdjusted / params.template get>()[i] * y[ISevPIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.template get>()[i]) / params.template get>()[i] * y[ISevPIi]; @@ -463,7 +464,7 @@ class Model y[ICrPIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadPartialImmunity / reducInfectedSevereCriticalDeadPartialImmunity) * params.template get>()[i]) / params.template get>()[i] * y[ICrPIi]; @@ -476,7 +477,7 @@ class Model // InfectedNoSymptoms flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.template get>()[i])) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSIIi]; @@ -491,7 +492,7 @@ class Model (1 - params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSIICi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSymptomsImprovedImmunity / reducExposedImprovedImmunity) * (1 - params.template get>()[i])) / (params.template get>()[i] * reducTimeInfectedMild) * y[INSIICi]; @@ -504,7 +505,7 @@ class Model (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIIi]; @@ -516,7 +517,7 @@ class Model (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIICi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSymptomsImprovedImmunity) * params.template get>()[i]) / (params.template get>()[i] * reducTimeInfectedMild) * y[ISyIICi]; @@ -528,7 +529,7 @@ class Model criticalPerSevereAdjusted / params.template get>()[i] * y[ISevIIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.template get>()[i]) / @@ -547,14 +548,14 @@ class Model y[ICrIIi]; flows[this->template get_flat_flow_index({i})] = + InfectionState::TemporaryImmuneImprovedImmunity>({i})] = (1 - (reducInfectedSevereCriticalDeadImprovedImmunity / reducInfectedSevereCriticalDeadImprovedImmunity) * params.template get>()[i]) / params.template get>()[i] * y[ICrIIi]; // Waning immunity - flows[this->template get_flat_flow_indextemplate get_flat_flow_index({i})] = 1 / params.template get>()[i] * y[TImm2]; @@ -732,7 +733,7 @@ class Simulation : public BaseT // the base value to use it in the apply_variant function and also to reset the parameter after the simulation. auto base_infectiousness = this->get_model().parameters.template get>(); - FP delay_lockdown; + FP delay_npi_implementation; auto t = BaseT::get_result().get_last_time(); const auto dt = dyn_npis.get_interval().get(); while (t < tmax) { @@ -748,10 +749,12 @@ class Simulation : public BaseT } if (t > 0) { - delay_lockdown = 7; + delay_npi_implementation = + this->get_model().parameters.template get>(); } else { - delay_lockdown = 0; + // DynamicNPIs for t=0 are 'misused' to be from-start NPIs. I.e., do not enforce delay. + delay_npi_implementation = 0; } t = t + dt_eff; @@ -765,7 +768,7 @@ class Simulation : public BaseT (exceeded_threshold->first > m_dynamic_npi.first || t > FP(m_dynamic_npi.second))) { //old npi was weaker or is expired - auto t_start = SimulationTime(t + delay_lockdown); + auto t_start = SimulationTime(t + delay_npi_implementation); auto t_end = t_start + SimulationTime(dyn_npis.get_duration()); this->get_model().parameters.get_start_commuter_detection() = (FP)t_start; this->get_model().parameters.get_end_commuter_detection() = (FP)t_end; diff --git a/cpp/models/ode_secirts/parameter_space.h b/cpp/models/ode_secirts/parameter_space.h index 5e24b40569..43c3ed8ec5 100644 --- a/cpp/models/ode_secirts/parameter_space.h +++ b/cpp/models/ode_secirts/parameter_space.h @@ -65,7 +65,7 @@ void draw_sample_demographics(Model& model) InfectionState::InfectedNoSymptomsPartialImmunity, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed, InfectionState::InfectedSymptomsPartialImmunity, InfectionState::InfectedSymptomsPartialImmunityConfirmed, InfectionState::InfectedSeverePartialImmunity, InfectionState::InfectedCriticalPartialImmunity, - InfectionState::TemporaryImmunPartialImmunity, InfectionState::DeadPartialImmunity, + InfectionState::TemporaryImmunePartialImmunity, InfectionState::DeadPartialImmunity, }; const static std::vector improved_immunity_states = { @@ -73,7 +73,7 @@ void draw_sample_demographics(Model& model) InfectionState::InfectedNoSymptomsImprovedImmunity, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed, InfectionState::InfectedSymptomsImprovedImmunity, InfectionState::InfectedSymptomsImprovedImmunityConfirmed, InfectionState::InfectedSevereImprovedImmunity, InfectionState::InfectedCriticalImprovedImmunity, - InfectionState::TemporaryImmunImprovedImmunity, InfectionState::DeadImprovedImmunity, + InfectionState::TemporaryImmuneImprovedImmunity, InfectionState::DeadImprovedImmunity, }; // helper function to calculate the total population of a layer for a given age group diff --git a/cpp/models/ode_secirts/parameters.h b/cpp/models/ode_secirts/parameters.h index 33253a70b6..fee3b55fbe 100644 --- a/cpp/models/ode_secirts/parameters.h +++ b/cpp/models/ode_secirts/parameters.h @@ -126,6 +126,38 @@ struct TestAndTraceCapacity { } }; +/** + * @brief Multiplier for the test and trace capacity to determine when it is considered overloaded from cases without symptoms. + */ +template +struct TestAndTraceCapacityMaxRiskNoSymptoms { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(2.0); + } + static std::string name() + { + return "TestAndTraceCapacityMaxRiskNoSymptoms"; + } +}; + +/** + * @brief Multiplier for the test and trace capacity to determine when it is considered overloaded by symptomatic cases. + */ +template +struct TestAndTraceCapacityMaxRiskSymptoms { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(15.0); + } + static std::string name() + { + return "TestAndTraceCapacityMaxRiskSymptoms"; + } +}; + /** * @brief The contact patterns within the society are modelled using an UncertainContactMatrix. * @tparam FP The floating-point type (default: double). @@ -693,20 +725,37 @@ struct InfectiousnessNewVariant { } }; +/** + * @brief The delay with which DynamicNPIs are implemented and enforced after exceedance of threshold. + */ +template +struct DynamicNPIsImplementationDelay { + using Type = UncertainValue; + static Type get_default(AgeGroup /*size*/) + { + return 0.; + } + static std::string name() + { + return "DynamicNPIsImplementationDelay"; + } +}; + template using ParametersBase = ParameterSet< - StartDay, Seasonality, ICUCapacity, TestAndTraceCapacity, ContactPatterns, - DynamicNPIsInfectedSymptoms, TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, - TimeInfectedSevere, TimeInfectedCritical, TimeWaningPartialImmunity, TimeWaningImprovedImmunity, - TimeTemporaryImmunityPI, TimeTemporaryImmunityII, TransmissionProbabilityOnContact, - RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, - MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, + StartDay, Seasonality, ICUCapacity, TestAndTraceCapacity, TestAndTraceCapacityMaxRiskNoSymptoms, + TestAndTraceCapacityMaxRiskSymptoms, ContactPatterns, DynamicNPIsInfectedSymptoms, TimeExposed, + TimeInfectedNoSymptoms, TimeInfectedSymptoms, TimeInfectedSevere, TimeInfectedCritical, + TimeWaningPartialImmunity, TimeWaningImprovedImmunity, TimeTemporaryImmunityPI, + TimeTemporaryImmunityII, TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, + RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, + SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, DaysUntilEffectivePartialVaccination, DaysUntilEffectiveImprovedVaccination, DaysUntilEffectiveBoosterImmunity, DailyFullVaccinations, DailyPartialVaccinations, DailyBoosterVaccinations, ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, ReducInfectedSevereCriticalDeadImprovedImmunity, - ReducTimeInfectedMild, InfectiousnessNewVariant, StartDayNewVariant>; + ReducTimeInfectedMild, InfectiousnessNewVariant, DynamicNPIsImplementationDelay, StartDayNewVariant>; /** * @brief Parameters of the age-resolved SECIRS-type model with high temporary immunity upon immunization and waning immunity over @@ -807,6 +856,34 @@ class Parameters : public ParametersBase corrected = true; } + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacity changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacityMaxRiskSymptoms changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacityMaxRiskNoSymptoms changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter DynamicNPIsImplementationDelay changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + const double tol_times = 1e-1; // accepted tolerance for compartment stays for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { @@ -1047,6 +1124,26 @@ class Parameters : public ParametersBase return true; } + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacity smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacityMaxRiskSymptoms smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacityMaxRiskNoSymptoms smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter DynamicNPIsImplementationDelay smaller {:d}", 0); + return true; + } + for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { if (this->template get>()[i] < tol_times) { @@ -1250,7 +1347,7 @@ class Parameters : public ParametersBase double m_commuter_nondetection = 0.0; double m_start_commuter_detection = 0.0; double m_end_commuter_detection = 0.0; - double m_end_dynamic_npis = 0.0; + double m_end_dynamic_npis = std::numeric_limits::max(); }; } // namespace osecirts diff --git a/cpp/models/ode_secirts/parameters_io.h b/cpp/models/ode_secirts/parameters_io.h index ad0a18d619..a4c7028483 100644 --- a/cpp/models/ode_secirts/parameters_io.h +++ b/cpp/models/ode_secirts/parameters_io.h @@ -464,7 +464,7 @@ set_confirmed_cases_data(std::vector& model, const std::vector>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals - model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunPartialImmunity}] += + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunePartialImmunity}] += immunity_population[1][i] * model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_timm1[county][i]; @@ -513,7 +513,7 @@ set_confirmed_cases_data(std::vector& model, const std::vector>()[(AgeGroup)i] * denom_I_Sev[i] * num_InfectedSevere[county][i]; // the += is necessary because we already set the previous vaccinated individuals - model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmunImprovedImmunity}] += + model[county].populations[{AgeGroup(i), InfectionState::TemporaryImmuneImprovedImmunity}] += immunity_population[2][i] * model[county].parameters.template get>()[(AgeGroup)i] * denom_E[i] * num_timm2[county][i]; @@ -732,7 +732,7 @@ IOResult set_population_data(std::vector& model, const std::vector< model[region].populations[{i, InfectionState::InfectedSevereImprovedImmunity}] + model[region].populations[{i, InfectionState::InfectedCriticalImprovedImmunity}] + model[region].populations[{i, InfectionState::DeadImprovedImmunity}] + - model[region].populations[{i, InfectionState::TemporaryImmunImprovedImmunity}]))); + model[region].populations[{i, InfectionState::TemporaryImmuneImprovedImmunity}]))); model[region].populations[{i, InfectionState::SusceptiblePartialImmunity}] = std::max( 0.0, @@ -744,7 +744,7 @@ IOResult set_population_data(std::vector& model, const std::vector< model[region].populations[{i, InfectionState::InfectedSeverePartialImmunity}] - model[region].populations[{i, InfectionState::InfectedCriticalPartialImmunity}] - model[region].populations[{i, InfectionState::DeadPartialImmunity}] - - model[region].populations[{i, InfectionState::TemporaryImmunPartialImmunity}]); + model[region].populations[{i, InfectionState::TemporaryImmunePartialImmunity}]); model[region].populations.template set_difference_from_group_total( {i, InfectionState::SusceptibleNaive}, num_population[region][size_t(i)]); diff --git a/cpp/tests/test_odesecirts.cpp b/cpp/tests/test_odesecirts.cpp index edd116f3bc..63a3cb9ccd 100644 --- a/cpp/tests/test_odesecirts.cpp +++ b/cpp/tests/test_odesecirts.cpp @@ -199,6 +199,32 @@ TEST(TestOdeSECIRTS, simulateDefault) EXPECT_NEAR(result.get_last_time(), tmax, 1e-10); } +// Test model initialization with total population of 0 and ensure get_flows returns no NaN values +TEST(TestOdeSECIRTS, population_zero_no_nan) +{ + // initialize simple model with total population 0 + mio::osecirts::Model model(1); + model.populations.set_total(0.0); + + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + model.parameters.get>().resize(mio::SimulationDay(size_t(1000))); + model.parameters.get>().array().setConstant(0); + + // call the get_flows function + auto dydt_default = Eigen::VectorXd(model.get_initial_flows().size()); + dydt_default.setZero(); + auto y0 = model.get_initial_values(); + model.get_flows(y0, y0, 0, dydt_default); + + // check that there are now NaN values in dydt_default + for (int i = 0; i < dydt_default.size(); i++) { + EXPECT_FALSE(std::isnan(dydt_default[i])); + } +} + TEST(TestOdeSECIRTS, overflow_vaccinations) { const double t0 = 0; @@ -240,13 +266,13 @@ TEST(TestOdeSECIRTS, overflow_vaccinations) // get the flow indices for each type of vaccination and also the indices of the susceptible compartments auto flow_indx_partial_vaccination = model.get_flat_flow_index({mio::AgeGroup(0)}); + mio::osecirts::InfectionState::TemporaryImmunePartialImmunity>({mio::AgeGroup(0)}); auto flow_indx_full_vaccination = model.get_flat_flow_index({mio::AgeGroup(0)}); + mio::osecirts::InfectionState::TemporaryImmuneImprovedImmunity>({mio::AgeGroup(0)}); auto flow_indx_booster_vaccination = model.get_flat_flow_index({mio::AgeGroup(0)}); + mio::osecirts::InfectionState::TemporaryImmuneImprovedImmunity>({mio::AgeGroup(0)}); auto indx_S_naive = model.populations.get_flat_index({mio::AgeGroup(0), mio::osecirts::InfectionState::SusceptibleNaive}); auto indx_S_partial = @@ -818,8 +844,9 @@ TEST(TestOdeSECIRTS, read_data) 0); EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::InfectedSymptomsImprovedImmunity}]), 0); - EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmunPartialImmunity}]), 0); - EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmunImprovedImmunity}]), 0); + EXPECT_GE(double(model2[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmunePartialImmunity}]), 0); + EXPECT_GE(double(model3[0].populations[{i, mio::osecirts::InfectionState::TemporaryImmuneImprovedImmunity}]), + 0); // currently dead and confirmed after commuting compartments are initialized as zero EXPECT_EQ(double(model1[0].populations[{i, mio::osecirts::InfectionState::InfectedNoSymptomsNaiveConfirmed}]), @@ -1134,6 +1161,18 @@ TEST(TestOdeSECIRTS, check_constraints_parameters) ASSERT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); model.parameters.set>(-2); ASSERT_EQ(model.parameters.check_constraints(), 1); @@ -1241,6 +1280,8 @@ TEST(TestOdeSECIRTS, check_constraints_parameters) model.parameters.set>(-4); ASSERT_EQ(model.parameters.check_constraints(), 1); + model.parameters.set>(2.0); + ASSERT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::warn); } @@ -1261,6 +1302,18 @@ TEST(TestOdeSECIRTS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); From a2c9fb3913da2ca25102288cb631af9bbfbe070a Mon Sep 17 00:00:00 2001 From: HenrZu <69154294+HenrZu@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:50:53 +0100 Subject: [PATCH 60/60] update test and trace --- cpp/models/ode_secirts/model.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/cpp/models/ode_secirts/model.h b/cpp/models/ode_secirts/model.h index 0fbda5af91..a7f22c20e4 100644 --- a/cpp/models/ode_secirts/model.h +++ b/cpp/models/ode_secirts/model.h @@ -126,14 +126,29 @@ class Model auto icu_occupancy = 0.0; auto test_and_trace_required = 0.0; for (auto i = AgeGroup(0); i < n_agegroups; ++i) { + // naive flow to symptomatic in unit time test_and_trace_required += (1 - params.template get>()[i]) / params.template get>()[i] * (this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaive}) + - this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunity}) + - this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunity}) + - this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaiveConfirmed}) + - this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsNaiveConfirmed})); + // partial immunity flow to symptomatic in unit time + test_and_trace_required += + (params.template get>()[i] / + params.template get>()[i]) * + (1 - params.template get>()[i]) / + (params.template get>()[i] * + params.template get>()[i]) * + (this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunity}) + + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsPartialImmunityConfirmed})); + // improved immunity flow to symptomatic in unit time + test_and_trace_required += + (params.template get>()[i] / + params.template get>()[i]) * + (1 - params.template get>()[i]) / + (params.template get>()[i] * + params.template get>()[i]) * + (this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunity}) + this->populations.get_from(pop, {i, InfectionState::InfectedNoSymptomsImprovedImmunityConfirmed})); icu_occupancy += this->populations.get_from(pop, {i, InfectionState::InfectedCriticalNaive}) + this->populations.get_from(pop, {i, InfectionState::InfectedCriticalPartialImmunity}) +