1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.experiment.results;
17
18 import java.util.ArrayList;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import p3j.misc.Misc;
25 import p3j.misc.math.Matrix2D;
26 import p3j.pppm.SubPopulation;
27 import p3j.pppm.SubPopulationModel;
28
29
30
31
32
33
34
35
36
37 public class ResultAggregation {
38
39
40 private final int generations;
41
42
43 private final int numOfYears;
44
45
46 private final SubPopulationModel subPopulationModel;
47
48
49
50
51
52
53 private final Map<ISubPopulationSelector, Map<IOutputVariableSelector, List<AbstractAggregationSelector>>> subPopSelectorMap;
54
55
56 private final Map<SubPopulation, ISubPopulationSelector> subPopulationSelectors;
57
58
59
60
61
62
63 private final List<AbstractAggregationSelector> allMaleAdditions = new ArrayList<>();
64
65
66
67
68 private final List<AbstractAggregationSelector> allFemaleAdditions = new ArrayList<>();
69
70
71
72
73 private final List<AbstractAggregationSelector> allMaleSubtractions = new ArrayList<>();
74
75
76
77
78 private final List<AbstractAggregationSelector> allFemaleSubtractions = new ArrayList<>();
79
80
81 private final List<AbstractAggregationSelector> allTotalAdditions = new ArrayList<>();
82
83
84 private final List<AbstractAggregationSelector> allTotalSubtractions = new ArrayList<>();
85
86
87
88
89
90
91
92
93
94
95
96 public ResultAggregation(int numberOfGenerations, int numberOfYears,
97 SubPopulationModel subPopModel) {
98
99
100 generations = numberOfGenerations;
101 numOfYears = numberOfYears;
102 subPopulationModel = subPopModel;
103
104
105 subPopulationSelectors = createSubPopSelectors();
106 subPopSelectorMap = initSubPopSelectorMap();
107
108
109 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
110 ISubPopulationSelector subPopSelector = subPopulationSelectors
111 .get(subPopulation);
112 if (subPopulation.isAdditive()) {
113 allMaleAdditions.addAll(subPopSelectorMap.get(subPopSelector).get(
114 END_X_M));
115 allFemaleAdditions.addAll(subPopSelectorMap.get(subPopSelector).get(
116 END_X_F));
117 allTotalAdditions.addAll(getAllForSubPop(subPopSelector));
118 } else {
119 allMaleSubtractions.addAll(subPopSelectorMap.get(subPopSelector).get(
120 END_X_M));
121 allFemaleSubtractions.addAll(subPopSelectorMap.get(subPopSelector).get(
122 END_X_F));
123 allTotalSubtractions.addAll(getAllForSubPop(subPopSelector));
124 }
125 }
126 }
127
128
129
130
131
132
133 private Map<SubPopulation, ISubPopulationSelector> createSubPopSelectors() {
134 Map<SubPopulation, ISubPopulationSelector> result = new HashMap<>();
135 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
136 result.put(
137 subPopulation,
138 new SubPopulationSelector(subPopulation.getName(), subPopulation
139 .getSimplifiedName()));
140 }
141 return Collections.unmodifiableMap(result);
142 }
143
144
145
146
147
148
149
150 private Map<ISubPopulationSelector, Map<IOutputVariableSelector, List<AbstractAggregationSelector>>> initSubPopSelectorMap() {
151 Map<ISubPopulationSelector, Map<IOutputVariableSelector, List<AbstractAggregationSelector>>> resultMap = new HashMap<>();
152 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
153
154 ISubPopulationSelector subPopSelector = subPopulationSelectors
155 .get(subPopulation);
156
157 Map<IOutputVariableSelector, List<AbstractAggregationSelector>> outputMap = new HashMap<>();
158 outputMap.put(END_X_M, new ArrayList<AbstractAggregationSelector>());
159 outputMap.put(END_X_F, new ArrayList<AbstractAggregationSelector>());
160 resultMap.put(subPopSelector, outputMap);
161
162 if (subPopulation.isConsistingOfDescendantGenerations())
163 for (int i = 0; i < generations; i++) {
164 resultMap.get(subPopSelector).get(END_X_M)
165 .add(new SumOverAgesSelector(END_X_M, subPopSelector, i));
166 resultMap.get(subPopSelector).get(END_X_F)
167 .add(new SumOverAgesSelector(END_X_F, subPopSelector, i));
168 }
169 else {
170 resultMap.get(subPopSelector).get(END_X_M)
171 .add(new SumOverAgesSelector(END_X_M, subPopSelector, -1));
172 resultMap.get(subPopSelector).get(END_X_F)
173 .add(new SumOverAgesSelector(END_X_F, subPopSelector, -1));
174 }
175 }
176 return Collections.unmodifiableMap(resultMap);
177 }
178
179
180 private static final IOutputVariableSelector END_X_M = new IOutputVariableSelector() {
181 @Override
182 public String getSuffix() {
183 return "end_x_m";
184 }
185
186 @Override
187 public Matrix2D select(BasicResults basicResults) {
188 return basicResults.getEndXm();
189 }
190 };
191
192
193 private static final IOutputVariableSelector END_X_F = new IOutputVariableSelector() {
194 @Override
195 public String getSuffix() {
196 return "end_x_f";
197 }
198
199 @Override
200 public Matrix2D select(BasicResults basicResults) {
201 return basicResults.getEndXf();
202 }
203 };
204
205
206 private static final IOutputVariableSelector MEAN_X_M = new IOutputVariableSelector() {
207 @Override
208 public String getSuffix() {
209 return "mean_x_m";
210 }
211
212 @Override
213 public Matrix2D select(BasicResults basicResults) {
214 return basicResults.getMeanXm();
215 }
216 };
217
218
219 private static final IOutputVariableSelector MEAN_X_F = new IOutputVariableSelector() {
220 @Override
221 public String getSuffix() {
222 return "mean_x_f";
223 }
224
225 @Override
226 public Matrix2D select(BasicResults basicResults) {
227 return basicResults.getMeanXf();
228 }
229 };
230
231
232
233
234
235
236
237
238
239 class SubPopulationSelector implements ISubPopulationSelector {
240
241
242 private final String subPopName;
243
244
245
246
247
248
249 private final String prefix;
250
251
252
253
254
255
256
257
258
259
260 SubPopulationSelector(String subPopulationName, String thePrefix) {
261 subPopName = subPopulationName;
262 prefix = thePrefix;
263 }
264
265 @Override
266 public BasicResults select(ResultsOfTrial resultsOfTrial, int generation) {
267
268 for (BasicResults result : resultsOfTrial.getSubPopulationResults())
269
270
271
272
273 if (result.getSubPopName().equals(subPopName)
274 && (result.getGeneration() == generation || generation == -1
275 && result.getGeneration() == 0))
276 return result;
277 throw new IllegalArgumentException(
278 "Could not find result for generation '" + generation
279 + "' of sub-population '" + subPopName + "'");
280 }
281
282 @Override
283 public String getPrefix() {
284 return prefix;
285 }
286
287 }
288
289
290 private static final IOutputVariableSelector[] RESULT_TYPES = { END_X_M,
291 END_X_F, MEAN_X_M, MEAN_X_F };
292
293
294
295
296
297
298 public IAggregationSelector[] getSelectorsForReport() {
299 List<IAggregationSelector> selectors = defineSubPopMergingSelectors();
300
301 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
302 ISubPopulationSelector subPopSelector = subPopulationSelectors
303 .get(subPopulation);
304 if (subPopulation.isConsistingOfDescendantGenerations())
305 for (int i = 0; i < generations; i++)
306 selectors.addAll(createSelectorsPerGeneration(subPopSelector, i));
307 else
308 selectors.addAll(createSelectorsPerGeneration(subPopSelector, -1));
309 }
310
311 return selectors.toArray(new IAggregationSelector[0]);
312 }
313
314
315
316
317
318
319
320
321
322
323
324 private List<IAggregationSelector> createSelectorsPerGeneration(
325 ISubPopulationSelector subPopSelector, int generation) {
326 List<IAggregationSelector> result = new ArrayList<>();
327 for (IOutputVariableSelector resultType : new IOutputVariableSelector[] {
328 END_X_M, END_X_F }) {
329 result.add(new ChooseAgesForSingleYearSelector(resultType,
330 subPopSelector, generation, 0));
331 result.add(new ChooseAgesForSingleYearSelector(resultType,
332 subPopSelector, generation, numOfYears - 1));
333 }
334 for (IOutputVariableSelector resultType : RESULT_TYPES) {
335 result
336 .add(new SumOverAgesSelector(resultType, subPopSelector, generation));
337 }
338 return result;
339 }
340
341
342
343
344
345
346 public IAggregationSelector[] getSelectorsForAggregatedDataExport() {
347 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
348
349 selectors.add(new MergeSubPopOldAgeDependencyRatioSelector(
350 allTotalAdditions, allTotalSubtractions, "oadr_total_end_mf"));
351
352 for (int i = 0; i < numOfYears; i++) {
353 selectors.add(new YearlyAgeTrialMatrixSelector(allMaleAdditions,
354 allMaleSubtractions, "age_trial_matrix_m_for_year_", i));
355 selectors.add(new YearlyAgeTrialMatrixSelector(allFemaleAdditions,
356 allFemaleSubtractions, "age_trial_matrix_f_for_year_", i));
357 }
358
359 return selectors.toArray(new IAggregationSelector[0]);
360 }
361
362
363
364
365
366
367
368 private List<IAggregationSelector> defineSubPopMergingSelectors() {
369
370
371 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
372
373 selectors.addAll(defineMFSelectorsForAllGenerations());
374
375
376 selectors.addAll(defineTotalMaleFemaleCombinedSelectors());
377
378
379 selectors
380 .addAll(defineSelectorsForSubPopsWithGenerations(subPopSelectorMap));
381
382 return selectors;
383 }
384
385
386
387
388
389
390
391
392 @SuppressWarnings("unchecked")
393 private List<IAggregationSelector> defineSelectorsForSubPopsWithGenerations(
394 Map<ISubPopulationSelector, Map<IOutputVariableSelector, List<AbstractAggregationSelector>>> subPopSelectorMap) {
395
396 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
397
398 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
399
400 if (!subPopulation.isConsistingOfDescendantGenerations())
401 continue;
402
403 ISubPopulationSelector subPopSelector = subPopulationSelectors
404 .get(subPopulation);
405 String prefix = subPopSelector.getPrefix();
406
407
408 selectors.addAll(defineSingleYearSelectors(
409 new MergeSubPopSumOverAgesSelector(subPopSelectorMap.get(
410 subPopSelector).get(END_X_M), prefix + "_end_x_m"), numOfYears));
411 selectors.addAll(defineSingleYearSelectors(
412 new MergeSubPopSumOverAgesSelector(subPopSelectorMap.get(
413 subPopSelector).get(END_X_F), prefix + "_end_x_f"), numOfYears));
414 selectors.add(new MergeSubPopSumOverAgesSelector(
415 getAllForSubPop(subPopSelector), prefix + "_end_x_mf"));
416
417
418 List<AbstractAggregationSelector> allMaleDescendants = new ArrayList<>(
419 subPopSelectorMap.get(subPopSelector).get(END_X_M));
420 allMaleDescendants.remove(0);
421 List<AbstractAggregationSelector> allFemaleDescendants = new ArrayList<>(
422 subPopSelectorMap.get(subPopSelector).get(END_X_F));
423 allFemaleDescendants.remove(0);
424
425
426 selectors.addAll(defineSingleYearSelectors(
427 new MergeSubPopSumOverAgesSelector(allMaleDescendants, null, prefix
428 + "_desc_end_x_m"), numOfYears));
429 selectors.addAll(defineSingleYearSelectors(
430 new MergeSubPopSumOverAgesSelector(allFemaleDescendants, null, prefix
431 + "_desc_end_x_f"), numOfYears));
432 selectors.add(new MergeSubPopSumOverAgesSelector(Misc
433 .<AbstractAggregationSelector> mergeList(allMaleDescendants,
434 allFemaleDescendants), null, prefix + "_desc_end_x_mf"));
435 }
436
437 return selectors;
438 }
439
440
441
442
443
444
445 private List<IAggregationSelector> defineTotalMaleFemaleCombinedSelectors() {
446 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
447 selectors.addAll(defineSingleYearSelectors(
448 new MergeSubPopSumOverAgesSelector(allMaleAdditions,
449 allMaleSubtractions, "total_end_x_m"), numOfYears));
450 selectors.addAll(defineSingleYearSelectors(
451 new MergeSubPopSumOverAgesSelector(allFemaleAdditions,
452 allFemaleSubtractions, "total_end_x_f"), numOfYears));
453 selectors.addAll(defineSingleYearSelectors(
454 new MergeSubPopSumOverAgesSelector(allTotalAdditions,
455 allTotalSubtractions, "total_end_x_mf"), numOfYears));
456 return selectors;
457 }
458
459
460
461
462
463
464
465 private List<IAggregationSelector> defineMFSelectorsForAllGenerations() {
466 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
467
468 for (SubPopulation subPopulation : subPopulationModel.getSubPopulations()) {
469 ISubPopulationSelector subPopSelector = subPopulationSelectors
470 .get(subPopulation);
471
472 if (subPopulation.isConsistingOfDescendantGenerations()) {
473 for (int i = 0; i < generations; i++) {
474 selectors.add(new MergeSubPopSumOverAgesSelector(
475 new AbstractAggregationSelector[] {
476 subPopSelectorMap.get(subPopSelector).get(END_X_M).get(i),
477 subPopSelectorMap.get(subPopSelector).get(END_X_F).get(i) },
478 new AbstractAggregationSelector[0], subPopSelector.getPrefix()
479 + "_gen_" + i + "_end_x_mf"));
480 }
481 } else {
482 selectors.add(new MergeSubPopSumOverAgesSelector(
483 new AbstractAggregationSelector[] {
484 subPopSelectorMap.get(subPopSelector).get(END_X_M).get(0),
485 subPopSelectorMap.get(subPopSelector).get(END_X_F).get(0) },
486 subPopSelector.getPrefix() + "_end_x_mf"));
487 }
488 }
489 return selectors;
490 }
491
492
493
494
495
496
497
498
499
500
501
502 private static List<IAggregationSelector> defineSingleYearSelectors(
503 MergeSubPopSumOverAgesSelector mergeSubPopSumOverAgesSelector,
504 int numOfYears) {
505 List<IAggregationSelector> selectors = new ArrayList<IAggregationSelector>();
506 selectors.add(mergeSubPopSumOverAgesSelector);
507
508
509 selectors.add(new MergeSubPopChooseAgesSingleYearSelector(
510 mergeSubPopSumOverAgesSelector, 0));
511
512
513 selectors.add(new MergeSubPopChooseAgesSingleYearSelector(
514 mergeSubPopSumOverAgesSelector, numOfYears - 1));
515
516 return selectors;
517 }
518
519
520
521
522
523
524
525
526
527 private List<AbstractAggregationSelector> getAllForSubPop(
528 ISubPopulationSelector subPopSelector) {
529 List<AbstractAggregationSelector> result = new ArrayList<AbstractAggregationSelector>();
530 for (List<AbstractAggregationSelector> selectorList : subPopSelectorMap
531 .get(subPopSelector).values()) {
532 result.addAll(selectorList);
533 }
534 return result;
535 }
536
537 }