X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc.h;h=7a3369e8ed512e9427c50e5c5f625cf19d176baa;hb=73018a03375b4b72ee482eb5a4a2152d7e4f0aac;hp=dae37cd98f05a10921a5903cddb4f7e47f6db311;hpb=e8788d1b32c9356fa0a127952d48c3748d8ec826;p=stockfish diff --git a/src/misc.h b/src/misc.h index dae37cd9..7a3369e8 100644 --- a/src/misc.h +++ b/src/misc.h @@ -85,6 +85,33 @@ static inline const union { uint32_t i; char c[4]; } Le = { 0x01020304 }; static inline const bool IsLittleEndian = (Le.c[0] == 4); +// RunningAverage : a class to calculate a running average of a series of values. +// For efficiency, all computations are done with integers. +class RunningAverage { + public: + + // Constructor + RunningAverage() {} + + // 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) + { return b * average > a * PERIOD * RESOLUTION ; } + + private : + static constexpr int64_t PERIOD = 4096; + static constexpr int64_t RESOLUTION = 1024; + int64_t average; +}; + + template class ValueListInserter { public: