analyze_result.h Source File

CPP API: analyze_result.h Source File
models/ode_secirvvs/analyze_result.h
Go to the documentation of this file.
1 /*
2 * Copyright (C) 2020-2026 MEmilio
3 *
4 * Authors: Wadim Koslow, Daniel Abele, Martin J. Kühn
5 *
6 * Contact: Martin J. Kuehn <Martin.Kuehn@DLR.de>
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20 #ifndef MIO_ODE_SECIRVVS_ANALYZE_RESULT_H
21 #define MIO_ODE_SECIRVVS_ANALYZE_RESULT_H
22 
25 
26 namespace mio
27 {
28 namespace osecirvvs
29 {
36 template <class Model>
37 std::vector<Model> ensemble_params_percentile(const std::vector<std::vector<Model>>& ensemble_params, double p)
38 {
39  assert(p > 0.0 && p < 1.0 && "Invalid percentile value.");
40 
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>();
47 
48  std::vector<double> single_element_ensemble(num_runs);
49 
50  // lambda function that calculates the percentile of a single parameter
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);
57  }
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)];
61  };
62 
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);
66 
67  for (auto i = AgeGroup(0); i < AgeGroup(num_groups); i++) {
68  //Population
69  for (auto compart = Index<InfectionState>(0); compart < InfectionState::Count; ++compart) {
70  param_percentil(node, [compart, i](auto&& model) -> auto& {
71  return model.populations[{i, compart}];
72  });
73  }
74  // times
75  param_percentil(node, [i](auto&& model) -> auto& {
76  return model.parameters.template get<TimeExposed<double>>()[i];
77  });
78  param_percentil(node, [i](auto&& model) -> auto& {
79  return model.parameters.template get<TimeInfectedNoSymptoms<double>>()[i];
80  });
81  param_percentil(node, [i](auto&& model) -> auto& {
82  return model.parameters.template get<TimeInfectedSymptoms<double>>()[i];
83  });
84  param_percentil(node, [i](auto&& model) -> auto& {
85  return model.parameters.template get<TimeInfectedSevere<double>>()[i];
86  });
87  param_percentil(node, [i](auto&& model) -> auto& {
88  return model.parameters.template get<TimeInfectedCritical<double>>()[i];
89  });
90  //probs
91  param_percentil(node, [i](auto&& model) -> auto& {
92  return model.parameters.template get<TransmissionProbabilityOnContact<double>>()[i];
93  });
94  param_percentil(node, [i](auto&& model) -> auto& {
95  return model.parameters.template get<RelativeTransmissionNoSymptoms<double>>()[i];
96  });
97  param_percentil(node, [i](auto&& model) -> auto& {
98  return model.parameters.template get<RiskOfInfectionFromSymptomatic<double>>()[i];
99  });
100  param_percentil(node, [i](auto&& model) -> auto& {
101  return model.parameters.template get<MaxRiskOfInfectionFromSymptomatic<double>>()[i];
102  });
103  param_percentil(node, [i](auto&& model) -> auto& {
104  return model.parameters.template get<RecoveredPerInfectedNoSymptoms<double>>()[i];
105  });
106  param_percentil(node, [i](auto&& model) -> auto& {
107  return model.parameters.template get<SeverePerInfectedSymptoms<double>>()[i];
108  });
109  param_percentil(node, [i](auto&& model) -> auto& {
110  return model.parameters.template get<CriticalPerSevere<double>>()[i];
111  });
112  param_percentil(node, [i](auto&& model) -> auto& {
113  return model.parameters.template get<DeathsPerCritical<double>>()[i];
114  });
115  //vaccinations
116  param_percentil(node, [i](auto&& model) -> auto& {
117  return model.parameters.template get<ReducExposedPartialImmunity<double>>()[i];
118  });
119  param_percentil(node, [i](auto&& model) -> auto& {
120  return model.parameters.template get<ReducExposedImprovedImmunity<double>>()[i];
121  });
122  param_percentil(node, [i](auto&& model) -> auto& {
123  return model.parameters.template get<ReducInfectedSymptomsPartialImmunity<double>>()[i];
124  });
125  param_percentil(node, [i](auto&& model) -> auto& {
126  return model.parameters.template get<ReducInfectedSymptomsImprovedImmunity<double>>()[i];
127  });
128  param_percentil(node, [i](auto&& model) -> auto& {
129  return model.parameters.template get<ReducInfectedSevereCriticalDeadPartialImmunity<double>>()[i];
130  });
131  param_percentil(node, [i](auto&& model) -> auto& {
132  return model.parameters.template get<ReducInfectedSevereCriticalDeadImprovedImmunity<double>>()[i];
133  });
134  param_percentil(node, [i](auto&& model) -> auto& {
135  return model.parameters.template get<ReducTimeInfectedMild<double>>()[i];
136  });
137  param_percentil(node, [i](auto&& model) -> auto& {
138  return model.parameters.template get<VaccinationGap<double>>()[i];
139  });
140  param_percentil(node, [i](auto&& model) -> auto& {
141  return model.parameters.template get<DaysUntilEffectivePartialImmunity<double>>()[i];
142  });
143  param_percentil(node, [i](auto&& model) -> auto& {
144  return model.parameters.template get<DaysUntilEffectiveImprovedImmunity<double>>()[i];
145  });
146 
147  for (auto day = SimulationDay(0); day < num_days; ++day) {
148  param_percentil(node, [i, day](auto&& model) -> auto& {
149  return model.parameters.template get<DailyPartialVaccinations<double>>()[{i, day}];
150  });
151  param_percentil(node, [i, day](auto&& model) -> auto& {
152  return model.parameters.template get<DailyFullVaccinations<double>>()[{i, day}];
153  });
154  }
155  //virus variants
156  param_percentil(node, [i](auto&& model) -> auto& {
157  return model.parameters.template get<InfectiousnessNewVariant<double>>()[i];
158  });
159  }
160  // group independent params
161  param_percentil(node, [](auto&& model) -> auto& {
162  return model.parameters.template get<Seasonality<double>>();
163  });
164  param_percentil(node, [](auto&& model) -> auto& {
165  return model.parameters.template get<TestAndTraceCapacity<double>>();
166  });
167  param_percentil(node, [](auto&& model) -> auto& {
168  return model.parameters.template get<ICUCapacity<double>>();
169  });
170  param_percentil(node, [](auto&& model) -> auto& {
171  return model.parameters.template get<DynamicNPIsImplementationDelay<double>>();
172  });
173 
174  for (size_t run = 0; run < num_runs; run++) {
175  auto const& params = ensemble_params[run][node];
176  single_element_ensemble[run] =
177  params.parameters.template get<ICUCapacity<double>>() * params.populations.get_total();
178  }
179  std::sort(single_element_ensemble.begin(), single_element_ensemble.end());
180  percentile[node].parameters.template set<ICUCapacity<double>>(
181  single_element_ensemble[static_cast<size_t>(num_runs * p)]);
182  }
183  return percentile;
184 }
185 
186 } // namespace osecirvvs
187 } // namespace mio
188 
189 #endif //MIO_ODE_SECIRVVS_ANALYZE_RESULT_H
An Index with more than one template parameter combines several Index objects.
Definition: index.h:181
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:809
The AgeGroup struct is used as a dynamically sized tag for all age dependent categories.
Definition: age_group.h:32