| Index: webrtc/base/rollingaccumulator.h
|
| diff --git a/webrtc/base/rollingaccumulator.h b/webrtc/base/rollingaccumulator.h
|
| index 66273755f13e4f3df15e1ad402e681ec12cdc3a3..a7de4f19dd4ed350e7863e079c2e614a6895c18a 100644
|
| --- a/webrtc/base/rollingaccumulator.h
|
| +++ b/webrtc/base/rollingaccumulator.h
|
| @@ -11,164 +11,9 @@
|
| #ifndef WEBRTC_BASE_ROLLINGACCUMULATOR_H_
|
| #define WEBRTC_BASE_ROLLINGACCUMULATOR_H_
|
|
|
| -#include <algorithm>
|
| -#include <vector>
|
|
|
| -#include "webrtc/base/checks.h"
|
| -#include "webrtc/base/constructormagic.h"
|
| -
|
| -namespace rtc {
|
| -
|
| -// RollingAccumulator stores and reports statistics
|
| -// over N most recent samples.
|
| -//
|
| -// T is assumed to be an int, long, double or float.
|
| -template<typename T>
|
| -class RollingAccumulator {
|
| - public:
|
| - explicit RollingAccumulator(size_t max_count)
|
| - : samples_(max_count) {
|
| - Reset();
|
| - }
|
| - ~RollingAccumulator() {
|
| - }
|
| -
|
| - size_t max_count() const {
|
| - return samples_.size();
|
| - }
|
| -
|
| - size_t count() const {
|
| - return count_;
|
| - }
|
| -
|
| - void Reset() {
|
| - count_ = 0U;
|
| - next_index_ = 0U;
|
| - sum_ = 0.0;
|
| - sum_2_ = 0.0;
|
| - max_ = T();
|
| - max_stale_ = false;
|
| - min_ = T();
|
| - min_stale_ = false;
|
| - }
|
| -
|
| - void AddSample(T sample) {
|
| - if (count_ == max_count()) {
|
| - // Remove oldest sample.
|
| - T sample_to_remove = samples_[next_index_];
|
| - sum_ -= sample_to_remove;
|
| - sum_2_ -= static_cast<double>(sample_to_remove) * sample_to_remove;
|
| - if (sample_to_remove >= max_) {
|
| - max_stale_ = true;
|
| - }
|
| - if (sample_to_remove <= min_) {
|
| - min_stale_ = true;
|
| - }
|
| - } else {
|
| - // Increase count of samples.
|
| - ++count_;
|
| - }
|
| - // Add new sample.
|
| - samples_[next_index_] = sample;
|
| - sum_ += sample;
|
| - sum_2_ += static_cast<double>(sample) * sample;
|
| - if (count_ == 1 || sample >= max_) {
|
| - max_ = sample;
|
| - max_stale_ = false;
|
| - }
|
| - if (count_ == 1 || sample <= min_) {
|
| - min_ = sample;
|
| - min_stale_ = false;
|
| - }
|
| - // Update next_index_.
|
| - next_index_ = (next_index_ + 1) % max_count();
|
| - }
|
| -
|
| - T ComputeSum() const {
|
| - return static_cast<T>(sum_);
|
| - }
|
| -
|
| - double ComputeMean() const {
|
| - if (count_ == 0) {
|
| - return 0.0;
|
| - }
|
| - return sum_ / count_;
|
| - }
|
| -
|
| - T ComputeMax() const {
|
| - if (max_stale_) {
|
| - RTC_DCHECK(count_ > 0) <<
|
| - "It shouldn't be possible for max_stale_ && count_ == 0";
|
| - max_ = samples_[next_index_];
|
| - for (size_t i = 1u; i < count_; i++) {
|
| - max_ = std::max(max_, samples_[(next_index_ + i) % max_count()]);
|
| - }
|
| - max_stale_ = false;
|
| - }
|
| - return max_;
|
| - }
|
| -
|
| - T ComputeMin() const {
|
| - if (min_stale_) {
|
| - RTC_DCHECK(count_ > 0) <<
|
| - "It shouldn't be possible for min_stale_ && count_ == 0";
|
| - min_ = samples_[next_index_];
|
| - for (size_t i = 1u; i < count_; i++) {
|
| - min_ = std::min(min_, samples_[(next_index_ + i) % max_count()]);
|
| - }
|
| - min_stale_ = false;
|
| - }
|
| - return min_;
|
| - }
|
| -
|
| - // O(n) time complexity.
|
| - // Weights nth sample with weight (learning_rate)^n. Learning_rate should be
|
| - // between (0.0, 1.0], otherwise the non-weighted mean is returned.
|
| - double ComputeWeightedMean(double learning_rate) const {
|
| - if (count_ < 1 || learning_rate <= 0.0 || learning_rate >= 1.0) {
|
| - return ComputeMean();
|
| - }
|
| - double weighted_mean = 0.0;
|
| - double current_weight = 1.0;
|
| - double weight_sum = 0.0;
|
| - const size_t max_size = max_count();
|
| - for (size_t i = 0; i < count_; ++i) {
|
| - current_weight *= learning_rate;
|
| - weight_sum += current_weight;
|
| - // Add max_size to prevent underflow.
|
| - size_t index = (next_index_ + max_size - i - 1) % max_size;
|
| - weighted_mean += current_weight * samples_[index];
|
| - }
|
| - return weighted_mean / weight_sum;
|
| - }
|
| -
|
| - // Compute estimated variance. Estimation is more accurate
|
| - // as the number of samples grows.
|
| - double ComputeVariance() const {
|
| - if (count_ == 0) {
|
| - return 0.0;
|
| - }
|
| - // Var = E[x^2] - (E[x])^2
|
| - double count_inv = 1.0 / count_;
|
| - double mean_2 = sum_2_ * count_inv;
|
| - double mean = sum_ * count_inv;
|
| - return mean_2 - (mean * mean);
|
| - }
|
| -
|
| - private:
|
| - size_t count_;
|
| - size_t next_index_;
|
| - double sum_; // Sum(x) - double to avoid overflow
|
| - double sum_2_; // Sum(x*x) - double to avoid overflow
|
| - mutable T max_;
|
| - mutable bool max_stale_;
|
| - mutable T min_;
|
| - mutable bool min_stale_;
|
| - std::vector<T> samples_;
|
| -
|
| - RTC_DISALLOW_COPY_AND_ASSIGN(RollingAccumulator);
|
| -};
|
| -
|
| -} // namespace rtc
|
| +// This header is deprecated and is just left here temporarily during
|
| +// refactoring. See https://bugs.webrtc.org/7634 for more details.
|
| +#include "webrtc/rtc_base/rollingaccumulator.h"
|
|
|
| #endif // WEBRTC_BASE_ROLLINGACCUMULATOR_H_
|
|
|