diff --git a/DESCRIPTION b/DESCRIPTION index f32a284..bc451e9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: mpoxseir Title: Stochastic compartmental model of mpox transmission -Version: 0.2.8 +Version: 0.2.9 Authors@R: c(person("Lilith", "Whittles", role = c("aut", "cre"), email = "l.whittles@imperial.ac.uk"), person("Ruth", "McCabe", role = c("aut")), diff --git a/NEWS.md b/NEWS.md index c73885b..0c798ee 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +# mpoxseir 0.2.9 + +* children_ind_raw replaced with is_child, adults_ind_raw replaced with (1 - is_child) +* vaccination allocation determined based on 3 criteria of eligibility, prioritisation and target met + # mpoxseir 0.2.8 * Age groups are now 0-4, 5-11, 12-14, 15-19, then in 5yr bands to allow for new guidance on vaccines for +/-12yo diff --git a/R/dust.R b/R/dust.R index ad816bb..069b6f1 100644 --- a/R/dust.R +++ b/R/dust.R @@ -6,11 +6,11 @@ model_targeted_vax <- structure( package = "mpoxseir", path = NULL, parameters = data.frame( - name = c("children_ind_raw", "adults_ind_raw", "daily_doses_children_value", "daily_doses_children_time", "daily_doses_adults_value", "daily_doses_adults_time", "N_prioritisation_steps_children", "N_prioritisation_steps_adults", "prioritisation_strategy_children", "prioritisation_strategy_adults", "m_gen_pop", "m_sex", "S0", "Ea0", "Eb0", "Ir0", "Id0", "R0", "D0", "beta_h", "beta_s", "beta_z", "beta_hcw", "gamma_E", "gamma_Ir", "gamma_Id", "CFR", "ve_T", "ve_I", "n_vax", "n_group", "exp_noise", "alpha_cases", "alpha_cases_00_04", "alpha_cases_05_14", "alpha_cases_15_plus", "alpha_deaths", "alpha_deaths_00_04", "alpha_deaths_05_14", "alpha_deaths_15_plus"), - type = c("real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "int", "int", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "int", "int", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type"), - constant = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), - required = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), - rank = c(1L, 1L, 2L, 1L, 2L, 1L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 2L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), + name = c("is_child", "daily_doses_children_value", "daily_doses_children_time", "daily_doses_adults_value", "daily_doses_adults_time", "N_prioritisation_steps_children", "N_prioritisation_steps_adults", "prioritisation_strategy_children", "prioritisation_strategy_adults", "m_gen_pop", "m_sex", "S0", "Ea0", "Eb0", "Ir0", "Id0", "R0", "D0", "beta_h", "beta_s", "beta_z", "beta_hcw", "gamma_E", "gamma_Ir", "gamma_Id", "CFR", "ve_T", "ve_I", "n_vax", "n_group", "exp_noise", "alpha_cases", "alpha_cases_00_04", "alpha_cases_05_14", "alpha_cases_15_plus", "alpha_deaths", "alpha_deaths_00_04", "alpha_deaths_05_14", "alpha_deaths_15_plus"), + type = c("real_type", "real_type", "real_type", "real_type", "real_type", "int", "int", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "int", "int", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type", "real_type"), + constant = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), + required = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), + rank = c(1L, 2L, 1L, 2L, 1L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 2L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), properties = list( time_type = "discrete", has_compare = TRUE, diff --git a/R/parameters.R b/R/parameters.R index 58daef5..fd8ff12 100644 --- a/R/parameters.R +++ b/R/parameters.R @@ -561,8 +561,7 @@ parameters_fixed <- function(region, initial_infections, use_ve_D = FALSE, daily_doses_children_time = 1, daily_doses_adults_value = matrix(0, nrow = n_vax, ncol = 1), daily_doses_adults_time = 1, - children_ind_raw = group_bins$children, - adults_ind_raw = group_bins$adults) + is_child = group_bins$children) # Ensure overridden parameters are passed as a list if (!is.list(overrides)) { diff --git a/inst/dust/model-targeted-vax.cpp b/inst/dust/model-targeted-vax.cpp index 00f80a1..b6ea736 100644 --- a/inst/dust/model-targeted-vax.cpp +++ b/inst/dust/model-targeted-vax.cpp @@ -3,8 +3,7 @@ // [[dust2::class(model_targeted_vax)]] // [[dust2::time_type(discrete)]] // [[dust2::has_compare()]] -// [[dust2::parameter(children_ind_raw, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] -// [[dust2::parameter(adults_ind_raw, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] +// [[dust2::parameter(is_child, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_children_value, type = "real_type", rank = 2, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_children_time, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_adults_value, type = "real_type", rank = 2, required = TRUE, constant = FALSE)]] @@ -58,8 +57,7 @@ class model_targeted_vax { } offset; } odin; struct dim_type { - dust2::array::dimensions<1> children_ind_raw; - dust2::array::dimensions<1> adults_ind_raw; + dust2::array::dimensions<1> is_child; dust2::array::dimensions<2> daily_doses_children_value; dust2::array::dimensions<1> daily_doses_children_time; dust2::array::dimensions<2> daily_doses_adults_value; @@ -68,14 +66,17 @@ class model_targeted_vax { dust2::array::dimensions<1> daily_doses_adults_t; dust2::array::dimensions<2> prioritisation_strategy_children; dust2::array::dimensions<2> prioritisation_strategy_adults; - dust2::array::dimensions<2> target_met_children_t; + dust2::array::dimensions<1> target_met_children_t; dust2::array::dimensions<2> target_met_adults_t; - dust2::array::dimensions<1> coverage_achieved_1st_dose_children; - dust2::array::dimensions<1> coverage_achieved_1st_dose_adults; - dust2::array::dimensions<1> coverage_achieved_2nd_dose_adults; - dust2::array::dimensions<1> n_eligible_for_dose1_children; - dust2::array::dimensions<1> n_eligible_for_dose1_adults; - dust2::array::dimensions<1> n_eligible_for_dose2_adults; + dust2::array::dimensions<1> coverage_target_1st_dose_children; + dust2::array::dimensions<1> coverage_target_1st_dose_adults; + dust2::array::dimensions<1> coverage_target_2nd_dose_adults; + dust2::array::dimensions<1> give_dose1_children; + dust2::array::dimensions<1> give_dose1_adults; + dust2::array::dimensions<1> give_dose2_adults; + dust2::array::dimensions<1> children_dose1_denom; + dust2::array::dimensions<1> adults_dose1_denom; + dust2::array::dimensions<1> adults_dose2_denom; dust2::array::dimensions<2> N; dust2::array::dimensions<2> S; dust2::array::dimensions<2> S0; @@ -171,8 +172,7 @@ class model_targeted_vax { std::vector daily_doses_children_time; std::vector daily_doses_adults_value; std::vector daily_doses_adults_time; - std::vector children_ind_raw; - std::vector adults_ind_raw; + std::vector is_child; dust2::interpolate::InterpolateConstantArray interpolate_daily_doses_children_t; dust2::interpolate::InterpolateConstantArray interpolate_daily_doses_adults_t; std::vector prioritisation_strategy_children; @@ -197,17 +197,25 @@ class model_targeted_vax { std::vector n_IdD; std::vector target_met_children_t; std::vector target_met_adults_t; - std::vector coverage_achieved_1st_dose_children; - std::vector coverage_achieved_1st_dose_adults; - std::vector coverage_achieved_2nd_dose_adults; - std::vector n_eligible_for_dose1_children; - std::vector n_eligible_for_dose1_adults; - std::vector n_eligible_for_dose2_adults; + std::vector coverage_target_1st_dose_children; + std::vector coverage_target_1st_dose_adults; + std::vector coverage_target_2nd_dose_adults; std::vector I_infectious; std::vector delta_R; std::vector delta_D; std::vector daily_doses_children_t; std::vector daily_doses_adults_t; + std::vector give_dose1_children; + std::vector give_dose1_adults; + std::vector give_dose2_adults; + std::vector new_D; + std::vector prop_infectious; + std::vector lambda_hc; + std::vector children_dose1_denom; + std::vector adults_dose1_denom; + std::vector adults_dose2_denom; + std::vector s_ij_gen_pop; + std::vector s_ij_sex; std::vector n_vaccination_t_S_children; std::vector n_vaccination_t_S_adults; std::vector n_vaccination_t_Ea_children; @@ -216,49 +224,44 @@ class model_targeted_vax { std::vector n_vaccination_t_Eb_adults; std::vector n_vaccination_t_R_children; std::vector n_vaccination_t_R_adults; - std::vector new_D; - std::vector prop_infectious; - std::vector lambda_hc; + std::vector lambda_hh; + std::vector lambda_s; std::vector n_vaccination_t_S; std::vector n_vaccination_t_Ea; std::vector n_vaccination_t_Eb; std::vector n_vaccination_t_R; - std::vector s_ij_gen_pop; - std::vector s_ij_sex; + std::vector lambda; std::vector delta_S_n_vaccination; std::vector delta_Ea_n_vaccination; std::vector delta_Eb_n_vaccination; std::vector delta_R_n_vaccination; std::vector n_vaccination_t; - std::vector lambda_hh; - std::vector lambda_s; - std::vector new_R; - std::vector lambda; - std::vector n_EaEb; - std::vector n_EbI; std::vector p_SE; std::vector p_hh; std::vector p_s; std::vector p_hc; + std::vector new_R; + std::vector n_SEa; + std::vector n_EaEb; + std::vector n_EbI; + std::vector new_S; + std::vector n_SEa_hh; std::vector n_EbId; + std::vector delta_Ea; std::vector delta_Eb; + std::vector new_Ea; std::vector new_Eb; - std::vector n_SEa; + std::vector n_SEa_s; std::vector n_EbIr; std::vector delta_Id; - std::vector new_S; std::vector new_Id; - std::vector n_SEa_hh; - std::vector delta_Ea; + std::vector new_E; + std::vector n_SEa_hc; std::vector delta_Ir; - std::vector new_Ea; std::vector new_Ir; - std::vector n_SEa_s; - std::vector new_E; + std::vector n_SEa_z; std::vector new_I; std::vector new_N; - std::vector n_SEa_hc; - std::vector n_SEa_z; }; struct data_type { real_type cases; @@ -304,8 +307,7 @@ class model_targeted_vax { const real_type alpha_deaths_00_04 = dust2::r::read_real(parameters, "alpha_deaths_00_04"); const real_type alpha_deaths_05_14 = dust2::r::read_real(parameters, "alpha_deaths_05_14"); const real_type alpha_deaths_15_plus = dust2::r::read_real(parameters, "alpha_deaths_15_plus"); - dim.children_ind_raw.set({static_cast(n_group)}); - dim.adults_ind_raw.set({static_cast(n_group)}); + dim.is_child.set({static_cast(n_group)}); std::vector daily_doses_children_value(dim.daily_doses_children_value.size); dust2::r::read_real_array(parameters, dim.daily_doses_children_value, daily_doses_children_value.data(), "daily_doses_children_value", true); std::vector daily_doses_children_time(dim.daily_doses_children_time.size); @@ -318,14 +320,17 @@ class model_targeted_vax { dim.daily_doses_adults_t.set({static_cast(n_vax)}); dim.prioritisation_strategy_children.set({static_cast(n_group), static_cast(N_prioritisation_steps_children)}); dim.prioritisation_strategy_adults.set({static_cast(n_group), static_cast(N_prioritisation_steps_adults)}); - dim.target_met_children_t.set({static_cast(n_group), static_cast(n_vax)}); + dim.target_met_children_t.set({static_cast(n_group)}); dim.target_met_adults_t.set({static_cast(n_group), static_cast(n_vax)}); - dim.coverage_achieved_1st_dose_children.set({static_cast(n_group)}); - dim.coverage_achieved_1st_dose_adults.set({static_cast(n_group)}); - dim.coverage_achieved_2nd_dose_adults.set({static_cast(n_group)}); - dim.n_eligible_for_dose1_children.set({static_cast(n_group)}); - dim.n_eligible_for_dose1_adults.set({static_cast(n_group)}); - dim.n_eligible_for_dose2_adults.set({static_cast(n_group)}); + dim.coverage_target_1st_dose_children.set({static_cast(n_group)}); + dim.coverage_target_1st_dose_adults.set({static_cast(n_group)}); + dim.coverage_target_2nd_dose_adults.set({static_cast(n_group)}); + dim.give_dose1_children.set({static_cast(n_group)}); + dim.give_dose1_adults.set({static_cast(n_group)}); + dim.give_dose2_adults.set({static_cast(n_group)}); + dim.children_dose1_denom.set({static_cast(n_group)}); + dim.adults_dose1_denom.set({static_cast(n_group)}); + dim.adults_dose2_denom.set({static_cast(n_group)}); dim.N.set({static_cast(n_group), static_cast(n_vax)}); dim.S.set({static_cast(n_group), static_cast(n_vax)}); dim.S0.set({static_cast(n_group), static_cast(n_vax)}); @@ -397,10 +402,8 @@ class model_targeted_vax { dim.delta_Ea_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); dim.delta_Eb_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); dim.delta_R_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); - std::vector children_ind_raw(dim.children_ind_raw.size); - dust2::r::read_real_array(parameters, dim.children_ind_raw, children_ind_raw.data(), "children_ind_raw", true); - std::vector adults_ind_raw(dim.adults_ind_raw.size); - dust2::r::read_real_array(parameters, dim.adults_ind_raw, adults_ind_raw.data(), "adults_ind_raw", true); + std::vector is_child(dim.is_child.size); + dust2::r::read_real_array(parameters, dim.is_child, is_child.data(), "is_child", true); const auto interpolate_daily_doses_children_t = dust2::interpolate::InterpolateConstantArray(daily_doses_children_time, daily_doses_children_value, dim.daily_doses_children_t, "daily_doses_children_time", "daily_doses_children_value"); const auto interpolate_daily_doses_adults_t = dust2::interpolate::InterpolateConstantArray(daily_doses_adults_time, daily_doses_adults_value, dim.daily_doses_adults_t, "daily_doses_adults_time", "daily_doses_adults_value"); std::vector prioritisation_strategy_children(dim.prioritisation_strategy_children.size); @@ -554,24 +557,32 @@ class model_targeted_vax { {"cases_cumulative_by_age", std::vector(dim.cases_cumulative_by_age.dim.begin(), dim.cases_cumulative_by_age.dim.end())} }; odin.packing.state.copy_offset(odin.offset.state.begin()); - return shared_state{odin, dim, N_prioritisation_steps_children, N_prioritisation_steps_adults, beta_h, beta_s, beta_hcw, gamma_E, gamma_Ir, gamma_Id, n_vax, n_group, exp_noise, alpha_cases, alpha_cases_00_04, alpha_cases_05_14, alpha_cases_15_plus, alpha_deaths, alpha_deaths_00_04, alpha_deaths_05_14, alpha_deaths_15_plus, daily_doses_children_value, daily_doses_children_time, daily_doses_adults_value, daily_doses_adults_time, children_ind_raw, adults_ind_raw, interpolate_daily_doses_children_t, interpolate_daily_doses_adults_t, prioritisation_strategy_children, prioritisation_strategy_adults, m_gen_pop, m_sex, S0, Ea0, Eb0, Ir0, Id0, R0, D0, beta_z, CFR, ve_T, ve_I, lambda_z}; + return shared_state{odin, dim, N_prioritisation_steps_children, N_prioritisation_steps_adults, beta_h, beta_s, beta_hcw, gamma_E, gamma_Ir, gamma_Id, n_vax, n_group, exp_noise, alpha_cases, alpha_cases_00_04, alpha_cases_05_14, alpha_cases_15_plus, alpha_deaths, alpha_deaths_00_04, alpha_deaths_05_14, alpha_deaths_15_plus, daily_doses_children_value, daily_doses_children_time, daily_doses_adults_value, daily_doses_adults_time, is_child, interpolate_daily_doses_children_t, interpolate_daily_doses_adults_t, prioritisation_strategy_children, prioritisation_strategy_adults, m_gen_pop, m_sex, S0, Ea0, Eb0, Ir0, Id0, R0, D0, beta_z, CFR, ve_T, ve_I, lambda_z}; } static internal_state build_internal(const shared_state& shared) { std::vector n_IrR(shared.dim.n_IrR.size); std::vector n_IdD(shared.dim.n_IdD.size); std::vector target_met_children_t(shared.dim.target_met_children_t.size); std::vector target_met_adults_t(shared.dim.target_met_adults_t.size); - std::vector coverage_achieved_1st_dose_children(shared.dim.coverage_achieved_1st_dose_children.size); - std::vector coverage_achieved_1st_dose_adults(shared.dim.coverage_achieved_1st_dose_adults.size); - std::vector coverage_achieved_2nd_dose_adults(shared.dim.coverage_achieved_2nd_dose_adults.size); - std::vector n_eligible_for_dose1_children(shared.dim.n_eligible_for_dose1_children.size); - std::vector n_eligible_for_dose1_adults(shared.dim.n_eligible_for_dose1_adults.size); - std::vector n_eligible_for_dose2_adults(shared.dim.n_eligible_for_dose2_adults.size); + std::vector coverage_target_1st_dose_children(shared.dim.coverage_target_1st_dose_children.size); + std::vector coverage_target_1st_dose_adults(shared.dim.coverage_target_1st_dose_adults.size); + std::vector coverage_target_2nd_dose_adults(shared.dim.coverage_target_2nd_dose_adults.size); std::vector I_infectious(shared.dim.I_infectious.size); std::vector delta_R(shared.dim.delta_R.size); std::vector delta_D(shared.dim.delta_D.size); std::vector daily_doses_children_t(shared.dim.daily_doses_children_t.size); std::vector daily_doses_adults_t(shared.dim.daily_doses_adults_t.size); + std::vector give_dose1_children(shared.dim.give_dose1_children.size); + std::vector give_dose1_adults(shared.dim.give_dose1_adults.size); + std::vector give_dose2_adults(shared.dim.give_dose2_adults.size); + std::vector new_D(shared.dim.D.size); + std::vector prop_infectious(shared.dim.prop_infectious.size); + std::vector lambda_hc(shared.dim.lambda_hc.size); + std::vector children_dose1_denom(shared.dim.children_dose1_denom.size); + std::vector adults_dose1_denom(shared.dim.adults_dose1_denom.size); + std::vector adults_dose2_denom(shared.dim.adults_dose2_denom.size); + std::vector s_ij_gen_pop(shared.dim.s_ij_gen_pop.size); + std::vector s_ij_sex(shared.dim.s_ij_sex.size); std::vector n_vaccination_t_S_children(shared.dim.n_vaccination_t_S_children.size); std::vector n_vaccination_t_S_adults(shared.dim.n_vaccination_t_S_adults.size); std::vector n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); @@ -580,50 +591,45 @@ class model_targeted_vax { std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); std::vector n_vaccination_t_R_children(shared.dim.n_vaccination_t_R_children.size); std::vector n_vaccination_t_R_adults(shared.dim.n_vaccination_t_R_adults.size); - std::vector new_D(shared.dim.D.size); - std::vector prop_infectious(shared.dim.prop_infectious.size); - std::vector lambda_hc(shared.dim.lambda_hc.size); + std::vector lambda_hh(shared.dim.lambda_hh.size); + std::vector lambda_s(shared.dim.lambda_s.size); std::vector n_vaccination_t_S(shared.dim.n_vaccination_t_S.size); std::vector n_vaccination_t_Ea(shared.dim.n_vaccination_t_Ea.size); std::vector n_vaccination_t_Eb(shared.dim.n_vaccination_t_Eb.size); std::vector n_vaccination_t_R(shared.dim.n_vaccination_t_R.size); - std::vector s_ij_gen_pop(shared.dim.s_ij_gen_pop.size); - std::vector s_ij_sex(shared.dim.s_ij_sex.size); + std::vector lambda(shared.dim.lambda.size); std::vector delta_S_n_vaccination(shared.dim.delta_S_n_vaccination.size); std::vector delta_Ea_n_vaccination(shared.dim.delta_Ea_n_vaccination.size); std::vector delta_Eb_n_vaccination(shared.dim.delta_Eb_n_vaccination.size); std::vector delta_R_n_vaccination(shared.dim.delta_R_n_vaccination.size); std::vector n_vaccination_t(shared.dim.n_vaccination_t.size); - std::vector lambda_hh(shared.dim.lambda_hh.size); - std::vector lambda_s(shared.dim.lambda_s.size); - std::vector new_R(shared.dim.R.size); - std::vector lambda(shared.dim.lambda.size); - std::vector n_EaEb(shared.dim.n_EaEb.size); - std::vector n_EbI(shared.dim.n_EbI.size); std::vector p_SE(shared.dim.p_SE.size); std::vector p_hh(shared.dim.p_hh.size); std::vector p_s(shared.dim.p_s.size); std::vector p_hc(shared.dim.p_hc.size); + std::vector new_R(shared.dim.R.size); + std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_EaEb(shared.dim.n_EaEb.size); + std::vector n_EbI(shared.dim.n_EbI.size); + std::vector new_S(shared.dim.S.size); + std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); std::vector n_EbId(shared.dim.n_EbId.size); + std::vector delta_Ea(shared.dim.delta_Ea.size); std::vector delta_Eb(shared.dim.delta_Eb.size); + std::vector new_Ea(shared.dim.Ea.size); std::vector new_Eb(shared.dim.Eb.size); - std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_SEa_s(shared.dim.n_SEa_s.size); std::vector n_EbIr(shared.dim.n_EbIr.size); std::vector delta_Id(shared.dim.delta_Id.size); - std::vector new_S(shared.dim.S.size); std::vector new_Id(shared.dim.Id.size); - std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); - std::vector delta_Ea(shared.dim.delta_Ea.size); + std::vector new_E(shared.dim.E.size); + std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); std::vector delta_Ir(shared.dim.delta_Ir.size); - std::vector new_Ea(shared.dim.Ea.size); std::vector new_Ir(shared.dim.Ir.size); - std::vector n_SEa_s(shared.dim.n_SEa_s.size); - std::vector new_E(shared.dim.E.size); + std::vector n_SEa_z(shared.dim.n_SEa_z.size); std::vector new_I(shared.dim.I.size); std::vector new_N(shared.dim.N.size); - std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); - std::vector n_SEa_z(shared.dim.n_SEa_z.size); - return internal_state{n_IrR, n_IdD, target_met_children_t, target_met_adults_t, coverage_achieved_1st_dose_children, coverage_achieved_1st_dose_adults, coverage_achieved_2nd_dose_adults, n_eligible_for_dose1_children, n_eligible_for_dose1_adults, n_eligible_for_dose2_adults, I_infectious, delta_R, delta_D, daily_doses_children_t, daily_doses_adults_t, n_vaccination_t_S_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_R_children, n_vaccination_t_R_adults, new_D, prop_infectious, lambda_hc, n_vaccination_t_S, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, s_ij_gen_pop, s_ij_sex, delta_S_n_vaccination, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, n_vaccination_t, lambda_hh, lambda_s, new_R, lambda, n_EaEb, n_EbI, p_SE, p_hh, p_s, p_hc, n_EbId, delta_Eb, new_Eb, n_SEa, n_EbIr, delta_Id, new_S, new_Id, n_SEa_hh, delta_Ea, delta_Ir, new_Ea, new_Ir, n_SEa_s, new_E, new_I, new_N, n_SEa_hc, n_SEa_z}; + return internal_state{n_IrR, n_IdD, target_met_children_t, target_met_adults_t, coverage_target_1st_dose_children, coverage_target_1st_dose_adults, coverage_target_2nd_dose_adults, I_infectious, delta_R, delta_D, daily_doses_children_t, daily_doses_adults_t, give_dose1_children, give_dose1_adults, give_dose2_adults, new_D, prop_infectious, lambda_hc, children_dose1_denom, adults_dose1_denom, adults_dose2_denom, s_ij_gen_pop, s_ij_sex, n_vaccination_t_S_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_R_children, n_vaccination_t_R_adults, lambda_hh, lambda_s, n_vaccination_t_S, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, lambda, delta_S_n_vaccination, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, n_vaccination_t, p_SE, p_hh, p_s, p_hc, new_R, n_SEa, n_EaEb, n_EbI, new_S, n_SEa_hh, n_EbId, delta_Ea, delta_Eb, new_Ea, new_Eb, n_SEa_s, n_EbIr, delta_Id, new_Id, new_E, n_SEa_hc, delta_Ir, new_Ir, n_SEa_z, new_I, new_N}; } static data_type build_data(cpp11::list data, const shared_state& shared) { auto cases = dust2::r::read_real(data, "cases", NA_REAL); @@ -662,8 +668,7 @@ class model_targeted_vax { dust2::r::read_real_array(parameters, shared.dim.daily_doses_children_time, shared.daily_doses_children_time.data(), "daily_doses_children_time", false); dust2::r::read_real_array(parameters, shared.dim.daily_doses_adults_value, shared.daily_doses_adults_value.data(), "daily_doses_adults_value", false); dust2::r::read_real_array(parameters, shared.dim.daily_doses_adults_time, shared.daily_doses_adults_time.data(), "daily_doses_adults_time", false); - dust2::r::read_real_array(parameters, shared.dim.children_ind_raw, shared.children_ind_raw.data(), "children_ind_raw", false); - dust2::r::read_real_array(parameters, shared.dim.adults_ind_raw, shared.adults_ind_raw.data(), "adults_ind_raw", false); + dust2::r::read_real_array(parameters, shared.dim.is_child, shared.is_child.data(), "is_child", false); const auto interpolate_daily_doses_children_t = dust2::interpolate::InterpolateConstantArray(shared.daily_doses_children_time, shared.daily_doses_children_value, shared.dim.daily_doses_children_t, "daily_doses_children_time", "daily_doses_children_value"); const auto interpolate_daily_doses_adults_t = dust2::interpolate::InterpolateConstantArray(shared.daily_doses_adults_time, shared.daily_doses_adults_value, shared.dim.daily_doses_adults_t, "daily_doses_adults_time", "daily_doses_adults_value"); dust2::r::read_real_array(parameters, shared.dim.prioritisation_strategy_children, shared.prioritisation_strategy_children.data(), "prioritisation_strategy_children", false); @@ -951,13 +956,11 @@ class model_targeted_vax { internal.n_IdD[i - 1 + (j - 1) * shared.dim.n_IdD.mult[1]] = monty::random::binomial(rng_state, Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]], p_IdD); } } - for (size_t i = 1; i <= shared.dim.target_met_children_t.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.target_met_children_t.dim[1]; ++j) { - internal.target_met_children_t[i - 1 + (j - 1) * shared.dim.target_met_children_t.mult[1]] = 0; - } + for (size_t i = 1; i <= shared.dim.target_met_children_t.size; ++i) { + internal.target_met_children_t[i - 1] = 0; } - for (size_t i = 1; i <= shared.dim.target_met_children_t.dim[0]; ++i) { - internal.target_met_children_t[i - 1 + 2 * shared.dim.target_met_children_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.children_ind_raw[i - 1]) > shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + for (size_t i = 1; i <= shared.dim.target_met_children_t.size; ++i) { + internal.target_met_children_t[i - 1] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.is_child[i - 1]) > shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.target_met_adults_t.dim[1]; ++j) { @@ -965,28 +968,19 @@ class model_targeted_vax { } } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { - internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.adults_ind_raw[i - 1]) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * (1 - shared.is_child[i - 1])) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { - internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {3, 3}) * shared.adults_ind_raw[i - 1]) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_1st_dose_children.size; ++i) { - internal.coverage_achieved_1st_dose_children[i - 1] = monty::math::ceil(shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_1st_dose_adults.size; ++i) { - internal.coverage_achieved_1st_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_2nd_dose_adults.size; ++i) { - internal.coverage_achieved_2nd_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); + internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {3, 3}) * (1 - shared.is_child[i - 1])) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose1_children.size; ++i) { - internal.n_eligible_for_dose1_children[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_1st_dose_children.size; ++i) { + internal.coverage_target_1st_dose_children[i - 1] = monty::math::ceil(shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose1_adults.size; ++i) { - internal.n_eligible_for_dose1_adults[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_1st_dose_adults.size; ++i) { + internal.coverage_target_1st_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose2_adults.size; ++i) { - internal.n_eligible_for_dose2_adults[i - 1] = (S[i - 1 + 2 * shared.dim.S.mult[1]] + Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] + Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] + R[i - 1 + 2 * shared.dim.R.mult[1]]) * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_2nd_dose_adults.size; ++i) { + internal.coverage_target_2nd_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); } const real_type new_deaths_00_04 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {0, 0}, {0, shared.dim.n_IdD.dim[1] - 1}); const real_type new_deaths_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}), static_cast(0.5)); @@ -1011,71 +1005,110 @@ class model_targeted_vax { } shared.interpolate_daily_doses_children_t.eval(time, internal.daily_doses_children_t); shared.interpolate_daily_doses_adults_t.eval(time, internal.daily_doses_adults_t); - const real_type prioritisation_step_1st_dose_children_proposal = (dust2::array::sum(internal.target_met_children_t.data(), shared.dim.target_met_children_t, {0, shared.dim.target_met_children_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_achieved_1st_dose_children.data(), shared.dim.coverage_achieved_1st_dose_children) ? prioritisation_step_1st_dose_children + 1 : prioritisation_step_1st_dose_children); - const real_type prioritisation_step_1st_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_achieved_1st_dose_adults.data(), shared.dim.coverage_achieved_1st_dose_adults) ? prioritisation_step_1st_dose_adults + 1 : prioritisation_step_1st_dose_adults); - const real_type prioritisation_step_2nd_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {3, 3}) == dust2::array::sum(internal.coverage_achieved_2nd_dose_adults.data(), shared.dim.coverage_achieved_2nd_dose_adults) ? prioritisation_step_2nd_dose_adults + 1 : prioritisation_step_2nd_dose_adults); + const real_type prioritisation_step_1st_dose_children_proposal = (dust2::array::sum(internal.target_met_children_t.data(), shared.dim.target_met_children_t) == dust2::array::sum(internal.coverage_target_1st_dose_children.data(), shared.dim.coverage_target_1st_dose_children) ? prioritisation_step_1st_dose_children + 1 : prioritisation_step_1st_dose_children); + const real_type prioritisation_step_1st_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_target_1st_dose_adults.data(), shared.dim.coverage_target_1st_dose_adults) ? prioritisation_step_1st_dose_adults + 1 : prioritisation_step_1st_dose_adults); + const real_type prioritisation_step_2nd_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {3, 3}) == dust2::array::sum(internal.coverage_target_2nd_dose_adults.data(), shared.dim.coverage_target_2nd_dose_adults) ? prioritisation_step_2nd_dose_adults + 1 : prioritisation_step_2nd_dose_adults); + for (size_t i = 1; i <= shared.dim.give_dose1_children.size; ++i) { + internal.give_dose1_children[i - 1] = shared.is_child[i - 1] * internal.coverage_target_1st_dose_children[i - 1] * (1 - internal.target_met_children_t[i - 1]); + } + for (size_t i = 1; i <= shared.dim.give_dose1_adults.size; ++i) { + internal.give_dose1_adults[i - 1] = (1 - shared.is_child[i - 1]) * internal.coverage_target_1st_dose_adults[i - 1] * (1 - internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]]); + } + for (size_t i = 1; i <= shared.dim.give_dose2_adults.size; ++i) { + internal.give_dose2_adults[i - 1] = (1 - shared.is_child[i - 1]) * internal.coverage_target_2nd_dose_adults[i - 1] * (1 - internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]]); + } + for (size_t i = 1; i <= shared.dim.D.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.D.dim[1]; ++j) { + internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]] = D[i - 1 + (j - 1) * shared.dim.D.mult[1]] + internal.delta_D[i - 1 + (j - 1) * shared.dim.delta_D.mult[1]]; + } + } + const real_type new_deaths_SW_15_17 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}) - new_deaths_SW_12_14; + const real_type new_deaths_05_14 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {1, 2}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_12_14; + const real_type new_deaths_SW = new_deaths_CSW + new_deaths_ASW; + for (size_t i = 1; i <= shared.dim.prop_infectious.size; ++i) { + internal.prop_infectious[i - 1] = (dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1}) == 0 ? 0 : dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious, {i - 1, i - 1}, {0, shared.dim.I_infectious.dim[1] - 1}) / dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + } + for (size_t i = 1; i <= shared.dim.lambda_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_hc.dim[1]; ++j) { + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] = (i == 20 ? shared.beta_hcw * dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious) / dust2::array::sum(N, shared.dim.N) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]) : 0); + } + } + for (size_t i = 1; i <= shared.dim.children_dose1_denom.size; ++i) { + internal.children_dose1_denom[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * internal.give_dose1_children[i - 1]; + } + for (size_t i = 1; i <= shared.dim.adults_dose1_denom.size; ++i) { + internal.adults_dose1_denom[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * internal.give_dose1_adults[i - 1]; + } + for (size_t i = 1; i <= shared.dim.adults_dose2_denom.size; ++i) { + internal.adults_dose2_denom[i - 1] = (S[i - 1 + 2 * shared.dim.S.mult[1]] + Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] + Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] + R[i - 1 + 2 * shared.dim.R.mult[1]]) * internal.give_dose2_adults[i - 1]; + } + const real_type new_deaths_15_plus = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {3, 15}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_15_17 + dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {17, 19}, {0, shared.dim.n_IdD.dim[1] - 1}); + for (size_t i = 1; i <= shared.dim.s_ij_gen_pop.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.s_ij_gen_pop.dim[1]; ++j) { + internal.s_ij_gen_pop[i - 1 + (j - 1) * shared.dim.s_ij_gen_pop.mult[1]] = shared.m_gen_pop[i - 1 + (j - 1) * shared.dim.m_gen_pop.mult[1]] * internal.prop_infectious[j - 1]; + } + } + for (size_t i = 1; i <= shared.dim.s_ij_sex.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.s_ij_sex.dim[1]; ++j) { + internal.s_ij_sex[i - 1 + (j - 1) * shared.dim.s_ij_sex.mult[1]] = shared.m_sex[i - 1 + (j - 1) * shared.dim.m_sex.mult[1]] * internal.prop_infectious[j - 1]; + } + } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_children.size; ++i) { internal.n_vaccination_t_S_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_children.size; ++i) { - internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * S[i - 1 + shared.dim.S.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), S[i - 1 + shared.dim.S.mult[1]])); + internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * S[i - 1 + shared.dim.S.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), S[i - 1 + shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_adults.size; ++i) { internal.n_vaccination_t_S_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_adults.size; ++i) { - internal.n_vaccination_t_S_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * S[i - 1 + shared.dim.S.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), S[i - 1 + shared.dim.S.mult[1]])); + internal.n_vaccination_t_S_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * S[i - 1 + shared.dim.S.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), S[i - 1 + shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_children.size; ++i) { internal.n_vaccination_t_Ea_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_children.size; ++i) { - internal.n_vaccination_t_Ea_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), Ea[i - 1 + shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), Ea[i - 1 + shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_adults.size; ++i) { internal.n_vaccination_t_Ea_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_adults.size; ++i) { - internal.n_vaccination_t_Ea_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), Ea[i - 1 + shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), Ea[i - 1 + shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_children.size; ++i) { internal.n_vaccination_t_Eb_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_children.size; ++i) { - internal.n_vaccination_t_Eb_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), Eb[i - 1 + shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), Eb[i - 1 + shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { internal.n_vaccination_t_Eb_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { - internal.n_vaccination_t_Eb_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), Eb[i - 1 + shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), Eb[i - 1 + shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_children.size; ++i) { internal.n_vaccination_t_R_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_children.size; ++i) { - internal.n_vaccination_t_R_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * R[i - 1 + shared.dim.R.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), R[i - 1 + shared.dim.R.mult[1]])); + internal.n_vaccination_t_R_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * R[i - 1 + shared.dim.R.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), R[i - 1 + shared.dim.R.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_adults.size; ++i) { internal.n_vaccination_t_R_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_adults.size; ++i) { - internal.n_vaccination_t_R_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * R[i - 1 + shared.dim.R.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), R[i - 1 + shared.dim.R.mult[1]])); + internal.n_vaccination_t_R_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * R[i - 1 + shared.dim.R.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), R[i - 1 + shared.dim.R.mult[1]])); } - for (size_t i = 1; i <= shared.dim.D.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.D.dim[1]; ++j) { - internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]] = D[i - 1 + (j - 1) * shared.dim.D.mult[1]] + internal.delta_D[i - 1 + (j - 1) * shared.dim.delta_D.mult[1]]; + for (size_t i = 1; i <= shared.dim.lambda_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_hh.dim[1]; ++j) { + internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] = shared.beta_h * dust2::array::sum(internal.s_ij_gen_pop.data(), shared.dim.s_ij_gen_pop, {i - 1, i - 1}, {0, shared.dim.s_ij_gen_pop.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); } } - const real_type new_deaths_SW_15_17 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}) - new_deaths_SW_12_14; - const real_type new_deaths_05_14 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {1, 2}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_12_14; - const real_type new_deaths_SW = new_deaths_CSW + new_deaths_ASW; - for (size_t i = 1; i <= shared.dim.prop_infectious.size; ++i) { - internal.prop_infectious[i - 1] = (dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1}) == 0 ? 0 : dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious, {i - 1, i - 1}, {0, shared.dim.I_infectious.dim[1] - 1}) / dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); - } - for (size_t i = 1; i <= shared.dim.lambda_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_hc.dim[1]; ++j) { - internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] = (i == 20 ? shared.beta_hcw * dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious) / dust2::array::sum(N, shared.dim.N) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]) : 0); + for (size_t i = 1; i <= shared.dim.lambda_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_s.dim[1]; ++j) { + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] = shared.beta_s * dust2::array::sum(internal.s_ij_sex.data(), shared.dim.s_ij_sex, {i - 1, i - 1}, {0, shared.dim.s_ij_sex.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { @@ -1086,9 +1119,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { internal.n_vaccination_t_S[i - 1 + shared.dim.n_vaccination_t_S.mult[1]] = internal.n_vaccination_t_S_children[i - 1] + internal.n_vaccination_t_S_adults[i - 1]; } - internal.n_vaccination_t_S[2 + shared.dim.n_vaccination_t_S.mult[1]] = monty::math::min(internal.n_vaccination_t_S[2 + shared.dim.n_vaccination_t_S.mult[1]], S[2 + shared.dim.S.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { - internal.n_vaccination_t_S[i - 1 + 2 * shared.dim.n_vaccination_t_S.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * S[i - 1 + 2 * shared.dim.S.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), S[i - 1 + 2 * shared.dim.S.mult[1]])); + internal.n_vaccination_t_S[i - 1 + 2 * shared.dim.n_vaccination_t_S.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * S[i - 1 + 2 * shared.dim.S.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), S[i - 1 + 2 * shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_Ea.dim[1]; ++j) { @@ -1098,9 +1130,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { internal.n_vaccination_t_Ea[i - 1 + shared.dim.n_vaccination_t_Ea.mult[1]] = internal.n_vaccination_t_Ea_children[i - 1] + internal.n_vaccination_t_Ea_adults[i - 1]; } - internal.n_vaccination_t_Ea[2 + shared.dim.n_vaccination_t_Ea.mult[1]] = monty::math::min(internal.n_vaccination_t_Ea[2 + shared.dim.n_vaccination_t_Ea.mult[1]], Ea[2 + shared.dim.Ea.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { - internal.n_vaccination_t_Ea[i - 1 + 2 * shared.dim.n_vaccination_t_Ea.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), Ea[i - 1 + 2 * shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea[i - 1 + 2 * shared.dim.n_vaccination_t_Ea.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * Ea[i - 1 + 2 * shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), Ea[i - 1 + 2 * shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_Eb.dim[1]; ++j) { @@ -1110,9 +1141,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { internal.n_vaccination_t_Eb[i - 1 + shared.dim.n_vaccination_t_Eb.mult[1]] = internal.n_vaccination_t_Eb_children[i - 1] + internal.n_vaccination_t_Eb_adults[i - 1]; } - internal.n_vaccination_t_Eb[2 + shared.dim.n_vaccination_t_Eb.mult[1]] = monty::math::min(internal.n_vaccination_t_Eb[2 + shared.dim.n_vaccination_t_Eb.mult[1]], Eb[2 + shared.dim.Eb.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { - internal.n_vaccination_t_Eb[i - 1 + 2 * shared.dim.n_vaccination_t_Eb.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), Eb[i - 1 + 2 * shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb[i - 1 + 2 * shared.dim.n_vaccination_t_Eb.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * Eb[i - 1 + 2 * shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), Eb[i - 1 + 2 * shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_R.dim[1]; ++j) { @@ -1122,19 +1152,12 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { internal.n_vaccination_t_R[i - 1 + shared.dim.n_vaccination_t_R.mult[1]] = internal.n_vaccination_t_R_children[i - 1] + internal.n_vaccination_t_R_adults[i - 1]; } - internal.n_vaccination_t_R[2 + shared.dim.n_vaccination_t_R.mult[1]] = monty::math::min(internal.n_vaccination_t_R[2 + shared.dim.n_vaccination_t_R.mult[1]], R[2 + shared.dim.R.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { - internal.n_vaccination_t_R[i - 1 + 2 * shared.dim.n_vaccination_t_R.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * R[i - 1 + 2 * shared.dim.R.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), R[i - 1 + 2 * shared.dim.R.mult[1]])); - } - const real_type new_deaths_15_plus = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {3, 15}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_15_17 + dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {17, 19}, {0, shared.dim.n_IdD.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.s_ij_gen_pop.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.s_ij_gen_pop.dim[1]; ++j) { - internal.s_ij_gen_pop[i - 1 + (j - 1) * shared.dim.s_ij_gen_pop.mult[1]] = shared.m_gen_pop[i - 1 + (j - 1) * shared.dim.m_gen_pop.mult[1]] * internal.prop_infectious[j - 1]; - } + internal.n_vaccination_t_R[i - 1 + 2 * shared.dim.n_vaccination_t_R.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * R[i - 1 + 2 * shared.dim.R.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), R[i - 1 + 2 * shared.dim.R.mult[1]])); } - for (size_t i = 1; i <= shared.dim.s_ij_sex.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.s_ij_sex.dim[1]; ++j) { - internal.s_ij_sex[i - 1 + (j - 1) * shared.dim.s_ij_sex.mult[1]] = shared.m_sex[i - 1 + (j - 1) * shared.dim.m_sex.mult[1]] * internal.prop_infectious[j - 1]; + for (size_t i = 1; i <= shared.dim.lambda.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda.dim[1]; ++j) { + internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] = internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] + shared.lambda_z[i - 1 + (j - 1) * shared.dim.lambda_z.mult[1]]; } } for (size_t i = 1; i <= shared.dim.delta_S_n_vaccination.dim[0]; ++i) { @@ -1162,14 +1185,24 @@ class model_targeted_vax { internal.n_vaccination_t[i - 1 + (j - 1) * shared.dim.n_vaccination_t.mult[1]] = internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.lambda_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_hh.dim[1]; ++j) { - internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] = shared.beta_h * dust2::array::sum(internal.s_ij_gen_pop.data(), shared.dim.s_ij_gen_pop, {i - 1, i - 1}, {0, shared.dim.s_ij_gen_pop.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); + for (size_t i = 1; i <= shared.dim.p_SE.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_SE.dim[1]; ++j) { + internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]] = 1 - monty::math::exp(-internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] * dt); } } - for (size_t i = 1; i <= shared.dim.lambda_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_s.dim[1]; ++j) { - internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] = shared.beta_s * dust2::array::sum(internal.s_ij_sex.data(), shared.dim.s_ij_sex, {i - 1, i - 1}, {0, shared.dim.s_ij_sex.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); + for (size_t i = 1; i <= shared.dim.p_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_hh.dim[1]; ++j) { + internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + } + } + for (size_t i = 1; i <= shared.dim.p_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_s.dim[1]; ++j) { + internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + } + } + for (size_t i = 1; i <= shared.dim.p_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_hc.dim[1]; ++j) { + internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); } } for (size_t i = 1; i <= shared.dim.R.dim[0]; ++i) { @@ -1191,9 +1224,9 @@ class model_targeted_vax { const real_type new_dose2_ASW = internal.n_vaccination_t[17 + 2 * shared.dim.n_vaccination_t.mult[1]]; const real_type new_dose2_PBS = internal.n_vaccination_t[18 + 2 * shared.dim.n_vaccination_t.mult[1]]; const real_type new_dose2_HCW = internal.n_vaccination_t[19 + 2 * shared.dim.n_vaccination_t.mult[1]]; - for (size_t i = 1; i <= shared.dim.lambda.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda.dim[1]; ++j) { - internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] = internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] + shared.lambda_z[i - 1 + (j - 1) * shared.dim.lambda_z.mult[1]]; + for (size_t i = 1; i <= shared.dim.n_SEa.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa.dim[1]; ++j) { + internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] = monty::random::binomial(rng_state, S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]], internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { @@ -1206,30 +1239,26 @@ class model_targeted_vax { internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]] = monty::random::binomial(rng_state, Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]], p_EI); } } + for (size_t i = 1; i <= shared.dim.S.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.S.dim[1]; ++j) { + internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] = S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]]; + } + } + const real_type new_cases_00_04 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {0, 0}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}), static_cast(0.5)); + const real_type new_cases_CSW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_ASW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 17}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_PBS = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {18, 18}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_HCW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {19, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); const real_type new_dose1_SW_15_17 = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] - new_dose1_SW_12_14; const real_type new_dose1_05_14 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {1, 2}, {1, 1}) + new_dose1_SW_12_14; const real_type new_dose1_SW = new_dose1_CSW + new_dose1_ASW; const real_type new_dose2_SW_15_17 = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] - new_dose2_SW_12_14; const real_type new_dose2_05_14 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {1, 2}, {2, 2}) + new_dose2_SW_12_14; const real_type new_dose2_SW = new_dose2_CSW + new_dose2_ASW; - for (size_t i = 1; i <= shared.dim.p_SE.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_SE.dim[1]; ++j) { - internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]] = 1 - monty::math::exp(-internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] * dt); - } - } - for (size_t i = 1; i <= shared.dim.p_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_hh.dim[1]; ++j) { - internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); - } - } - for (size_t i = 1; i <= shared.dim.p_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_s.dim[1]; ++j) { - internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); - } - } - for (size_t i = 1; i <= shared.dim.p_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_hc.dim[1]; ++j) { - internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + for (size_t i = 1; i <= shared.dim.n_SEa_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_hh.dim[1]; ++j) { + internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]], internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EbId.dim[0]; ++i) { @@ -1237,21 +1266,34 @@ class model_targeted_vax { internal.n_EbId[i - 1 + (j - 1) * shared.dim.n_EbId.mult[1]] = monty::random::binomial(rng_state, internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]], shared.CFR[i - 1 + (j - 1) * shared.dim.CFR.mult[1]]); } } + for (size_t i = 1; i <= shared.dim.delta_Ea.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Ea.dim[1]; ++j) { + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]]; + } + } for (size_t i = 1; i <= shared.dim.delta_Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.delta_Eb.dim[1]; ++j) { internal.delta_Eb[i - 1 + (j - 1) * shared.dim.delta_Eb.mult[1]] = internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] - internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]]; } } + for (size_t i = 1; i <= shared.dim.Ea.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.Ea.dim[1]; ++j) { + internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] = Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]]; + } + } for (size_t i = 1; i <= shared.dim.Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Eb.dim[1]; ++j) { internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] = Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] + internal.delta_Eb[i - 1 + (j - 1) * shared.dim.delta_Eb.mult[1]]; } } + const real_type new_cases_SW_15_17 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}) - new_cases_SW_12_14; + const real_type new_cases_05_14 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {1, 2}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_12_14; + const real_type new_cases_SW = new_cases_CSW + new_cases_ASW; const real_type new_dose1_15_plus = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {3, 15}, {1, 1}) + new_dose1_SW_15_17 + dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {17, 19}, {1, 1}); const real_type new_dose2_15_plus = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {3, 15}, {2, 2}) + new_dose2_SW_15_17 + dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {17, 19}, {2, 2}); - for (size_t i = 1; i <= shared.dim.n_SEa.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa.dim[1]; ++j) { - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] = monty::random::binomial(rng_state, S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]], internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]]); + for (size_t i = 1; i <= shared.dim.n_SEa_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_s.dim[1]; ++j) { + internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]], internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EbIr.dim[0]; ++i) { @@ -1264,30 +1306,20 @@ class model_targeted_vax { internal.delta_Id[i - 1 + (j - 1) * shared.dim.delta_Id.mult[1]] = internal.n_EbId[i - 1 + (j - 1) * shared.dim.n_EbId.mult[1]] - internal.n_IdD[i - 1 + (j - 1) * shared.dim.n_IdD.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.S.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.S.dim[1]; ++j) { - internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] = S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]]; - } - } for (size_t i = 1; i <= shared.dim.Id.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Id.dim[1]; ++j) { internal.new_Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] = Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] + internal.delta_Id[i - 1 + (j - 1) * shared.dim.delta_Id.mult[1]]; } } - const real_type new_cases_00_04 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {0, 0}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}), static_cast(0.5)); - const real_type new_cases_CSW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_ASW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 17}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_PBS = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {18, 18}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_HCW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {19, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.n_SEa_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_hh.dim[1]; ++j) { - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]], internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]]); + for (size_t i = 1; i <= shared.dim.E.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.E.dim[1]; ++j) { + internal.new_E[i - 1 + (j - 1) * shared.dim.E.mult[1]] = internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.delta_Ea.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Ea.dim[1]; ++j) { - internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]]; + const real_type new_cases_15_plus = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {3, 15}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_15_17 + dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); + for (size_t i = 1; i <= shared.dim.n_SEa_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_hc.dim[1]; ++j) { + internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]], internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]]); } } for (size_t i = 1; i <= shared.dim.delta_Ir.dim[0]; ++i) { @@ -1295,27 +1327,14 @@ class model_targeted_vax { internal.delta_Ir[i - 1 + (j - 1) * shared.dim.delta_Ir.mult[1]] = internal.n_EbIr[i - 1 + (j - 1) * shared.dim.n_EbIr.mult[1]] - internal.n_IrR[i - 1 + (j - 1) * shared.dim.n_IrR.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.Ea.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.Ea.dim[1]; ++j) { - internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] = Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]]; - } - } for (size_t i = 1; i <= shared.dim.Ir.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Ir.dim[1]; ++j) { internal.new_Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] = Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] + internal.delta_Ir[i - 1 + (j - 1) * shared.dim.delta_Ir.mult[1]]; } } - const real_type new_cases_SW_15_17 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}) - new_cases_SW_12_14; - const real_type new_cases_05_14 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {1, 2}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_12_14; - const real_type new_cases_SW = new_cases_CSW + new_cases_ASW; - for (size_t i = 1; i <= shared.dim.n_SEa_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_s.dim[1]; ++j) { - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]], internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]]); - } - } - for (size_t i = 1; i <= shared.dim.E.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.E.dim[1]; ++j) { - internal.new_E[i - 1 + (j - 1) * shared.dim.E.mult[1]] = internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]]; + for (size_t i = 1; i <= shared.dim.n_SEa_z.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_z.dim[1]; ++j) { + internal.n_SEa_z[i - 1 + (j - 1) * shared.dim.n_SEa_z.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]]; } } for (size_t i = 1; i <= shared.dim.I.dim[0]; ++i) { @@ -1328,17 +1347,6 @@ class model_targeted_vax { internal.new_N[i - 1 + (j - 1) * shared.dim.N.mult[1]] = internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.new_Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] + internal.new_Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] + internal.new_R[i - 1 + (j - 1) * shared.dim.R.mult[1]] + internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]]; } } - const real_type new_cases_15_plus = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {3, 15}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_15_17 + dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.n_SEa_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_hc.dim[1]; ++j) { - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]], internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]]); - } - } - for (size_t i = 1; i <= shared.dim.n_SEa_z.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_z.dim[1]; ++j) { - internal.n_SEa_z[i - 1 + (j - 1) * shared.dim.n_SEa_z.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]]; - } - } state_next[0] = (prioritisation_step_1st_dose_children_proposal > shared.N_prioritisation_steps_children ? shared.N_prioritisation_steps_children : prioritisation_step_1st_dose_children_proposal); state_next[1] = (prioritisation_step_1st_dose_adults_proposal > shared.N_prioritisation_steps_adults ? shared.N_prioritisation_steps_adults : prioritisation_step_1st_dose_adults_proposal); state_next[2] = (prioritisation_step_2nd_dose_adults_proposal > shared.N_prioritisation_steps_adults ? shared.N_prioritisation_steps_adults : prioritisation_step_2nd_dose_adults_proposal); diff --git a/inst/odin/model-targeted-vax.R b/inst/odin/model-targeted-vax.R index f1c9a79..2026b6c 100644 --- a/inst/odin/model-targeted-vax.R +++ b/inst/odin/model-targeted-vax.R @@ -10,12 +10,8 @@ ## Emergency use of the MVA-BN has not been granted for children (u18s) in DRC ## and so we split vaccination into two components depending on age ## below are indicators for children vs adult groups -## use of _raw indicates that we are in prop form for the boundary category -## of 15 - 19 -children_ind_raw <- parameter() -dim(children_ind_raw) <- c(n_group) -adults_ind_raw <- parameter() -dim(adults_ind_raw) <- c(n_group) +is_child <- parameter() +dim(is_child) <- c(n_group) ### setup the number of daily doses ## daily_doses_value has dimensions n_vax x n_time @@ -58,8 +54,6 @@ dim(prioritisation_strategy_adults) <- c(n_group, N_prioritisation_steps_adults) ## vaccination targets: for each group, what is the level of coverage we want to ## see before we move onto the next set of groups to target? -## when we input this do the calc outside by the population size as part of -## pre-processing to save faffing around in here. ## here, j=1,...,n_vax corresponds to the coverage wanted in j, so for j=0 ## and j=1 this stays at 0 @@ -72,19 +66,20 @@ dim(prioritisation_strategy_adults) <- c(n_group, N_prioritisation_steps_adults) ## neither children or adults, for children col 4 (2nd dose) also doesn't matter ## children -dim(target_met_children_t) <- c(n_group, n_vax) +dim(target_met_children_t) <- c(n_group) ## 1st doses ## if you have a 2nd dose this implies you also have had a 1st dose so account ## for this in the 1st dose target - this now isn't strictly relevant for ## children but leaving it in in case we do expand this to 2 doses in future -target_met_children_t[, ] <- 0 -target_met_children_t[, 3] <- - ((sum(N[i, 3:4]) * children_ind_raw[i]) > +target_met_children_t[] <- 0 +target_met_children_t[] <- + ((sum(N[i, 3:4]) * is_child[i]) > prioritisation_strategy_children[ i, prioritisation_step_1st_dose_children] * sum(N[i, ])) ## adults +## keep this as a vector because it means the columns match (E.g. 3 and 3, 4 and 4) dim(target_met_adults_t) <- c(n_group, n_vax) ## 1st doses @@ -92,18 +87,17 @@ dim(target_met_adults_t) <- c(n_group, n_vax) ## for this in the 1st dose target target_met_adults_t[, ] <- 0 target_met_adults_t[, 3] <- - ((sum(N[i, 3:4]) * adults_ind_raw[i]) > + ((sum(N[i, 3:4]) * (1 - is_child[i])) > prioritisation_strategy_adults[i, prioritisation_step_1st_dose_adults] * sum(N[i, ])) ## 2nd doses target_met_adults_t[, 4] <- - ((sum(N[i, 4]) * adults_ind_raw[i]) > + ((sum(N[i, 4]) * (1 - is_child[i])) > prioritisation_strategy_adults[i, prioritisation_step_2nd_dose_adults] * sum(N[i, ])) - ## prioritisation step proposal to account for the fact that this would update ## every single time step if we vaccinate quickly enough (unlikely but would ## like it to be done properly) @@ -111,22 +105,22 @@ target_met_adults_t[, 4] <- ## the target goal for the current prioritisation strategy ## with ceiling basically saying if there is any target in that group to account ## for it -coverage_achieved_1st_dose_children[] <- ceiling( +coverage_target_1st_dose_children[] <- ceiling( prioritisation_strategy_children[i, prioritisation_step_1st_dose_children]) -dim(coverage_achieved_1st_dose_children) <- c(n_group) +dim(coverage_target_1st_dose_children) <- c(n_group) -coverage_achieved_1st_dose_adults[] <- ceiling( +coverage_target_1st_dose_adults[] <- ceiling( prioritisation_strategy_adults[i, prioritisation_step_1st_dose_adults]) -dim(coverage_achieved_1st_dose_adults) <- c(n_group) +dim(coverage_target_1st_dose_adults) <- c(n_group) -coverage_achieved_2nd_dose_adults[] <- ceiling( +coverage_target_2nd_dose_adults[] <- ceiling( prioritisation_strategy_adults[i, prioritisation_step_2nd_dose_adults]) -dim(coverage_achieved_2nd_dose_adults) <- c(n_group) +dim(coverage_target_2nd_dose_adults) <- c(n_group) ## children prioritisation_step_1st_dose_children_proposal <- - if (sum(target_met_children_t[, 3]) == - sum(coverage_achieved_1st_dose_children[])) + if (sum(target_met_children_t[]) == + sum(coverage_target_1st_dose_children[])) prioritisation_step_1st_dose_children + 1 else prioritisation_step_1st_dose_children @@ -139,7 +133,7 @@ update(prioritisation_step_1st_dose_children) <- ## adults prioritisation_step_1st_dose_adults_proposal <- - if (sum(target_met_adults_t[, 3]) == sum(coverage_achieved_1st_dose_adults[])) + if (sum(target_met_adults_t[, 3]) == sum(coverage_target_1st_dose_adults[])) prioritisation_step_1st_dose_adults + 1 else prioritisation_step_1st_dose_adults @@ -150,7 +144,7 @@ update(prioritisation_step_1st_dose_adults) <- prioritisation_step_1st_dose_adults_proposal prioritisation_step_2nd_dose_adults_proposal <- - if (sum(target_met_adults_t[, 4]) == sum(coverage_achieved_2nd_dose_adults[])) + if (sum(target_met_adults_t[, 4]) == sum(coverage_target_2nd_dose_adults[])) prioritisation_step_2nd_dose_adults + 1 else prioritisation_step_2nd_dose_adults @@ -167,48 +161,55 @@ initial(prioritisation_step_1st_dose_children) <- 1 initial(prioritisation_step_1st_dose_adults) <- 1 initial(prioritisation_step_2nd_dose_adults) <- 1 -## now that we know the step we are on, we know who is eligible per age group to +## now that we know the step we are on, we know who is eligible per age group to ## be vaccinated +## create indicator for which groups are allowed to be vaccinated based on: +## 1) if they are an adult or a child (via is_child) +## 2) if they are in a prioritised group, dependent on being adult or child (prioritisation_strategy_X) +## 3) if the target for this group has not yet been met (target_met_X_t) + +dim(give_dose1_children) <- c(n_group) +give_dose1_children[] <- + is_child[i] * coverage_target_1st_dose_children[i] * (1 - target_met_children_t[i]) + +dim(give_dose1_adults) <- c(n_group) +give_dose1_adults[] <- + (1 - is_child[i]) * coverage_target_1st_dose_adults[i] * (1 - target_met_adults_t[i, 3]) +dim(give_dose2_adults) <- c(n_group) +give_dose2_adults[] <- + (1 - is_child[i]) * coverage_target_2nd_dose_adults[i] * (1 - target_met_adults_t[i, 4]) + + +## allocate the doses to the unvaccinated by age group, prioritisation strategy +## and across S, E, R + +children_dose1_denom[] <- (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2]) * give_dose1_children[i] +dim(children_dose1_denom) <- c(n_group) -## who can get a children's dose -n_eligible_for_dose1_children[] <- (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2]) * - prioritisation_strategy_children[i, prioritisation_step_1st_dose_children] -dim(n_eligible_for_dose1_children) <- c(n_group) -## who can get a 1st dose -## now we have to look in the preceding j class (e.g. who in unvaccinated j = 1 -## can get a 1st dose and move to j = 2) as these are the people who will be -## eligible -n_eligible_for_dose1_adults[] <- (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2]) * - prioritisation_strategy_adults[i, prioritisation_step_1st_dose_adults] -dim(n_eligible_for_dose1_adults) <- c(n_group) -## who can get a 2nd dose -n_eligible_for_dose2_adults[] <- (S[i, 3] + Ea[i, 3] + Eb[i, 3] + R[i, 3]) * - prioritisation_strategy_adults[i, prioritisation_step_2nd_dose_adults] -dim(n_eligible_for_dose2_adults) <- c(n_group) +adults_dose1_denom[] <- (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2]) * give_dose1_adults[i] +dim(adults_dose1_denom) <- c(n_group) +adults_dose2_denom[] <- (S[i, 3] + Ea[i, 3] + Eb[i, 3] + R[i, 3]) * give_dose2_adults[i] +dim(adults_dose2_denom) <- c(n_group) ### allocate to S ## children 1st doses n_vaccination_t_S_children[] <- 0 n_vaccination_t_S_children[] <- - if (sum(n_eligible_for_dose1_children[]) == 0) 0 else - min(floor((daily_doses_children_t[2] * S[i, 2] * - prioritisation_strategy_children[ - i, prioritisation_step_1st_dose_children]) / - sum(n_eligible_for_dose1_children[])), + if (sum(children_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_children_t[2] * S[i, 2]) / + sum(children_dose1_denom[])) * give_dose1_children[i]), S[i, 2]) n_vaccination_t_S_adults[] <- 0 ## adults 1st doses n_vaccination_t_S_adults[] <- - if (sum(n_eligible_for_dose1_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[2] * S[i, 2] * - prioritisation_strategy_adults[ - i, prioritisation_step_1st_dose_adults]) / - sum(n_eligible_for_dose1_adults[])), + if (sum(adults_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[2] * S[i, 2]) / + sum(adults_dose1_denom[])) * give_dose1_adults[i]), S[i, 2]) ## combine total first doses @@ -216,39 +217,31 @@ n_vaccination_t_S[, ] <- 0 n_vaccination_t_S[, 2] <- n_vaccination_t_S_children[i] + n_vaccination_t_S_adults[i] -## for the boundary case do an extra check that we haven't gone over the number -## of people in each compartment -n_vaccination_t_S[3, 2] <- min(n_vaccination_t_S[3, 2], S[3, 2]) +## no longer doing boundary checks as we won't have any groups which are a mix of children and adults ## allocate 2nd doses (adults only for now) -n_vaccination_t_S[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[3] * S[i, 3] * - prioritisation_strategy_adults[ - i, prioritisation_step_2nd_dose_adults]) / - sum(n_eligible_for_dose2_adults[])), +n_vaccination_t_S[, 3] <- + if (sum(adults_dose2_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[3] * S[i, 3]) / + sum(adults_dose2_denom[])) * give_dose2_adults[i]), S[i, 3]) - ### allocate to Ea ## children 1st doses n_vaccination_t_Ea_children[] <- 0 n_vaccination_t_Ea_children[] <- - if (sum(n_eligible_for_dose1_children[]) == 0) 0 else - min(floor((daily_doses_children_t[2] * Ea[i, 2] * - prioritisation_strategy_children[ - i, prioritisation_step_1st_dose_children]) / - sum(n_eligible_for_dose1_children[])), + if (sum(children_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_children_t[2] * Ea[i, 2]) / + sum(children_dose1_denom[])) * give_dose1_children[i]), Ea[i, 2]) ## adults 1st doses n_vaccination_t_Ea_adults[] <- 0 n_vaccination_t_Ea_adults[] <- - if (sum(n_eligible_for_dose1_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[2] * Ea[i, 2] * - prioritisation_strategy_adults[ - i, prioritisation_step_1st_dose_adults]) / - sum(n_eligible_for_dose1_adults[])), + if (sum(adults_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[2] * Ea[i, 2]) / + sum(adults_dose1_denom[])) * give_dose1_adults[i]), Ea[i, 2]) ## combine total first doses @@ -256,17 +249,12 @@ n_vaccination_t_Ea[, ] <- 0 n_vaccination_t_Ea[, 2] <- n_vaccination_t_Ea_children[i] + n_vaccination_t_Ea_adults[i] -## for the boundary case do an extra check that we haven't gone over the number -## of people in each compartment -n_vaccination_t_Ea[3, 2] <- min(n_vaccination_t_Ea[3, 2], Ea[3, 2]) - ## adults 2nd doses -n_vaccination_t_Ea[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[3] * Ea[i, 3] * - prioritisation_strategy_adults[ - i, prioritisation_step_2nd_dose_adults]) / - sum(n_eligible_for_dose2_adults[])), - Ea[i, 3]) +n_vaccination_t_Ea[, 3] <- + if (sum(adults_dose2_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[3] * Ea[i, 3]) / + sum(adults_dose2_denom[])) * give_dose2_adults[i]), + Ea[i, 3]) ### allocate to Eb @@ -274,21 +262,17 @@ n_vaccination_t_Ea[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else ## children 1st doses n_vaccination_t_Eb_children[] <- 0 n_vaccination_t_Eb_children[] <- - if (sum(n_eligible_for_dose1_children[]) == 0) 0 else - min(floor((daily_doses_children_t[2] * Eb[i, 2] * - prioritisation_strategy_children[ - i, prioritisation_step_1st_dose_children]) / - sum(n_eligible_for_dose1_children[])), + if (sum(children_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_children_t[2] * Eb[i, 2]) / + sum(children_dose1_denom[])) * give_dose1_children[i]), Eb[i, 2]) ## adults 1st doses n_vaccination_t_Eb_adults[] <- 0 n_vaccination_t_Eb_adults[] <- - if (sum(n_eligible_for_dose1_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[2] * Eb[i, 2] * - prioritisation_strategy_adults[ - i, prioritisation_step_1st_dose_adults]) / - sum(n_eligible_for_dose1_adults[])), + if (sum(adults_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[2] * Eb[i, 2]) / + sum(adults_dose1_denom[])) * give_dose1_adults[i]), Eb[i, 2]) ## combine total first doses @@ -296,17 +280,12 @@ n_vaccination_t_Eb[, ] <- 0 n_vaccination_t_Eb[, 2] <- n_vaccination_t_Eb_children[i] + n_vaccination_t_Eb_adults[i] -## for the boundary case do an extra check that we haven't gone over the number -## of people in each compartment -n_vaccination_t_Eb[3, 2] <- min(n_vaccination_t_Eb[3, 2], Eb[3, 2]) - ## adults 2nd doses -n_vaccination_t_Eb[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[3] * Eb[i, 3] * - prioritisation_strategy_adults[ - i, prioritisation_step_2nd_dose_adults]) / - sum(n_eligible_for_dose2_adults[])), - Eb[i, 3]) +n_vaccination_t_Eb[, 3] <- + if (sum(adults_dose2_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[3] * Eb[i, 3]) / + sum(adults_dose2_denom[])) * give_dose2_adults[i]), + Eb[i, 3]) ### allocate to R @@ -314,21 +293,17 @@ n_vaccination_t_Eb[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else ## children 1st doses n_vaccination_t_R_children[] <- 0 n_vaccination_t_R_children[] <- - if (sum(n_eligible_for_dose1_children[]) == 0) 0 else - min(floor((daily_doses_children_t[2] * R[i, 2] * - prioritisation_strategy_children[ - i, prioritisation_step_1st_dose_children]) / - sum(n_eligible_for_dose1_children[])), + if (sum(children_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_children_t[2] * R[i, 2]) / + sum(children_dose1_denom[])) * give_dose1_children[i]), R[i, 2]) ## adults 1st doses n_vaccination_t_R_adults[] <- 0 n_vaccination_t_R_adults[] <- - if (sum(n_eligible_for_dose1_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[2] * R[i, 2] * - prioritisation_strategy_adults[ - i, prioritisation_step_1st_dose_adults]) / - sum(n_eligible_for_dose1_adults[])), + if (sum(adults_dose1_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[2] * R[i, 2]) / + sum(adults_dose1_denom[])) * give_dose1_adults[i]), R[i, 2]) ## combine total first doses @@ -336,17 +311,12 @@ n_vaccination_t_R[, ] <- 0 n_vaccination_t_R[, 2] <- n_vaccination_t_R_children[i] + n_vaccination_t_R_adults[i] -## for the boundary case do an extra check that we haven't gone over the number -## of people in each compartment -n_vaccination_t_R[3, 2] <- min(n_vaccination_t_R[3, 2], R[3, 2]) - ## adults 2nd doses -n_vaccination_t_R[, 3] <- if (sum(n_eligible_for_dose2_adults[]) == 0) 0 else - min(floor((daily_doses_adults_t[3] * R[i, 3] * - prioritisation_strategy_adults[ - i, prioritisation_step_2nd_dose_adults]) / - sum(n_eligible_for_dose2_adults[])), - R[i, 3]) +n_vaccination_t_R[, 3] <- + if (sum(adults_dose2_denom[]) == 0) 0 else + min(floor(((daily_doses_adults_t[3] * R[i, 3]) / + sum(adults_dose2_denom[])) * give_dose2_adults[i]), + R[i, 3]) ## net vaccination change for relevant classes (S, Ea, Eb, R) @@ -638,6 +608,7 @@ s_ij_gen_pop[, ] <- m_gen_pop[i, j] * prop_infectious[j] # as above but for the sexual contacts only s_ij_sex[, ] <- m_sex[i, j] * prop_infectious[j] + lambda_hh[, ] <- beta_h * sum(s_ij_gen_pop[i, ]) * (1 - ve_I[i, j]) lambda_s[, ] <- beta_s * sum(s_ij_sex[i, ]) * (1 - ve_I[i, j]) # additional foi in HCW only (i = 20) homogeneous from infected as assumed equally @@ -646,7 +617,8 @@ lambda_hc[, ] <- if (i == 20) beta_hcw * sum(I_infectious) / sum(N) * (1 - ve_I[i, j]) else 0 lambda_z[, ] <- beta_z[i] * (1 - ve_I[i, j]) -lambda[, ] <- lambda_hh[i, j] + lambda_s[i, j] + lambda_hc[i, j] + lambda_z[i, j] +lambda[, ] <- lambda_hh[i, j] + lambda_s[i, j] + lambda_hc[i, j] + lambda_z[i, j] + ## Draws from binomial distributions for numbers changing between compartments # accounting for vaccination: diff --git a/src/model-targeted-vax.cpp b/src/model-targeted-vax.cpp index 9277cd5..02ac908 100644 --- a/src/model-targeted-vax.cpp +++ b/src/model-targeted-vax.cpp @@ -5,8 +5,7 @@ // [[dust2::class(model_targeted_vax)]] // [[dust2::time_type(discrete)]] // [[dust2::has_compare()]] -// [[dust2::parameter(children_ind_raw, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] -// [[dust2::parameter(adults_ind_raw, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] +// [[dust2::parameter(is_child, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_children_value, type = "real_type", rank = 2, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_children_time, type = "real_type", rank = 1, required = TRUE, constant = FALSE)]] // [[dust2::parameter(daily_doses_adults_value, type = "real_type", rank = 2, required = TRUE, constant = FALSE)]] @@ -60,8 +59,7 @@ class model_targeted_vax { } offset; } odin; struct dim_type { - dust2::array::dimensions<1> children_ind_raw; - dust2::array::dimensions<1> adults_ind_raw; + dust2::array::dimensions<1> is_child; dust2::array::dimensions<2> daily_doses_children_value; dust2::array::dimensions<1> daily_doses_children_time; dust2::array::dimensions<2> daily_doses_adults_value; @@ -70,14 +68,17 @@ class model_targeted_vax { dust2::array::dimensions<1> daily_doses_adults_t; dust2::array::dimensions<2> prioritisation_strategy_children; dust2::array::dimensions<2> prioritisation_strategy_adults; - dust2::array::dimensions<2> target_met_children_t; + dust2::array::dimensions<1> target_met_children_t; dust2::array::dimensions<2> target_met_adults_t; - dust2::array::dimensions<1> coverage_achieved_1st_dose_children; - dust2::array::dimensions<1> coverage_achieved_1st_dose_adults; - dust2::array::dimensions<1> coverage_achieved_2nd_dose_adults; - dust2::array::dimensions<1> n_eligible_for_dose1_children; - dust2::array::dimensions<1> n_eligible_for_dose1_adults; - dust2::array::dimensions<1> n_eligible_for_dose2_adults; + dust2::array::dimensions<1> coverage_target_1st_dose_children; + dust2::array::dimensions<1> coverage_target_1st_dose_adults; + dust2::array::dimensions<1> coverage_target_2nd_dose_adults; + dust2::array::dimensions<1> give_dose1_children; + dust2::array::dimensions<1> give_dose1_adults; + dust2::array::dimensions<1> give_dose2_adults; + dust2::array::dimensions<1> children_dose1_denom; + dust2::array::dimensions<1> adults_dose1_denom; + dust2::array::dimensions<1> adults_dose2_denom; dust2::array::dimensions<2> N; dust2::array::dimensions<2> S; dust2::array::dimensions<2> S0; @@ -173,8 +174,7 @@ class model_targeted_vax { std::vector daily_doses_children_time; std::vector daily_doses_adults_value; std::vector daily_doses_adults_time; - std::vector children_ind_raw; - std::vector adults_ind_raw; + std::vector is_child; dust2::interpolate::InterpolateConstantArray interpolate_daily_doses_children_t; dust2::interpolate::InterpolateConstantArray interpolate_daily_doses_adults_t; std::vector prioritisation_strategy_children; @@ -199,17 +199,25 @@ class model_targeted_vax { std::vector n_IdD; std::vector target_met_children_t; std::vector target_met_adults_t; - std::vector coverage_achieved_1st_dose_children; - std::vector coverage_achieved_1st_dose_adults; - std::vector coverage_achieved_2nd_dose_adults; - std::vector n_eligible_for_dose1_children; - std::vector n_eligible_for_dose1_adults; - std::vector n_eligible_for_dose2_adults; + std::vector coverage_target_1st_dose_children; + std::vector coverage_target_1st_dose_adults; + std::vector coverage_target_2nd_dose_adults; std::vector I_infectious; std::vector delta_R; std::vector delta_D; std::vector daily_doses_children_t; std::vector daily_doses_adults_t; + std::vector give_dose1_children; + std::vector give_dose1_adults; + std::vector give_dose2_adults; + std::vector new_D; + std::vector prop_infectious; + std::vector lambda_hc; + std::vector children_dose1_denom; + std::vector adults_dose1_denom; + std::vector adults_dose2_denom; + std::vector s_ij_gen_pop; + std::vector s_ij_sex; std::vector n_vaccination_t_S_children; std::vector n_vaccination_t_S_adults; std::vector n_vaccination_t_Ea_children; @@ -218,49 +226,44 @@ class model_targeted_vax { std::vector n_vaccination_t_Eb_adults; std::vector n_vaccination_t_R_children; std::vector n_vaccination_t_R_adults; - std::vector new_D; - std::vector prop_infectious; - std::vector lambda_hc; + std::vector lambda_hh; + std::vector lambda_s; std::vector n_vaccination_t_S; std::vector n_vaccination_t_Ea; std::vector n_vaccination_t_Eb; std::vector n_vaccination_t_R; - std::vector s_ij_gen_pop; - std::vector s_ij_sex; + std::vector lambda; std::vector delta_S_n_vaccination; std::vector delta_Ea_n_vaccination; std::vector delta_Eb_n_vaccination; std::vector delta_R_n_vaccination; std::vector n_vaccination_t; - std::vector lambda_hh; - std::vector lambda_s; - std::vector new_R; - std::vector lambda; - std::vector n_EaEb; - std::vector n_EbI; std::vector p_SE; std::vector p_hh; std::vector p_s; std::vector p_hc; + std::vector new_R; + std::vector n_SEa; + std::vector n_EaEb; + std::vector n_EbI; + std::vector new_S; + std::vector n_SEa_hh; std::vector n_EbId; + std::vector delta_Ea; std::vector delta_Eb; + std::vector new_Ea; std::vector new_Eb; - std::vector n_SEa; + std::vector n_SEa_s; std::vector n_EbIr; std::vector delta_Id; - std::vector new_S; std::vector new_Id; - std::vector n_SEa_hh; - std::vector delta_Ea; + std::vector new_E; + std::vector n_SEa_hc; std::vector delta_Ir; - std::vector new_Ea; std::vector new_Ir; - std::vector n_SEa_s; - std::vector new_E; + std::vector n_SEa_z; std::vector new_I; std::vector new_N; - std::vector n_SEa_hc; - std::vector n_SEa_z; }; struct data_type { real_type cases; @@ -306,8 +309,7 @@ class model_targeted_vax { const real_type alpha_deaths_00_04 = dust2::r::read_real(parameters, "alpha_deaths_00_04"); const real_type alpha_deaths_05_14 = dust2::r::read_real(parameters, "alpha_deaths_05_14"); const real_type alpha_deaths_15_plus = dust2::r::read_real(parameters, "alpha_deaths_15_plus"); - dim.children_ind_raw.set({static_cast(n_group)}); - dim.adults_ind_raw.set({static_cast(n_group)}); + dim.is_child.set({static_cast(n_group)}); std::vector daily_doses_children_value(dim.daily_doses_children_value.size); dust2::r::read_real_array(parameters, dim.daily_doses_children_value, daily_doses_children_value.data(), "daily_doses_children_value", true); std::vector daily_doses_children_time(dim.daily_doses_children_time.size); @@ -320,14 +322,17 @@ class model_targeted_vax { dim.daily_doses_adults_t.set({static_cast(n_vax)}); dim.prioritisation_strategy_children.set({static_cast(n_group), static_cast(N_prioritisation_steps_children)}); dim.prioritisation_strategy_adults.set({static_cast(n_group), static_cast(N_prioritisation_steps_adults)}); - dim.target_met_children_t.set({static_cast(n_group), static_cast(n_vax)}); + dim.target_met_children_t.set({static_cast(n_group)}); dim.target_met_adults_t.set({static_cast(n_group), static_cast(n_vax)}); - dim.coverage_achieved_1st_dose_children.set({static_cast(n_group)}); - dim.coverage_achieved_1st_dose_adults.set({static_cast(n_group)}); - dim.coverage_achieved_2nd_dose_adults.set({static_cast(n_group)}); - dim.n_eligible_for_dose1_children.set({static_cast(n_group)}); - dim.n_eligible_for_dose1_adults.set({static_cast(n_group)}); - dim.n_eligible_for_dose2_adults.set({static_cast(n_group)}); + dim.coverage_target_1st_dose_children.set({static_cast(n_group)}); + dim.coverage_target_1st_dose_adults.set({static_cast(n_group)}); + dim.coverage_target_2nd_dose_adults.set({static_cast(n_group)}); + dim.give_dose1_children.set({static_cast(n_group)}); + dim.give_dose1_adults.set({static_cast(n_group)}); + dim.give_dose2_adults.set({static_cast(n_group)}); + dim.children_dose1_denom.set({static_cast(n_group)}); + dim.adults_dose1_denom.set({static_cast(n_group)}); + dim.adults_dose2_denom.set({static_cast(n_group)}); dim.N.set({static_cast(n_group), static_cast(n_vax)}); dim.S.set({static_cast(n_group), static_cast(n_vax)}); dim.S0.set({static_cast(n_group), static_cast(n_vax)}); @@ -399,10 +404,8 @@ class model_targeted_vax { dim.delta_Ea_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); dim.delta_Eb_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); dim.delta_R_n_vaccination.set({static_cast(n_group), static_cast(n_vax)}); - std::vector children_ind_raw(dim.children_ind_raw.size); - dust2::r::read_real_array(parameters, dim.children_ind_raw, children_ind_raw.data(), "children_ind_raw", true); - std::vector adults_ind_raw(dim.adults_ind_raw.size); - dust2::r::read_real_array(parameters, dim.adults_ind_raw, adults_ind_raw.data(), "adults_ind_raw", true); + std::vector is_child(dim.is_child.size); + dust2::r::read_real_array(parameters, dim.is_child, is_child.data(), "is_child", true); const auto interpolate_daily_doses_children_t = dust2::interpolate::InterpolateConstantArray(daily_doses_children_time, daily_doses_children_value, dim.daily_doses_children_t, "daily_doses_children_time", "daily_doses_children_value"); const auto interpolate_daily_doses_adults_t = dust2::interpolate::InterpolateConstantArray(daily_doses_adults_time, daily_doses_adults_value, dim.daily_doses_adults_t, "daily_doses_adults_time", "daily_doses_adults_value"); std::vector prioritisation_strategy_children(dim.prioritisation_strategy_children.size); @@ -556,24 +559,32 @@ class model_targeted_vax { {"cases_cumulative_by_age", std::vector(dim.cases_cumulative_by_age.dim.begin(), dim.cases_cumulative_by_age.dim.end())} }; odin.packing.state.copy_offset(odin.offset.state.begin()); - return shared_state{odin, dim, N_prioritisation_steps_children, N_prioritisation_steps_adults, beta_h, beta_s, beta_hcw, gamma_E, gamma_Ir, gamma_Id, n_vax, n_group, exp_noise, alpha_cases, alpha_cases_00_04, alpha_cases_05_14, alpha_cases_15_plus, alpha_deaths, alpha_deaths_00_04, alpha_deaths_05_14, alpha_deaths_15_plus, daily_doses_children_value, daily_doses_children_time, daily_doses_adults_value, daily_doses_adults_time, children_ind_raw, adults_ind_raw, interpolate_daily_doses_children_t, interpolate_daily_doses_adults_t, prioritisation_strategy_children, prioritisation_strategy_adults, m_gen_pop, m_sex, S0, Ea0, Eb0, Ir0, Id0, R0, D0, beta_z, CFR, ve_T, ve_I, lambda_z}; + return shared_state{odin, dim, N_prioritisation_steps_children, N_prioritisation_steps_adults, beta_h, beta_s, beta_hcw, gamma_E, gamma_Ir, gamma_Id, n_vax, n_group, exp_noise, alpha_cases, alpha_cases_00_04, alpha_cases_05_14, alpha_cases_15_plus, alpha_deaths, alpha_deaths_00_04, alpha_deaths_05_14, alpha_deaths_15_plus, daily_doses_children_value, daily_doses_children_time, daily_doses_adults_value, daily_doses_adults_time, is_child, interpolate_daily_doses_children_t, interpolate_daily_doses_adults_t, prioritisation_strategy_children, prioritisation_strategy_adults, m_gen_pop, m_sex, S0, Ea0, Eb0, Ir0, Id0, R0, D0, beta_z, CFR, ve_T, ve_I, lambda_z}; } static internal_state build_internal(const shared_state& shared) { std::vector n_IrR(shared.dim.n_IrR.size); std::vector n_IdD(shared.dim.n_IdD.size); std::vector target_met_children_t(shared.dim.target_met_children_t.size); std::vector target_met_adults_t(shared.dim.target_met_adults_t.size); - std::vector coverage_achieved_1st_dose_children(shared.dim.coverage_achieved_1st_dose_children.size); - std::vector coverage_achieved_1st_dose_adults(shared.dim.coverage_achieved_1st_dose_adults.size); - std::vector coverage_achieved_2nd_dose_adults(shared.dim.coverage_achieved_2nd_dose_adults.size); - std::vector n_eligible_for_dose1_children(shared.dim.n_eligible_for_dose1_children.size); - std::vector n_eligible_for_dose1_adults(shared.dim.n_eligible_for_dose1_adults.size); - std::vector n_eligible_for_dose2_adults(shared.dim.n_eligible_for_dose2_adults.size); + std::vector coverage_target_1st_dose_children(shared.dim.coverage_target_1st_dose_children.size); + std::vector coverage_target_1st_dose_adults(shared.dim.coverage_target_1st_dose_adults.size); + std::vector coverage_target_2nd_dose_adults(shared.dim.coverage_target_2nd_dose_adults.size); std::vector I_infectious(shared.dim.I_infectious.size); std::vector delta_R(shared.dim.delta_R.size); std::vector delta_D(shared.dim.delta_D.size); std::vector daily_doses_children_t(shared.dim.daily_doses_children_t.size); std::vector daily_doses_adults_t(shared.dim.daily_doses_adults_t.size); + std::vector give_dose1_children(shared.dim.give_dose1_children.size); + std::vector give_dose1_adults(shared.dim.give_dose1_adults.size); + std::vector give_dose2_adults(shared.dim.give_dose2_adults.size); + std::vector new_D(shared.dim.D.size); + std::vector prop_infectious(shared.dim.prop_infectious.size); + std::vector lambda_hc(shared.dim.lambda_hc.size); + std::vector children_dose1_denom(shared.dim.children_dose1_denom.size); + std::vector adults_dose1_denom(shared.dim.adults_dose1_denom.size); + std::vector adults_dose2_denom(shared.dim.adults_dose2_denom.size); + std::vector s_ij_gen_pop(shared.dim.s_ij_gen_pop.size); + std::vector s_ij_sex(shared.dim.s_ij_sex.size); std::vector n_vaccination_t_S_children(shared.dim.n_vaccination_t_S_children.size); std::vector n_vaccination_t_S_adults(shared.dim.n_vaccination_t_S_adults.size); std::vector n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); @@ -582,50 +593,45 @@ class model_targeted_vax { std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); std::vector n_vaccination_t_R_children(shared.dim.n_vaccination_t_R_children.size); std::vector n_vaccination_t_R_adults(shared.dim.n_vaccination_t_R_adults.size); - std::vector new_D(shared.dim.D.size); - std::vector prop_infectious(shared.dim.prop_infectious.size); - std::vector lambda_hc(shared.dim.lambda_hc.size); + std::vector lambda_hh(shared.dim.lambda_hh.size); + std::vector lambda_s(shared.dim.lambda_s.size); std::vector n_vaccination_t_S(shared.dim.n_vaccination_t_S.size); std::vector n_vaccination_t_Ea(shared.dim.n_vaccination_t_Ea.size); std::vector n_vaccination_t_Eb(shared.dim.n_vaccination_t_Eb.size); std::vector n_vaccination_t_R(shared.dim.n_vaccination_t_R.size); - std::vector s_ij_gen_pop(shared.dim.s_ij_gen_pop.size); - std::vector s_ij_sex(shared.dim.s_ij_sex.size); + std::vector lambda(shared.dim.lambda.size); std::vector delta_S_n_vaccination(shared.dim.delta_S_n_vaccination.size); std::vector delta_Ea_n_vaccination(shared.dim.delta_Ea_n_vaccination.size); std::vector delta_Eb_n_vaccination(shared.dim.delta_Eb_n_vaccination.size); std::vector delta_R_n_vaccination(shared.dim.delta_R_n_vaccination.size); std::vector n_vaccination_t(shared.dim.n_vaccination_t.size); - std::vector lambda_hh(shared.dim.lambda_hh.size); - std::vector lambda_s(shared.dim.lambda_s.size); - std::vector new_R(shared.dim.R.size); - std::vector lambda(shared.dim.lambda.size); - std::vector n_EaEb(shared.dim.n_EaEb.size); - std::vector n_EbI(shared.dim.n_EbI.size); std::vector p_SE(shared.dim.p_SE.size); std::vector p_hh(shared.dim.p_hh.size); std::vector p_s(shared.dim.p_s.size); std::vector p_hc(shared.dim.p_hc.size); + std::vector new_R(shared.dim.R.size); + std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_EaEb(shared.dim.n_EaEb.size); + std::vector n_EbI(shared.dim.n_EbI.size); + std::vector new_S(shared.dim.S.size); + std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); std::vector n_EbId(shared.dim.n_EbId.size); + std::vector delta_Ea(shared.dim.delta_Ea.size); std::vector delta_Eb(shared.dim.delta_Eb.size); + std::vector new_Ea(shared.dim.Ea.size); std::vector new_Eb(shared.dim.Eb.size); - std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_SEa_s(shared.dim.n_SEa_s.size); std::vector n_EbIr(shared.dim.n_EbIr.size); std::vector delta_Id(shared.dim.delta_Id.size); - std::vector new_S(shared.dim.S.size); std::vector new_Id(shared.dim.Id.size); - std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); - std::vector delta_Ea(shared.dim.delta_Ea.size); + std::vector new_E(shared.dim.E.size); + std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); std::vector delta_Ir(shared.dim.delta_Ir.size); - std::vector new_Ea(shared.dim.Ea.size); std::vector new_Ir(shared.dim.Ir.size); - std::vector n_SEa_s(shared.dim.n_SEa_s.size); - std::vector new_E(shared.dim.E.size); + std::vector n_SEa_z(shared.dim.n_SEa_z.size); std::vector new_I(shared.dim.I.size); std::vector new_N(shared.dim.N.size); - std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); - std::vector n_SEa_z(shared.dim.n_SEa_z.size); - return internal_state{n_IrR, n_IdD, target_met_children_t, target_met_adults_t, coverage_achieved_1st_dose_children, coverage_achieved_1st_dose_adults, coverage_achieved_2nd_dose_adults, n_eligible_for_dose1_children, n_eligible_for_dose1_adults, n_eligible_for_dose2_adults, I_infectious, delta_R, delta_D, daily_doses_children_t, daily_doses_adults_t, n_vaccination_t_S_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_R_children, n_vaccination_t_R_adults, new_D, prop_infectious, lambda_hc, n_vaccination_t_S, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, s_ij_gen_pop, s_ij_sex, delta_S_n_vaccination, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, n_vaccination_t, lambda_hh, lambda_s, new_R, lambda, n_EaEb, n_EbI, p_SE, p_hh, p_s, p_hc, n_EbId, delta_Eb, new_Eb, n_SEa, n_EbIr, delta_Id, new_S, new_Id, n_SEa_hh, delta_Ea, delta_Ir, new_Ea, new_Ir, n_SEa_s, new_E, new_I, new_N, n_SEa_hc, n_SEa_z}; + return internal_state{n_IrR, n_IdD, target_met_children_t, target_met_adults_t, coverage_target_1st_dose_children, coverage_target_1st_dose_adults, coverage_target_2nd_dose_adults, I_infectious, delta_R, delta_D, daily_doses_children_t, daily_doses_adults_t, give_dose1_children, give_dose1_adults, give_dose2_adults, new_D, prop_infectious, lambda_hc, children_dose1_denom, adults_dose1_denom, adults_dose2_denom, s_ij_gen_pop, s_ij_sex, n_vaccination_t_S_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_R_children, n_vaccination_t_R_adults, lambda_hh, lambda_s, n_vaccination_t_S, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, lambda, delta_S_n_vaccination, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, n_vaccination_t, p_SE, p_hh, p_s, p_hc, new_R, n_SEa, n_EaEb, n_EbI, new_S, n_SEa_hh, n_EbId, delta_Ea, delta_Eb, new_Ea, new_Eb, n_SEa_s, n_EbIr, delta_Id, new_Id, new_E, n_SEa_hc, delta_Ir, new_Ir, n_SEa_z, new_I, new_N}; } static data_type build_data(cpp11::list data, const shared_state& shared) { auto cases = dust2::r::read_real(data, "cases", NA_REAL); @@ -664,8 +670,7 @@ class model_targeted_vax { dust2::r::read_real_array(parameters, shared.dim.daily_doses_children_time, shared.daily_doses_children_time.data(), "daily_doses_children_time", false); dust2::r::read_real_array(parameters, shared.dim.daily_doses_adults_value, shared.daily_doses_adults_value.data(), "daily_doses_adults_value", false); dust2::r::read_real_array(parameters, shared.dim.daily_doses_adults_time, shared.daily_doses_adults_time.data(), "daily_doses_adults_time", false); - dust2::r::read_real_array(parameters, shared.dim.children_ind_raw, shared.children_ind_raw.data(), "children_ind_raw", false); - dust2::r::read_real_array(parameters, shared.dim.adults_ind_raw, shared.adults_ind_raw.data(), "adults_ind_raw", false); + dust2::r::read_real_array(parameters, shared.dim.is_child, shared.is_child.data(), "is_child", false); const auto interpolate_daily_doses_children_t = dust2::interpolate::InterpolateConstantArray(shared.daily_doses_children_time, shared.daily_doses_children_value, shared.dim.daily_doses_children_t, "daily_doses_children_time", "daily_doses_children_value"); const auto interpolate_daily_doses_adults_t = dust2::interpolate::InterpolateConstantArray(shared.daily_doses_adults_time, shared.daily_doses_adults_value, shared.dim.daily_doses_adults_t, "daily_doses_adults_time", "daily_doses_adults_value"); dust2::r::read_real_array(parameters, shared.dim.prioritisation_strategy_children, shared.prioritisation_strategy_children.data(), "prioritisation_strategy_children", false); @@ -953,13 +958,11 @@ class model_targeted_vax { internal.n_IdD[i - 1 + (j - 1) * shared.dim.n_IdD.mult[1]] = monty::random::binomial(rng_state, Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]], p_IdD); } } - for (size_t i = 1; i <= shared.dim.target_met_children_t.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.target_met_children_t.dim[1]; ++j) { - internal.target_met_children_t[i - 1 + (j - 1) * shared.dim.target_met_children_t.mult[1]] = 0; - } + for (size_t i = 1; i <= shared.dim.target_met_children_t.size; ++i) { + internal.target_met_children_t[i - 1] = 0; } - for (size_t i = 1; i <= shared.dim.target_met_children_t.dim[0]; ++i) { - internal.target_met_children_t[i - 1 + 2 * shared.dim.target_met_children_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.children_ind_raw[i - 1]) > shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + for (size_t i = 1; i <= shared.dim.target_met_children_t.size; ++i) { + internal.target_met_children_t[i - 1] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.is_child[i - 1]) > shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.target_met_adults_t.dim[1]; ++j) { @@ -967,28 +970,19 @@ class model_targeted_vax { } } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { - internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * shared.adults_ind_raw[i - 1]) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {2, 3}) * (1 - shared.is_child[i - 1])) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } for (size_t i = 1; i <= shared.dim.target_met_adults_t.dim[0]; ++i) { - internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {3, 3}) * shared.adults_ind_raw[i - 1]) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_1st_dose_children.size; ++i) { - internal.coverage_achieved_1st_dose_children[i - 1] = monty::math::ceil(shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_1st_dose_adults.size; ++i) { - internal.coverage_achieved_1st_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); - } - for (size_t i = 1; i <= shared.dim.coverage_achieved_2nd_dose_adults.size; ++i) { - internal.coverage_achieved_2nd_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); + internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]] = ((dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {3, 3}) * (1 - shared.is_child[i - 1])) > shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]] * dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose1_children.size; ++i) { - internal.n_eligible_for_dose1_children[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_1st_dose_children.size; ++i) { + internal.coverage_target_1st_dose_children[i - 1] = monty::math::ceil(shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose1_adults.size; ++i) { - internal.n_eligible_for_dose1_adults[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_1st_dose_adults.size; ++i) { + internal.coverage_target_1st_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); } - for (size_t i = 1; i <= shared.dim.n_eligible_for_dose2_adults.size; ++i) { - internal.n_eligible_for_dose2_adults[i - 1] = (S[i - 1 + 2 * shared.dim.S.mult[1]] + Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] + Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] + R[i - 1 + 2 * shared.dim.R.mult[1]]) * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]; + for (size_t i = 1; i <= shared.dim.coverage_target_2nd_dose_adults.size; ++i) { + internal.coverage_target_2nd_dose_adults[i - 1] = monty::math::ceil(shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]); } const real_type new_deaths_00_04 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {0, 0}, {0, shared.dim.n_IdD.dim[1] - 1}); const real_type new_deaths_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}), static_cast(0.5)); @@ -1013,71 +1007,110 @@ class model_targeted_vax { } shared.interpolate_daily_doses_children_t.eval(time, internal.daily_doses_children_t); shared.interpolate_daily_doses_adults_t.eval(time, internal.daily_doses_adults_t); - const real_type prioritisation_step_1st_dose_children_proposal = (dust2::array::sum(internal.target_met_children_t.data(), shared.dim.target_met_children_t, {0, shared.dim.target_met_children_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_achieved_1st_dose_children.data(), shared.dim.coverage_achieved_1st_dose_children) ? prioritisation_step_1st_dose_children + 1 : prioritisation_step_1st_dose_children); - const real_type prioritisation_step_1st_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_achieved_1st_dose_adults.data(), shared.dim.coverage_achieved_1st_dose_adults) ? prioritisation_step_1st_dose_adults + 1 : prioritisation_step_1st_dose_adults); - const real_type prioritisation_step_2nd_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {3, 3}) == dust2::array::sum(internal.coverage_achieved_2nd_dose_adults.data(), shared.dim.coverage_achieved_2nd_dose_adults) ? prioritisation_step_2nd_dose_adults + 1 : prioritisation_step_2nd_dose_adults); + const real_type prioritisation_step_1st_dose_children_proposal = (dust2::array::sum(internal.target_met_children_t.data(), shared.dim.target_met_children_t) == dust2::array::sum(internal.coverage_target_1st_dose_children.data(), shared.dim.coverage_target_1st_dose_children) ? prioritisation_step_1st_dose_children + 1 : prioritisation_step_1st_dose_children); + const real_type prioritisation_step_1st_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {2, 2}) == dust2::array::sum(internal.coverage_target_1st_dose_adults.data(), shared.dim.coverage_target_1st_dose_adults) ? prioritisation_step_1st_dose_adults + 1 : prioritisation_step_1st_dose_adults); + const real_type prioritisation_step_2nd_dose_adults_proposal = (dust2::array::sum(internal.target_met_adults_t.data(), shared.dim.target_met_adults_t, {0, shared.dim.target_met_adults_t.dim[0] - 1}, {3, 3}) == dust2::array::sum(internal.coverage_target_2nd_dose_adults.data(), shared.dim.coverage_target_2nd_dose_adults) ? prioritisation_step_2nd_dose_adults + 1 : prioritisation_step_2nd_dose_adults); + for (size_t i = 1; i <= shared.dim.give_dose1_children.size; ++i) { + internal.give_dose1_children[i - 1] = shared.is_child[i - 1] * internal.coverage_target_1st_dose_children[i - 1] * (1 - internal.target_met_children_t[i - 1]); + } + for (size_t i = 1; i <= shared.dim.give_dose1_adults.size; ++i) { + internal.give_dose1_adults[i - 1] = (1 - shared.is_child[i - 1]) * internal.coverage_target_1st_dose_adults[i - 1] * (1 - internal.target_met_adults_t[i - 1 + 2 * shared.dim.target_met_adults_t.mult[1]]); + } + for (size_t i = 1; i <= shared.dim.give_dose2_adults.size; ++i) { + internal.give_dose2_adults[i - 1] = (1 - shared.is_child[i - 1]) * internal.coverage_target_2nd_dose_adults[i - 1] * (1 - internal.target_met_adults_t[i - 1 + 3 * shared.dim.target_met_adults_t.mult[1]]); + } + for (size_t i = 1; i <= shared.dim.D.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.D.dim[1]; ++j) { + internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]] = D[i - 1 + (j - 1) * shared.dim.D.mult[1]] + internal.delta_D[i - 1 + (j - 1) * shared.dim.delta_D.mult[1]]; + } + } + const real_type new_deaths_SW_15_17 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}) - new_deaths_SW_12_14; + const real_type new_deaths_05_14 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {1, 2}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_12_14; + const real_type new_deaths_SW = new_deaths_CSW + new_deaths_ASW; + for (size_t i = 1; i <= shared.dim.prop_infectious.size; ++i) { + internal.prop_infectious[i - 1] = (dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1}) == 0 ? 0 : dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious, {i - 1, i - 1}, {0, shared.dim.I_infectious.dim[1] - 1}) / dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); + } + for (size_t i = 1; i <= shared.dim.lambda_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_hc.dim[1]; ++j) { + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] = (i == 20 ? shared.beta_hcw * dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious) / dust2::array::sum(N, shared.dim.N) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]) : 0); + } + } + for (size_t i = 1; i <= shared.dim.children_dose1_denom.size; ++i) { + internal.children_dose1_denom[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * internal.give_dose1_children[i - 1]; + } + for (size_t i = 1; i <= shared.dim.adults_dose1_denom.size; ++i) { + internal.adults_dose1_denom[i - 1] = (S[i - 1 + shared.dim.S.mult[1]] + Ea[i - 1 + shared.dim.Ea.mult[1]] + Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]]) * internal.give_dose1_adults[i - 1]; + } + for (size_t i = 1; i <= shared.dim.adults_dose2_denom.size; ++i) { + internal.adults_dose2_denom[i - 1] = (S[i - 1 + 2 * shared.dim.S.mult[1]] + Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] + Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] + R[i - 1 + 2 * shared.dim.R.mult[1]]) * internal.give_dose2_adults[i - 1]; + } + const real_type new_deaths_15_plus = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {3, 15}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_15_17 + dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {17, 19}, {0, shared.dim.n_IdD.dim[1] - 1}); + for (size_t i = 1; i <= shared.dim.s_ij_gen_pop.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.s_ij_gen_pop.dim[1]; ++j) { + internal.s_ij_gen_pop[i - 1 + (j - 1) * shared.dim.s_ij_gen_pop.mult[1]] = shared.m_gen_pop[i - 1 + (j - 1) * shared.dim.m_gen_pop.mult[1]] * internal.prop_infectious[j - 1]; + } + } + for (size_t i = 1; i <= shared.dim.s_ij_sex.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.s_ij_sex.dim[1]; ++j) { + internal.s_ij_sex[i - 1 + (j - 1) * shared.dim.s_ij_sex.mult[1]] = shared.m_sex[i - 1 + (j - 1) * shared.dim.m_sex.mult[1]] * internal.prop_infectious[j - 1]; + } + } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_children.size; ++i) { internal.n_vaccination_t_S_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_children.size; ++i) { - internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * S[i - 1 + shared.dim.S.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), S[i - 1 + shared.dim.S.mult[1]])); + internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * S[i - 1 + shared.dim.S.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), S[i - 1 + shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_adults.size; ++i) { internal.n_vaccination_t_S_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S_adults.size; ++i) { - internal.n_vaccination_t_S_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * S[i - 1 + shared.dim.S.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), S[i - 1 + shared.dim.S.mult[1]])); + internal.n_vaccination_t_S_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * S[i - 1 + shared.dim.S.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), S[i - 1 + shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_children.size; ++i) { internal.n_vaccination_t_Ea_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_children.size; ++i) { - internal.n_vaccination_t_Ea_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), Ea[i - 1 + shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), Ea[i - 1 + shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_adults.size; ++i) { internal.n_vaccination_t_Ea_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea_adults.size; ++i) { - internal.n_vaccination_t_Ea_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), Ea[i - 1 + shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * Ea[i - 1 + shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), Ea[i - 1 + shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_children.size; ++i) { internal.n_vaccination_t_Eb_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_children.size; ++i) { - internal.n_vaccination_t_Eb_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), Eb[i - 1 + shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), Eb[i - 1 + shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { internal.n_vaccination_t_Eb_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { - internal.n_vaccination_t_Eb_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), Eb[i - 1 + shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * Eb[i - 1 + shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), Eb[i - 1 + shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_children.size; ++i) { internal.n_vaccination_t_R_children[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_children.size; ++i) { - internal.n_vaccination_t_R_children[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_children_t[1] * R[i - 1 + shared.dim.R.mult[1]] * shared.prioritisation_strategy_children[i - 1 + (prioritisation_step_1st_dose_children - 1) * shared.dim.prioritisation_strategy_children.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_children.data(), shared.dim.n_eligible_for_dose1_children)), R[i - 1 + shared.dim.R.mult[1]])); + internal.n_vaccination_t_R_children[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_children_t[1] * R[i - 1 + shared.dim.R.mult[1]]) / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)) * internal.give_dose1_children[i - 1]), R[i - 1 + shared.dim.R.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_adults.size; ++i) { internal.n_vaccination_t_R_adults[i - 1] = 0; } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R_adults.size; ++i) { - internal.n_vaccination_t_R_adults[i - 1] = (dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[1] * R[i - 1 + shared.dim.R.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_1st_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose1_adults.data(), shared.dim.n_eligible_for_dose1_adults)), R[i - 1 + shared.dim.R.mult[1]])); + internal.n_vaccination_t_R_adults[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[1] * R[i - 1 + shared.dim.R.mult[1]]) / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)) * internal.give_dose1_adults[i - 1]), R[i - 1 + shared.dim.R.mult[1]])); } - for (size_t i = 1; i <= shared.dim.D.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.D.dim[1]; ++j) { - internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]] = D[i - 1 + (j - 1) * shared.dim.D.mult[1]] + internal.delta_D[i - 1 + (j - 1) * shared.dim.delta_D.mult[1]]; + for (size_t i = 1; i <= shared.dim.lambda_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_hh.dim[1]; ++j) { + internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] = shared.beta_h * dust2::array::sum(internal.s_ij_gen_pop.data(), shared.dim.s_ij_gen_pop, {i - 1, i - 1}, {0, shared.dim.s_ij_gen_pop.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); } } - const real_type new_deaths_SW_15_17 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {16, 16}, {0, shared.dim.n_IdD.dim[1] - 1}) - new_deaths_SW_12_14; - const real_type new_deaths_05_14 = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {1, 2}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_12_14; - const real_type new_deaths_SW = new_deaths_CSW + new_deaths_ASW; - for (size_t i = 1; i <= shared.dim.prop_infectious.size; ++i) { - internal.prop_infectious[i - 1] = (dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1}) == 0 ? 0 : dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious, {i - 1, i - 1}, {0, shared.dim.I_infectious.dim[1] - 1}) / dust2::array::sum(N, shared.dim.N, {i - 1, i - 1}, {0, shared.dim.N.dim[1] - 1})); - } - for (size_t i = 1; i <= shared.dim.lambda_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_hc.dim[1]; ++j) { - internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] = (i == 20 ? shared.beta_hcw * dust2::array::sum(internal.I_infectious.data(), shared.dim.I_infectious) / dust2::array::sum(N, shared.dim.N) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]) : 0); + for (size_t i = 1; i <= shared.dim.lambda_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda_s.dim[1]; ++j) { + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] = shared.beta_s * dust2::array::sum(internal.s_ij_sex.data(), shared.dim.s_ij_sex, {i - 1, i - 1}, {0, shared.dim.s_ij_sex.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { @@ -1088,9 +1121,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { internal.n_vaccination_t_S[i - 1 + shared.dim.n_vaccination_t_S.mult[1]] = internal.n_vaccination_t_S_children[i - 1] + internal.n_vaccination_t_S_adults[i - 1]; } - internal.n_vaccination_t_S[2 + shared.dim.n_vaccination_t_S.mult[1]] = monty::math::min(internal.n_vaccination_t_S[2 + shared.dim.n_vaccination_t_S.mult[1]], S[2 + shared.dim.S.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_S.dim[0]; ++i) { - internal.n_vaccination_t_S[i - 1 + 2 * shared.dim.n_vaccination_t_S.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * S[i - 1 + 2 * shared.dim.S.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), S[i - 1 + 2 * shared.dim.S.mult[1]])); + internal.n_vaccination_t_S[i - 1 + 2 * shared.dim.n_vaccination_t_S.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * S[i - 1 + 2 * shared.dim.S.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), S[i - 1 + 2 * shared.dim.S.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_Ea.dim[1]; ++j) { @@ -1100,9 +1132,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { internal.n_vaccination_t_Ea[i - 1 + shared.dim.n_vaccination_t_Ea.mult[1]] = internal.n_vaccination_t_Ea_children[i - 1] + internal.n_vaccination_t_Ea_adults[i - 1]; } - internal.n_vaccination_t_Ea[2 + shared.dim.n_vaccination_t_Ea.mult[1]] = monty::math::min(internal.n_vaccination_t_Ea[2 + shared.dim.n_vaccination_t_Ea.mult[1]], Ea[2 + shared.dim.Ea.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_Ea.dim[0]; ++i) { - internal.n_vaccination_t_Ea[i - 1 + 2 * shared.dim.n_vaccination_t_Ea.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * Ea[i - 1 + 2 * shared.dim.Ea.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), Ea[i - 1 + 2 * shared.dim.Ea.mult[1]])); + internal.n_vaccination_t_Ea[i - 1 + 2 * shared.dim.n_vaccination_t_Ea.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * Ea[i - 1 + 2 * shared.dim.Ea.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), Ea[i - 1 + 2 * shared.dim.Ea.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_Eb.dim[1]; ++j) { @@ -1112,9 +1143,8 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { internal.n_vaccination_t_Eb[i - 1 + shared.dim.n_vaccination_t_Eb.mult[1]] = internal.n_vaccination_t_Eb_children[i - 1] + internal.n_vaccination_t_Eb_adults[i - 1]; } - internal.n_vaccination_t_Eb[2 + shared.dim.n_vaccination_t_Eb.mult[1]] = monty::math::min(internal.n_vaccination_t_Eb[2 + shared.dim.n_vaccination_t_Eb.mult[1]], Eb[2 + shared.dim.Eb.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb.dim[0]; ++i) { - internal.n_vaccination_t_Eb[i - 1 + 2 * shared.dim.n_vaccination_t_Eb.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * Eb[i - 1 + 2 * shared.dim.Eb.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), Eb[i - 1 + 2 * shared.dim.Eb.mult[1]])); + internal.n_vaccination_t_Eb[i - 1 + 2 * shared.dim.n_vaccination_t_Eb.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * Eb[i - 1 + 2 * shared.dim.Eb.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), Eb[i - 1 + 2 * shared.dim.Eb.mult[1]])); } for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_R.dim[1]; ++j) { @@ -1124,19 +1154,12 @@ class model_targeted_vax { for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { internal.n_vaccination_t_R[i - 1 + shared.dim.n_vaccination_t_R.mult[1]] = internal.n_vaccination_t_R_children[i - 1] + internal.n_vaccination_t_R_adults[i - 1]; } - internal.n_vaccination_t_R[2 + shared.dim.n_vaccination_t_R.mult[1]] = monty::math::min(internal.n_vaccination_t_R[2 + shared.dim.n_vaccination_t_R.mult[1]], R[2 + shared.dim.R.mult[1]]); for (size_t i = 1; i <= shared.dim.n_vaccination_t_R.dim[0]; ++i) { - internal.n_vaccination_t_R[i - 1 + 2 * shared.dim.n_vaccination_t_R.mult[1]] = (dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults) == 0 ? 0 : monty::math::min(monty::math::floor((internal.daily_doses_adults_t[2] * R[i - 1 + 2 * shared.dim.R.mult[1]] * shared.prioritisation_strategy_adults[i - 1 + (prioritisation_step_2nd_dose_adults - 1) * shared.dim.prioritisation_strategy_adults.mult[1]]) / dust2::array::sum(internal.n_eligible_for_dose2_adults.data(), shared.dim.n_eligible_for_dose2_adults)), R[i - 1 + 2 * shared.dim.R.mult[1]])); - } - const real_type new_deaths_15_plus = dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {3, 15}, {0, shared.dim.n_IdD.dim[1] - 1}) + new_deaths_SW_15_17 + dust2::array::sum(internal.n_IdD.data(), shared.dim.n_IdD, {17, 19}, {0, shared.dim.n_IdD.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.s_ij_gen_pop.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.s_ij_gen_pop.dim[1]; ++j) { - internal.s_ij_gen_pop[i - 1 + (j - 1) * shared.dim.s_ij_gen_pop.mult[1]] = shared.m_gen_pop[i - 1 + (j - 1) * shared.dim.m_gen_pop.mult[1]] * internal.prop_infectious[j - 1]; - } + internal.n_vaccination_t_R[i - 1 + 2 * shared.dim.n_vaccination_t_R.mult[1]] = (dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom) == 0 ? 0 : monty::math::min(monty::math::floor(((internal.daily_doses_adults_t[2] * R[i - 1 + 2 * shared.dim.R.mult[1]]) / dust2::array::sum(internal.adults_dose2_denom.data(), shared.dim.adults_dose2_denom)) * internal.give_dose2_adults[i - 1]), R[i - 1 + 2 * shared.dim.R.mult[1]])); } - for (size_t i = 1; i <= shared.dim.s_ij_sex.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.s_ij_sex.dim[1]; ++j) { - internal.s_ij_sex[i - 1 + (j - 1) * shared.dim.s_ij_sex.mult[1]] = shared.m_sex[i - 1 + (j - 1) * shared.dim.m_sex.mult[1]] * internal.prop_infectious[j - 1]; + for (size_t i = 1; i <= shared.dim.lambda.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.lambda.dim[1]; ++j) { + internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] = internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] + shared.lambda_z[i - 1 + (j - 1) * shared.dim.lambda_z.mult[1]]; } } for (size_t i = 1; i <= shared.dim.delta_S_n_vaccination.dim[0]; ++i) { @@ -1164,14 +1187,24 @@ class model_targeted_vax { internal.n_vaccination_t[i - 1 + (j - 1) * shared.dim.n_vaccination_t.mult[1]] = internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.lambda_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_hh.dim[1]; ++j) { - internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] = shared.beta_h * dust2::array::sum(internal.s_ij_gen_pop.data(), shared.dim.s_ij_gen_pop, {i - 1, i - 1}, {0, shared.dim.s_ij_gen_pop.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); + for (size_t i = 1; i <= shared.dim.p_SE.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_SE.dim[1]; ++j) { + internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]] = 1 - monty::math::exp(-internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] * dt); } } - for (size_t i = 1; i <= shared.dim.lambda_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda_s.dim[1]; ++j) { - internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] = shared.beta_s * dust2::array::sum(internal.s_ij_sex.data(), shared.dim.s_ij_sex, {i - 1, i - 1}, {0, shared.dim.s_ij_sex.dim[1] - 1}) * (1 - shared.ve_I[i - 1 + (j - 1) * shared.dim.ve_I.mult[1]]); + for (size_t i = 1; i <= shared.dim.p_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_hh.dim[1]; ++j) { + internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + } + } + for (size_t i = 1; i <= shared.dim.p_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_s.dim[1]; ++j) { + internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + } + } + for (size_t i = 1; i <= shared.dim.p_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.p_hc.dim[1]; ++j) { + internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); } } for (size_t i = 1; i <= shared.dim.R.dim[0]; ++i) { @@ -1193,9 +1226,9 @@ class model_targeted_vax { const real_type new_dose2_ASW = internal.n_vaccination_t[17 + 2 * shared.dim.n_vaccination_t.mult[1]]; const real_type new_dose2_PBS = internal.n_vaccination_t[18 + 2 * shared.dim.n_vaccination_t.mult[1]]; const real_type new_dose2_HCW = internal.n_vaccination_t[19 + 2 * shared.dim.n_vaccination_t.mult[1]]; - for (size_t i = 1; i <= shared.dim.lambda.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.lambda.dim[1]; ++j) { - internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] = internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] + internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] + internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] + shared.lambda_z[i - 1 + (j - 1) * shared.dim.lambda_z.mult[1]]; + for (size_t i = 1; i <= shared.dim.n_SEa.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa.dim[1]; ++j) { + internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] = monty::random::binomial(rng_state, S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]], internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { @@ -1208,30 +1241,26 @@ class model_targeted_vax { internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]] = monty::random::binomial(rng_state, Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]], p_EI); } } + for (size_t i = 1; i <= shared.dim.S.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.S.dim[1]; ++j) { + internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] = S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]]; + } + } + const real_type new_cases_00_04 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {0, 0}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}), static_cast(0.5)); + const real_type new_cases_CSW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_ASW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 17}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_PBS = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {18, 18}, {0, shared.dim.n_SEa.dim[1] - 1}); + const real_type new_cases_HCW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {19, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); const real_type new_dose1_SW_15_17 = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] - new_dose1_SW_12_14; const real_type new_dose1_05_14 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {1, 2}, {1, 1}) + new_dose1_SW_12_14; const real_type new_dose1_SW = new_dose1_CSW + new_dose1_ASW; const real_type new_dose2_SW_15_17 = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] - new_dose2_SW_12_14; const real_type new_dose2_05_14 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {1, 2}, {2, 2}) + new_dose2_SW_12_14; const real_type new_dose2_SW = new_dose2_CSW + new_dose2_ASW; - for (size_t i = 1; i <= shared.dim.p_SE.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_SE.dim[1]; ++j) { - internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]] = 1 - monty::math::exp(-internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] * dt); - } - } - for (size_t i = 1; i <= shared.dim.p_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_hh.dim[1]; ++j) { - internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hh[i - 1 + (j - 1) * shared.dim.lambda_hh.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); - } - } - for (size_t i = 1; i <= shared.dim.p_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_s.dim[1]; ++j) { - internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_s[i - 1 + (j - 1) * shared.dim.lambda_s.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); - } - } - for (size_t i = 1; i <= shared.dim.p_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.p_hc.dim[1]; ++j) { - internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]] = (internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] > 0 ? internal.lambda_hc[i - 1 + (j - 1) * shared.dim.lambda_hc.mult[1]] / internal.lambda[i - 1 + (j - 1) * shared.dim.lambda.mult[1]] : 0); + for (size_t i = 1; i <= shared.dim.n_SEa_hh.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_hh.dim[1]; ++j) { + internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]], internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EbId.dim[0]; ++i) { @@ -1239,21 +1268,34 @@ class model_targeted_vax { internal.n_EbId[i - 1 + (j - 1) * shared.dim.n_EbId.mult[1]] = monty::random::binomial(rng_state, internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]], shared.CFR[i - 1 + (j - 1) * shared.dim.CFR.mult[1]]); } } + for (size_t i = 1; i <= shared.dim.delta_Ea.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Ea.dim[1]; ++j) { + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]]; + } + } for (size_t i = 1; i <= shared.dim.delta_Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.delta_Eb.dim[1]; ++j) { internal.delta_Eb[i - 1 + (j - 1) * shared.dim.delta_Eb.mult[1]] = internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] - internal.n_EbI[i - 1 + (j - 1) * shared.dim.n_EbI.mult[1]]; } } + for (size_t i = 1; i <= shared.dim.Ea.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.Ea.dim[1]; ++j) { + internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] = Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]]; + } + } for (size_t i = 1; i <= shared.dim.Eb.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Eb.dim[1]; ++j) { internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] = Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] + internal.delta_Eb[i - 1 + (j - 1) * shared.dim.delta_Eb.mult[1]]; } } + const real_type new_cases_SW_15_17 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}) - new_cases_SW_12_14; + const real_type new_cases_05_14 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {1, 2}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_12_14; + const real_type new_cases_SW = new_cases_CSW + new_cases_ASW; const real_type new_dose1_15_plus = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {3, 15}, {1, 1}) + new_dose1_SW_15_17 + dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {17, 19}, {1, 1}); const real_type new_dose2_15_plus = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {3, 15}, {2, 2}) + new_dose2_SW_15_17 + dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {17, 19}, {2, 2}); - for (size_t i = 1; i <= shared.dim.n_SEa.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa.dim[1]; ++j) { - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] = monty::random::binomial(rng_state, S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]], internal.p_SE[i - 1 + (j - 1) * shared.dim.p_SE.mult[1]]); + for (size_t i = 1; i <= shared.dim.n_SEa_s.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_s.dim[1]; ++j) { + internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]], internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]]); } } for (size_t i = 1; i <= shared.dim.n_EbIr.dim[0]; ++i) { @@ -1266,30 +1308,20 @@ class model_targeted_vax { internal.delta_Id[i - 1 + (j - 1) * shared.dim.delta_Id.mult[1]] = internal.n_EbId[i - 1 + (j - 1) * shared.dim.n_EbId.mult[1]] - internal.n_IdD[i - 1 + (j - 1) * shared.dim.n_IdD.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.S.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.S.dim[1]; ++j) { - internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] = S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] - internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]]; - } - } for (size_t i = 1; i <= shared.dim.Id.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Id.dim[1]; ++j) { internal.new_Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] = Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] + internal.delta_Id[i - 1 + (j - 1) * shared.dim.delta_Id.mult[1]]; } } - const real_type new_cases_00_04 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {0, 0}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_SW_12_14 = monty::random::binomial(rng_state, dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}), static_cast(0.5)); - const real_type new_cases_CSW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_ASW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 17}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_PBS = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {18, 18}, {0, shared.dim.n_SEa.dim[1] - 1}); - const real_type new_cases_HCW = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {19, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.n_SEa_hh.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_hh.dim[1]; ++j) { - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]], internal.p_hh[i - 1 + (j - 1) * shared.dim.p_hh.mult[1]]); + for (size_t i = 1; i <= shared.dim.E.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.E.dim[1]; ++j) { + internal.new_E[i - 1 + (j - 1) * shared.dim.E.mult[1]] = internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.delta_Ea.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Ea.dim[1]; ++j) { - internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]]; + const real_type new_cases_15_plus = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {3, 15}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_15_17 + dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); + for (size_t i = 1; i <= shared.dim.n_SEa_hc.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_hc.dim[1]; ++j) { + internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]], internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]]); } } for (size_t i = 1; i <= shared.dim.delta_Ir.dim[0]; ++i) { @@ -1297,27 +1329,14 @@ class model_targeted_vax { internal.delta_Ir[i - 1 + (j - 1) * shared.dim.delta_Ir.mult[1]] = internal.n_EbIr[i - 1 + (j - 1) * shared.dim.n_EbIr.mult[1]] - internal.n_IrR[i - 1 + (j - 1) * shared.dim.n_IrR.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.Ea.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.Ea.dim[1]; ++j) { - internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] = Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] + internal.delta_Ea[i - 1 + (j - 1) * shared.dim.delta_Ea.mult[1]]; - } - } for (size_t i = 1; i <= shared.dim.Ir.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.Ir.dim[1]; ++j) { internal.new_Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] = Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] + internal.delta_Ir[i - 1 + (j - 1) * shared.dim.delta_Ir.mult[1]]; } } - const real_type new_cases_SW_15_17 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {16, 16}, {0, shared.dim.n_SEa.dim[1] - 1}) - new_cases_SW_12_14; - const real_type new_cases_05_14 = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {1, 2}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_12_14; - const real_type new_cases_SW = new_cases_CSW + new_cases_ASW; - for (size_t i = 1; i <= shared.dim.n_SEa_s.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_s.dim[1]; ++j) { - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]], internal.p_s[i - 1 + (j - 1) * shared.dim.p_s.mult[1]]); - } - } - for (size_t i = 1; i <= shared.dim.E.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.E.dim[1]; ++j) { - internal.new_E[i - 1 + (j - 1) * shared.dim.E.mult[1]] = internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]]; + for (size_t i = 1; i <= shared.dim.n_SEa_z.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_SEa_z.dim[1]; ++j) { + internal.n_SEa_z[i - 1 + (j - 1) * shared.dim.n_SEa_z.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]]; } } for (size_t i = 1; i <= shared.dim.I.dim[0]; ++i) { @@ -1330,17 +1349,6 @@ class model_targeted_vax { internal.new_N[i - 1 + (j - 1) * shared.dim.N.mult[1]] = internal.new_S[i - 1 + (j - 1) * shared.dim.S.mult[1]] + internal.new_Ea[i - 1 + (j - 1) * shared.dim.Ea.mult[1]] + internal.new_Eb[i - 1 + (j - 1) * shared.dim.Eb.mult[1]] + internal.new_Ir[i - 1 + (j - 1) * shared.dim.Ir.mult[1]] + internal.new_Id[i - 1 + (j - 1) * shared.dim.Id.mult[1]] + internal.new_R[i - 1 + (j - 1) * shared.dim.R.mult[1]] + internal.new_D[i - 1 + (j - 1) * shared.dim.D.mult[1]]; } } - const real_type new_cases_15_plus = dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {3, 15}, {0, shared.dim.n_SEa.dim[1] - 1}) + new_cases_SW_15_17 + dust2::array::sum(internal.n_SEa.data(), shared.dim.n_SEa, {17, 19}, {0, shared.dim.n_SEa.dim[1] - 1}); - for (size_t i = 1; i <= shared.dim.n_SEa_hc.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_hc.dim[1]; ++j) { - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]] = monty::random::binomial(rng_state, internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]], internal.p_hc[i - 1 + (j - 1) * shared.dim.p_hc.mult[1]]); - } - } - for (size_t i = 1; i <= shared.dim.n_SEa_z.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_SEa_z.dim[1]; ++j) { - internal.n_SEa_z[i - 1 + (j - 1) * shared.dim.n_SEa_z.mult[1]] = internal.n_SEa[i - 1 + (j - 1) * shared.dim.n_SEa.mult[1]] - internal.n_SEa_hh[i - 1 + (j - 1) * shared.dim.n_SEa_hh.mult[1]] - internal.n_SEa_s[i - 1 + (j - 1) * shared.dim.n_SEa_s.mult[1]] - internal.n_SEa_hc[i - 1 + (j - 1) * shared.dim.n_SEa_hc.mult[1]]; - } - } state_next[0] = (prioritisation_step_1st_dose_children_proposal > shared.N_prioritisation_steps_children ? shared.N_prioritisation_steps_children : prioritisation_step_1st_dose_children_proposal); state_next[1] = (prioritisation_step_1st_dose_adults_proposal > shared.N_prioritisation_steps_adults ? shared.N_prioritisation_steps_adults : prioritisation_step_1st_dose_adults_proposal); state_next[2] = (prioritisation_step_2nd_dose_adults_proposal > shared.N_prioritisation_steps_adults ? shared.N_prioritisation_steps_adults : prioritisation_step_2nd_dose_adults_proposal); diff --git a/tests/testthat/test-model-targeted-vax.R b/tests/testthat/test-model-targeted-vax.R index 81967c1..f7ed4b2 100644 --- a/tests/testthat/test-model-targeted-vax.R +++ b/tests/testthat/test-model-targeted-vax.R @@ -109,7 +109,7 @@ test_that("relevant states sum correctly", { }) -test_that("when beta_h = beta_z = beta_s = 0 there are no new infections", { +test_that("when beta_h = beta_z = beta_s = beta_hcw = 0 there are no new infections", { pars <- reference_pars_targeted_vax() pars$beta_h <- 0 pars$beta_s <- 0 @@ -193,7 +193,7 @@ test_that("when CFR = 1 everybody dies", { }) -test_that("when beta_h = 0 and beta_s = 0 there are only zoonotic infections", { +test_that("when beta_h = 0, beta_s = 0, beta_hcw = 0 there are only zoonotic infections", { pars <- reference_pars_targeted_vax() pars$beta_h <- 0 pars$beta_s <- 0 @@ -219,7 +219,7 @@ test_that("when beta_h = 0 and beta_s = 0 there are only zoonotic infections", { }) -test_that("when beta_h = 0 and beta_z = 0 infections only from sexual contact", { +test_that("when beta_h = 0, beta_z = 0, beta_hcw = 0 infections only from sexual contact", { pars <- reference_pars_targeted_vax() pars$beta_h <- 0 pars$beta_z[] <- 0 @@ -365,7 +365,7 @@ test_that("vaccines are only given in the prioritised groups", { ## identify which child groups aren't prioritised for vaccination in the first step idx_novax_children <- (pars$prioritisation_strategy_children[, 1] == 0) & - (pars$children_ind_raw > 0) + (pars$is_child > 0) idx_vax <- c(idx$vax$one_dose, idx$vax$two_dose) if(all(res["prioritisation_step_1st_dose_children", , ] == 1)){ @@ -376,7 +376,7 @@ test_that("vaccines are only given in the prioritised groups", { ## repeat above for adults, including first and second doses idx_novax_adults <- (pars$prioritisation_strategy_adults[, 1] == 0) & - (pars$adults_ind_raw > 0) + ((1 - pars$is_child) > 0) if(all(res["prioritisation_step_1st_dose_adults",,] == 1)){ expect_true(all(y$N[idx_novax_adults, idx_vax, , ] == 0)) @@ -442,7 +442,7 @@ test_that("2nd doses are not given to children", { expect_true(all(res["total_vax_2nddose",,max(t)]>0)) # children_idx - idx_children <- (rep(ceiling(pars$children_ind_raw),pars$n_vax)) *seq(1:(pars$n_group*pars$n_vax)) + idx_children <- (rep(ceiling(pars$is_child),pars$n_vax)) *seq(1:(pars$n_group*pars$n_vax)) # 2nd dose compartments idx_children <- idx_children[which(idx_children!=0&idx_children>=3*pars$n_group)] @@ -530,7 +530,7 @@ test_that("no 2nd doses are given if no 1st doses are given", { res <- dust2::dust_system_simulate(sys, t) rownames(res) <- names(unlist(dust2::dust_unpack_index(sys))) - idx_adults <- ceiling(pars$adults_ind_raw)*seq(1:(pars$n_group*pars$n_vax)) + idx_adults <- ceiling(1-pars$is_child)*seq(1:(pars$n_group*pars$n_vax)) idx_adults <- idx_adults[which(idx_adults!=0&idx_adults>2*pars$n_group)] idx_adults_vax <- paste0(rep("N", each = length(idx_adults)), @@ -567,7 +567,7 @@ test_that("vaccination of children still occurs if adult vaccination is turned o expect_true(all(res["total_vax_2nddose",,max(t)]==0)) # check that the doses aren't in the adult groups - idx_adults <- ceiling(pars$adults_ind_raw)*seq(1:(pars$n_group*pars$n_vax)) + idx_adults <- ceiling(1-pars$is_child)*seq(1:(pars$n_group*pars$n_vax)) idx_adults <- idx_adults[which(idx_adults!=0&idx_adults>2*pars$n_group)] idx_adults_vax <- paste0(rep("N", each = length(idx_adults)), @@ -602,7 +602,7 @@ test_that("vaccination of adults still occurs if child vaccination is turned off expect_true(all(res["total_vax_2nddose",,max(t)]>0)) # check that the doses aren't in the child groups - idx_children <- ceiling(pars$children_ind_raw)*seq(1:(pars$n_group*pars$n_vax)) + idx_children <- ceiling(pars$is_child)*seq(1:(pars$n_group*pars$n_vax)) idx_children <- idx_children[which(idx_children!=0&idx_children>2*pars$n_group)] idx_children_vax <- paste0(rep("N", each = length(idx_children)),