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,50 @@
|
|
|
1
|
+
////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// CPredictionCUI.h
|
|
4
|
+
//
|
|
5
|
+
// Remi Coulom
|
|
6
|
+
//
|
|
7
|
+
// December, 2005
|
|
8
|
+
//
|
|
9
|
+
////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
#ifndef CPredictionCUI_Declared
|
|
11
|
+
#define CPredictionCUI_Declared
|
|
12
|
+
|
|
13
|
+
#include "consolui.h" // CConsoleUI
|
|
14
|
+
#include "CResultSet.h"
|
|
15
|
+
|
|
16
|
+
#include <vector>
|
|
17
|
+
|
|
18
|
+
class CEloRatingCUI;
|
|
19
|
+
|
|
20
|
+
class CPredictionCUI : public CConsoleUI // predcui
|
|
21
|
+
{
|
|
22
|
+
private: //////////////////////////////////////////////////////////////////
|
|
23
|
+
static const char * const tszCommands[];
|
|
24
|
+
|
|
25
|
+
CEloRatingCUI &ercui;
|
|
26
|
+
std::vector<double> vbtvariance;
|
|
27
|
+
|
|
28
|
+
std::vector<double> velo;
|
|
29
|
+
std::vector<double> vStdDev;
|
|
30
|
+
CResultSet rs;
|
|
31
|
+
std::vector<std::string> vecName;
|
|
32
|
+
|
|
33
|
+
int Simulations;
|
|
34
|
+
int Rounds;
|
|
35
|
+
int tScore[3];
|
|
36
|
+
double ScoreMultiplier;
|
|
37
|
+
|
|
38
|
+
protected: ////////////////////////////////////////////////////////////////
|
|
39
|
+
virtual int ProcessCommand(const char *pszCommand,
|
|
40
|
+
const char *pszParameters,
|
|
41
|
+
std::istream &in,
|
|
42
|
+
std::ostream &out);
|
|
43
|
+
|
|
44
|
+
virtual void PrintLocalPrompt(std::ostream &out);
|
|
45
|
+
|
|
46
|
+
public: ///////////////////////////////////////////////////////////////////
|
|
47
|
+
CPredictionCUI(CEloRatingCUI &ercuiInit, int openmode = OpenModal);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
#endif
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// R�mi Coulom
|
|
4
|
+
//
|
|
5
|
+
// December, 2004
|
|
6
|
+
//
|
|
7
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#include "CResultSet.h"
|
|
9
|
+
#include "debug.h"
|
|
10
|
+
#include "random.h"
|
|
11
|
+
|
|
12
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
13
|
+
// Subset constructor for one player
|
|
14
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
15
|
+
CResultSet::CResultSet(const CResultSet &rs, int Player)
|
|
16
|
+
{
|
|
17
|
+
Reset();
|
|
18
|
+
for (int i = 0; i < rs.GetGames(); i++)
|
|
19
|
+
if (rs.GetWhite(i) == Player || rs.GetBlack(i) == Player)
|
|
20
|
+
Append(rs.GetWhite(i), rs.GetBlack(i), rs.GetResult(i));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
24
|
+
// Subset constructor for a pair of players (+pack)
|
|
25
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
26
|
+
CResultSet::CResultSet(const CResultSet &rs, int Player1, int Player2)
|
|
27
|
+
{
|
|
28
|
+
Reset();
|
|
29
|
+
for (int i = 0; i < rs.GetGames(); i++)
|
|
30
|
+
{
|
|
31
|
+
if (rs.GetWhite(i) == Player1 && rs.GetBlack(i) == Player2)
|
|
32
|
+
Append(0, 1, rs.GetResult(i));
|
|
33
|
+
if (rs.GetWhite(i) == Player2 && rs.GetBlack(i) == Player1)
|
|
34
|
+
Append(1, 0, rs.GetResult(i));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
39
|
+
// Count games of a player
|
|
40
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
int CResultSet::CountGames(unsigned Player) const
|
|
42
|
+
{
|
|
43
|
+
int Result = 0;
|
|
44
|
+
for (int i = GetGames(); --i >= 0;)
|
|
45
|
+
if (vWhite[i] == Player || vBlack[i] == Player)
|
|
46
|
+
Result++;
|
|
47
|
+
return Result;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
51
|
+
// Reset to empty set
|
|
52
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
53
|
+
void CResultSet::Reset()
|
|
54
|
+
{
|
|
55
|
+
vWhite.clear();
|
|
56
|
+
vBlack.clear();
|
|
57
|
+
vResult.clear();
|
|
58
|
+
Players = 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
62
|
+
// Add a result
|
|
63
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
64
|
+
void CResultSet::Append(unsigned w, unsigned b, unsigned r)
|
|
65
|
+
{
|
|
66
|
+
FATAL(r > 2);
|
|
67
|
+
|
|
68
|
+
vWhite.push_back(w);
|
|
69
|
+
vBlack.push_back(b);
|
|
70
|
+
vResult.push_back(r);
|
|
71
|
+
|
|
72
|
+
if (w >= Players)
|
|
73
|
+
Players = w + 1;
|
|
74
|
+
if (b >= Players)
|
|
75
|
+
Players = b + 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
79
|
+
// Remove a game
|
|
80
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
81
|
+
void CResultSet::RemoveGame(int Index)
|
|
82
|
+
{
|
|
83
|
+
int Games = GetGames();
|
|
84
|
+
vWhite[Index] = vWhite[Games - 1];
|
|
85
|
+
vBlack[Index] = vBlack[Games - 1];
|
|
86
|
+
vResult[Index] = vResult[Games - 1];
|
|
87
|
+
vWhite.resize(Games - 1);
|
|
88
|
+
vBlack.resize(Games - 1);
|
|
89
|
+
vResult.resize(Games - 1);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
93
|
+
// Remove games by a player
|
|
94
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
95
|
+
void CResultSet::RemovePlayer(unsigned Player)
|
|
96
|
+
{
|
|
97
|
+
for (int i = GetGames(); --i >= 0;)
|
|
98
|
+
if (vWhite[i] == Player || vBlack[i] == Player)
|
|
99
|
+
RemoveGame(i);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
103
|
+
// Remove games by player who have played less than Threshold games
|
|
104
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
105
|
+
void CResultSet::RemoveRarePlayers(int Threshold)
|
|
106
|
+
{
|
|
107
|
+
std::vector<int> vPlayersToRemove;
|
|
108
|
+
for (int i = GetPlayers(); --i >= 0;)
|
|
109
|
+
if (CountGames(i) < Threshold)
|
|
110
|
+
vPlayersToRemove.push_back(i);
|
|
111
|
+
for (int i = vPlayersToRemove.size(); --i >= 0;)
|
|
112
|
+
RemovePlayer(vPlayersToRemove[i]);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
116
|
+
// Pack players
|
|
117
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
118
|
+
void CResultSet::PackPlayers(std::vector<std::string> &vName)
|
|
119
|
+
{
|
|
120
|
+
//
|
|
121
|
+
// Find Players that have games
|
|
122
|
+
//
|
|
123
|
+
std::vector<int> vTranslation(Players);
|
|
124
|
+
std::vector<int> vReverseTranslation(Players);
|
|
125
|
+
int NewPlayers = 0;
|
|
126
|
+
for (unsigned i = 0; i < Players; i++)
|
|
127
|
+
{
|
|
128
|
+
vTranslation[i] = NewPlayers;
|
|
129
|
+
if (CountGames(i))
|
|
130
|
+
{
|
|
131
|
+
vReverseTranslation[NewPlayers] = i;
|
|
132
|
+
NewPlayers++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
//
|
|
137
|
+
// Change player numbers
|
|
138
|
+
//
|
|
139
|
+
for (int i = GetGames(); --i >= 0;)
|
|
140
|
+
{
|
|
141
|
+
vWhite[i] = vTranslation[vWhite[i]];
|
|
142
|
+
vBlack[i] = vTranslation[vBlack[i]];
|
|
143
|
+
}
|
|
144
|
+
Players = NewPlayers;
|
|
145
|
+
|
|
146
|
+
//
|
|
147
|
+
// Reorder player names
|
|
148
|
+
//
|
|
149
|
+
std::vector<std::string> vNewName(NewPlayers);
|
|
150
|
+
for (int i = NewPlayers; --i >= 0;)
|
|
151
|
+
vNewName[i] = vName[vReverseTranslation[i]];
|
|
152
|
+
vName = vNewName;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
156
|
+
// Extract a subset (used for cross-validation)
|
|
157
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
158
|
+
void CResultSet::Extract(CResultSet &rs1, CResultSet &rs2, unsigned Seed) const
|
|
159
|
+
{
|
|
160
|
+
CRandom<unsigned> rnd(Seed);
|
|
161
|
+
for (int i = 0; i < GetGames(); i++)
|
|
162
|
+
{
|
|
163
|
+
if (rnd.NewValue() & 1)
|
|
164
|
+
rs1.Append(GetWhite(i), GetBlack(i), GetResult(i));
|
|
165
|
+
else
|
|
166
|
+
rs2.Append(GetWhite(i), GetBlack(i), GetResult(i));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
171
|
+
// Connect (return the new number of Player)
|
|
172
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
173
|
+
int CResultSet::Connect(unsigned Player,
|
|
174
|
+
int ForbiddenResult,
|
|
175
|
+
std::vector<std::string> &vecName)
|
|
176
|
+
{
|
|
177
|
+
if (Player >= GetPlayers())
|
|
178
|
+
return Player;
|
|
179
|
+
|
|
180
|
+
std::vector<int> vConnected(GetPlayers());
|
|
181
|
+
std::fill(vConnected.begin(), vConnected.end(), 0);
|
|
182
|
+
|
|
183
|
+
//
|
|
184
|
+
// Loop to find connected players
|
|
185
|
+
//
|
|
186
|
+
vConnected[Player] = 1;
|
|
187
|
+
while(1)
|
|
188
|
+
{
|
|
189
|
+
int Additions = 0;
|
|
190
|
+
|
|
191
|
+
for (int i = GetGames(); --i >= 0;)
|
|
192
|
+
if (vConnected[GetWhite(i)] == 1 &&
|
|
193
|
+
vConnected[GetBlack(i)] == 0 &&
|
|
194
|
+
GetResult(i) != ForbiddenResult)
|
|
195
|
+
{
|
|
196
|
+
vConnected[GetBlack(i)] = 1;
|
|
197
|
+
Additions++;
|
|
198
|
+
}
|
|
199
|
+
else if (vConnected[GetWhite(i)] == 0 &&
|
|
200
|
+
vConnected[GetBlack(i)] == 1 &&
|
|
201
|
+
GetResult(i) != 2 - ForbiddenResult)
|
|
202
|
+
{
|
|
203
|
+
vConnected[GetWhite(i)] = 1;
|
|
204
|
+
Additions++;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (Additions == 0)
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
//
|
|
212
|
+
// Compute translation of player numbers
|
|
213
|
+
//
|
|
214
|
+
std::vector<int> vTranslation(GetPlayers());
|
|
215
|
+
std::vector<int> vReverseTranslation(GetPlayers());
|
|
216
|
+
|
|
217
|
+
int Players = 0;
|
|
218
|
+
for (unsigned i = 0; i < GetPlayers(); i++)
|
|
219
|
+
{
|
|
220
|
+
vTranslation[i] = Players;
|
|
221
|
+
vReverseTranslation[Players] = i;
|
|
222
|
+
Players += vConnected[i];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
//
|
|
226
|
+
// Build new vector of player names
|
|
227
|
+
//
|
|
228
|
+
std::vector<std::string> vecNewName(Players);
|
|
229
|
+
for (int i = Players; --i >= 0;)
|
|
230
|
+
vecNewName[i] = vecName[vReverseTranslation[i]];
|
|
231
|
+
vecName = vecNewName;
|
|
232
|
+
|
|
233
|
+
//
|
|
234
|
+
// Build new set of results
|
|
235
|
+
//
|
|
236
|
+
CResultSet rsNew;
|
|
237
|
+
for (int i = 0; i < GetGames(); i++)
|
|
238
|
+
if (vConnected[GetWhite(i)] && vConnected[GetBlack(i)])
|
|
239
|
+
rsNew.Append(vTranslation[GetWhite(i)],
|
|
240
|
+
vTranslation[GetBlack(i)],
|
|
241
|
+
GetResult(i));
|
|
242
|
+
*this = rsNew;
|
|
243
|
+
|
|
244
|
+
return vTranslation[Player];
|
|
245
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// R�mi Coulom
|
|
4
|
+
//
|
|
5
|
+
// December, 2004
|
|
6
|
+
//
|
|
7
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#ifndef CResultSet_Declared
|
|
9
|
+
#define CResultSet_Declared
|
|
10
|
+
|
|
11
|
+
#include <vector>
|
|
12
|
+
#include <string>
|
|
13
|
+
|
|
14
|
+
class CResultSet // rs
|
|
15
|
+
{
|
|
16
|
+
private: //////////////////////////////////////////////////////////////////
|
|
17
|
+
std::vector<unsigned> vWhite;
|
|
18
|
+
std::vector<unsigned> vBlack;
|
|
19
|
+
std::vector<unsigned> vResult;
|
|
20
|
+
|
|
21
|
+
unsigned Players;
|
|
22
|
+
|
|
23
|
+
public: ///////////////////////////////////////////////////////////////////
|
|
24
|
+
CResultSet(): Players(0) {}
|
|
25
|
+
CResultSet(const CResultSet &rs, int Player);
|
|
26
|
+
CResultSet(const CResultSet &rs, int Player1, int Player2);
|
|
27
|
+
|
|
28
|
+
unsigned GetPlayers() const {return Players;}
|
|
29
|
+
int GetGames() const {return vResult.size();}
|
|
30
|
+
int CountGames(unsigned Player) const;
|
|
31
|
+
|
|
32
|
+
int GetWhite(int i) const {return vWhite[i];}
|
|
33
|
+
int GetBlack(int i) const {return vBlack[i];}
|
|
34
|
+
int GetResult(int i) const {return vResult[i];}
|
|
35
|
+
|
|
36
|
+
void Reset();
|
|
37
|
+
void Append(unsigned w, unsigned b, unsigned r);
|
|
38
|
+
void RemoveGame(int Index);
|
|
39
|
+
void RemovePlayer(unsigned Player);
|
|
40
|
+
void RemoveRarePlayers(int Threshold);
|
|
41
|
+
|
|
42
|
+
void PackPlayers(std::vector<std::string> &vName);
|
|
43
|
+
|
|
44
|
+
void Extract(CResultSet &rs1, CResultSet &rs2, unsigned Seed) const;
|
|
45
|
+
int Connect(unsigned Player,
|
|
46
|
+
int ForbiddenResult,
|
|
47
|
+
std::vector<std::string> &vecName);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
#endif
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
//
|
|
3
|
+
// Remi Coulom
|
|
4
|
+
//
|
|
5
|
+
// December, 2004
|
|
6
|
+
//
|
|
7
|
+
////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
#include "CResultSetCUI.h"
|
|
9
|
+
#include "CResultSet.h"
|
|
10
|
+
#include "CCondensedResults.h"
|
|
11
|
+
#include "CEloRatingCUI.h"
|
|
12
|
+
#include "EloDataFromFile.h"
|
|
13
|
+
#include "pgnlex.h"
|
|
14
|
+
#include "pgn.h"
|
|
15
|
+
#include "debug.h"
|
|
16
|
+
|
|
17
|
+
#include <iostream>
|
|
18
|
+
#include <iomanip>
|
|
19
|
+
#include <sstream>
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <fstream>
|
|
22
|
+
|
|
23
|
+
////////////////////////////////////////////////////////////////////////////
|
|
24
|
+
// Constructor
|
|
25
|
+
////////////////////////////////////////////////////////////////////////////
|
|
26
|
+
CResultSetCUI::CResultSetCUI(CResultSet &rsInit,
|
|
27
|
+
std::vector<std::string> &vecNameInit,
|
|
28
|
+
CConsoleUI *pcui,
|
|
29
|
+
int openmode) :
|
|
30
|
+
CConsoleUI(pcui, openmode),
|
|
31
|
+
rs(rsInit),
|
|
32
|
+
vecName(vecNameInit)
|
|
33
|
+
{
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
////////////////////////////////////////////////////////////////////////////
|
|
37
|
+
// Local prompt
|
|
38
|
+
////////////////////////////////////////////////////////////////////////////
|
|
39
|
+
void CResultSetCUI::PrintLocalPrompt(std::ostream &out)
|
|
40
|
+
{
|
|
41
|
+
out << "ResultSet";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
////////////////////////////////////////////////////////////////////////////
|
|
45
|
+
// Command strings
|
|
46
|
+
////////////////////////////////////////////////////////////////////////////
|
|
47
|
+
const char * const CResultSetCUI::tszCommands[] =
|
|
48
|
+
{
|
|
49
|
+
"?",
|
|
50
|
+
"players",
|
|
51
|
+
"names",
|
|
52
|
+
"results",
|
|
53
|
+
"pgn",
|
|
54
|
+
"reset",
|
|
55
|
+
"addplayer",
|
|
56
|
+
"addresult",
|
|
57
|
+
"removeresult",
|
|
58
|
+
"removeplayer",
|
|
59
|
+
"removerare",
|
|
60
|
+
"pack",
|
|
61
|
+
"readpgn",
|
|
62
|
+
"gen",
|
|
63
|
+
"connect",
|
|
64
|
+
"elo",
|
|
65
|
+
0
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
////////////////////////////////////////////////////////////////////////////
|
|
69
|
+
// Compute player width
|
|
70
|
+
////////////////////////////////////////////////////////////////////////////
|
|
71
|
+
unsigned CResultSetCUI::ComputePlayerWidth() const
|
|
72
|
+
{
|
|
73
|
+
unsigned Result = 14;
|
|
74
|
+
for (int i = vecName.size(); --i >= 0;)
|
|
75
|
+
if (vecName[i].size() > Result)
|
|
76
|
+
Result = vecName[i].length();
|
|
77
|
+
return Result;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
////////////////////////////////////////////////////////////////////////////
|
|
81
|
+
// Process commands
|
|
82
|
+
////////////////////////////////////////////////////////////////////////////
|
|
83
|
+
int CResultSetCUI::ProcessCommand(const char *pszCommand,
|
|
84
|
+
const char *pszParameters,
|
|
85
|
+
std::istream &in,
|
|
86
|
+
std::ostream &out)
|
|
87
|
+
{
|
|
88
|
+
enum
|
|
89
|
+
{
|
|
90
|
+
IDC_Help,
|
|
91
|
+
IDC_Players,
|
|
92
|
+
IDC_Names,
|
|
93
|
+
IDC_Results,
|
|
94
|
+
IDC_PGN,
|
|
95
|
+
IDC_Reset,
|
|
96
|
+
IDC_AddPlayer,
|
|
97
|
+
IDC_AddResult,
|
|
98
|
+
IDC_RemoveResult,
|
|
99
|
+
IDC_RemovePlayer,
|
|
100
|
+
IDC_RemoveRare,
|
|
101
|
+
IDC_Pack,
|
|
102
|
+
IDC_ReadPGN,
|
|
103
|
+
IDC_Gen,
|
|
104
|
+
IDC_Connect,
|
|
105
|
+
IDC_Elo
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
switch (ArrayLookup(pszCommand, tszCommands))
|
|
109
|
+
{
|
|
110
|
+
case IDC_Help: ///////////////////////////////////////////////////////////
|
|
111
|
+
CConsoleUI::ProcessCommand(pszCommand, pszParameters, in, out);
|
|
112
|
+
out << "ResultSet commands\n";
|
|
113
|
+
out << "~~~~~~~~~~~~~~~~~~\n";
|
|
114
|
+
out << "players ......... list players\n";
|
|
115
|
+
out << "names ........... alphabetical list of player names\n";
|
|
116
|
+
out << "results ......... list game results\n";
|
|
117
|
+
out << "pgn ............. write results in PGN format\n";
|
|
118
|
+
out << '\n';
|
|
119
|
+
out << "reset ........... reset results and players\n";
|
|
120
|
+
out << "addplayer <pn> .. add one player with name <pn>\n";
|
|
121
|
+
out << "addresult w b r . add result (w = white, b = black, r = result)\n";
|
|
122
|
+
out << " r = 0 (b wins), 1 (draw), or 2 (w wins)\n";
|
|
123
|
+
out << "removeresult n .. remove result number\n";
|
|
124
|
+
out << "removeplayer n .. remove games of player n\n";
|
|
125
|
+
out << "removerare n .... remove games of players with less than n games\n";
|
|
126
|
+
out << "pack ............ pack players (remove players with 0 games)\n";
|
|
127
|
+
out << "readpgn <file>... read PGN file\n";
|
|
128
|
+
out << "connect [p] [fr] remove players not connected to p [fr=forbidden result]\n";
|
|
129
|
+
out << '\n';
|
|
130
|
+
out << "elo ............. open Elo-estimation interface\n";
|
|
131
|
+
out << '\n';
|
|
132
|
+
break;
|
|
133
|
+
|
|
134
|
+
case IDC_Players: ////////////////////////////////////////////////////////
|
|
135
|
+
{
|
|
136
|
+
CCondensedResults crs(rs);
|
|
137
|
+
std::ios::fmtflags f = out.flags();
|
|
138
|
+
int PlayerWidth = ComputePlayerWidth();
|
|
139
|
+
|
|
140
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
141
|
+
out << std::setw(4) << "Num." << ' ';
|
|
142
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
143
|
+
out << std::setw(PlayerWidth) << "Name" << ' ';
|
|
144
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
145
|
+
out << std::setw(6) << "games" << ' ';
|
|
146
|
+
out << std::setw(7) << "score" << ' ';
|
|
147
|
+
out << '\n';
|
|
148
|
+
|
|
149
|
+
for (unsigned i = 0; i < vecName.size(); i++)
|
|
150
|
+
{
|
|
151
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
152
|
+
out << std::setw(4) << i << ' ';
|
|
153
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
154
|
+
out << std::setw(PlayerWidth) << vecName[i] << ' ';
|
|
155
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
156
|
+
if (i < unsigned(crs.GetPlayers()))
|
|
157
|
+
{
|
|
158
|
+
out << std::setw(6) << crs.CountGames(i) << ' ';
|
|
159
|
+
out << std::setw(7) << double(crs.Score(i)) / 2 << ' ';
|
|
160
|
+
}
|
|
161
|
+
else
|
|
162
|
+
{
|
|
163
|
+
out << std::setw(6) << 0 << ' ';
|
|
164
|
+
out << std::setw(7) << 0 << ' ';
|
|
165
|
+
}
|
|
166
|
+
out << '\n';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
out.flags(f);
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
|
|
173
|
+
case IDC_Names: //////////////////////////////////////////////////////////
|
|
174
|
+
{
|
|
175
|
+
std::vector<std::string> vecSorted = vecName;
|
|
176
|
+
std::sort(vecSorted.begin(), vecSorted.end());
|
|
177
|
+
for (unsigned i = 0; i < vecSorted.size(); i++)
|
|
178
|
+
out << vecSorted[i] << '\n';
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
|
|
182
|
+
case IDC_Results: ////////////////////////////////////////////////////////
|
|
183
|
+
{
|
|
184
|
+
std::ios::fmtflags f = out.flags();
|
|
185
|
+
int PlayerWidth = ComputePlayerWidth();
|
|
186
|
+
|
|
187
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
188
|
+
out << std::setw(6) << "Game";
|
|
189
|
+
out << std::setw(6) << "White";
|
|
190
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
191
|
+
out << std::setw(PlayerWidth + 1) << " Name of White";
|
|
192
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
193
|
+
out << std::setw(6) << "Black";
|
|
194
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
195
|
+
out << std::setw(PlayerWidth + 1) << " Name of Black";
|
|
196
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
197
|
+
out << std::setw(7) << "Result";
|
|
198
|
+
out << '\n';
|
|
199
|
+
for (int i = 0; i < rs.GetGames(); i++)
|
|
200
|
+
{
|
|
201
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
202
|
+
out << std::setw(6) << i;
|
|
203
|
+
out << std::setw(6) << rs.GetWhite(i);
|
|
204
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
205
|
+
out << ' ' << std::setw(PlayerWidth) << vecName[rs.GetWhite(i)];
|
|
206
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
207
|
+
out << std::setw(6) << rs.GetBlack(i);
|
|
208
|
+
out.setf(std::ios::left, std::ios::adjustfield);
|
|
209
|
+
out << ' ' << std::setw(PlayerWidth) << vecName[rs.GetBlack(i)];
|
|
210
|
+
out.setf(std::ios::right, std::ios::adjustfield);
|
|
211
|
+
out << std::setw(7);
|
|
212
|
+
switch(rs.GetResult(i))
|
|
213
|
+
{
|
|
214
|
+
case 0: out << "0-1"; break;
|
|
215
|
+
case 1: out << "1/2"; break;
|
|
216
|
+
case 2: out << "1-0"; break;
|
|
217
|
+
case 3: out << " * "; break;
|
|
218
|
+
}
|
|
219
|
+
out << '\n';
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
out.flags(f);
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
|
|
226
|
+
case IDC_PGN: ////////////////////////////////////////////////////////////
|
|
227
|
+
{
|
|
228
|
+
for (int i = 0; i < rs.GetGames(); i++)
|
|
229
|
+
{
|
|
230
|
+
CPGN::WriteTag(CPGN::TAG_White, vecName[rs.GetWhite(i)].c_str(), out);
|
|
231
|
+
CPGN::WriteTag(CPGN::TAG_Black, vecName[rs.GetBlack(i)].c_str(), out);
|
|
232
|
+
CPGN::WriteTag(CPGN::TAG_Result, CPGN::tszResult[rs.GetResult(i)], out);
|
|
233
|
+
out << CPGN::tszResult[rs.GetResult(i)] << "\n\n";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
|
|
238
|
+
case IDC_Reset: //////////////////////////////////////////////////////////
|
|
239
|
+
rs.Reset();
|
|
240
|
+
vecName.clear();
|
|
241
|
+
break;
|
|
242
|
+
|
|
243
|
+
case IDC_AddPlayer: //////////////////////////////////////////////////////
|
|
244
|
+
vecName.push_back(pszParameters);
|
|
245
|
+
break;
|
|
246
|
+
|
|
247
|
+
case IDC_AddResult: //////////////////////////////////////////////////////
|
|
248
|
+
{
|
|
249
|
+
unsigned White = 0;
|
|
250
|
+
unsigned Black = 0;
|
|
251
|
+
unsigned Result = 0;
|
|
252
|
+
std::istringstream(pszParameters) >> White >> Black >> Result;
|
|
253
|
+
if (White < vecName.size() && Black < vecName.size())
|
|
254
|
+
if (Result <= 2)
|
|
255
|
+
rs.Append(White, Black, Result);
|
|
256
|
+
else
|
|
257
|
+
out << "Error: no such result\n";
|
|
258
|
+
else
|
|
259
|
+
out << "Error: no such player\n";
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
|
|
263
|
+
case IDC_RemoveResult: ///////////////////////////////////////////////////
|
|
264
|
+
{
|
|
265
|
+
int n = -1;
|
|
266
|
+
std::istringstream(pszParameters) >> n;
|
|
267
|
+
if (n >= 0 && n < rs.GetGames())
|
|
268
|
+
rs.RemoveGame(n);
|
|
269
|
+
else
|
|
270
|
+
out << "error: bad result number\n";
|
|
271
|
+
}
|
|
272
|
+
break;
|
|
273
|
+
|
|
274
|
+
case IDC_RemovePlayer: ///////////////////////////////////////////////////
|
|
275
|
+
{
|
|
276
|
+
int n = -1;
|
|
277
|
+
std::istringstream(pszParameters) >> n;
|
|
278
|
+
if (n >= 0)
|
|
279
|
+
rs.RemovePlayer(n);
|
|
280
|
+
}
|
|
281
|
+
break;
|
|
282
|
+
|
|
283
|
+
case IDC_RemoveRare: /////////////////////////////////////////////////////
|
|
284
|
+
{
|
|
285
|
+
int n = -1;
|
|
286
|
+
std::istringstream(pszParameters) >> n;
|
|
287
|
+
rs.RemoveRarePlayers(n);
|
|
288
|
+
}
|
|
289
|
+
break;
|
|
290
|
+
|
|
291
|
+
case IDC_Pack: ///////////////////////////////////////////////////////////
|
|
292
|
+
rs.PackPlayers(vecName);
|
|
293
|
+
break;
|
|
294
|
+
|
|
295
|
+
case IDC_ReadPGN: ////////////////////////////////////////////////////////
|
|
296
|
+
{
|
|
297
|
+
std::ifstream ifs(pszParameters);
|
|
298
|
+
CPGNLex pgnlex(ifs);
|
|
299
|
+
EloDataFromFile(pgnlex, rs, vecName);
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
|
|
303
|
+
case IDC_Gen: ////////////////////////////////////////////////////////////
|
|
304
|
+
{
|
|
305
|
+
int Games = 0;
|
|
306
|
+
std::vector<double> velo;
|
|
307
|
+
std::istringstream is(pszParameters);
|
|
308
|
+
is >> Games;
|
|
309
|
+
out << Games << " games\n";
|
|
310
|
+
while(!is.eof())
|
|
311
|
+
{
|
|
312
|
+
double elo = 0;
|
|
313
|
+
is >> elo;
|
|
314
|
+
velo.push_back(elo);
|
|
315
|
+
out << elo << ' ';
|
|
316
|
+
}
|
|
317
|
+
out << '\n';
|
|
318
|
+
|
|
319
|
+
rs.Reset();
|
|
320
|
+
vecName.clear();
|
|
321
|
+
vecName.push_back("player 1");
|
|
322
|
+
vecName.push_back("player 2");
|
|
323
|
+
for (int i = 1000; --i >= 0;)
|
|
324
|
+
{
|
|
325
|
+
rs.Append(0, 1, 2);
|
|
326
|
+
rs.Append(1, 0, 1);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
|
|
331
|
+
case IDC_Connect: ////////////////////////////////////////////////////////
|
|
332
|
+
{
|
|
333
|
+
int Player = 0;
|
|
334
|
+
int ForbiddenResult = 3;
|
|
335
|
+
std::istringstream(pszParameters) >> Player >> ForbiddenResult;
|
|
336
|
+
int NewPlayer = rs.Connect(Player, ForbiddenResult, vecName);
|
|
337
|
+
out << rs.GetPlayers() << " players left\n";
|
|
338
|
+
if (NewPlayer != Player)
|
|
339
|
+
out << "Player " << Player << " is now " << NewPlayer << '\n';
|
|
340
|
+
}
|
|
341
|
+
break;
|
|
342
|
+
|
|
343
|
+
case IDC_Elo: ////////////////////////////////////////////////////////////
|
|
344
|
+
{
|
|
345
|
+
CEloRatingCUI ercui(rs, vecName, this);
|
|
346
|
+
ercui.MainLoop(in, out);
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
|
|
350
|
+
default: /////////////////////////////////////////////////////////////////
|
|
351
|
+
return CConsoleUI::ProcessCommand(pszCommand, pszParameters, in, out);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return PC_Continue;
|
|
355
|
+
}
|