20 #ifndef MIO_ODE_SECIRVVS_ANALYZE_RESULT_H
21 #define MIO_ODE_SECIRVVS_ANALYZE_RESULT_H
36 template <
class Model>
39 assert(p > 0.0 && p < 1.0 &&
"Invalid percentile value.");
41 auto num_runs = ensemble_params.size();
42 auto num_nodes = ensemble_params[0].size();
43 auto num_groups = (size_t)ensemble_params[0][0].parameters.get_num_groups();
44 auto num_days = ensemble_params[0][0]
45 .parameters.template get<DailyPartialVaccinations<double>>()
46 .
template size<mio::SimulationDay>();
48 std::vector<double> single_element_ensemble(num_runs);
51 std::vector<Model> percentile(num_nodes,
Model((
int)num_groups));
52 auto param_percentil = [&ensemble_params, p, num_runs, &percentile](
auto n,
auto get_param)
mutable {
53 std::vector<double> single_element(num_runs);
54 for (
size_t run = 0; run < num_runs; run++) {
55 auto const& params = ensemble_params[run][n];
56 single_element[run] = get_param(params);
58 std::sort(single_element.begin(), single_element.end());
59 auto& new_params = get_param(percentile[n]);
60 new_params = single_element[
static_cast<size_t>(num_runs * p)];
63 for (
size_t node = 0; node < num_nodes; node++) {
64 percentile[node].parameters.template get<DailyPartialVaccinations<double>>().resize(num_days);
65 percentile[node].parameters.template get<DailyFullVaccinations<double>>().resize(num_days);
71 node, [ compart,
i ](
auto&& model) ->
auto& {
72 return model.populations[{
i, compart}];
77 node, [
i](
auto&& model) ->
auto& {
return model.parameters.template get<TimeExposed<double>>()[
i]; });
79 node, [
i](
auto&& model) ->
auto& {
80 return model.parameters.template get<TimeInfectedNoSymptoms<double>>()[
i];
83 node, [
i](
auto&& model) ->
auto& {
84 return model.parameters.template get<TimeInfectedSymptoms<double>>()[
i];
87 node, [
i](
auto&& model) ->
auto& {
88 return model.parameters.template get<TimeInfectedSevere<double>>()[
i];
91 node, [
i](
auto&& model) ->
auto& {
92 return model.parameters.template get<TimeInfectedCritical<double>>()[
i];
96 node, [
i](
auto&& model) ->
auto& {
97 return model.parameters.template get<TransmissionProbabilityOnContact<double>>()[
i];
100 node, [
i](
auto&& model) ->
auto& {
101 return model.parameters.template get<RelativeTransmissionNoSymptoms<double>>()[
i];
104 node, [
i](
auto&& model) ->
auto& {
105 return model.parameters.template get<RiskOfInfectionFromSymptomatic<double>>()[
i];
108 node, [
i](
auto&& model) ->
auto& {
109 return model.parameters.template get<MaxRiskOfInfectionFromSymptomatic<double>>()[
i];
112 node, [
i](
auto&& model) ->
auto& {
113 return model.parameters.template get<RecoveredPerInfectedNoSymptoms<double>>()[
i];
116 node, [
i](
auto&& model) ->
auto& {
117 return model.parameters.template get<SeverePerInfectedSymptoms<double>>()[
i];
120 node, [
i](
auto&& model) ->
auto& {
121 return model.parameters.template get<CriticalPerSevere<double>>()[
i];
124 node, [
i](
auto&& model) ->
auto& {
125 return model.parameters.template get<DeathsPerCritical<double>>()[
i];
129 node, [
i](
auto&& model) ->
auto& {
130 return model.parameters.template get<ReducExposedPartialImmunity<double>>()[
i];
133 node, [
i](
auto&& model) ->
auto& {
134 return model.parameters.template get<ReducExposedImprovedImmunity<double>>()[
i];
137 node, [
i](
auto&& model) ->
auto& {
138 return model.parameters.template get<ReducInfectedSymptomsPartialImmunity<double>>()[
i];
141 node, [
i](
auto&& model) ->
auto& {
142 return model.parameters.template get<ReducInfectedSymptomsImprovedImmunity<double>>()[
i];
145 node, [
i](
auto&& model) ->
auto& {
146 return model.parameters.template get<ReducInfectedSevereCriticalDeadPartialImmunity<double>>()[
i];
149 node, [
i](
auto&& model) ->
auto& {
150 return model.parameters.template get<ReducInfectedSevereCriticalDeadImprovedImmunity<double>>()[
i];
153 node, [
i](
auto&& model) ->
auto& {
154 return model.parameters.template get<ReducTimeInfectedMild<double>>()[
i];
157 node, [
i](
auto&& model) ->
auto& {
158 return model.parameters.template get<VaccinationGap<double>>()[
i];
161 node, [
i](
auto&& model) ->
auto& {
162 return model.parameters.template get<DaysUntilEffectivePartialImmunity<double>>()[
i];
165 node, [
i](
auto&& model) ->
auto& {
166 return model.parameters.template get<DaysUntilEffectiveImprovedImmunity<double>>()[
i];
171 node, [
i, day ](
auto&& model) ->
auto& {
172 return model.parameters.template get<DailyPartialVaccinations<double>>()[{
i, day}];
175 node, [
i, day ](
auto&& model) ->
auto& {
176 return model.parameters.template get<DailyFullVaccinations<double>>()[{
i, day}];
181 node, [
i](
auto&& model) ->
auto& {
182 return model.parameters.template get<InfectiousnessNewVariant<double>>()[
i];
187 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<Seasonality<double>>(); });
189 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<TestAndTraceCapacity<double>>(); });
191 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<ICUCapacity<double>>(); });
193 for (
size_t run = 0; run < num_runs; run++) {
194 auto const& params = ensemble_params[run][node];
195 single_element_ensemble[run] =
196 params.parameters.template get<ICUCapacity<double>>() * params.populations.get_total();
198 std::sort(single_element_ensemble.begin(), single_element_ensemble.end());
199 percentile[node].parameters.template set<ICUCapacity<double>>(
200 single_element_ensemble[
static_cast<size_t>(num_runs * p)]);
An Index with more than one template parameter combines several Index objects.
Definition: index.h:191
Represents the simulation time as an integer index.
Definition: simulation_day.h:32
Definition: ode_secirvvs/model.h:94
std::vector< Model > ensemble_params_percentile(const std::vector< std::vector< Model >> &ensemble_params, double p)
computes the p percentile of the parameters for each node.
Definition: models/ode_secirvvs/analyze_result.h:37
A collection of classes to simplify handling of matrix shapes in meta programming.
Definition: models/abm/analyze_result.h:30
auto i
Definition: io.h:810
Typesafe index representing an age group.
Definition: age_group.h:40