@@ -9,17 +9,29 @@ namespace fast_chess {
9
9
Elo::Elo (int wins, int losses, int draws) {
10
10
diff_ = getDiff (wins, losses, draws);
11
11
error_ = getError (wins, losses, draws);
12
+ nelodiff_ = getneloDiff (wins, losses, draws);
13
+ neloerror_ = getneloError (wins, losses, draws);
12
14
}
13
15
14
16
Elo::Elo (int penta_WW, int penta_WD, int penta_WL, int penta_DD, int penta_LD, int penta_LL) {
15
17
diff_ = getDiff (penta_WW, penta_WD, penta_WL, penta_DD, penta_LD, penta_LL);
16
18
error_ = getError (penta_WW, penta_WD, penta_WL, penta_DD, penta_LD, penta_LL);
19
+ nelodiff_ = getneloDiff (penta_WW, penta_WD, penta_WL, penta_DD, penta_LD, penta_LL);
20
+ neloerror_ = getneloError (penta_WW, penta_WD, penta_WL, penta_DD, penta_LD, penta_LL);
17
21
}
18
22
19
23
double Elo::percToEloDiff (double percentage) noexcept {
20
24
return -400.0 * std::log10 (1.0 / percentage - 1.0 );
21
25
}
22
26
27
+ double Elo::percToNeloDiff (double percentage, double stdev) noexcept {
28
+ return (percentage - 0.5 ) / (std::sqrt (2 ) * stdev) * (800 / std::log (10 ));
29
+ }
30
+
31
+ double Elo::percToNeloDiffWDL (double percentage, double stdev) noexcept {
32
+ return (percentage - 0.5 ) / stdev * (800 / std::log (10 ));
33
+ }
34
+
23
35
double Elo::getError (int wins, int losses, int draws) noexcept {
24
36
const double n = wins + losses + draws;
25
37
const double w = wins / n;
@@ -37,6 +49,23 @@ double Elo::getError(int wins, int losses, int draws) noexcept {
37
49
return (percToEloDiff (devMax) - percToEloDiff (devMin)) / 2.0 ;
38
50
}
39
51
52
+ double Elo::getneloError (int wins, int losses, int draws) noexcept {
53
+ const double n = wins + losses + draws;
54
+ const double w = wins / n;
55
+ const double l = losses / n;
56
+ const double d = draws / n;
57
+ const double perc = w + d / 2.0 ;
58
+
59
+ const double devW = w * std::pow (1.0 - perc, 2.0 );
60
+ const double devL = l * std::pow (0.0 - perc, 2.0 );
61
+ const double devD = d * std::pow (0.5 - perc, 2.0 );
62
+ const double stdev = std::sqrt (devW + devL + devD) / std::sqrt (n);
63
+
64
+ const double devMin = perc - 1.959963984540054 * stdev;
65
+ const double devMax = perc + 1.959963984540054 * stdev;
66
+ return (percToNeloDiffWDL (devMax, stdev * std::sqrt (n)) - percToNeloDiffWDL (devMin, stdev * std::sqrt (n))) / 2.0 ;
67
+ }
68
+
40
69
double Elo::getError (int penta_WW, int penta_WD, int penta_WL, int penta_DD, int penta_LD, int penta_LL) noexcept {
41
70
const double pairs = penta_WW + penta_WD + penta_WL + penta_DD + penta_LD + penta_LL;
42
71
const double WW = double (penta_WW) / pairs;
@@ -58,6 +87,27 @@ double Elo::getError(int penta_WW, int penta_WD, int penta_WL, int penta_DD, int
58
87
return (percToEloDiff (devMax) - percToEloDiff (devMin)) / 2.0 ;
59
88
}
60
89
90
+ double Elo::getneloError (int penta_WW, int penta_WD, int penta_WL, int penta_DD, int penta_LD, int penta_LL) noexcept {
91
+ const double pairs = penta_WW + penta_WD + penta_WL + penta_DD + penta_LD + penta_LL;
92
+ const double WW = double (penta_WW) / pairs;
93
+ const double WD = double (penta_WD) / pairs;
94
+ const double WL = double (penta_WL) / pairs;
95
+ const double DD = double (penta_DD) / pairs;
96
+ const double LD = double (penta_LD) / pairs;
97
+ const double LL = double (penta_LL) / pairs;
98
+ const double a = WW + 0.75 * WD + 0.5 * (WL + DD) + 0.25 * LD;
99
+ const double WW_dev = WW * std::pow ((1 - a), 2 );
100
+ const double WD_dev = WD * std::pow ((0.75 - a), 2 );
101
+ const double WLDD_dev = (WL + DD) * std::pow ((0.5 - a), 2 );
102
+ const double LD_dev = LD * std::pow ((0.25 - a), 2 );
103
+ const double LL_dev = LL * std::pow ((0 - a), 2 );
104
+ const double stdev = std::sqrt (WW_dev + WD_dev + WLDD_dev + LD_dev + LL_dev) / std::sqrt (pairs);
105
+
106
+ const double devMin = a - 1.959963984540054 * stdev;
107
+ const double devMax = a + 1.959963984540054 * stdev;
108
+ return (percToNeloDiff (devMax, stdev * std::sqrt (pairs)) - percToNeloDiff (devMin, stdev * std::sqrt (pairs))) / 2.0 ;
109
+ }
110
+
61
111
double Elo::getDiff (int wins, int losses, int draws) noexcept {
62
112
const double n = wins + losses + draws;
63
113
const double score = wins + draws / 2.0 ;
@@ -66,6 +116,20 @@ double Elo::getDiff(int wins, int losses, int draws) noexcept {
66
116
return percToEloDiff (percentage);
67
117
}
68
118
119
+ double Elo::getneloDiff (int wins, int losses, int draws) noexcept {
120
+ const double n = wins + losses + draws;
121
+ const double w = wins / n;
122
+ const double l = losses / n;
123
+ const double d = draws / n;
124
+ const double perc = w + d / 2.0 ;
125
+
126
+ const double devW = w * std::pow (1.0 - perc, 2.0 );
127
+ const double devL = l * std::pow (0.0 - perc, 2.0 );
128
+ const double devD = d * std::pow (0.5 - perc, 2.0 );
129
+ const double stdev = std::sqrt (devW + devL + devD) / std::sqrt (n);
130
+ return percToNeloDiffWDL (perc, stdev * std::sqrt (n));
131
+ }
132
+
69
133
double Elo::getDiff (int penta_WW, int penta_WD, int penta_WL, int penta_DD, int penta_LD, int penta_LL) noexcept {
70
134
const double pairs = penta_WW + penta_WD + penta_WL + penta_DD + penta_LD + penta_LL;
71
135
const double WW = double (penta_WW) / pairs;
@@ -78,6 +142,25 @@ double Elo::getDiff(int penta_WW, int penta_WD, int penta_WL, int penta_DD, int
78
142
return percToEloDiff (percentage);
79
143
}
80
144
145
+ double Elo::getneloDiff (int penta_WW, int penta_WD, int penta_WL, int penta_DD, int penta_LD, int penta_LL) noexcept {
146
+ const double pairs = penta_WW + penta_WD + penta_WL + penta_DD + penta_LD + penta_LL;
147
+ const double WW = double (penta_WW) / pairs;
148
+ const double WD = double (penta_WD) / pairs;
149
+ const double WL = double (penta_WL) / pairs;
150
+ const double DD = double (penta_DD) / pairs;
151
+ const double LD = double (penta_LD) / pairs;
152
+ const double LL = double (penta_LL) / pairs;
153
+ const double a = WW + 0.75 * WD + 0.5 * (WL + DD) + 0.25 * LD;
154
+ const double WW_dev = WW * std::pow ((1 - a), 2 );
155
+ const double WD_dev = WD * std::pow ((0.75 - a), 2 );
156
+ const double WLDD_dev = (WL + DD) * std::pow ((0.5 - a), 2 );
157
+ const double LD_dev = LD * std::pow ((0.25 - a), 2 );
158
+ const double LL_dev = LL * std::pow ((0 - a), 2 );
159
+ const double stdev = std::sqrt (WW_dev + WD_dev + WLDD_dev + LD_dev + LL_dev) / std::sqrt (pairs);
160
+
161
+ return percToNeloDiff (a, stdev * std::sqrt (pairs));
162
+ }
163
+
81
164
std::string Elo::getElo () const noexcept {
82
165
std::stringstream ss;
83
166
@@ -87,6 +170,15 @@ std::string Elo::getElo() const noexcept {
87
170
return ss.str ();
88
171
}
89
172
173
+ std::string Elo::getnElo () const noexcept {
174
+ std::stringstream ss;
175
+
176
+ ss << std::fixed << std::setprecision (2 ) << nelodiff_;
177
+ ss << " +/- " ;
178
+ ss << std::fixed << std::setprecision (2 ) << neloerror_;
179
+ return ss.str ();
180
+ }
181
+
90
182
std::string Elo::getLos (int wins, int losses, int draws) noexcept {
91
183
const double games = wins + losses + draws;
92
184
const double W = double (wins) / games;
0 commit comments