Mercurial > hg > vamp-plugin-sdk
comparison src/vamp-hostsdk/PluginSummarisingAdapter.cpp @ 418:a13635e9c440
Tweak debug output
| author | Chris Cannam |
|---|---|
| date | Tue, 01 Mar 2016 12:10:29 +0000 |
| parents | 632d90c185ec |
| children | 55de53d7c777 |
comparison
equal
deleted
inserted
replaced
| 385:632d90c185ec | 418:a13635e9c440 |
|---|---|
| 39 #include <map> | 39 #include <map> |
| 40 #include <algorithm> | 40 #include <algorithm> |
| 41 #include <cmath> | 41 #include <cmath> |
| 42 #include <climits> | 42 #include <climits> |
| 43 | 43 |
| 44 using namespace std; | |
| 45 | |
| 44 //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER 1 | 46 //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER 1 |
| 45 //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT 1 | 47 //#define DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT 1 |
| 46 | 48 |
| 47 _VAMP_SDK_HOSTSPACE_BEGIN(PluginSummarisingAdapter.cpp) | 49 _VAMP_SDK_HOSTSPACE_BEGIN(PluginSummarisingAdapter.cpp) |
| 48 | 50 |
| 78 size_t m_stepSize; | 80 size_t m_stepSize; |
| 79 size_t m_blockSize; | 81 size_t m_blockSize; |
| 80 | 82 |
| 81 SegmentBoundaries m_boundaries; | 83 SegmentBoundaries m_boundaries; |
| 82 | 84 |
| 83 typedef std::vector<float> ValueList; | 85 typedef vector<float> ValueList; |
| 84 | 86 |
| 85 struct Result { // smaller than Feature | 87 struct Result { // smaller than Feature |
| 86 RealTime time; | 88 RealTime time; |
| 87 RealTime duration; | 89 RealTime duration; |
| 88 ValueList values; // bin number -> value | 90 ValueList values; // bin number -> value |
| 89 }; | 91 }; |
| 90 | 92 |
| 91 typedef std::vector<Result> ResultList; | 93 typedef vector<Result> ResultList; |
| 92 | 94 |
| 93 struct OutputAccumulator { | 95 struct OutputAccumulator { |
| 94 int bins; | 96 int bins; |
| 95 ResultList results; | 97 ResultList results; |
| 96 OutputAccumulator() : bins(0) { } | 98 OutputAccumulator() : bins(0) { } |
| 97 }; | 99 }; |
| 98 | 100 |
| 99 typedef std::map<int, OutputAccumulator> OutputAccumulatorMap; | 101 typedef map<int, OutputAccumulator> OutputAccumulatorMap; |
| 100 OutputAccumulatorMap m_accumulators; // output number -> accumulator | 102 OutputAccumulatorMap m_accumulators; // output number -> accumulator |
| 101 | 103 |
| 102 typedef std::map<RealTime, OutputAccumulator> SegmentAccumulatorMap; | 104 typedef map<RealTime, OutputAccumulator> SegmentAccumulatorMap; |
| 103 typedef std::map<int, SegmentAccumulatorMap> OutputSegmentAccumulatorMap; | 105 typedef map<int, SegmentAccumulatorMap> OutputSegmentAccumulatorMap; |
| 104 OutputSegmentAccumulatorMap m_segmentedAccumulators; // output -> segmented | 106 OutputSegmentAccumulatorMap m_segmentedAccumulators; // output -> segmented |
| 105 | 107 |
| 106 typedef std::map<int, RealTime> OutputTimestampMap; | 108 typedef map<int, RealTime> OutputTimestampMap; |
| 107 OutputTimestampMap m_prevTimestamps; // output number -> timestamp | 109 OutputTimestampMap m_prevTimestamps; // output number -> timestamp |
| 108 OutputTimestampMap m_prevDurations; // output number -> durations | 110 OutputTimestampMap m_prevDurations; // output number -> durations |
| 109 | 111 |
| 110 struct OutputBinSummary { | 112 struct OutputBinSummary { |
| 111 | 113 |
| 126 double mode_c; | 128 double mode_c; |
| 127 double mean_c; | 129 double mean_c; |
| 128 double variance_c; | 130 double variance_c; |
| 129 }; | 131 }; |
| 130 | 132 |
| 131 typedef std::map<int, OutputBinSummary> OutputSummary; | 133 typedef map<int, OutputBinSummary> OutputSummary; |
| 132 typedef std::map<RealTime, OutputSummary> SummarySegmentMap; | 134 typedef map<RealTime, OutputSummary> SummarySegmentMap; |
| 133 typedef std::map<int, SummarySegmentMap> OutputSummarySegmentMap; | 135 typedef map<int, SummarySegmentMap> OutputSummarySegmentMap; |
| 134 | 136 |
| 135 OutputSummarySegmentMap m_summaries; | 137 OutputSummarySegmentMap m_summaries; |
| 136 | 138 |
| 137 bool m_reduced; | 139 bool m_reduced; |
| 138 RealTime m_endTime; | 140 RealTime m_endTime; |
| 142 void accumulateFinalDurations(); | 144 void accumulateFinalDurations(); |
| 143 void findSegmentBounds(RealTime t, RealTime &start, RealTime &end); | 145 void findSegmentBounds(RealTime t, RealTime &start, RealTime &end); |
| 144 void segment(); | 146 void segment(); |
| 145 void reduce(); | 147 void reduce(); |
| 146 | 148 |
| 147 std::string getSummaryLabel(SummaryType type, AveragingMethod avg); | 149 string getSummaryLabel(SummaryType type, AveragingMethod avg); |
| 148 }; | 150 }; |
| 149 | 151 |
| 150 static RealTime INVALID_DURATION(INT_MIN, INT_MIN); | 152 static RealTime INVALID_DURATION(INT_MIN, INT_MIN); |
| 151 | 153 |
| 152 PluginSummarisingAdapter::PluginSummarisingAdapter(Plugin *plugin) : | 154 PluginSummarisingAdapter::PluginSummarisingAdapter(Plugin *plugin) : |
| 243 Plugin::FeatureSet | 245 Plugin::FeatureSet |
| 244 PluginSummarisingAdapter::Impl::process(const float *const *inputBuffers, | 246 PluginSummarisingAdapter::Impl::process(const float *const *inputBuffers, |
| 245 RealTime timestamp) | 247 RealTime timestamp) |
| 246 { | 248 { |
| 247 if (m_reduced) { | 249 if (m_reduced) { |
| 248 std::cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << std::endl; | 250 cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << endl; |
| 249 } | 251 } |
| 250 FeatureSet fs = m_plugin->process(inputBuffers, timestamp); | 252 FeatureSet fs = m_plugin->process(inputBuffers, timestamp); |
| 251 accumulate(fs, timestamp, false); | 253 accumulate(fs, timestamp, false); |
| 252 m_endTime = timestamp + | 254 m_endTime = timestamp + |
| 253 RealTime::frame2RealTime(m_stepSize, int(m_inputSampleRate + 0.5)); | 255 RealTime::frame2RealTime(m_stepSize, int(m_inputSampleRate + 0.5)); |
| 256 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | |
| 257 cerr << "timestamp = " << timestamp << ", end time becomes " << m_endTime | |
| 258 << endl; | |
| 259 #endif | |
| 254 return fs; | 260 return fs; |
| 255 } | 261 } |
| 256 | 262 |
| 257 Plugin::FeatureSet | 263 Plugin::FeatureSet |
| 258 PluginSummarisingAdapter::Impl::getRemainingFeatures() | 264 PluginSummarisingAdapter::Impl::getRemainingFeatures() |
| 259 { | 265 { |
| 260 if (m_reduced) { | 266 if (m_reduced) { |
| 261 std::cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << std::endl; | 267 cerr << "WARNING: Cannot call PluginSummarisingAdapter::process() or getRemainingFeatures() after one of the getSummary methods" << endl; |
| 262 } | 268 } |
| 263 FeatureSet fs = m_plugin->getRemainingFeatures(); | 269 FeatureSet fs = m_plugin->getRemainingFeatures(); |
| 264 accumulate(fs, m_endTime, true); | 270 accumulate(fs, m_endTime, true); |
| 265 return fs; | 271 return fs; |
| 266 } | 272 } |
| 268 void | 274 void |
| 269 PluginSummarisingAdapter::Impl::setSummarySegmentBoundaries(const SegmentBoundaries &b) | 275 PluginSummarisingAdapter::Impl::setSummarySegmentBoundaries(const SegmentBoundaries &b) |
| 270 { | 276 { |
| 271 m_boundaries = b; | 277 m_boundaries = b; |
| 272 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 278 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 273 std::cerr << "PluginSummarisingAdapter::setSummarySegmentBoundaries: boundaries are:" << std::endl; | 279 cerr << "PluginSummarisingAdapter::setSummarySegmentBoundaries: boundaries are:" << endl; |
| 274 for (SegmentBoundaries::const_iterator i = m_boundaries.begin(); | 280 for (SegmentBoundaries::const_iterator i = m_boundaries.begin(); |
| 275 i != m_boundaries.end(); ++i) { | 281 i != m_boundaries.end(); ++i) { |
| 276 std::cerr << *i << " "; | 282 cerr << *i << " "; |
| 277 } | 283 } |
| 278 std::cerr << std::endl; | 284 cerr << endl; |
| 279 #endif | 285 #endif |
| 280 } | 286 } |
| 281 | 287 |
| 282 Plugin::FeatureList | 288 Plugin::FeatureList |
| 283 PluginSummarisingAdapter::Impl::getSummaryForOutput(int output, | 289 PluginSummarisingAdapter::Impl::getSummaryForOutput(int output, |
| 418 } | 424 } |
| 419 } | 425 } |
| 420 } | 426 } |
| 421 } | 427 } |
| 422 | 428 |
| 423 std::string | 429 string |
| 424 PluginSummarisingAdapter::Impl::getSummaryLabel(SummaryType type, | 430 PluginSummarisingAdapter::Impl::getSummaryLabel(SummaryType type, |
| 425 AveragingMethod avg) | 431 AveragingMethod avg) |
| 426 { | 432 { |
| 427 std::string label; | 433 string label; |
| 428 std::string avglabel; | 434 string avglabel; |
| 429 | 435 |
| 430 if (avg == SampleAverage) avglabel = ", sample average"; | 436 if (avg == SampleAverage) avglabel = ", sample average"; |
| 431 else avglabel = ", continuous-time average"; | 437 else avglabel = ", continuous-time average"; |
| 432 | 438 |
| 433 switch (type) { | 439 switch (type) { |
| 448 | 454 |
| 449 void | 455 void |
| 450 PluginSummarisingAdapter::Impl::accumulate(int output, | 456 PluginSummarisingAdapter::Impl::accumulate(int output, |
| 451 const Feature &f, | 457 const Feature &f, |
| 452 RealTime timestamp, | 458 RealTime timestamp, |
| 453 bool /* final */) | 459 bool |
| 460 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | |
| 461 final | |
| 462 #endif | |
| 463 ) | |
| 454 { | 464 { |
| 455 // What should happen if a feature's duration spans a segment | 465 // What should happen if a feature's duration spans a segment |
| 456 // boundary? I think we probably want to chop it, and pretend | 466 // boundary? I think we probably want to chop it, and pretend |
| 457 // that it appears in both. A very long feature (e.g. key, if the | 467 // that it appears in both. A very long feature (e.g. key, if the |
| 458 // whole audio is in a single key) might span many or all | 468 // whole audio is in a single key) might span many or all |
| 464 // to have per-segment accumulators (and the feature value goes | 474 // to have per-segment accumulators (and the feature value goes |
| 465 // into both -- with a separate phase to split the accumulator up | 475 // into both -- with a separate phase to split the accumulator up |
| 466 // into segments). | 476 // into segments). |
| 467 | 477 |
| 468 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 478 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 469 std::cerr << "output " << output << ": timestamp " << timestamp << ", prev timestamp " << m_prevTimestamps[output] << ", final " << final << std::endl; | 479 cerr << "output " << output << ": timestamp " << timestamp << ", prev timestamp " << m_prevTimestamps[output] << ", final " << final << endl; |
| 470 #endif | 480 #endif |
| 471 | 481 |
| 472 // At each process step, accumulate() is called once for each | 482 // At each process step, accumulate() is called once for each |
| 473 // feature on each output within that process's returned feature | 483 // feature on each output within that process's returned feature |
| 474 // list, and with the timestamp passed in being that of the start | 484 // list, and with the timestamp passed in being that of the start |
| 505 // current timestamps. | 515 // current timestamps. |
| 506 | 516 |
| 507 if (m_prevDurations[output] != INVALID_DURATION) { | 517 if (m_prevDurations[output] != INVALID_DURATION) { |
| 508 prevDuration = m_prevDurations[output]; | 518 prevDuration = m_prevDurations[output]; |
| 509 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 519 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 510 std::cerr << "Previous duration from previous feature: " << prevDuration << std::endl; | 520 cerr << "Previous duration from previous feature: " << prevDuration << endl; |
| 511 #endif | 521 #endif |
| 512 } else { | 522 } else { |
| 513 prevDuration = timestamp - m_prevTimestamps[output]; | 523 prevDuration = timestamp - m_prevTimestamps[output]; |
| 514 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 524 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 515 std::cerr << "Previous duration from diff: " << timestamp << " - " | 525 cerr << "Previous duration from diff: " << timestamp << " - " |
| 516 << m_prevTimestamps[output] << std::endl; | 526 << m_prevTimestamps[output] << endl; |
| 517 #endif | 527 #endif |
| 518 } | 528 } |
| 519 | 529 |
| 520 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 530 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 521 std::cerr << "output " << output << ": "; | 531 cerr << "output " << output << ": "; |
| 522 std::cerr << "Pushing previous duration as " << prevDuration << std::endl; | 532 cerr << "Pushing previous duration as " << prevDuration << endl; |
| 523 #endif | 533 #endif |
| 524 | 534 |
| 525 m_accumulators[output].results | 535 m_accumulators[output].results |
| 526 [m_accumulators[output].results.size() - 1] | 536 [m_accumulators[output].results.size() - 1] |
| 527 .duration = prevDuration; | 537 .duration = prevDuration; |
| 534 | 544 |
| 535 if (f.hasDuration) { | 545 if (f.hasDuration) { |
| 536 RealTime et = timestamp; | 546 RealTime et = timestamp; |
| 537 et = et + f.duration; | 547 et = et + f.duration; |
| 538 if (et > m_endTime) m_endTime = et; | 548 if (et > m_endTime) m_endTime = et; |
| 549 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | |
| 550 cerr << "feature has duration, updating end time to " << m_endTime << endl; | |
| 551 #endif | |
| 539 } | 552 } |
| 540 | 553 |
| 541 Result result; | 554 Result result; |
| 542 result.time = timestamp; | 555 result.time = timestamp; |
| 543 result.duration = INVALID_DURATION; | 556 result.duration = INVALID_DURATION; |
| 564 int acount = m_accumulators[output].results.size(); | 577 int acount = m_accumulators[output].results.size(); |
| 565 | 578 |
| 566 if (acount == 0) continue; | 579 if (acount == 0) continue; |
| 567 | 580 |
| 568 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 581 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 569 std::cerr << "output " << output << ": "; | 582 cerr << "output " << output << ": "; |
| 570 #endif | 583 #endif |
| 571 | 584 |
| 572 if (m_prevDurations.find(output) != m_prevDurations.end() && | 585 if (m_prevDurations.find(output) != m_prevDurations.end() && |
| 573 m_prevDurations[output] != INVALID_DURATION) { | 586 m_prevDurations[output] != INVALID_DURATION) { |
| 574 | 587 |
| 575 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 588 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 576 std::cerr << "Pushing final duration from feature as " << m_prevDurations[output] << std::endl; | 589 cerr << "Pushing final duration from feature as " << m_prevDurations[output] << endl; |
| 577 #endif | 590 #endif |
| 578 | 591 |
| 579 m_accumulators[output].results[acount - 1].duration = | 592 m_accumulators[output].results[acount - 1].duration = |
| 580 m_prevDurations[output]; | 593 m_prevDurations[output]; |
| 581 | 594 |
| 582 } else { | 595 } else { |
| 583 | 596 |
| 584 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 597 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 585 std::cerr << "Pushing final duration from diff as " << m_endTime << " - " << m_prevTimestamps[output] << std::endl; | 598 cerr << "Pushing final duration from diff as " << m_endTime << " - " << m_prevTimestamps[output] << endl; |
| 586 #endif | 599 #endif |
| 587 | 600 |
| 588 m_accumulators[output].results[acount - 1].duration = | 601 m_accumulators[output].results[acount - 1].duration = |
| 589 m_endTime - m_prevTimestamps[output]; | 602 m_endTime - m_prevTimestamps[output]; |
| 590 } | 603 } |
| 591 | 604 |
| 592 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 605 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 593 std::cerr << "so duration for result no " << acount-1 << " is " | 606 cerr << "so duration for result no " << acount-1 << " is " |
| 594 << m_accumulators[output].results[acount-1].duration | 607 << m_accumulators[output].results[acount-1].duration |
| 595 << std::endl; | 608 << endl; |
| 596 #endif | 609 #endif |
| 597 } | 610 } |
| 598 } | 611 } |
| 599 | 612 |
| 600 void | 613 void |
| 601 PluginSummarisingAdapter::Impl::findSegmentBounds(RealTime t, | 614 PluginSummarisingAdapter::Impl::findSegmentBounds(RealTime t, |
| 602 RealTime &start, | 615 RealTime &start, |
| 603 RealTime &end) | 616 RealTime &end) |
| 604 { | 617 { |
| 605 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 618 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 606 std::cerr << "findSegmentBounds: t = " << t << std::endl; | 619 cerr << "findSegmentBounds: t = " << t << endl; |
| 607 #endif | 620 #endif |
| 608 | 621 |
| 609 SegmentBoundaries::const_iterator i = std::upper_bound | 622 SegmentBoundaries::const_iterator i = upper_bound |
| 610 (m_boundaries.begin(), m_boundaries.end(), t); | 623 (m_boundaries.begin(), m_boundaries.end(), t); |
| 611 | 624 |
| 612 start = RealTime::zeroTime; | 625 start = RealTime::zeroTime; |
| 613 end = m_endTime; | 626 end = m_endTime; |
| 614 | 627 |
| 619 if (i != m_boundaries.begin()) { | 632 if (i != m_boundaries.begin()) { |
| 620 start = *--i; | 633 start = *--i; |
| 621 } | 634 } |
| 622 | 635 |
| 623 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 636 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 624 std::cerr << "findSegmentBounds: " << t << " is in segment " << start << " -> " << end << std::endl; | 637 cerr << "findSegmentBounds: " << t << " is in segment " << start << " -> " << end << endl; |
| 625 #endif | 638 #endif |
| 626 } | 639 } |
| 627 | 640 |
| 628 void | 641 void |
| 629 PluginSummarisingAdapter::Impl::segment() | 642 PluginSummarisingAdapter::Impl::segment() |
| 630 { | 643 { |
| 631 SegmentBoundaries::iterator boundaryitr = m_boundaries.begin(); | 644 SegmentBoundaries::iterator boundaryitr = m_boundaries.begin(); |
| 632 | 645 |
| 633 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 646 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 634 std::cerr << "segment: starting" << std::endl; | 647 cerr << "segment: starting" << endl; |
| 635 #endif | 648 #endif |
| 636 | 649 |
| 637 for (OutputAccumulatorMap::iterator i = m_accumulators.begin(); | 650 for (OutputAccumulatorMap::iterator i = m_accumulators.begin(); |
| 638 i != m_accumulators.end(); ++i) { | 651 i != m_accumulators.end(); ++i) { |
| 639 | 652 |
| 640 int output = i->first; | 653 int output = i->first; |
| 641 OutputAccumulator &source = i->second; | 654 OutputAccumulator &source = i->second; |
| 642 | 655 |
| 643 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 656 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 644 std::cerr << "segment: total results for output " << output << " = " | 657 cerr << "segment: total results for output " << output << " = " |
| 645 << source.results.size() << std::endl; | 658 << source.results.size() << endl; |
| 646 #endif | 659 #endif |
| 647 | 660 |
| 648 // This is basically nonsense if the results have no values | 661 // This is basically nonsense if the results have no values |
| 649 // (i.e. their times and counts are the only things of | 662 // (i.e. their times and counts are the only things of |
| 650 // interest)... but perhaps it's the user's problem if they | 663 // interest)... but perhaps it's the user's problem if they |
| 658 | 671 |
| 659 RealTime resultStart = source.results[n].time; | 672 RealTime resultStart = source.results[n].time; |
| 660 RealTime resultEnd = resultStart + source.results[n].duration; | 673 RealTime resultEnd = resultStart + source.results[n].duration; |
| 661 | 674 |
| 662 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 675 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 663 std::cerr << "output: " << output << ", result start = " << resultStart << ", end = " << resultEnd << std::endl; | 676 cerr << "output: " << output << ", result start = " << resultStart << ", end = " << resultEnd << endl; |
| 664 #endif | 677 #endif |
| 665 | 678 |
| 666 RealTime segmentStart = RealTime::zeroTime; | 679 RealTime segmentStart = RealTime::zeroTime; |
| 667 RealTime segmentEnd = resultEnd - RealTime(1, 0); | 680 RealTime segmentEnd = resultEnd - RealTime(1, 0); |
| 668 | 681 |
| 669 RealTime prevSegmentStart = segmentStart - RealTime(1, 0); | 682 RealTime prevSegmentStart = segmentStart - RealTime(1, 0); |
| 670 | 683 |
| 671 while (segmentEnd < resultEnd) { | 684 while (segmentEnd < resultEnd) { |
| 672 | 685 |
| 673 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 686 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 674 std::cerr << "segment end " << segmentEnd << " < result end " | 687 cerr << "segment end " << segmentEnd << " < result end " |
| 675 << resultEnd << " (with result start " << resultStart << ")" << std::endl; | 688 << resultEnd << " (with result start " << resultStart << ")" << endl; |
| 676 #endif | 689 #endif |
| 677 | 690 |
| 678 findSegmentBounds(resultStart, segmentStart, segmentEnd); | 691 findSegmentBounds(resultStart, segmentStart, segmentEnd); |
| 679 | 692 |
| 680 if (segmentStart == prevSegmentStart) { | 693 if (segmentStart == prevSegmentStart) { |
| 697 chunk.time = chunkStart; | 710 chunk.time = chunkStart; |
| 698 chunk.duration = chunkEnd - chunkStart; | 711 chunk.duration = chunkEnd - chunkStart; |
| 699 chunk.values = source.results[n].values; | 712 chunk.values = source.results[n].values; |
| 700 | 713 |
| 701 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT | 714 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT |
| 702 std::cerr << "chunk for segment " << segmentStart << ": from " << chunk.time << ", duration " << chunk.duration << std::endl; | 715 cerr << "chunk for segment " << segmentStart << ": from " << chunk.time << ", duration " << chunk.duration << endl; |
| 703 #endif | 716 #endif |
| 704 | 717 |
| 705 m_segmentedAccumulators[output][segmentStart].results | 718 m_segmentedAccumulators[output][segmentStart].results |
| 706 .push_back(chunk); | 719 .push_back(chunk); |
| 707 | 720 |
| 750 OutputAccumulator &accumulator = j->second; | 763 OutputAccumulator &accumulator = j->second; |
| 751 | 764 |
| 752 int sz = accumulator.results.size(); | 765 int sz = accumulator.results.size(); |
| 753 | 766 |
| 754 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 767 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 755 std::cerr << "reduce: segment starting at " << segmentStart | 768 cerr << "reduce: segment starting at " << segmentStart |
| 756 << " on output " << output << " has " << sz << " result(s)" << std::endl; | 769 << " on output " << output << " has " << sz << " result(s)" << endl; |
| 757 #endif | 770 #endif |
| 758 | 771 |
| 759 double totalDuration = 0.0; | 772 double totalDuration = 0.0; |
| 760 //!!! is this right? | 773 //!!! is this right? |
| 761 if (sz > 0) { | 774 if (sz > 0) { |
| 762 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 775 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 763 std::cerr << "last time = " << accumulator.results[sz-1].time | 776 cerr << "last time = " << accumulator.results[sz-1].time |
| 764 << ", duration = " << accumulator.results[sz-1].duration | 777 << ", duration = " << accumulator.results[sz-1].duration |
| 765 << " (step = " << m_stepSize << ", block = " << m_blockSize << ")" | 778 << " (step = " << m_stepSize << ", block = " << m_blockSize << ")" |
| 766 << std::endl; | 779 << endl; |
| 767 #endif | 780 #endif |
| 768 totalDuration = toSec((accumulator.results[sz-1].time + | 781 totalDuration = toSec((accumulator.results[sz-1].time + |
| 769 accumulator.results[sz-1].duration) - | 782 accumulator.results[sz-1].duration) - |
| 770 segmentStart); | 783 segmentStart); |
| 771 } | 784 } |
| 772 | 785 |
| 773 for (int bin = 0; bin < accumulator.bins; ++bin) { | 786 for (int bin = 0; bin < accumulator.bins; ++bin) { |
| 774 | 787 |
| 775 // work on all values over time for a single bin | 788 // work on all values over time for a single bin |
| 776 | 789 |
| 790 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | |
| 791 cerr << "bin " << bin << ":" << endl; | |
| 792 #endif | |
| 793 | |
| 777 OutputBinSummary summary; | 794 OutputBinSummary summary; |
| 778 | 795 |
| 779 summary.count = sz; | 796 summary.count = sz; |
| 780 | 797 |
| 781 summary.minimum = 0.f; | 798 summary.minimum = 0.f; |
| 791 summary.mean_c = 0.f; | 808 summary.mean_c = 0.f; |
| 792 summary.variance_c = 0.f; | 809 summary.variance_c = 0.f; |
| 793 | 810 |
| 794 if (sz == 0) continue; | 811 if (sz == 0) continue; |
| 795 | 812 |
| 796 std::vector<ValueDurationFloatPair> valvec; | 813 vector<ValueDurationFloatPair> valvec; |
| 797 | 814 |
| 798 for (int k = 0; k < sz; ++k) { | 815 for (int k = 0; k < sz; ++k) { |
| 799 while (int(accumulator.results[k].values.size()) < | 816 while (int(accumulator.results[k].values.size()) < |
| 800 accumulator.bins) { | 817 accumulator.bins) { |
| 801 accumulator.results[k].values.push_back(0.f); | 818 accumulator.results[k].values.push_back(0.f); |
| 807 valvec.push_back(ValueDurationFloatPair | 824 valvec.push_back(ValueDurationFloatPair |
| 808 (value, | 825 (value, |
| 809 toSec(accumulator.results[k].duration))); | 826 toSec(accumulator.results[k].duration))); |
| 810 } | 827 } |
| 811 | 828 |
| 812 std::sort(valvec.begin(), valvec.end()); | 829 sort(valvec.begin(), valvec.end()); |
| 813 | 830 |
| 814 summary.minimum = valvec[0].value; | 831 summary.minimum = valvec[0].value; |
| 815 summary.maximum = valvec[sz-1].value; | 832 summary.maximum = valvec[sz-1].value; |
| 816 | 833 |
| 817 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 834 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 818 std::cerr << "total duration = " << totalDuration << std::endl; | 835 cerr << "total duration = " << totalDuration << endl; |
| 819 #endif | 836 #endif |
| 820 | 837 |
| 821 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 838 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 822 /* | 839 /* |
| 823 std::cerr << "value vector for medians:" << std::endl; | 840 cerr << "value vector for medians:" << endl; |
| 824 for (int k = 0; k < sz; ++k) { | 841 for (int k = 0; k < sz; ++k) { |
| 825 std::cerr << "(" << valvec[k].value << "," << valvec[k].duration << ") "; | 842 cerr << "(" << valvec[k].value << "," << valvec[k].duration << ") "; |
| 826 } | 843 } |
| 827 std::cerr << std::endl; | 844 cerr << endl; |
| 828 */ | 845 */ |
| 829 #endif | 846 #endif |
| 830 | 847 |
| 831 if (sz % 2 == 1) { | 848 if (sz % 2 == 1) { |
| 832 summary.median = valvec[sz/2].value; | 849 summary.median = valvec[sz/2].value; |
| 844 break; | 861 break; |
| 845 } | 862 } |
| 846 } | 863 } |
| 847 | 864 |
| 848 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 865 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 849 std::cerr << "median_c = " << summary.median_c << std::endl; | 866 cerr << "median_c = " << summary.median_c << endl; |
| 850 std::cerr << "median = " << summary.median << std::endl; | 867 cerr << "median = " << summary.median << endl; |
| 851 #endif | 868 #endif |
| 852 | 869 |
| 853 std::map<float, int> distribution; | 870 map<float, int> distribution; |
| 854 | 871 |
| 855 for (int k = 0; k < sz; ++k) { | 872 for (int k = 0; k < sz; ++k) { |
| 856 summary.sum += accumulator.results[k].values[bin]; | 873 summary.sum += accumulator.results[k].values[bin]; |
| 857 distribution[accumulator.results[k].values[bin]] += 1; | 874 distribution[accumulator.results[k].values[bin]] += 1; |
| 858 } | 875 } |
| 859 | 876 |
| 860 int md = 0; | 877 int md = 0; |
| 861 | 878 |
| 862 for (std::map<float, int>::iterator di = distribution.begin(); | 879 for (map<float, int>::iterator di = distribution.begin(); |
| 863 di != distribution.end(); ++di) { | 880 di != distribution.end(); ++di) { |
| 864 if (di->second > md) { | 881 if (di->second > md) { |
| 865 md = di->second; | 882 md = di->second; |
| 866 summary.mode = di->first; | 883 summary.mode = di->first; |
| 867 } | 884 } |
| 868 } | 885 } |
| 869 | 886 |
| 870 distribution.clear(); | 887 distribution.clear(); |
| 871 | 888 |
| 872 std::map<float, double> distribution_c; | 889 map<float, double> distribution_c; |
| 873 | 890 |
| 874 for (int k = 0; k < sz; ++k) { | 891 for (int k = 0; k < sz; ++k) { |
| 875 distribution_c[accumulator.results[k].values[bin]] | 892 distribution_c[accumulator.results[k].values[bin]] |
| 876 += toSec(accumulator.results[k].duration); | 893 += toSec(accumulator.results[k].duration); |
| 877 } | 894 } |
| 878 | 895 |
| 879 double mrd = 0.0; | 896 double mrd = 0.0; |
| 880 | 897 |
| 881 for (std::map<float, double>::iterator di = distribution_c.begin(); | 898 for (map<float, double>::iterator di = distribution_c.begin(); |
| 882 di != distribution_c.end(); ++di) { | 899 di != distribution_c.end(); ++di) { |
| 883 if (di->second > mrd) { | 900 if (di->second > mrd) { |
| 884 mrd = di->second; | 901 mrd = di->second; |
| 885 summary.mode_c = di->first; | 902 summary.mode_c = di->first; |
| 886 } | 903 } |
| 897 * toSec(accumulator.results[k].duration); | 914 * toSec(accumulator.results[k].duration); |
| 898 sum_c += value; | 915 sum_c += value; |
| 899 } | 916 } |
| 900 | 917 |
| 901 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 918 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 902 std::cerr << "mean_c = " << sum_c << " / " << totalDuration << " = " | 919 cerr << "mean_c = " << sum_c << " / " << totalDuration << " = " |
| 903 << sum_c / totalDuration << " (sz = " << sz << ")" << std::endl; | 920 << sum_c / totalDuration << " (sz = " << sz << ")" << endl; |
| 904 #endif | 921 #endif |
| 905 | 922 |
| 906 summary.mean_c = sum_c / totalDuration; | 923 summary.mean_c = sum_c / totalDuration; |
| 907 | 924 |
| 908 for (int k = 0; k < sz; ++k) { | 925 for (int k = 0; k < sz; ++k) { |
| 918 } | 935 } |
| 919 | 936 |
| 920 double mean = summary.sum / summary.count; | 937 double mean = summary.sum / summary.count; |
| 921 | 938 |
| 922 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER | 939 #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER |
| 923 std::cerr << "mean = " << summary.sum << " / " << summary.count << " = " | 940 cerr << "mean = " << summary.sum << " / " << summary.count << " = " |
| 924 << summary.sum / summary.count << std::endl; | 941 << summary.sum / summary.count << endl; |
| 925 #endif | 942 #endif |
| 926 | 943 |
| 927 for (int k = 0; k < sz; ++k) { | 944 for (int k = 0; k < sz; ++k) { |
| 928 float value = accumulator.results[k].values[bin]; | 945 float value = accumulator.results[k].values[bin]; |
| 929 summary.variance += (value - mean) * (value - mean); | 946 summary.variance += (value - mean) * (value - mean); |
