elo-ratings 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +23 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/elo-ratings.gemspec +148 -0
- data/ext/bayeselo/.gitignore +4 -0
- data/ext/bayeselo/CBradleyTerry.cpp +670 -0
- data/ext/bayeselo/CBradleyTerry.h +137 -0
- data/ext/bayeselo/CCDistribution.cpp +135 -0
- data/ext/bayeselo/CCDistribution.h +44 -0
- data/ext/bayeselo/CCDistributionCUI.cpp +104 -0
- data/ext/bayeselo/CCDistributionCUI.h +38 -0
- data/ext/bayeselo/CCondensedResults.cpp +253 -0
- data/ext/bayeselo/CCondensedResults.h +64 -0
- data/ext/bayeselo/CDiscretization.h +40 -0
- data/ext/bayeselo/CDistribution.cpp +123 -0
- data/ext/bayeselo/CDistribution.h +58 -0
- data/ext/bayeselo/CDistributionCollection.cpp +34 -0
- data/ext/bayeselo/CDistributionCollection.h +29 -0
- data/ext/bayeselo/CEloRatingCUI.cpp +1046 -0
- data/ext/bayeselo/CEloRatingCUI.h +67 -0
- data/ext/bayeselo/CIndirectCompare.h +28 -0
- data/ext/bayeselo/CJointBayesian.cpp +111 -0
- data/ext/bayeselo/CJointBayesian.h +38 -0
- data/ext/bayeselo/CLUDecomposition.cpp +154 -0
- data/ext/bayeselo/CLUDecomposition.h +36 -0
- data/ext/bayeselo/CMatrix.cpp +48 -0
- data/ext/bayeselo/CMatrix.h +35 -0
- data/ext/bayeselo/CMatrixIO.cpp +27 -0
- data/ext/bayeselo/CMatrixIO.h +17 -0
- data/ext/bayeselo/CPredictionCUI.cpp +393 -0
- data/ext/bayeselo/CPredictionCUI.h +50 -0
- data/ext/bayeselo/CResultSet.cpp +245 -0
- data/ext/bayeselo/CResultSet.h +50 -0
- data/ext/bayeselo/CResultSetCUI.cpp +355 -0
- data/ext/bayeselo/CResultSetCUI.h +44 -0
- data/ext/bayeselo/CTimeIO.cpp +58 -0
- data/ext/bayeselo/CTimeIO.h +19 -0
- data/ext/bayeselo/CVector.cpp +110 -0
- data/ext/bayeselo/CVector.h +42 -0
- data/ext/bayeselo/EloDataFromFile.cpp +120 -0
- data/ext/bayeselo/EloDataFromFile.h +21 -0
- data/ext/bayeselo/README +8 -0
- data/ext/bayeselo/ReadLineToString.cpp +32 -0
- data/ext/bayeselo/ReadLineToString.h +18 -0
- data/ext/bayeselo/chtime.cpp +56 -0
- data/ext/bayeselo/chtime.h +61 -0
- data/ext/bayeselo/chtimer.h +27 -0
- data/ext/bayeselo/clktimer.cpp +178 -0
- data/ext/bayeselo/clktimer.h +29 -0
- data/ext/bayeselo/consolui.cpp +538 -0
- data/ext/bayeselo/consolui.h +154 -0
- data/ext/bayeselo/const.cpp +79 -0
- data/ext/bayeselo/const.h +42 -0
- data/ext/bayeselo/date.cpp +96 -0
- data/ext/bayeselo/date.h +44 -0
- data/ext/bayeselo/debug.h +58 -0
- data/ext/bayeselo/elomain.cpp +26 -0
- data/ext/bayeselo/extconf.rb +6 -0
- data/ext/bayeselo/list.h +367 -0
- data/ext/bayeselo/listi.h +125 -0
- data/ext/bayeselo/move.cpp +249 -0
- data/ext/bayeselo/move.h +139 -0
- data/ext/bayeselo/pgn.h +62 -0
- data/ext/bayeselo/pgnlex.cpp +432 -0
- data/ext/bayeselo/pgnlex.h +105 -0
- data/ext/bayeselo/pgnstr.cpp +126 -0
- data/ext/bayeselo/piece.h +44 -0
- data/ext/bayeselo/player.h +31 -0
- data/ext/bayeselo/position.h +89 -0
- data/ext/bayeselo/random.cpp +114 -0
- data/ext/bayeselo/random.h +63 -0
- data/ext/bayeselo/rb_bayeselo.cpp +76 -0
- data/ext/bayeselo/readstr.cpp +51 -0
- data/ext/bayeselo/readstr.h +19 -0
- data/ext/bayeselo/square.h +61 -0
- data/ext/bayeselo/str.cpp +81 -0
- data/ext/bayeselo/str.h +71 -0
- data/ext/bayeselo/version.cpp +30 -0
- data/ext/bayeselo/version.h +28 -0
- data/ext/bayeselo/version_number.h +1 -0
- data/lib/bayeselo.rb +6 -0
- data/lib/bayeselo/bayeselo.rb +11 -0
- data/lib/bayeselo/c_bayeselo.rb +7 -0
- data/test/bayeselo/test_bayeselo.rb +33 -0
- data/test/bayeselo/test_c_bayeselo.rb +84 -0
- data/test/helper.rb +18 -0
- metadata +226 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// CMatrix.h
|
|
4
|
+
//
|
|
5
|
+
// R�mi Coulom
|
|
6
|
+
//
|
|
7
|
+
// February, 2005
|
|
8
|
+
//
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
#ifndef Math_CMatrix_Declared
|
|
11
|
+
#define Math_CMatrix_Declared
|
|
12
|
+
|
|
13
|
+
#include "CVector.h"
|
|
14
|
+
|
|
15
|
+
class CMatrix: public CVector
|
|
16
|
+
{
|
|
17
|
+
private: ///////////////////////////////////////////////////////////////////
|
|
18
|
+
int Rows;
|
|
19
|
+
int Columns;
|
|
20
|
+
|
|
21
|
+
public: ////////////////////////////////////////////////////////////////////
|
|
22
|
+
CMatrix(int RowsInit = 0, int ColumnsInit = 0);
|
|
23
|
+
|
|
24
|
+
void SetSize(int RowsInit, int ColumnsInit);
|
|
25
|
+
int GetRows() const {return Rows;}
|
|
26
|
+
int GetColumns() const {return Columns;}
|
|
27
|
+
|
|
28
|
+
double GetElement(int i, int j) const {return (*this)[i * Columns + j];}
|
|
29
|
+
void SetElement(int i, int j, double x) {(*this)[i * Columns + j] = x;}
|
|
30
|
+
void AddToElement(int i, int j, double x) {(*this)[i * Columns + j] += x;}
|
|
31
|
+
|
|
32
|
+
void SetProductByTranspose(const CMatrix &mA, const CMatrix &mB);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
#endif
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// R�mi Coulom
|
|
4
|
+
//
|
|
5
|
+
// February, 2005
|
|
6
|
+
//
|
|
7
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#include "CMatrixIO.h"
|
|
9
|
+
#include "CMatrix.h"
|
|
10
|
+
|
|
11
|
+
#include <iostream>
|
|
12
|
+
#include <iomanip>
|
|
13
|
+
|
|
14
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
15
|
+
// Output operator for matrices
|
|
16
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
17
|
+
std::ostream &operator<<(std::ostream &out, const CMatrix &m)
|
|
18
|
+
{
|
|
19
|
+
for (int i = 0; i < m.GetRows(); i++)
|
|
20
|
+
{
|
|
21
|
+
for (int j = 0; j < m.GetColumns(); j++)
|
|
22
|
+
out << std::setw(12) << m.GetElement(i, j) << ' ';
|
|
23
|
+
out << '\n';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// R�mi Coulom
|
|
4
|
+
//
|
|
5
|
+
// February, 2005
|
|
6
|
+
//
|
|
7
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#ifndef CMatrixIO_Declared
|
|
9
|
+
#define CMatrixIO_Declared
|
|
10
|
+
|
|
11
|
+
#include <iosfwd>
|
|
12
|
+
|
|
13
|
+
class CMatrix;
|
|
14
|
+
|
|
15
|
+
std::ostream &operator<<(std::ostream &out, const CMatrix &m);
|
|
16
|
+
|
|
17
|
+
#endif
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// Remi Coulom
|
|
4
|
+
//
|
|
5
|
+
// December, 2005
|
|
6
|
+
//
|
|
7
|
+
////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#include "CPredictionCUI.h"
|
|
9
|
+
#include "CEloRatingCUI.h"
|
|
10
|
+
#include "CResultSetCUI.h"
|
|
11
|
+
#include "CIndirectCompare.h"
|
|
12
|
+
#include "random.h"
|
|
13
|
+
|
|
14
|
+
#include <iostream>
|
|
15
|
+
#include <sstream>
|
|
16
|
+
#include <iomanip>
|
|
17
|
+
#include <algorithm>
|
|
18
|
+
#include <cmath>
|
|
19
|
+
|
|
20
|
+
////////////////////////////////////////////////////////////////////////////
|
|
21
|
+
// Command strings
|
|
22
|
+
////////////////////////////////////////////////////////////////////////////
|
|
23
|
+
const char * const CPredictionCUI::tszCommands[] =
|
|
24
|
+
{
|
|
25
|
+
"?",
|
|
26
|
+
"results",
|
|
27
|
+
"players",
|
|
28
|
+
"elo",
|
|
29
|
+
"stddev",
|
|
30
|
+
"simulations",
|
|
31
|
+
"rounds",
|
|
32
|
+
"lossscore",
|
|
33
|
+
"drawscore",
|
|
34
|
+
"winscore",
|
|
35
|
+
"multiplier",
|
|
36
|
+
"simulate",
|
|
37
|
+
0
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
// Constructor
|
|
42
|
+
////////////////////////////////////////////////////////////////////////////
|
|
43
|
+
CPredictionCUI::CPredictionCUI(CEloRatingCUI &ercuiInit, int openmode) :
|
|
44
|
+
CConsoleUI(&ercuiInit, openmode),
|
|
45
|
+
ercui(ercuiInit),
|
|
46
|
+
vbtvariance(ercui.crs.GetPlayers()),
|
|
47
|
+
Simulations(100000),
|
|
48
|
+
Rounds(1),
|
|
49
|
+
ScoreMultiplier(0.5)
|
|
50
|
+
{
|
|
51
|
+
tScore[0] = 0;
|
|
52
|
+
tScore[1] = 1;
|
|
53
|
+
tScore[2] = 2;
|
|
54
|
+
|
|
55
|
+
ercui.bt.GetVariance(&vbtvariance[0]);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
////////////////////////////////////////////////////////////////////////////
|
|
59
|
+
// Local prompt
|
|
60
|
+
////////////////////////////////////////////////////////////////////////////
|
|
61
|
+
void CPredictionCUI::PrintLocalPrompt(std::ostream &out)
|
|
62
|
+
{
|
|
63
|
+
out << "Prediction";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
////////////////////////////////////////////////////////////////////////////
|
|
67
|
+
// Process commands
|
|
68
|
+
////////////////////////////////////////////////////////////////////////////
|
|
69
|
+
int CPredictionCUI::ProcessCommand(const char *pszCommand,
|
|
70
|
+
const char *pszParameters,
|
|
71
|
+
std::istream &in,
|
|
72
|
+
std::ostream &out)
|
|
73
|
+
{
|
|
74
|
+
enum
|
|
75
|
+
{
|
|
76
|
+
IDC_Help,
|
|
77
|
+
IDC_Results,
|
|
78
|
+
IDC_Players,
|
|
79
|
+
IDC_Elo,
|
|
80
|
+
IDC_StdDev,
|
|
81
|
+
IDC_Simulations,
|
|
82
|
+
IDC_Rounds,
|
|
83
|
+
IDC_LossScore,
|
|
84
|
+
IDC_DrawScore,
|
|
85
|
+
IDC_WinScore,
|
|
86
|
+
IDC_Multiplier,
|
|
87
|
+
IDC_Simulate
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
switch (ArrayLookup(pszCommand, tszCommands))
|
|
91
|
+
{
|
|
92
|
+
case IDC_Help: ///////////////////////////////////////////////////////////
|
|
93
|
+
CConsoleUI::ProcessCommand(pszCommand, pszParameters, in, out);
|
|
94
|
+
out << "Prediction commands\n";
|
|
95
|
+
out << "~~~~~~~~~~~~~~~~~~~\n";
|
|
96
|
+
out << "results ......... open interface to define players and results\n";
|
|
97
|
+
out << "players ......... list players\n";
|
|
98
|
+
out << "elo n [x] ....... get[set] elo of player number n\n";
|
|
99
|
+
out << "stddev n [x] .... get[set] standard deviation of player number n\n";
|
|
100
|
+
out << '\n';
|
|
101
|
+
out << "simulations [n] . get[set] number of simulations\n";
|
|
102
|
+
out << "rounds [n] ...... get[set] number of (double) rounds\n";
|
|
103
|
+
out << "lossscore [n] ... get[set] score obtained when losing\n";
|
|
104
|
+
out << "drawscore [n] ... get[set] score obtained when drawing\n";
|
|
105
|
+
out << "winscore [n] .... get[set] score obtained when winning\n";
|
|
106
|
+
out << "multiplier [x] .. get[set] score multiplier\n";
|
|
107
|
+
out << '\n';
|
|
108
|
+
out << "simulate [n]..... run simulations (n = rng seed)\n";
|
|
109
|
+
break;
|
|
110
|
+
|
|
111
|
+
case IDC_Results: ////////////////////////////////////////////////////////
|
|
112
|
+
{
|
|
113
|
+
//
|
|
114
|
+
// Open a rscui to get a list of players and results
|
|
115
|
+
//
|
|
116
|
+
CResultSetCUI rscui(rs, vecName, this);
|
|
117
|
+
rscui.MainLoop(in, out);
|
|
118
|
+
|
|
119
|
+
//
|
|
120
|
+
// Find player ratings and variances in ercui
|
|
121
|
+
//
|
|
122
|
+
velo.resize(vecName.size());
|
|
123
|
+
vStdDev.resize(vecName.size());
|
|
124
|
+
for (unsigned i = 0; i < vecName.size(); i++)
|
|
125
|
+
{
|
|
126
|
+
velo[i] = 0;
|
|
127
|
+
vStdDev[i] = 1000;
|
|
128
|
+
for (int j = ercui.vecName.size(); --j >= 0;)
|
|
129
|
+
if (ercui.vecName[j] == vecName[i])
|
|
130
|
+
{
|
|
131
|
+
velo[i] = ercui.bt.GetElo(j);
|
|
132
|
+
vStdDev[i] = std::sqrt(vbtvariance[j]);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
|
|
138
|
+
case IDC_Players: ////////////////////////////////////////////////////////
|
|
139
|
+
{
|
|
140
|
+
out << std::setw(3) << "Num" << ' ';
|
|
141
|
+
out << std::setw(20) << "Name" << ' ';
|
|
142
|
+
out << std::setw(8) << "Elo" << ' ';
|
|
143
|
+
out << std::setw(8) << "Std.Dev." << '\n';
|
|
144
|
+
for (unsigned i = 0; i < vecName.size(); i++)
|
|
145
|
+
{
|
|
146
|
+
out << std::setw(3) << i << ' ';
|
|
147
|
+
out << std::setw(20) << vecName[i] << ' ';
|
|
148
|
+
out << std::setw(8) << velo[i] << ' ';
|
|
149
|
+
out << std::setw(8) << vStdDev[i] << '\n';
|
|
150
|
+
}
|
|
151
|
+
out << "(" << vecName.size() << " players)\n";
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
|
|
155
|
+
case IDC_Elo: ////////////////////////////////////////////////////////////
|
|
156
|
+
{
|
|
157
|
+
std::istringstream is(pszParameters);
|
|
158
|
+
unsigned Player = 0;
|
|
159
|
+
is >> Player;
|
|
160
|
+
if (Player < velo.size())
|
|
161
|
+
{
|
|
162
|
+
is >> velo[Player];
|
|
163
|
+
out << velo[Player] << '\n';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
|
|
168
|
+
case IDC_StdDev: /////////////////////////////////////////////////////////
|
|
169
|
+
{
|
|
170
|
+
std::istringstream is(pszParameters);
|
|
171
|
+
unsigned Player = 0;
|
|
172
|
+
is >> Player;
|
|
173
|
+
if (Player < vStdDev.size())
|
|
174
|
+
{
|
|
175
|
+
is >> vStdDev[Player];
|
|
176
|
+
out << vStdDev[Player] << '\n';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
|
|
181
|
+
case IDC_Simulations: ////////////////////////////////////////////////////
|
|
182
|
+
GetSet<int>(Simulations, pszParameters, out);
|
|
183
|
+
break;
|
|
184
|
+
|
|
185
|
+
case IDC_Rounds: /////////////////////////////////////////////////////////
|
|
186
|
+
GetSet<int>(Rounds, pszParameters, out);
|
|
187
|
+
break;
|
|
188
|
+
|
|
189
|
+
case IDC_LossScore: //////////////////////////////////////////////////////
|
|
190
|
+
GetSet<int>(tScore[0], pszParameters, out);
|
|
191
|
+
break;
|
|
192
|
+
|
|
193
|
+
case IDC_DrawScore: //////////////////////////////////////////////////////
|
|
194
|
+
GetSet<int>(tScore[1], pszParameters, out);
|
|
195
|
+
break;
|
|
196
|
+
|
|
197
|
+
case IDC_WinScore: ///////////////////////////////////////////////////////
|
|
198
|
+
GetSet<int>(tScore[2], pszParameters, out);
|
|
199
|
+
break;
|
|
200
|
+
|
|
201
|
+
case IDC_Multiplier: /////////////////////////////////////////////////////
|
|
202
|
+
GetSet<double>(ScoreMultiplier, pszParameters, out);
|
|
203
|
+
break;
|
|
204
|
+
|
|
205
|
+
case IDC_Simulate: ///////////////////////////////////////////////////////
|
|
206
|
+
{
|
|
207
|
+
int Seed = 0;
|
|
208
|
+
std::istringstream(pszParameters) >> Seed;
|
|
209
|
+
CRandom<unsigned> rnd(Seed);
|
|
210
|
+
int Players = vecName.size();
|
|
211
|
+
std::vector<int> vGames(Players * Players);
|
|
212
|
+
std::vector<int> vScore(Players);
|
|
213
|
+
|
|
214
|
+
//
|
|
215
|
+
// Reset arrays
|
|
216
|
+
//
|
|
217
|
+
for (int i = Players * Players; --i >= 0;)
|
|
218
|
+
vGames[i] = 0;
|
|
219
|
+
for (int i = Players; --i >= 0;)
|
|
220
|
+
vScore[i] = 0;
|
|
221
|
+
|
|
222
|
+
//
|
|
223
|
+
// Add games that have already been played
|
|
224
|
+
//
|
|
225
|
+
for (int i = rs.GetGames(); --i >= 0;)
|
|
226
|
+
{
|
|
227
|
+
int White = rs.GetWhite(i);
|
|
228
|
+
int Black = rs.GetBlack(i);
|
|
229
|
+
int Result = rs.GetResult(i);
|
|
230
|
+
int Index = White + Players * Black;
|
|
231
|
+
if (vGames[Index] < Rounds)
|
|
232
|
+
{
|
|
233
|
+
vGames[Index]++;
|
|
234
|
+
vScore[White] += tScore[Result];
|
|
235
|
+
vScore[Black] += tScore[2 - Result];
|
|
236
|
+
}
|
|
237
|
+
else
|
|
238
|
+
out << "warning: more games than rounds\n";
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
//
|
|
242
|
+
// Arrays to receive cumulative information
|
|
243
|
+
//
|
|
244
|
+
std::vector<int> vTotalScore(Players);
|
|
245
|
+
std::vector<int> vTotalVariance(Players);
|
|
246
|
+
std::vector<int> vTotalRank(Players);
|
|
247
|
+
for (int i = Players; --i >= 0;)
|
|
248
|
+
{
|
|
249
|
+
vTotalScore[i] = 0;
|
|
250
|
+
vTotalVariance[i] = 0;
|
|
251
|
+
vTotalRank[i] = 0;
|
|
252
|
+
}
|
|
253
|
+
std::vector<int> vRankDistribution(Players * Players);
|
|
254
|
+
for (int i = Players * Players; --i >= 0;)
|
|
255
|
+
vRankDistribution[i] = 0;
|
|
256
|
+
|
|
257
|
+
//
|
|
258
|
+
// Permutation vector to rank players
|
|
259
|
+
//
|
|
260
|
+
std::vector<int> vPermutation(Players);
|
|
261
|
+
for (int i = Players; --i >= 0;)
|
|
262
|
+
vPermutation[i] = i;
|
|
263
|
+
|
|
264
|
+
//
|
|
265
|
+
// Run simulations
|
|
266
|
+
//
|
|
267
|
+
for (int i = Simulations; --i >= 0;)
|
|
268
|
+
{
|
|
269
|
+
std::vector<int> vLocalScore = vScore;
|
|
270
|
+
std::vector<double> veloRandom = velo;
|
|
271
|
+
|
|
272
|
+
for (int j = Players; --j >= 0;)
|
|
273
|
+
veloRandom[j] += rnd.NextGaussian() * vStdDev[j];
|
|
274
|
+
|
|
275
|
+
for (int White = Players; --White >= 0;)
|
|
276
|
+
for (int Black = Players; --Black >= 0;)
|
|
277
|
+
if (White != Black)
|
|
278
|
+
{
|
|
279
|
+
int Index = White + Players * Black;
|
|
280
|
+
|
|
281
|
+
double eloDelta = veloRandom[White] - veloRandom[Black];
|
|
282
|
+
double xWin = ercui.bt.WinProbability(eloDelta);
|
|
283
|
+
double xLoss = xWin + ercui.bt.LossProbability(eloDelta);
|
|
284
|
+
|
|
285
|
+
for (int r = Rounds - vGames[Index]; --r >= 0;)
|
|
286
|
+
{
|
|
287
|
+
double x = rnd.NextDouble();
|
|
288
|
+
int Result = 1;
|
|
289
|
+
if (x < xWin)
|
|
290
|
+
Result = 2;
|
|
291
|
+
else if (x < xLoss)
|
|
292
|
+
Result = 0;
|
|
293
|
+
vLocalScore[White] += tScore[Result];
|
|
294
|
+
vLocalScore[Black] += tScore[2 - Result];
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
std::sort(vPermutation.begin(),
|
|
299
|
+
vPermutation.end(),
|
|
300
|
+
CIndirectCompare<int>(&vLocalScore[0]));
|
|
301
|
+
|
|
302
|
+
for (int Player = Players; --Player >= 0;)
|
|
303
|
+
{
|
|
304
|
+
vTotalScore[Player] += vLocalScore[Player];
|
|
305
|
+
vTotalVariance[Player] += vLocalScore[Player] * vLocalScore[Player];
|
|
306
|
+
vTotalRank[vPermutation[Player]] += Player;
|
|
307
|
+
vRankDistribution[Player + Players * vPermutation[Player]]++;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
//
|
|
312
|
+
// Find maximum name length
|
|
313
|
+
//
|
|
314
|
+
unsigned MaxNameLength = 11;
|
|
315
|
+
for (int i = Players; --i >= 0;)
|
|
316
|
+
if (vecName[i].length() > MaxNameLength)
|
|
317
|
+
MaxNameLength = vecName[i].length();
|
|
318
|
+
|
|
319
|
+
//
|
|
320
|
+
// Sort players according to expected score
|
|
321
|
+
//
|
|
322
|
+
std::sort(vPermutation.begin(),
|
|
323
|
+
vPermutation.end(),
|
|
324
|
+
CIndirectCompare<int>(&vTotalScore[0]));
|
|
325
|
+
|
|
326
|
+
//
|
|
327
|
+
// Print summary of simulations
|
|
328
|
+
//
|
|
329
|
+
std::ios::fmtflags f = out.flags();
|
|
330
|
+
|
|
331
|
+
out.setf(std::ios::fixed, std::ios::floatfield);
|
|
332
|
+
out.precision(2);
|
|
333
|
+
|
|
334
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
335
|
+
out << std::setw(4) << "Rank" << ' ';
|
|
336
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
337
|
+
out << std::setw(MaxNameLength + 1) << "Player name";
|
|
338
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
339
|
+
out << std::setw(8) << "Points";
|
|
340
|
+
out << std::setw(8) << "EPoints";
|
|
341
|
+
out << std::setw(8) << "StdDev";
|
|
342
|
+
out << std::setw(8) << "ERank";
|
|
343
|
+
out << " ";
|
|
344
|
+
for (int k = 0; k < Players; k++)
|
|
345
|
+
out << std::setw(3) << k + 1;
|
|
346
|
+
out << '\n';
|
|
347
|
+
|
|
348
|
+
for (int i = 0; i < Players; i++)
|
|
349
|
+
{
|
|
350
|
+
int j = vPermutation[i];
|
|
351
|
+
|
|
352
|
+
float Score = float(vTotalScore[j] * ScoreMultiplier) / float(Simulations);
|
|
353
|
+
float Score2 =
|
|
354
|
+
float(vTotalVariance[j] * ScoreMultiplier * ScoreMultiplier) /
|
|
355
|
+
float(Simulations);
|
|
356
|
+
float Variance = Score2 - Score * Score;
|
|
357
|
+
|
|
358
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
359
|
+
out << std::setw(4) << i + 1 << ' ';
|
|
360
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
361
|
+
out << std::setw(MaxNameLength + 1) << vecName[j];
|
|
362
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
363
|
+
out << std::setw(8);
|
|
364
|
+
out.precision(1);
|
|
365
|
+
out << float(vScore[j] * ScoreMultiplier);
|
|
366
|
+
out << std::setw(8);
|
|
367
|
+
out.precision(2);
|
|
368
|
+
out << Score;
|
|
369
|
+
out << std::setw(8);
|
|
370
|
+
out << std::sqrt(Variance);
|
|
371
|
+
out << std::setw(8);
|
|
372
|
+
out << float(vTotalRank[j]) / float(Simulations) + 1.0;
|
|
373
|
+
out << " ";
|
|
374
|
+
for (int k = 0; k < Players; k++)
|
|
375
|
+
{
|
|
376
|
+
double x = (100.0 * vRankDistribution[k + Players * j]) /
|
|
377
|
+
float(Simulations);
|
|
378
|
+
out << std::setw(3) << int(x + 0.5);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
out << '\n';
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
out.flags(f);
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
|
|
388
|
+
default: /////////////////////////////////////////////////////////////////
|
|
389
|
+
return CConsoleUI::ProcessCommand(pszCommand, pszParameters, in, out);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return PC_Continue;
|
|
393
|
+
}
|