14 #ifndef OR_TOOLS_UTIL_RUNNING_STAT_H_
15 #define OR_TOOLS_UTIL_RUNNING_STAT_H_
34 void Reset(
int window_size);
59 std::deque<int> values_;
66 template <
class Number =
double>
80 const int window_size_;
83 std::vector<Number> values_;
97 : window_size_(window_size),
105 window_size_ = window_size;
113 global_sum_ +=
value;
115 values_.push_back(
value);
116 if (values_.size() > window_size_) {
117 local_sum_ -= values_.front();
123 return num_adds_ == 0 ? 0.0 : global_sum_ /
static_cast<double>(num_adds_);
127 return values_.empty() ? 0.0
128 : local_sum_ /
static_cast<double>(values_.size());
137 return values_.size() == window_size_;
140 template <
class Number>
142 : window_size_(window_size), values_(), last_index_(0), max_index_(0) {
146 template <
class Number>
148 if (values_.size() < window_size_) {
151 if (values_.empty() ||
value >= GetCurrentMax()) {
152 max_index_ = values_.size();
154 values_.push_back(
value);
161 if (
value >= GetCurrentMax()) {
162 max_index_ = last_index_;
163 values_[last_index_] =
value;
165 values_[last_index_] =
value;
166 if (last_index_ == max_index_) {
171 Number max_value = values_[max_index_];
172 for (
int i = 1; i < values_.size(); ++i) {
173 if (values_[i] > max_value) {
174 max_value = values_[i];
180 if (++last_index_ == window_size_) {
185 template <
class Number>
188 return values_[max_index_];
193 #endif // OR_TOOLS_UTIL_RUNNING_STAT_H_