30 unsigned long long eloWhiteSum = 0;
31 unsigned long long eloBlackSum = 0;
32 unsigned long long yearSum = 0;
33 gamenumT freq[scid::core::NUM_RESULT_TYPES] = {};
34 gamenumT eloCount = 0;
35 gamenumT yearCount = 0;
41 void add(scid::core::resultT result,
int eloW,
int eloB,
unsigned year) {
42 static_assert(scid::core::RESULT_None == 0);
44 if (result != scid::core::RESULT_None) {
47 if (eloW > 0 && eloB > 0) {
61 auto n = freq[scid::core::RESULT_White] + freq[scid::core::RESULT_Draw] + freq[scid::core::RESULT_Black];
62 auto res = 1000ull * freq[scid::core::RESULT_White] + 500ull * freq[scid::core::RESULT_Draw];
63 return n ?
static_cast<int>(res / n) : 500;
66 double eloPerformance()
const {
71 auto eloOpp = eloBlackSum;
72 if (move.getColor() != scid::core::WHITE) {
76 return 1.0 * eloOpp / eloCount + FIDE_ratingTable[
score];
79 double avgElo()
const {
83 auto elo = (move.getColor() == scid::core::WHITE) ? eloWhiteSum : eloBlackSum;
84 return 1.0 * elo / eloCount;
87 double avgYear()
const {
return yearCount ? 1.0 * yearSum / yearCount : 0; }
89 double percDraws()
const {
90 return freq[0] ? 100.0 * freq[scid::core::RESULT_Draw] / freq[0] : 0;
93 static auto cmp_ngames_desc() {
95 [](
auto const& a,
auto const& b) {
return a.freq[0] > b.freq[0]; };
101 static constexpr short FIDE_ratingTable[] = {
102 -800, -677, -589, -538, -501, -470, -444, -422, -401, -383, -366, -351,
103 -336, -322, -309, -296, -284, -273, -262, -251, -240, -230, -220, -211,
104 -202, -193, -184, -175, -166, -158, -149, -141, -133, -125, -117, -110,
105 -102, -95, -87, -80, -72, -65, -57, -50, -43, -36, -29, -21,
106 -14, -7, 0, 7, 14, 21, 29, 36, 43, 50, 57, 65,
107 72, 80, 87, 95, 102, 110, 117, 125, 133, 141, 149, 158,
108 166, 175, 184, 193, 202, 211, 220, 230, 240, 251, 262, 273,
109 284, 296, 309, 322, 336, 351, 366, 383, 401, 422, 444, 470,
110 501, 538, 589, 677, 800};