20 #ifndef ABM_ANALYZE_RESULT_H
21 #define ABM_ANALYZE_RESULT_H
23 #include "abm/parameters.h"
39 template <
class Model>
42 assert(p > 0.0 && p < 1.0 &&
"Invalid percentile value.");
44 auto num_runs = ensemble_params.size();
45 auto num_nodes = ensemble_params[0].size();
46 std::vector<ScalarType> single_element_ensemble(num_runs);
47 auto num_groups = (size_t)ensemble_params[0][0].parameters.get_num_groups();
50 std::vector<Model> percentile(num_nodes,
Model((
int)num_groups));
51 auto param_percentile = [&ensemble_params, p, num_runs, &percentile](
auto n,
auto get_param)
mutable {
52 std::vector<ScalarType> single_element(num_runs);
53 for (
size_t run = 0; run < num_runs; run++) {
54 auto const& params = ensemble_params[run][n];
55 single_element[run] = get_param(params);
57 std::sort(single_element.begin(), single_element.end());
58 auto& new_params = get_param(percentile[n]);
59 new_params = single_element[
static_cast<size_t>(num_runs * p)];
62 auto param_percentile_dist = [&ensemble_params, p, num_runs, &percentile](
auto n,
auto single_element,
63 auto get_param,
auto sort_fct)
mutable {
64 for (
size_t run = 0; run < num_runs; run++) {
65 auto const& params = ensemble_params[run][n];
66 single_element[run] = get_param(params);
68 std::sort(single_element.begin(), single_element.end(), sort_fct);
69 auto& new_params = get_param(percentile[n]);
70 new_params = single_element[
static_cast<size_t>(num_runs * p)];
73 for (
size_t node = 0; node < num_nodes; node++) {
74 for (
auto age_group =
AgeGroup(0); age_group <
AgeGroup(num_groups); age_group++) {
75 for (
auto virus_variant : enum_members<VirusVariant>()) {
79 param_percentile_dist(
80 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
81 [age_group, virus_variant](
auto&& model) ->
auto& {
82 return model.parameters.template get<TimeExposedToNoSymptoms>()[{virus_variant, age_group}];
84 [](
auto& dist1,
auto& dist2) {
87 param_percentile_dist(
88 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
89 [age_group, virus_variant](
auto&& model) ->
auto& {
90 return model.parameters
91 .template get<TimeInfectedNoSymptomsToSymptoms>()[{virus_variant, age_group}];
93 [](
auto& dist1,
auto& dist2) {
96 param_percentile_dist(
97 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
98 [age_group, virus_variant](
auto&& model) ->
auto& {
99 return model.parameters
100 .template get<TimeInfectedNoSymptomsToRecovered>()[{virus_variant, age_group}];
102 [](
auto& dist1,
auto& dist2) {
103 return dist1 < dist2;
105 param_percentile_dist(
106 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
107 [age_group, virus_variant](
auto&& model) ->
auto& {
108 return model.parameters
109 .template get<TimeInfectedSymptomsToSevere>()[{virus_variant, age_group}];
111 [](
auto& dist1,
auto& dist2) {
112 return dist1 < dist2;
114 param_percentile_dist(
115 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
116 [age_group, virus_variant](
auto&& model) ->
auto& {
117 return model.parameters
118 .template get<TimeInfectedSymptomsToRecovered>()[{virus_variant, age_group}];
120 [](
auto& dist1,
auto& dist2) {
121 return dist1 < dist2;
123 param_percentile_dist(
124 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
125 [age_group, virus_variant](
auto&& model) ->
auto& {
126 return model.parameters
127 .template get<TimeInfectedSevereToCritical>()[{virus_variant, age_group}];
129 [](
auto& dist1,
auto& dist2) {
130 return dist1 < dist2;
132 param_percentile_dist(
133 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
134 [age_group, virus_variant](
auto&& model) ->
auto& {
135 return model.parameters
136 .template get<TimeInfectedSevereToRecovered>()[{virus_variant, age_group}];
138 [](
auto& dist1,
auto& dist2) {
139 return dist1 < dist2;
141 param_percentile_dist(
142 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
143 [age_group, virus_variant](
auto&& model) ->
auto& {
144 return model.parameters.template get<TimeInfectedCriticalToDead>()[{virus_variant, age_group}];
146 [](
auto& dist1,
auto& dist2) {
147 return dist1 < dist2;
149 param_percentile_dist(
150 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
151 [age_group, virus_variant](
auto&& model) ->
auto& {
152 return model.parameters
153 .template get<TimeInfectedCriticalToRecovered>()[{virus_variant, age_group}];
155 [](
auto& dist1,
auto& dist2) {
156 return dist1 < dist2;
159 param_percentile(node, [age_group, virus_variant](
auto&& model) ->
auto& {
160 return model.parameters.template get<SymptomsPerInfectedNoSymptoms>()[{virus_variant, age_group}];
162 param_percentile(node, [age_group, virus_variant](
auto&& model) ->
auto& {
163 return model.parameters.template get<SeverePerInfectedSymptoms>()[{virus_variant, age_group}];
165 param_percentile(node, [age_group, virus_variant](
auto&& model) ->
auto& {
166 return model.parameters.template get<CriticalPerInfectedSevere>()[{virus_variant, age_group}];
168 param_percentile(node, [age_group, virus_variant](
auto&& model) ->
auto& {
169 return model.parameters.template get<DeathsPerInfectedCritical>()[{virus_variant, age_group}];
172 param_percentile(node, [virus_variant](
auto&& model) ->
auto& {
173 return model.parameters.template get<AerosolTransmissionRates>()[{virus_variant}];
177 param_percentile_dist(
178 node, std::vector<ViralLoadDistributionsParameters>(num_runs),
179 [age_group, virus_variant](
auto&& model) ->
auto& {
180 return model.parameters.template get<ViralLoadDistributions>()[{virus_variant, age_group}];
182 [](
auto& dist1,
auto& dist2) {
183 return dist1.viral_load_peak < dist2.viral_load_peak;
185 param_percentile_dist(
186 node, std::vector<ViralShedTuple>(num_runs),
187 [age_group, virus_variant](
auto&& model) ->
auto& {
188 return model.parameters.template get<ViralShedParameters>()[{virus_variant, age_group}];
190 [](
auto& dist1,
auto& dist2) {
191 return dist1.viral_shed_alpha < dist2.viral_shed_alpha;
193 param_percentile_dist(
194 node, std::vector<mio::AbstractParameterDistribution>(num_runs),
195 [age_group, virus_variant](
auto&& model) ->
auto& {
196 return model.parameters.template get<ViralShedFactor>()[{virus_variant, age_group}];
198 [](
auto& dist1,
auto& dist2) {
199 return dist1 < dist2;
202 param_percentile(node, [age_group](
auto&& model) ->
auto& {
203 return model.parameters.template get<BasicShoppingRate>()[{age_group}];
205 param_percentile(node, [age_group](
auto&& model) ->
auto& {
206 static auto result = model.parameters.template get<GotoWorkTimeMinimum>()[{age_group}].hours();
209 param_percentile(node, [age_group](
auto&& model) ->
auto& {
210 static auto result = model.parameters.template get<GotoWorkTimeMaximum>()[{age_group}].hours();
213 param_percentile(node, [age_group](
auto&& model) ->
auto& {
214 static auto result = model.parameters.template get<GotoSchoolTimeMinimum>()[{age_group}].hours();
217 param_percentile(node, [age_group](
auto&& model) ->
auto& {
218 static auto result = model.parameters.template get<GotoSchoolTimeMaximum>()[{age_group}].hours();
222 param_percentile(node, [](
auto&& model) ->
auto& {
225 param_percentile(node, [](
auto&& model) ->
auto& {
226 return model.parameters.template get<MaskProtection>()[
MaskType::FFP2];
228 param_percentile(node, [](
auto&& model) ->
auto& {
231 param_percentile(node, [](
auto&& model) ->
auto& {
232 static auto result = model.parameters.template get<LockdownDate>().days();
The Model of the Simulation.
Definition: abm/model.h:54
double ScalarType
Configuration of memilio library.
Definition: memilio/config.h:30
std::vector< Model > ensemble_params_percentile(const std::vector< std::vector< Model >> &ensemble_params, ScalarType p)
computes the p percentile of the parameters for each node.
Definition: models/abm/analyze_result.h:40
A collection of classes to simplify handling of matrix shapes in meta programming.
Definition: models/abm/analyze_result.h:30
The AgeGroup struct is used as a dynamically sized tag for all age dependent categories.
Definition: age_group.h:32