+ // Reset the running average to rational value p / q
+ void set(int64_t p, int64_t q)
+ { average = p * PERIOD * RESOLUTION / q; }
+
+ // Update average with value v
+ void update(int64_t v)
+ { average = RESOLUTION * v + (PERIOD - 1) * average / PERIOD; }
+
+ // Test if average is strictly greater than rational a / b
+ bool is_greater(int64_t a, int64_t b) const
+ { return b * average > a * (PERIOD * RESOLUTION); }
+
+ int64_t value() const
+ { return average / (PERIOD * RESOLUTION); }
+
+ private :
+ static constexpr int64_t PERIOD = 4096;
+ static constexpr int64_t RESOLUTION = 1024;
+ int64_t average;