|
21 | 21 | #define MEMILIO_DATA_ANALYZE_RESULT_H |
22 | 22 |
|
23 | 23 | #include "memilio/config.h" |
| 24 | +#include "memilio/utils/logging.h" |
24 | 25 | #include "memilio/utils/time_series.h" |
25 | 26 | #include "memilio/mobility/metapopulation_mobility_instant.h" |
26 | 27 | #include "memilio/math/interpolation.h" |
@@ -376,81 +377,51 @@ template <class FP> |
376 | 377 | IOResult<TimeSeries<FP>> merge_time_series(const TimeSeries<FP>& ts1, const TimeSeries<FP>& ts2, |
377 | 378 | bool add_values = false) |
378 | 379 | { |
379 | | - TimeSeries<FP> merged_ts(ts1.get_num_elements()); |
380 | 380 | if (ts1.get_num_elements() != ts2.get_num_elements()) { |
381 | 381 | log_error("TimeSeries have a different number of elements."); |
382 | 382 | return failure(mio::StatusCode::InvalidValue); |
383 | 383 | } |
384 | | - else { |
385 | | - Eigen::Index t1_iterator = 0; |
386 | | - Eigen::Index t2_iterator = 0; |
387 | | - bool t1_finished = false; |
388 | | - bool t2_finished = false; |
389 | | - while (!t1_finished || !t2_finished) { |
390 | | - if (!t1_finished) { |
391 | | - if (ts1.get_time(t1_iterator) < ts2.get_time(t2_iterator) || |
392 | | - t2_finished) { // Current time point of first TimeSeries is smaller than current time point of second TimeSeries or second TimeSeries has already been copied entirely |
393 | | - merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
394 | | - t1_iterator += 1; |
395 | | - } |
396 | | - else if (!t2_finished && ts1.get_time(t1_iterator) == |
397 | | - ts2.get_time(t2_iterator)) { // Both TimeSeries have the current time point |
398 | | - if (add_values) { |
399 | | - merged_ts.add_time_point(ts1.get_time(t1_iterator), |
400 | | - ts1.get_value(t1_iterator) + ts2.get_value(t2_iterator)); |
401 | | - } |
402 | | - else { |
403 | | - merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
404 | | - log_warning("Both TimeSeries have values for t={}. The value of the first TimeSeries is used", |
405 | | - ts1.get_time(t1_iterator)); |
406 | | - } |
407 | | - t1_iterator += 1; |
408 | | - t2_iterator += 1; |
409 | | - if (t2_iterator >= |
410 | | - ts2.get_num_time_points()) { // Check if all values of second TimeSeries have been copied |
411 | | - t2_finished = true; |
412 | | - t2_iterator = ts2.get_num_time_points() - 1; |
413 | | - } |
414 | | - } |
415 | | - if (t1_iterator >= |
416 | | - ts1.get_num_time_points()) { // Check if all values of first TimeSeries have been copied |
417 | | - t1_finished = true; |
418 | | - t1_iterator = ts1.get_num_time_points() - 1; |
419 | | - } |
| 384 | + if (!ts1.is_strictly_monotonic() || !ts2.is_strictly_monotonic()) { |
| 385 | + log_error("TimeSeries need to have strictly monotonic time points to be merged."); |
| 386 | + return failure(mio::StatusCode::InvalidValue); |
| 387 | + } |
| 388 | + Eigen::Index t1_iterator = 0; |
| 389 | + Eigen::Index t2_iterator = 0; |
| 390 | + const Eigen::Index t1_size = ts1.get_num_time_points(); |
| 391 | + const Eigen::Index t2_size = ts2.get_num_time_points(); |
| 392 | + TimeSeries<FP> merged_ts(ts1.get_num_elements()); |
| 393 | + merged_ts.reserve(t1_size + t2_size); |
| 394 | + // merge entries of both time series until one finishes |
| 395 | + while (t1_iterator < t1_size && t2_iterator < t2_size) { |
| 396 | + // check which ts has the smaller time at the current iterator, and merge it |
| 397 | + if (ts1.get_time(t1_iterator) < ts2.get_time(t2_iterator)) { |
| 398 | + merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
| 399 | + ++t1_iterator; |
| 400 | + } |
| 401 | + else if (ts1.get_time(t1_iterator) == ts2.get_time(t2_iterator)) { |
| 402 | + merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
| 403 | + if (add_values) { |
| 404 | + merged_ts.get_last_value() += ts2.get_value(t2_iterator); |
420 | 405 | } |
421 | | - if (!t2_finished) { |
422 | | - if (ts2.get_time(t2_iterator) < ts1.get_time(t1_iterator) || |
423 | | - t1_finished) { // Current time point of second TimeSeries is smaller than current time point of first TimeSeries or first TimeSeries has already been copied entirely |
424 | | - merged_ts.add_time_point(ts2.get_time(t2_iterator), ts2.get_value(t2_iterator)); |
425 | | - t2_iterator += 1; |
426 | | - } |
427 | | - else if (!t1_finished && ts2.get_time(t2_iterator) == |
428 | | - ts1.get_time(t1_iterator)) { // Both TimeSeries have the current time point |
429 | | - if (add_values) { |
430 | | - merged_ts.add_time_point(ts1.get_time(t1_iterator), |
431 | | - ts1.get_value(t1_iterator) + ts2.get_value(t2_iterator)); |
432 | | - } |
433 | | - else { |
434 | | - merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
435 | | - log_warning("Both TimeSeries have values for t={}. The value of the first TimeSeries is used", |
436 | | - ts1.get_time(t1_iterator)); |
437 | | - } |
438 | | - t1_iterator += 1; |
439 | | - t2_iterator += 1; |
440 | | - if (t1_iterator >= |
441 | | - ts1.get_num_time_points()) { // Check if all values of first TimeSeries have been copied |
442 | | - t1_finished = true; |
443 | | - t1_iterator = ts1.get_num_time_points() - 1; |
444 | | - } |
445 | | - } |
446 | | - if (t2_iterator >= |
447 | | - ts2.get_num_time_points()) { // Check if all values of second TimeSeries have been copied |
448 | | - t2_finished = true; |
449 | | - t2_iterator = ts2.get_num_time_points() - 1; |
450 | | - } |
| 406 | + else { |
| 407 | + log_warning("Both TimeSeries have values for t={}. The value of the first TimeSeries is used", |
| 408 | + ts1.get_time(t1_iterator)); |
451 | 409 | } |
| 410 | + ++t1_iterator; |
| 411 | + ++t2_iterator; |
| 412 | + } |
| 413 | + else { // " > " |
| 414 | + merged_ts.add_time_point(ts2.get_time(t2_iterator), ts2.get_value(t2_iterator)); |
| 415 | + ++t2_iterator; |
452 | 416 | } |
453 | 417 | } |
| 418 | + // append remaining entries. at most one of the following for loops will be executed |
| 419 | + for (; t1_iterator < t1_size; ++t1_iterator) { |
| 420 | + merged_ts.add_time_point(ts1.get_time(t1_iterator), ts1.get_value(t1_iterator)); |
| 421 | + } |
| 422 | + for (; t2_iterator < t2_size; ++t2_iterator) { |
| 423 | + merged_ts.add_time_point(ts2.get_time(t2_iterator), ts2.get_value(t2_iterator)); |
| 424 | + } |
454 | 425 | return success(merged_ts); |
455 | 426 | } |
456 | 427 |
|
|
0 commit comments