20 #ifndef MIO_ODE_SECIRTS_ANALYZE_RESULT_H
21 #define MIO_ODE_SECIRTS_ANALYZE_RESULT_H
40 template <
typename FP,
class Model>
43 assert(p > 0.0 && p < 1.0 &&
"Invalid percentile value.");
45 auto num_runs = ensemble_params.size();
46 auto num_nodes = ensemble_params[0].size();
47 auto num_groups = (size_t)ensemble_params[0][0].parameters.get_num_groups();
48 auto num_days = ensemble_params[0][0]
49 .parameters.template get<DailyPartialVaccinations<FP>>()
50 .
template size<mio::SimulationDay>();
52 std::vector<FP> single_element_ensemble(num_runs);
55 std::vector<Model> percentile(num_nodes,
Model((
int)num_groups));
56 auto param_percentil = [&ensemble_params, p, num_runs, &percentile](
auto n,
auto get_param)
mutable {
57 std::vector<FP> single_element(num_runs);
58 for (
size_t run = 0; run < num_runs; run++) {
59 auto const& params = ensemble_params[run][n];
60 single_element[run] = get_param(params);
62 std::sort(single_element.begin(), single_element.end());
63 auto& new_params = get_param(percentile[n]);
64 new_params = single_element[
static_cast<size_t>(num_runs * p)];
67 for (
size_t node = 0; node < num_nodes; node++) {
68 percentile[node].parameters.template get<DailyPartialVaccinations<FP>>().resize(num_days);
69 percentile[node].parameters.template get<DailyFullVaccinations<FP>>().resize(num_days);
70 percentile[node].parameters.template get<DailyBoosterVaccinations<FP>>().resize(num_days);
76 node, [ compart,
i ](
auto&& model) ->
auto& {
77 return model.populations[{
i, compart}];
82 node, [
i](
auto&& model) ->
auto& {
return model.parameters.template get<TimeExposed<FP>>()[
i]; });
84 node, [
i](
auto&& model) ->
auto& {
85 return model.parameters.template get<TimeInfectedNoSymptoms<FP>>()[
i];
88 node, [
i](
auto&& model) ->
auto& {
89 return model.parameters.template get<TimeInfectedSymptoms<FP>>()[
i];
92 node, [
i](
auto&& model) ->
auto& {
93 return model.parameters.template get<TimeInfectedSevere<FP>>()[
i];
96 node, [
i](
auto&& model) ->
auto& {
97 return model.parameters.template get<TimeInfectedCritical<FP>>()[
i];
101 node, [
i](
auto&& model) ->
auto& {
102 return model.parameters.template get<TransmissionProbabilityOnContact<FP>>()[
i];
105 node, [
i](
auto&& model) ->
auto& {
106 return model.parameters.template get<RelativeTransmissionNoSymptoms<FP>>()[
i];
109 node, [
i](
auto&& model) ->
auto& {
110 return model.parameters.template get<RiskOfInfectionFromSymptomatic<FP>>()[
i];
113 node, [
i](
auto&& model) ->
auto& {
114 return model.parameters.template get<MaxRiskOfInfectionFromSymptomatic<FP>>()[
i];
117 node, [
i](
auto&& model) ->
auto& {
118 return model.parameters.template get<RecoveredPerInfectedNoSymptoms<FP>>()[
i];
121 node, [
i](
auto&& model) ->
auto& {
122 return model.parameters.template get<SeverePerInfectedSymptoms<FP>>()[
i];
125 node, [
i](
auto&& model) ->
auto& {
return model.parameters.template get<CriticalPerSevere<FP>>()[
i]; });
127 node, [
i](
auto&& model) ->
auto& {
return model.parameters.template get<DeathsPerCritical<FP>>()[
i]; });
130 node, [
i](
auto&& model) ->
auto& {
131 return model.parameters.template get<ReducExposedPartialImmunity<FP>>()[
i];
134 node, [
i](
auto&& model) ->
auto& {
135 return model.parameters.template get<ReducExposedImprovedImmunity<FP>>()[
i];
138 node, [
i](
auto&& model) ->
auto& {
139 return model.parameters.template get<ReducInfectedSymptomsPartialImmunity<FP>>()[
i];
142 node, [
i](
auto&& model) ->
auto& {
143 return model.parameters.template get<ReducInfectedSymptomsImprovedImmunity<FP>>()[
i];
146 node, [
i](
auto&& model) ->
auto& {
147 return model.parameters.template get<ReducInfectedSevereCriticalDeadPartialImmunity<FP>>()[
i];
150 node, [
i](
auto&& model) ->
auto& {
151 return model.parameters.template get<ReducInfectedSevereCriticalDeadImprovedImmunity<FP>>()[
i];
154 node, [
i](
auto&& model) ->
auto& {
155 return model.parameters.template get<ReducTimeInfectedMild<FP>>()[
i];
158 node, [
i](
auto&& model) ->
auto& {
159 return model.parameters.template get<DaysUntilEffectivePartialVaccination<FP>>()[
i];
162 node, [
i](
auto&& model) ->
auto& {
163 return model.parameters.template get<DaysUntilEffectiveImprovedVaccination<FP>>()[
i];
168 node, [
i, day ](
auto&& model) ->
auto& {
169 return model.parameters.template get<DailyPartialVaccinations<FP>>()[{
i, day}];
172 node, [
i, day ](
auto&& model) ->
auto& {
173 return model.parameters.template get<DailyFullVaccinations<FP>>()[{
i, day}];
176 node, [
i, day ](
auto&& model) ->
auto& {
177 return model.parameters.template get<DailyBoosterVaccinations<FP>>()[{
i, day}];
182 node, [
i](
auto&& model) ->
auto& {
183 return model.parameters.template get<InfectiousnessNewVariant<FP>>()[
i];
188 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<Seasonality<FP>>(); });
190 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<TestAndTraceCapacity<FP>>(); });
192 node, [](
auto&& model) ->
auto& {
return model.parameters.template get<ICUCapacity<FP>>(); });
194 for (
size_t run = 0; run < num_runs; run++) {
196 auto const& params = ensemble_params[run][node];
197 single_element_ensemble[run] =
198 params.parameters.template get<ICUCapacity<FP>>() * params.populations.get_total();
200 std::sort(single_element_ensemble.begin(), single_element_ensemble.end());
201 percentile[node].parameters.template set<ICUCapacity<FP>>(
202 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_secirts/model.h:102
std::vector< Model > ensemble_params_percentile(const std::vector< std::vector< Model >> &ensemble_params, FP p)
computes the p percentile of the parameters for each node.
Definition: models/ode_secirts/analyze_result.h:41
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