diff --git a/inst/dust/model-targeted-vax.cpp b/inst/dust/model-targeted-vax.cpp index 229ef79..12b9b35 100644 --- a/inst/dust/model-targeted-vax.cpp +++ b/inst/dust/model-targeted-vax.cpp @@ -77,10 +77,10 @@ class model_targeted_vax { dust2::array::dimensions<1> children_dose1_denom; dust2::array::dimensions<1> adults_dose1_denom; dust2::array::dimensions<1> adults_dose2_denom; - dust2::array::dimensions<1> children_dose_state_prob; - dust2::array::dimensions<1> children_dose_state; - dust2::array::dimensions<1> children_dose_within_S_denom; - dust2::array::dimensions<1> children_dose_prob_within_S; + dust2::array::dimensions<1> children_dose1_prob; + dust2::array::dimensions<1> children_dose1_group; + dust2::array::dimensions<1> adults_dose1_prob; + dust2::array::dimensions<1> adults_dose1_group; dust2::array::dimensions<2> N; dust2::array::dimensions<2> S; dust2::array::dimensions<2> S0; @@ -218,58 +218,58 @@ class model_targeted_vax { std::vector children_dose1_denom; std::vector adults_dose1_denom; std::vector adults_dose2_denom; - std::vector children_dose_within_S_denom; std::vector s_ij_gen_pop; std::vector s_ij_sex; - std::vector children_dose_state_prob; - std::vector children_dose_prob_within_S; - std::vector n_vaccination_t_Ea_children; - std::vector n_vaccination_t_Eb_children; - std::vector n_vaccination_t_R_children; - std::vector n_vaccination_t_S_adults; - std::vector n_vaccination_t_Ea_adults; - std::vector n_vaccination_t_Eb_adults; - std::vector n_vaccination_t_R_adults; + std::vector children_dose1_prob; + std::vector adults_dose1_prob; std::vector lambda_hh; std::vector lambda_s; - std::vector children_dose_state; - std::vector n_vaccination_t_Ea; - std::vector n_vaccination_t_Eb; - std::vector n_vaccination_t_R; + std::vector children_dose1_group; + std::vector adults_dose1_group; std::vector lambda; std::vector n_vaccination_t_S_children; - std::vector delta_Ea_n_vaccination; - std::vector delta_Eb_n_vaccination; - std::vector delta_R_n_vaccination; + std::vector n_vaccination_t_S_adults; std::vector p_SE; std::vector p_hh; std::vector p_s; std::vector p_hc; + std::vector n_vaccination_t_Ea_children; + std::vector n_vaccination_t_Ea_adults; std::vector n_vaccination_t_S; - std::vector new_R; - std::vector n_EaEb; - std::vector n_EbI; + std::vector n_vaccination_t_Eb_children; + std::vector n_vaccination_t_Eb_adults; + std::vector n_vaccination_t_Ea; std::vector delta_S_n_vaccination; + std::vector n_vaccination_t_R_children; + std::vector n_vaccination_t_R_adults; + std::vector n_vaccination_t_Eb; + std::vector delta_Ea_n_vaccination; + std::vector n_SEa; + std::vector n_vaccination_t_R; + std::vector delta_Eb_n_vaccination; + std::vector new_S; + std::vector n_SEa_hh; + std::vector n_EaEb; + std::vector delta_R_n_vaccination; std::vector n_vaccination_t; + std::vector n_SEa_s; + std::vector n_EbI; + std::vector delta_Ea; + std::vector new_Ea; + std::vector new_R; + std::vector n_SEa_hc; std::vector n_EbId; std::vector delta_Eb; std::vector new_Eb; - std::vector n_SEa; + std::vector n_SEa_z; 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 delta_Ir; - std::vector new_Ea; std::vector new_Ir; - std::vector n_SEa_s; - std::vector new_E; std::vector new_I; std::vector new_N; - std::vector n_SEa_hc; - std::vector n_SEa_z; }; struct data_type { real_type cases; @@ -298,8 +298,6 @@ class model_targeted_vax { dim.daily_doses_adults_time = dust2::r::read_dimensions<1>(parameters, "daily_doses_adults_time"); const int N_prioritisation_steps_children = dust2::r::read_int(parameters, "N_prioritisation_steps_children"); const int N_prioritisation_steps_adults = dust2::r::read_int(parameters, "N_prioritisation_steps_adults"); - dim.children_dose_state_prob.set({static_cast(4)}); - dim.children_dose_state.set({static_cast(4)}); const real_type beta_h = dust2::r::read_real(parameters, "beta_h"); const real_type beta_s = dust2::r::read_real(parameters, "beta_s"); const real_type beta_hcw = dust2::r::read_real(parameters, "beta_hcw"); @@ -341,8 +339,10 @@ class model_targeted_vax { 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.children_dose_within_S_denom.set({static_cast(n_group)}); - dim.children_dose_prob_within_S.set({static_cast(n_group)}); + dim.children_dose1_prob.set({static_cast(n_group)}); + dim.children_dose1_group.set({static_cast(n_group)}); + dim.adults_dose1_prob.set({static_cast(n_group)}); + dim.adults_dose1_group.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)}); @@ -593,59 +593,59 @@ class model_targeted_vax { 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 children_dose_within_S_denom(shared.dim.children_dose_within_S_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 children_dose_state_prob(shared.dim.children_dose_state_prob.size); - std::vector children_dose_prob_within_S(shared.dim.children_dose_prob_within_S.size); - std::vector n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); - std::vector n_vaccination_t_Eb_children(shared.dim.n_vaccination_t_Eb_children.size); - std::vector n_vaccination_t_R_children(shared.dim.n_vaccination_t_R_children.size); - std::vector n_vaccination_t_S_adults(shared.dim.n_vaccination_t_S_adults.size); - std::vector n_vaccination_t_Ea_adults(shared.dim.n_vaccination_t_Ea_adults.size); - std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); - std::vector n_vaccination_t_R_adults(shared.dim.n_vaccination_t_R_adults.size); + std::vector children_dose1_prob(shared.dim.children_dose1_prob.size); + std::vector adults_dose1_prob(shared.dim.adults_dose1_prob.size); std::vector lambda_hh(shared.dim.lambda_hh.size); std::vector lambda_s(shared.dim.lambda_s.size); - std::vector children_dose_state(shared.dim.children_dose_state.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 children_dose1_group(shared.dim.children_dose1_group.size); + std::vector adults_dose1_group(shared.dim.adults_dose1_group.size); std::vector lambda(shared.dim.lambda.size); std::vector n_vaccination_t_S_children(shared.dim.n_vaccination_t_S_children.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_S_adults(shared.dim.n_vaccination_t_S_adults.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 n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); + std::vector n_vaccination_t_Ea_adults(shared.dim.n_vaccination_t_Ea_adults.size); std::vector n_vaccination_t_S(shared.dim.n_vaccination_t_S.size); - std::vector new_R(shared.dim.R.size); - std::vector n_EaEb(shared.dim.n_EaEb.size); - std::vector n_EbI(shared.dim.n_EbI.size); + std::vector n_vaccination_t_Eb_children(shared.dim.n_vaccination_t_Eb_children.size); + std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); + std::vector n_vaccination_t_Ea(shared.dim.n_vaccination_t_Ea.size); std::vector delta_S_n_vaccination(shared.dim.delta_S_n_vaccination.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 n_vaccination_t_Eb(shared.dim.n_vaccination_t_Eb.size); + std::vector delta_Ea_n_vaccination(shared.dim.delta_Ea_n_vaccination.size); + std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_vaccination_t_R(shared.dim.n_vaccination_t_R.size); + std::vector delta_Eb_n_vaccination(shared.dim.delta_Eb_n_vaccination.size); + std::vector new_S(shared.dim.S.size); + std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); + std::vector n_EaEb(shared.dim.n_EaEb.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 n_SEa_s(shared.dim.n_SEa_s.size); + std::vector n_EbI(shared.dim.n_EbI.size); + std::vector delta_Ea(shared.dim.delta_Ea.size); + std::vector new_Ea(shared.dim.Ea.size); + std::vector new_R(shared.dim.R.size); + std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); std::vector n_EbId(shared.dim.n_EbId.size); std::vector delta_Eb(shared.dim.delta_Eb.size); std::vector new_Eb(shared.dim.Eb.size); - std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_SEa_z(shared.dim.n_SEa_z.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 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 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_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, children_dose_within_S_denom, s_ij_gen_pop, s_ij_sex, children_dose_state_prob, children_dose_prob_within_S, n_vaccination_t_Ea_children, n_vaccination_t_Eb_children, n_vaccination_t_R_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_adults, n_vaccination_t_R_adults, lambda_hh, lambda_s, children_dose_state, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, lambda, n_vaccination_t_S_children, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, p_SE, p_hh, p_s, p_hc, n_vaccination_t_S, new_R, n_EaEb, n_EbI, delta_S_n_vaccination, n_vaccination_t, 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, children_dose1_prob, adults_dose1_prob, lambda_hh, lambda_s, children_dose1_group, adults_dose1_group, lambda, n_vaccination_t_S_children, n_vaccination_t_S_adults, p_SE, p_hh, p_s, p_hc, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_S, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_Ea, delta_S_n_vaccination, n_vaccination_t_R_children, n_vaccination_t_R_adults, n_vaccination_t_Eb, delta_Ea_n_vaccination, n_SEa, n_vaccination_t_R, delta_Eb_n_vaccination, new_S, n_SEa_hh, n_EaEb, delta_R_n_vaccination, n_vaccination_t, n_SEa_s, n_EbI, delta_Ea, new_Ea, new_R, n_SEa_hc, n_EbId, delta_Eb, new_Eb, n_SEa_z, n_EbIr, delta_Id, new_Id, new_E, delta_Ir, new_Ir, 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); @@ -1058,9 +1058,6 @@ class model_targeted_vax { 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]; } - for (size_t i = 1; i <= shared.dim.children_dose_within_S_denom.size; ++i) { - internal.children_dose_within_S_denom[i - 1] = internal.give_dose1_children[i - 1] * S[i - 1 + shared.dim.S.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) { @@ -1072,83 +1069,83 @@ class model_targeted_vax { 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]; } } - { - const size_t i = 1; - internal.children_dose_state_prob[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : S[i - 1 + shared.dim.S.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); - } - { - const size_t i = 2; - internal.children_dose_state_prob[1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : Ea[i - 1 + shared.dim.Ea.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); + for (size_t i = 1; i <= shared.dim.children_dose1_prob.size; ++i) { + internal.children_dose1_prob[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : internal.children_dose1_denom[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); } - { - const size_t i = 3; - internal.children_dose_state_prob[2] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : Eb[i - 1 + shared.dim.Eb.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); + for (size_t i = 1; i <= shared.dim.adults_dose1_prob.size; ++i) { + internal.adults_dose1_prob[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : internal.adults_dose1_denom[i - 1] / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)); } - { - const size_t i = 4; - internal.children_dose_state_prob[3] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : R[i - 1 + shared.dim.R.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); - } - for (size_t i = 1; i <= shared.dim.children_dose_prob_within_S.size; ++i) { - internal.children_dose_prob_within_S[i - 1] = (dust2::array::sum(internal.children_dose_within_S_denom.data(), shared.dim.children_dose_within_S_denom) == 0 ? 0 : internal.children_dose_within_S_denom[i - 1] / dust2::array::sum(internal.children_dose_within_S_denom.data(), shared.dim.children_dose_within_S_denom)); - } - 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.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.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.n_vaccination_t_Eb_children.size; ++i) { - internal.n_vaccination_t_Eb_children[i - 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_Eb_children.size; ++i) { - 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]])); + internal.children_dose1_group[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1], internal.children_dose1_prob[0])); + for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { + internal.children_dose1_group[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1] - dust2::array::sum(internal.children_dose1_group.data(), shared.dim.children_dose1_group, {0, (i - 1) - 1}), internal.children_dose1_prob[i - 1] / dust2::array::sum(internal.children_dose1_prob.data(), shared.dim.children_dose1_prob, {i - 1, shared.n_group - 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; + internal.adults_dose1_group[0] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_adults_t[1], internal.adults_dose1_prob[0])); + for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { + internal.adults_dose1_group[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_adults_t[1] - dust2::array::sum(internal.adults_dose1_group.data(), shared.dim.adults_dose1_group, {0, (i - 1) - 1}), internal.adults_dose1_prob[i - 1] / dust2::array::sum(internal.adults_dose1_prob.data(), shared.dim.adults_dose1_prob, {i - 1, shared.n_group - 1}))); } - 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.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.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_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_children.size; ++i) { + internal.n_vaccination_t_S_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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1], S[i - 1 + shared.dim.S.mult[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]])), 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] = (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]])); + internal.n_vaccination_t_S_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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1], S[i - 1 + shared.dim.S.mult[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]])), S[i - 1 + shared.dim.S.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.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.n_vaccination_t_Ea_adults.size; ++i) { - 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.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.n_vaccination_t_Eb_adults.size; ++i) { - internal.n_vaccination_t_Eb_adults[i - 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.n_vaccination_t_Eb_adults.size; ++i) { - 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.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_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_Ea_children.size; ++i) { + internal.n_vaccination_t_Ea_children[i - 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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1], Ea[i - 1 + shared.dim.Ea.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]])), Ea[i - 1 + shared.dim.Ea.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] = (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.n_vaccination_t_Ea_adults.size; ++i) { + internal.n_vaccination_t_Ea_adults[i - 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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1], Ea[i - 1 + shared.dim.Ea.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]])), Ea[i - 1 + shared.dim.Ea.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.n_vaccination_t_S.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_vaccination_t_S.dim[1]; ++j) { + internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.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) { + 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]; + } + 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.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.children_dose_state.size; ++i) { - internal.children_dose_state[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] = (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1] - internal.n_vaccination_t_Ea_children[i - 1], Eb[i - 1 + shared.dim.Eb.mult[1]] / (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]])), Eb[i - 1 + shared.dim.Eb.mult[1]])); } - internal.children_dose_state[0] = monty::random::binomial(rng_state, internal.daily_doses_children_t[1], internal.children_dose_state_prob[0]); - for (size_t i = 2; i <= 4; ++i) { - internal.children_dose_state[i - 1] = (dust2::array::sum(internal.children_dose_state_prob.data(), shared.dim.children_dose_state_prob, {i - 1, 3}) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1] - dust2::array::sum(internal.children_dose_state.data(), shared.dim.children_dose_state, {0, (i - 1) - 1}), internal.children_dose_state_prob[i - 1] / dust2::array::sum(internal.children_dose_state_prob.data(), shared.dim.children_dose_state_prob, {i - 1, 3}))); + for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { + internal.n_vaccination_t_Eb_adults[i - 1] = (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1] - internal.n_vaccination_t_Ea_adults[i - 1], Eb[i - 1 + shared.dim.Eb.mult[1]] / (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]])), Eb[i - 1 + shared.dim.Eb.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) { @@ -1161,6 +1158,17 @@ 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 + 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.delta_S_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_S_n_vaccination.dim[1]; ++j) { + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.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] = (R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1] - internal.n_vaccination_t_Ea_children[i - 1] - internal.n_vaccination_t_Eb_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] = (R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1] - internal.n_vaccination_t_Ea_adults[i - 1] - internal.n_vaccination_t_Eb_adults[i - 1], R[i - 1 + shared.dim.R.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) { internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] = 0; @@ -1169,8 +1177,15 @@ 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]; } - 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.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.delta_Ea_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Ea_n_vaccination.dim[1]; ++j) { + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.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_vaccination_t_R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_R.dim[1]; ++j) { @@ -1183,29 +1198,30 @@ 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 + 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.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_Eb_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Eb_n_vaccination.dim[1]; ++j) { + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[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; - } - { - const size_t i = 1; - internal.n_vaccination_t_S_children[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose_state[0], internal.children_dose_prob_within_S[0]), S[i - 1 + shared.dim.S.mult[1]])); - } - for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { - internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.children_dose_prob_within_S.data(), shared.dim.children_dose_prob_within_S, {i - 1, shared.n_group - 1}) == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose_state[0] - dust2::array::sum(internal.n_vaccination_t_S_children.data(), shared.dim.n_vaccination_t_S_children, {0, (i - 1) - 1}), internal.children_dose_prob_within_S[i - 1] / dust2::array::sum(internal.children_dose_prob_within_S.data(), shared.dim.children_dose_prob_within_S, {i - 1, shared.n_group - 1})), S[i - 1 + shared.dim.S.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.delta_Ea_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Ea_n_vaccination.dim[1]; ++j) { - internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.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.delta_Eb_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Eb_n_vaccination.dim[1]; ++j) { - internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]])))); + for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_EaEb.dim[1]; ++j) { + internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] = monty::random::binomial(rng_state, 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]], p_EE); } } for (size_t i = 1; i <= shared.dim.delta_R_n_vaccination.dim[0]; ++i) { @@ -1213,60 +1229,57 @@ class model_targeted_vax { internal.delta_R_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_R_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_R[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_R.mult[1]]) : (-internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]] + internal.n_vaccination_t_R[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_R.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); + 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_vaccination_t.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_vaccination_t.dim[1]; ++j) { + 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.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.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.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.n_EbI.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_EbI.dim[1]; ++j) { + 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.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.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.n_vaccination_t_S.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_vaccination_t_S.dim[1]; ++j) { - internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] = 0; + 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.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]; - } - 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.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.R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.R.dim[1]; ++j) { internal.new_R[i - 1 + (j - 1) * shared.dim.R.mult[1]] = R[i - 1 + (j - 1) * shared.dim.R.mult[1]] + internal.delta_R_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_R_n_vaccination.mult[1]] + internal.delta_R[i - 1 + (j - 1) * shared.dim.delta_R.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_EaEb.dim[1]; ++j) { - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] = monty::random::binomial(rng_state, 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]], p_EE); - } - } - for (size_t i = 1; i <= shared.dim.n_EbI.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_EbI.dim[1]; ++j) { - 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.delta_S_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_S_n_vaccination.dim[1]; ++j) { - internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]])))); - } - } - for (size_t i = 1; i <= shared.dim.n_vaccination_t.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_vaccination_t.dim[1]; ++j) { - 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]]; + 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}); + const real_type new_dose1 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {1, 1}); + const real_type new_dose1_00_04 = internal.n_vaccination_t[shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); + const real_type new_dose1_CSW = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_ASW = internal.n_vaccination_t[17 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_PBS = internal.n_vaccination_t[18 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_HCW = internal.n_vaccination_t[19 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose2 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {2, 2}); + const real_type new_dose2_00_04 = internal.n_vaccination_t[2 * shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose2_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); + const real_type new_dose2_CSW = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]]; + 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.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_EbId.dim[0]; ++i) { @@ -1284,23 +1297,15 @@ class model_targeted_vax { 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_dose1 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {1, 1}); - const real_type new_dose1_00_04 = internal.n_vaccination_t[shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); - const real_type new_dose1_CSW = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_ASW = internal.n_vaccination_t[17 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_PBS = internal.n_vaccination_t[18 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_HCW = internal.n_vaccination_t[19 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose2 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {2, 2}); - const real_type new_dose2_00_04 = internal.n_vaccination_t[2 * shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose2_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); - const real_type new_dose2_CSW = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]]; - 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.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]]); + 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.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.n_EbIr.dim[0]; ++i) { @@ -1313,68 +1318,28 @@ 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}); - 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.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.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.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]]; } } + 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.delta_Ir.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.delta_Ir.dim[1]; ++j) { 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; - 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_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.I.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.I.dim[1]; ++j) { internal.new_I[i - 1 + (j - 1) * shared.dim.I.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]]; @@ -1385,17 +1350,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 29cd880..d7d0915 100644 --- a/inst/odin/model-targeted-vax.R +++ b/inst/odin/model-targeted-vax.R @@ -122,7 +122,7 @@ prioritisation_step_1st_dose_children_proposal <- if (sum(target_met_children_t[]) == sum(coverage_target_1st_dose_children[])) prioritisation_step_1st_dose_children + 1 else - prioritisation_step_1st_dose_children + prioritisation_step_1st_dose_children update(prioritisation_step_1st_dose_children) <- if (prioritisation_step_1st_dose_children_proposal > @@ -135,7 +135,7 @@ update(prioritisation_step_1st_dose_children) <- prioritisation_step_1st_dose_adults_proposal <- 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 + prioritisation_step_1st_dose_adults update(prioritisation_step_1st_dose_adults) <- if (prioritisation_step_1st_dose_adults_proposal > @@ -146,7 +146,7 @@ update(prioritisation_step_1st_dose_adults) <- prioritisation_step_2nd_dose_adults_proposal <- 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 + prioritisation_step_2nd_dose_adults update(prioritisation_step_2nd_dose_adults) <- if (prioritisation_step_2nd_dose_adults_proposal > @@ -193,20 +193,23 @@ 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 doses +## decide how many will go to each different state ## children 1st doses -children_dose1_prob[i] <- if (sum(children_dose1_denom[]) == 0) 0 else - children_dose1_denom[i] / sum(children_dose1_denom[]) + +children_dose1_prob[] <- if (sum(children_dose1_denom) == 0) 0 else + children_dose1_denom[i] / sum(children_dose1_denom) dim(children_dose1_prob) <- n_group -children_dose1_group[1] <- if (sum(children_dose1_denom[i]) == 0) 0 else +children_dose1_group[1] <- if (sum(children_dose1_denom) == 0) 0 else Binomial(daily_doses_children_t[2], children_dose1_prob[1]) -children_dose1_group[2:n_group] <- if (sum(children_dose1_denom[i]) == 0) 0 else +children_dose1_group[2:n_group] <- if (sum(children_dose1_denom) == 0) 0 else Binomial(daily_doses_children_t[2] - sum(children_dose1_group[1:(i - 1)]), children_dose1_prob[i] / sum(children_dose1_prob[i:n_group])) dim(children_dose1_group) <- n_group +### then we need to do another for within each state now that we have the value going to the state + ## S n_vaccination_t_S_children[] <- if (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2] == 0) 0 else @@ -237,10 +240,9 @@ n_vaccination_t_R_children[] <- R[i, 2]) -################################################### +## adults dose 1 -## adult 1st doses -adults_dose1_prob[i] <- if (sum(adults_dose1_denom) == 0) 0 else +adults_dose1_prob[] <- if (sum(adults_dose1_denom) == 0) 0 else adults_dose1_denom[i] / sum(adults_dose1_denom) dim(adults_dose1_prob) <- n_group @@ -251,23 +253,25 @@ adults_dose1_group[2:n_group] <- if (sum(adults_dose1_denom) == 0) 0 else adults_dose1_prob[i] / sum(adults_dose1_prob[i:n_group])) dim(adults_dose1_group) <- n_group +### then we need to do another for within each state now that we have the value going to the state + ## S n_vaccination_t_S_adults[] <- - if (sum(adults_dose1_denom[i]) == 0) 0 else + if (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2] == 0) 0 else min(Binomial(adults_dose1_group[i], S[i, 2] / (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2])), S[i, 2]) ## Ea n_vaccination_t_Ea_adults[] <- - if (sum(adults_dose1_denom[i]) == 0) 0 else + if (Ea[i, 2] + Eb[i, 2] + R[i, 2] == 0) 0 else min(Binomial(adults_dose1_group[i] - n_vaccination_t_S_adults[i], Ea[i, 2] / (Ea[i, 2] + Eb[i, 2] + R[i, 2])), Ea[i, 2]) ## Eb n_vaccination_t_Eb_adults[] <- - if (sum(adults_dose1_denom[i]) == 0) 0 else + if (Eb[i, 2] + R[i, 2] == 0) 0 else min(Binomial(adults_dose1_group[i] - n_vaccination_t_S_adults[i] - n_vaccination_t_Ea_adults[i], Eb[i, 2] / (Eb[i, 2] + R[i, 2])), @@ -275,47 +279,19 @@ n_vaccination_t_Eb_adults[] <- ## R n_vaccination_t_R_adults[] <- - if (sum(adults_dose1_denom[i]) == 0) 0 else + if (R[i, 2] == 0) 0 else min(adults_dose1_group[i] - n_vaccination_t_S_adults[i] - n_vaccination_t_Ea_adults[i] - n_vaccination_t_Eb_adults[i], - Eb[i, 2]) + R[i, 2]) +###################### -##################################################### -# ## S -# n_vaccination_t_S_children[] <- -# if (sum(children_dose1_denom[i]) == 0) 0 else -# min(Binomial(children_dose1_group[i], -# S[i, 2] / (S[i, 2] + Ea[i, 2] + Eb[i, 2] + R[i, 2])), -# S[i, 2]) -# -# ## Ea -# n_vaccination_t_Ea_children[] <- -# if (sum(children_dose1_denom[i]) == 0) 0 else -# min(Binomial(children_dose1_group[i] - n_vaccination_t_S_children[i], -# Ea[i, 2] / (Ea[i, 2] + Eb[i, 2] + R[i, 2])), -# Ea[i, 2]) -# -# ## Eb -# n_vaccination_t_Eb_children[] <- -# if (sum(children_dose1_denom[i]) == 0) 0 else -# min(Binomial(children_dose1_group[i] - n_vaccination_t_S_children[i] - -# n_vaccination_t_Ea_children[i], -# Eb[i, 2] / (Eb[i, 2] + R[i, 2])), -# Eb[i, 2]) -# -# ## R -# n_vaccination_t_R_children[] <- -# if (sum(children_dose1_denom[i]) == 0) 0 else -# min(children_dose1_group[i] - n_vaccination_t_S_children[i] - -# n_vaccination_t_Ea_children[i] - n_vaccination_t_Eb_children[i], -# Eb[i, 2]) -# -# -# n_vaccination_t_S_adults[] <- 0 -# +### allocate to S + +#n_vaccination_t_S_adults[] <- 0 + # ## adults 1st doses # n_vaccination_t_S_adults[] <- # if (sum(adults_dose1_denom[]) == 0) 0 else @@ -333,9 +309,9 @@ n_vaccination_t_S[, 2] <- ## allocate 2nd doses (adults only for now) 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]) + min(floor(((daily_doses_adults_t[3] * S[i, 3]) / + sum(adults_dose2_denom[])) * give_dose2_adults[i]), + S[i, 3]) ### allocate to Ea @@ -381,12 +357,12 @@ n_vaccination_t_Eb[, ] <- 0 n_vaccination_t_Eb[, 2] <- n_vaccination_t_Eb_children[i] + n_vaccination_t_Eb_adults[i] -## adults 2nd doses -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]) +# ## adults 2nd doses +# 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 @@ -674,7 +650,7 @@ update(dose2_cumulative_ASW) <- dose2_cumulative_ASW + new_dose2_ASW update(dose2_cumulative_SW) <- dose2_cumulative_SW + new_dose2_SW update(dose2_cumulative_PBS) <- dose2_cumulative_PBS + new_dose2_PBS update(dose2_cumulative_HCW) <- dose2_cumulative_HCW + new_dose2_HCW - + ## Individual probabilities of transition: # S to E - age dependent @@ -728,7 +704,7 @@ p_hc[, ] <- if (lambda[i, j] > 0) lambda_hc[i, j] / lambda[i, j] else 0 n_SEa_hh[, ] <- Binomial(n_SEa[i, j], p_hh[i, j]) n_SEa_s[, ] <- Binomial(n_SEa[i, j] - n_SEa_hh[i, j], p_s[i, j]) n_SEa_hc[, ] <- Binomial(n_SEa[i, j] - n_SEa_hh[i, j] - n_SEa_s[i, j], - p_hc[i, j]) + p_hc[i, j]) n_SEa_z[, ] <- n_SEa[i, j] - n_SEa_hh[i, j] - n_SEa_s[i, j] - n_SEa_hc[i, j] @@ -1077,4 +1053,4 @@ cases_SW <- data() model_cases_SW <- cases_inc_SW + Exponential(exp_noise) model_cases_non_SW <- cases_inc - cases_inc_SW + Exponential(exp_noise) model_prop_SW <- model_cases_SW / (model_cases_SW + model_cases_non_SW) -cases_SW ~ Binomial(cases_total, model_prop_SW) +cases_SW ~ Binomial(cases_total, model_prop_SW) \ No newline at end of file diff --git a/src/model-targeted-vax.cpp b/src/model-targeted-vax.cpp index ea4fcfd..15a5371 100644 --- a/src/model-targeted-vax.cpp +++ b/src/model-targeted-vax.cpp @@ -79,10 +79,10 @@ class model_targeted_vax { dust2::array::dimensions<1> children_dose1_denom; dust2::array::dimensions<1> adults_dose1_denom; dust2::array::dimensions<1> adults_dose2_denom; - dust2::array::dimensions<1> children_dose_state_prob; - dust2::array::dimensions<1> children_dose_state; - dust2::array::dimensions<1> children_dose_within_S_denom; - dust2::array::dimensions<1> children_dose_prob_within_S; + dust2::array::dimensions<1> children_dose1_prob; + dust2::array::dimensions<1> children_dose1_group; + dust2::array::dimensions<1> adults_dose1_prob; + dust2::array::dimensions<1> adults_dose1_group; dust2::array::dimensions<2> N; dust2::array::dimensions<2> S; dust2::array::dimensions<2> S0; @@ -220,58 +220,58 @@ class model_targeted_vax { std::vector children_dose1_denom; std::vector adults_dose1_denom; std::vector adults_dose2_denom; - std::vector children_dose_within_S_denom; std::vector s_ij_gen_pop; std::vector s_ij_sex; - std::vector children_dose_state_prob; - std::vector children_dose_prob_within_S; - std::vector n_vaccination_t_Ea_children; - std::vector n_vaccination_t_Eb_children; - std::vector n_vaccination_t_R_children; - std::vector n_vaccination_t_S_adults; - std::vector n_vaccination_t_Ea_adults; - std::vector n_vaccination_t_Eb_adults; - std::vector n_vaccination_t_R_adults; + std::vector children_dose1_prob; + std::vector adults_dose1_prob; std::vector lambda_hh; std::vector lambda_s; - std::vector children_dose_state; - std::vector n_vaccination_t_Ea; - std::vector n_vaccination_t_Eb; - std::vector n_vaccination_t_R; + std::vector children_dose1_group; + std::vector adults_dose1_group; std::vector lambda; std::vector n_vaccination_t_S_children; - std::vector delta_Ea_n_vaccination; - std::vector delta_Eb_n_vaccination; - std::vector delta_R_n_vaccination; + std::vector n_vaccination_t_S_adults; std::vector p_SE; std::vector p_hh; std::vector p_s; std::vector p_hc; + std::vector n_vaccination_t_Ea_children; + std::vector n_vaccination_t_Ea_adults; std::vector n_vaccination_t_S; - std::vector new_R; - std::vector n_EaEb; - std::vector n_EbI; + std::vector n_vaccination_t_Eb_children; + std::vector n_vaccination_t_Eb_adults; + std::vector n_vaccination_t_Ea; std::vector delta_S_n_vaccination; + std::vector n_vaccination_t_R_children; + std::vector n_vaccination_t_R_adults; + std::vector n_vaccination_t_Eb; + std::vector delta_Ea_n_vaccination; + std::vector n_SEa; + std::vector n_vaccination_t_R; + std::vector delta_Eb_n_vaccination; + std::vector new_S; + std::vector n_SEa_hh; + std::vector n_EaEb; + std::vector delta_R_n_vaccination; std::vector n_vaccination_t; + std::vector n_SEa_s; + std::vector n_EbI; + std::vector delta_Ea; + std::vector new_Ea; + std::vector new_R; + std::vector n_SEa_hc; std::vector n_EbId; std::vector delta_Eb; std::vector new_Eb; - std::vector n_SEa; + std::vector n_SEa_z; 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 delta_Ir; - std::vector new_Ea; std::vector new_Ir; - std::vector n_SEa_s; - std::vector new_E; std::vector new_I; std::vector new_N; - std::vector n_SEa_hc; - std::vector n_SEa_z; }; struct data_type { real_type cases; @@ -300,8 +300,6 @@ class model_targeted_vax { dim.daily_doses_adults_time = dust2::r::read_dimensions<1>(parameters, "daily_doses_adults_time"); const int N_prioritisation_steps_children = dust2::r::read_int(parameters, "N_prioritisation_steps_children"); const int N_prioritisation_steps_adults = dust2::r::read_int(parameters, "N_prioritisation_steps_adults"); - dim.children_dose_state_prob.set({static_cast(4)}); - dim.children_dose_state.set({static_cast(4)}); const real_type beta_h = dust2::r::read_real(parameters, "beta_h"); const real_type beta_s = dust2::r::read_real(parameters, "beta_s"); const real_type beta_hcw = dust2::r::read_real(parameters, "beta_hcw"); @@ -343,8 +341,10 @@ class model_targeted_vax { 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.children_dose_within_S_denom.set({static_cast(n_group)}); - dim.children_dose_prob_within_S.set({static_cast(n_group)}); + dim.children_dose1_prob.set({static_cast(n_group)}); + dim.children_dose1_group.set({static_cast(n_group)}); + dim.adults_dose1_prob.set({static_cast(n_group)}); + dim.adults_dose1_group.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)}); @@ -595,59 +595,59 @@ class model_targeted_vax { 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 children_dose_within_S_denom(shared.dim.children_dose_within_S_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 children_dose_state_prob(shared.dim.children_dose_state_prob.size); - std::vector children_dose_prob_within_S(shared.dim.children_dose_prob_within_S.size); - std::vector n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); - std::vector n_vaccination_t_Eb_children(shared.dim.n_vaccination_t_Eb_children.size); - std::vector n_vaccination_t_R_children(shared.dim.n_vaccination_t_R_children.size); - std::vector n_vaccination_t_S_adults(shared.dim.n_vaccination_t_S_adults.size); - std::vector n_vaccination_t_Ea_adults(shared.dim.n_vaccination_t_Ea_adults.size); - std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); - std::vector n_vaccination_t_R_adults(shared.dim.n_vaccination_t_R_adults.size); + std::vector children_dose1_prob(shared.dim.children_dose1_prob.size); + std::vector adults_dose1_prob(shared.dim.adults_dose1_prob.size); std::vector lambda_hh(shared.dim.lambda_hh.size); std::vector lambda_s(shared.dim.lambda_s.size); - std::vector children_dose_state(shared.dim.children_dose_state.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 children_dose1_group(shared.dim.children_dose1_group.size); + std::vector adults_dose1_group(shared.dim.adults_dose1_group.size); std::vector lambda(shared.dim.lambda.size); std::vector n_vaccination_t_S_children(shared.dim.n_vaccination_t_S_children.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_S_adults(shared.dim.n_vaccination_t_S_adults.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 n_vaccination_t_Ea_children(shared.dim.n_vaccination_t_Ea_children.size); + std::vector n_vaccination_t_Ea_adults(shared.dim.n_vaccination_t_Ea_adults.size); std::vector n_vaccination_t_S(shared.dim.n_vaccination_t_S.size); - std::vector new_R(shared.dim.R.size); - std::vector n_EaEb(shared.dim.n_EaEb.size); - std::vector n_EbI(shared.dim.n_EbI.size); + std::vector n_vaccination_t_Eb_children(shared.dim.n_vaccination_t_Eb_children.size); + std::vector n_vaccination_t_Eb_adults(shared.dim.n_vaccination_t_Eb_adults.size); + std::vector n_vaccination_t_Ea(shared.dim.n_vaccination_t_Ea.size); std::vector delta_S_n_vaccination(shared.dim.delta_S_n_vaccination.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 n_vaccination_t_Eb(shared.dim.n_vaccination_t_Eb.size); + std::vector delta_Ea_n_vaccination(shared.dim.delta_Ea_n_vaccination.size); + std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_vaccination_t_R(shared.dim.n_vaccination_t_R.size); + std::vector delta_Eb_n_vaccination(shared.dim.delta_Eb_n_vaccination.size); + std::vector new_S(shared.dim.S.size); + std::vector n_SEa_hh(shared.dim.n_SEa_hh.size); + std::vector n_EaEb(shared.dim.n_EaEb.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 n_SEa_s(shared.dim.n_SEa_s.size); + std::vector n_EbI(shared.dim.n_EbI.size); + std::vector delta_Ea(shared.dim.delta_Ea.size); + std::vector new_Ea(shared.dim.Ea.size); + std::vector new_R(shared.dim.R.size); + std::vector n_SEa_hc(shared.dim.n_SEa_hc.size); std::vector n_EbId(shared.dim.n_EbId.size); std::vector delta_Eb(shared.dim.delta_Eb.size); std::vector new_Eb(shared.dim.Eb.size); - std::vector n_SEa(shared.dim.n_SEa.size); + std::vector n_SEa_z(shared.dim.n_SEa_z.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 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 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_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, children_dose_within_S_denom, s_ij_gen_pop, s_ij_sex, children_dose_state_prob, children_dose_prob_within_S, n_vaccination_t_Ea_children, n_vaccination_t_Eb_children, n_vaccination_t_R_children, n_vaccination_t_S_adults, n_vaccination_t_Ea_adults, n_vaccination_t_Eb_adults, n_vaccination_t_R_adults, lambda_hh, lambda_s, children_dose_state, n_vaccination_t_Ea, n_vaccination_t_Eb, n_vaccination_t_R, lambda, n_vaccination_t_S_children, delta_Ea_n_vaccination, delta_Eb_n_vaccination, delta_R_n_vaccination, p_SE, p_hh, p_s, p_hc, n_vaccination_t_S, new_R, n_EaEb, n_EbI, delta_S_n_vaccination, n_vaccination_t, 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, children_dose1_prob, adults_dose1_prob, lambda_hh, lambda_s, children_dose1_group, adults_dose1_group, lambda, n_vaccination_t_S_children, n_vaccination_t_S_adults, p_SE, p_hh, p_s, p_hc, n_vaccination_t_Ea_children, n_vaccination_t_Ea_adults, n_vaccination_t_S, n_vaccination_t_Eb_children, n_vaccination_t_Eb_adults, n_vaccination_t_Ea, delta_S_n_vaccination, n_vaccination_t_R_children, n_vaccination_t_R_adults, n_vaccination_t_Eb, delta_Ea_n_vaccination, n_SEa, n_vaccination_t_R, delta_Eb_n_vaccination, new_S, n_SEa_hh, n_EaEb, delta_R_n_vaccination, n_vaccination_t, n_SEa_s, n_EbI, delta_Ea, new_Ea, new_R, n_SEa_hc, n_EbId, delta_Eb, new_Eb, n_SEa_z, n_EbIr, delta_Id, new_Id, new_E, delta_Ir, new_Ir, 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); @@ -1060,9 +1060,6 @@ class model_targeted_vax { 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]; } - for (size_t i = 1; i <= shared.dim.children_dose_within_S_denom.size; ++i) { - internal.children_dose_within_S_denom[i - 1] = internal.give_dose1_children[i - 1] * S[i - 1 + shared.dim.S.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) { @@ -1074,83 +1071,83 @@ class model_targeted_vax { 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]; } } - { - const size_t i = 1; - internal.children_dose_state_prob[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : S[i - 1 + shared.dim.S.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); - } - { - const size_t i = 2; - internal.children_dose_state_prob[1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : Ea[i - 1 + shared.dim.Ea.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); + for (size_t i = 1; i <= shared.dim.children_dose1_prob.size; ++i) { + internal.children_dose1_prob[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : internal.children_dose1_denom[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); } - { - const size_t i = 3; - internal.children_dose_state_prob[2] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : Eb[i - 1 + shared.dim.Eb.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); + for (size_t i = 1; i <= shared.dim.adults_dose1_prob.size; ++i) { + internal.adults_dose1_prob[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : internal.adults_dose1_denom[i - 1] / dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom)); } - { - const size_t i = 4; - internal.children_dose_state_prob[3] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : R[i - 1 + shared.dim.R.mult[1]] * internal.give_dose1_children[i - 1] / dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom)); - } - for (size_t i = 1; i <= shared.dim.children_dose_prob_within_S.size; ++i) { - internal.children_dose_prob_within_S[i - 1] = (dust2::array::sum(internal.children_dose_within_S_denom.data(), shared.dim.children_dose_within_S_denom) == 0 ? 0 : internal.children_dose_within_S_denom[i - 1] / dust2::array::sum(internal.children_dose_within_S_denom.data(), shared.dim.children_dose_within_S_denom)); - } - 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.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.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.n_vaccination_t_Eb_children.size; ++i) { - internal.n_vaccination_t_Eb_children[i - 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_Eb_children.size; ++i) { - 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]])); + internal.children_dose1_group[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1], internal.children_dose1_prob[0])); + for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { + internal.children_dose1_group[i - 1] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1] - dust2::array::sum(internal.children_dose1_group.data(), shared.dim.children_dose1_group, {0, (i - 1) - 1}), internal.children_dose1_prob[i - 1] / dust2::array::sum(internal.children_dose1_prob.data(), shared.dim.children_dose1_prob, {i - 1, shared.n_group - 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; + internal.adults_dose1_group[0] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_adults_t[1], internal.adults_dose1_prob[0])); + for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { + internal.adults_dose1_group[i - 1] = (dust2::array::sum(internal.adults_dose1_denom.data(), shared.dim.adults_dose1_denom) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_adults_t[1] - dust2::array::sum(internal.adults_dose1_group.data(), shared.dim.adults_dose1_group, {0, (i - 1) - 1}), internal.adults_dose1_prob[i - 1] / dust2::array::sum(internal.adults_dose1_prob.data(), shared.dim.adults_dose1_prob, {i - 1, shared.n_group - 1}))); } - 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.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.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_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_children.size; ++i) { + internal.n_vaccination_t_S_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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1], S[i - 1 + shared.dim.S.mult[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]])), 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] = (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]])); + internal.n_vaccination_t_S_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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1], S[i - 1 + shared.dim.S.mult[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]])), S[i - 1 + shared.dim.S.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.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.n_vaccination_t_Ea_adults.size; ++i) { - 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.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.n_vaccination_t_Eb_adults.size; ++i) { - internal.n_vaccination_t_Eb_adults[i - 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.n_vaccination_t_Eb_adults.size; ++i) { - 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.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_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_Ea_children.size; ++i) { + internal.n_vaccination_t_Ea_children[i - 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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1], Ea[i - 1 + shared.dim.Ea.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]])), Ea[i - 1 + shared.dim.Ea.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] = (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.n_vaccination_t_Ea_adults.size; ++i) { + internal.n_vaccination_t_Ea_adults[i - 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]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1], Ea[i - 1 + shared.dim.Ea.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]])), Ea[i - 1 + shared.dim.Ea.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.n_vaccination_t_S.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_vaccination_t_S.dim[1]; ++j) { + internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.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) { + 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]; + } + 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.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.children_dose_state.size; ++i) { - internal.children_dose_state[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] = (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1] - internal.n_vaccination_t_Ea_children[i - 1], Eb[i - 1 + shared.dim.Eb.mult[1]] / (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]])), Eb[i - 1 + shared.dim.Eb.mult[1]])); } - internal.children_dose_state[0] = monty::random::binomial(rng_state, internal.daily_doses_children_t[1], internal.children_dose_state_prob[0]); - for (size_t i = 2; i <= 4; ++i) { - internal.children_dose_state[i - 1] = (dust2::array::sum(internal.children_dose_state_prob.data(), shared.dim.children_dose_state_prob, {i - 1, 3}) == 0 ? 0 : monty::random::binomial(rng_state, internal.daily_doses_children_t[1] - dust2::array::sum(internal.children_dose_state.data(), shared.dim.children_dose_state, {0, (i - 1) - 1}), internal.children_dose_state_prob[i - 1] / dust2::array::sum(internal.children_dose_state_prob.data(), shared.dim.children_dose_state_prob, {i - 1, 3}))); + for (size_t i = 1; i <= shared.dim.n_vaccination_t_Eb_adults.size; ++i) { + internal.n_vaccination_t_Eb_adults[i - 1] = (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1] - internal.n_vaccination_t_Ea_adults[i - 1], Eb[i - 1 + shared.dim.Eb.mult[1]] / (Eb[i - 1 + shared.dim.Eb.mult[1]] + R[i - 1 + shared.dim.R.mult[1]])), Eb[i - 1 + shared.dim.Eb.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) { @@ -1163,6 +1160,17 @@ 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 + 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.delta_S_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_S_n_vaccination.dim[1]; ++j) { + internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.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] = (R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(internal.children_dose1_group[i - 1] - internal.n_vaccination_t_S_children[i - 1] - internal.n_vaccination_t_Ea_children[i - 1] - internal.n_vaccination_t_Eb_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] = (R[i - 1 + shared.dim.R.mult[1]] == 0 ? 0 : monty::math::min(internal.adults_dose1_group[i - 1] - internal.n_vaccination_t_S_adults[i - 1] - internal.n_vaccination_t_Ea_adults[i - 1] - internal.n_vaccination_t_Eb_adults[i - 1], R[i - 1 + shared.dim.R.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) { internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] = 0; @@ -1171,8 +1179,15 @@ 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]; } - 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.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.delta_Ea_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Ea_n_vaccination.dim[1]; ++j) { + internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.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_vaccination_t_R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.n_vaccination_t_R.dim[1]; ++j) { @@ -1185,29 +1200,30 @@ 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 + 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.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_Eb_n_vaccination.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.delta_Eb_n_vaccination.dim[1]; ++j) { + internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[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; - } - { - const size_t i = 1; - internal.n_vaccination_t_S_children[0] = (dust2::array::sum(internal.children_dose1_denom.data(), shared.dim.children_dose1_denom) == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose_state[0], internal.children_dose_prob_within_S[0]), S[i - 1 + shared.dim.S.mult[1]])); - } - for (size_t i = 2; i <= static_cast(shared.n_group); ++i) { - internal.n_vaccination_t_S_children[i - 1] = (dust2::array::sum(internal.children_dose_prob_within_S.data(), shared.dim.children_dose_prob_within_S, {i - 1, shared.n_group - 1}) == 0 ? 0 : monty::math::min(monty::random::binomial(rng_state, internal.children_dose_state[0] - dust2::array::sum(internal.n_vaccination_t_S_children.data(), shared.dim.n_vaccination_t_S_children, {0, (i - 1) - 1}), internal.children_dose_prob_within_S[i - 1] / dust2::array::sum(internal.children_dose_prob_within_S.data(), shared.dim.children_dose_prob_within_S, {i - 1, shared.n_group - 1})), S[i - 1 + shared.dim.S.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.delta_Ea_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Ea_n_vaccination.dim[1]; ++j) { - internal.delta_Ea_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Ea_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.mult[1]]) : (-internal.n_vaccination_t_Ea[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Ea.mult[1]] + internal.n_vaccination_t_Ea[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Ea.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.delta_Eb_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_Eb_n_vaccination.dim[1]; ++j) { - internal.delta_Eb_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_Eb_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]]) : (-internal.n_vaccination_t_Eb[i - 1 + (j - 1) * shared.dim.n_vaccination_t_Eb.mult[1]] + internal.n_vaccination_t_Eb[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_Eb.mult[1]])))); + for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_EaEb.dim[1]; ++j) { + internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] = monty::random::binomial(rng_state, 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]], p_EE); } } for (size_t i = 1; i <= shared.dim.delta_R_n_vaccination.dim[0]; ++i) { @@ -1215,60 +1231,57 @@ class model_targeted_vax { internal.delta_R_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_R_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_R[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_R.mult[1]]) : (-internal.n_vaccination_t_R[i - 1 + (j - 1) * shared.dim.n_vaccination_t_R.mult[1]] + internal.n_vaccination_t_R[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_R.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); + 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_vaccination_t.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_vaccination_t.dim[1]; ++j) { + 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.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.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.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.n_EbI.dim[0]; ++i) { + for (size_t j = 1; j <= shared.dim.n_EbI.dim[1]; ++j) { + 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.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.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.n_vaccination_t_S.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_vaccination_t_S.dim[1]; ++j) { - internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] = 0; + 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.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]; - } - 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.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.R.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.R.dim[1]; ++j) { internal.new_R[i - 1 + (j - 1) * shared.dim.R.mult[1]] = R[i - 1 + (j - 1) * shared.dim.R.mult[1]] + internal.delta_R_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_R_n_vaccination.mult[1]] + internal.delta_R[i - 1 + (j - 1) * shared.dim.delta_R.mult[1]]; } } - for (size_t i = 1; i <= shared.dim.n_EaEb.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_EaEb.dim[1]; ++j) { - internal.n_EaEb[i - 1 + (j - 1) * shared.dim.n_EaEb.mult[1]] = monty::random::binomial(rng_state, 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]], p_EE); - } - } - for (size_t i = 1; i <= shared.dim.n_EbI.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_EbI.dim[1]; ++j) { - 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.delta_S_n_vaccination.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.delta_S_n_vaccination.dim[1]; ++j) { - internal.delta_S_n_vaccination[i - 1 + (j - 1) * shared.dim.delta_S_n_vaccination.mult[1]] = (j == 1 ? 0 : (j == 2 ? (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (static_cast(j) == shared.n_vax ? (internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]]) : (-internal.n_vaccination_t_S[i - 1 + (j - 1) * shared.dim.n_vaccination_t_S.mult[1]] + internal.n_vaccination_t_S[i - 1 + (j - 1 - 1) * shared.dim.n_vaccination_t_S.mult[1]])))); - } - } - for (size_t i = 1; i <= shared.dim.n_vaccination_t.dim[0]; ++i) { - for (size_t j = 1; j <= shared.dim.n_vaccination_t.dim[1]; ++j) { - 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]]; + 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}); + const real_type new_dose1 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {1, 1}); + const real_type new_dose1_00_04 = internal.n_vaccination_t[shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); + const real_type new_dose1_CSW = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_ASW = internal.n_vaccination_t[17 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_PBS = internal.n_vaccination_t[18 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose1_HCW = internal.n_vaccination_t[19 + shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose2 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {2, 2}); + const real_type new_dose2_00_04 = internal.n_vaccination_t[2 * shared.dim.n_vaccination_t.mult[1]]; + const real_type new_dose2_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); + const real_type new_dose2_CSW = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]]; + 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.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_EbId.dim[0]; ++i) { @@ -1286,23 +1299,15 @@ class model_targeted_vax { 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_dose1 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {1, 1}); - const real_type new_dose1_00_04 = internal.n_vaccination_t[shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); - const real_type new_dose1_CSW = internal.n_vaccination_t[16 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_ASW = internal.n_vaccination_t[17 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_PBS = internal.n_vaccination_t[18 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose1_HCW = internal.n_vaccination_t[19 + shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose2 = dust2::array::sum(internal.n_vaccination_t.data(), shared.dim.n_vaccination_t, {0, shared.dim.n_vaccination_t.dim[0] - 1}, {2, 2}); - const real_type new_dose2_00_04 = internal.n_vaccination_t[2 * shared.dim.n_vaccination_t.mult[1]]; - const real_type new_dose2_SW_12_14 = monty::math::round(internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]] * static_cast(0.5)); - const real_type new_dose2_CSW = internal.n_vaccination_t[16 + 2 * shared.dim.n_vaccination_t.mult[1]]; - 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.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]]); + 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.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.n_EbIr.dim[0]; ++i) { @@ -1315,68 +1320,28 @@ 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}); - 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.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.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.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]]; } } + 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.delta_Ir.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.delta_Ir.dim[1]; ++j) { 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; - 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_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.I.dim[0]; ++i) { for (size_t j = 1; j <= shared.dim.I.dim[1]; ++j) { internal.new_I[i - 1 + (j - 1) * shared.dim.I.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]]; @@ -1387,17 +1352,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);