all-up-in-your-elo 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.document +5 -0
  2. data/Gemfile +14 -0
  3. data/Gemfile.lock +22 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +42 -0
  6. data/Rakefile +54 -0
  7. data/VERSION +1 -0
  8. data/all-up-in-your-elo.gemspec +148 -0
  9. data/ext/bayeselo/.gitignore +4 -0
  10. data/ext/bayeselo/CBradleyTerry.cpp +670 -0
  11. data/ext/bayeselo/CBradleyTerry.h +137 -0
  12. data/ext/bayeselo/CCDistribution.cpp +135 -0
  13. data/ext/bayeselo/CCDistribution.h +44 -0
  14. data/ext/bayeselo/CCDistributionCUI.cpp +104 -0
  15. data/ext/bayeselo/CCDistributionCUI.h +38 -0
  16. data/ext/bayeselo/CCondensedResults.cpp +253 -0
  17. data/ext/bayeselo/CCondensedResults.h +64 -0
  18. data/ext/bayeselo/CDiscretization.h +40 -0
  19. data/ext/bayeselo/CDistribution.cpp +123 -0
  20. data/ext/bayeselo/CDistribution.h +58 -0
  21. data/ext/bayeselo/CDistributionCollection.cpp +34 -0
  22. data/ext/bayeselo/CDistributionCollection.h +29 -0
  23. data/ext/bayeselo/CEloRatingCUI.cpp +1046 -0
  24. data/ext/bayeselo/CEloRatingCUI.h +67 -0
  25. data/ext/bayeselo/CIndirectCompare.h +28 -0
  26. data/ext/bayeselo/CJointBayesian.cpp +111 -0
  27. data/ext/bayeselo/CJointBayesian.h +38 -0
  28. data/ext/bayeselo/CLUDecomposition.cpp +154 -0
  29. data/ext/bayeselo/CLUDecomposition.h +36 -0
  30. data/ext/bayeselo/CMatrix.cpp +48 -0
  31. data/ext/bayeselo/CMatrix.h +35 -0
  32. data/ext/bayeselo/CMatrixIO.cpp +27 -0
  33. data/ext/bayeselo/CMatrixIO.h +17 -0
  34. data/ext/bayeselo/CPredictionCUI.cpp +393 -0
  35. data/ext/bayeselo/CPredictionCUI.h +50 -0
  36. data/ext/bayeselo/CResultSet.cpp +245 -0
  37. data/ext/bayeselo/CResultSet.h +50 -0
  38. data/ext/bayeselo/CResultSetCUI.cpp +355 -0
  39. data/ext/bayeselo/CResultSetCUI.h +44 -0
  40. data/ext/bayeselo/CTimeIO.cpp +58 -0
  41. data/ext/bayeselo/CTimeIO.h +19 -0
  42. data/ext/bayeselo/CVector.cpp +110 -0
  43. data/ext/bayeselo/CVector.h +42 -0
  44. data/ext/bayeselo/EloDataFromFile.cpp +120 -0
  45. data/ext/bayeselo/EloDataFromFile.h +21 -0
  46. data/ext/bayeselo/README +8 -0
  47. data/ext/bayeselo/ReadLineToString.cpp +32 -0
  48. data/ext/bayeselo/ReadLineToString.h +18 -0
  49. data/ext/bayeselo/chtime.cpp +56 -0
  50. data/ext/bayeselo/chtime.h +61 -0
  51. data/ext/bayeselo/chtimer.h +27 -0
  52. data/ext/bayeselo/clktimer.cpp +178 -0
  53. data/ext/bayeselo/clktimer.h +29 -0
  54. data/ext/bayeselo/consolui.cpp +538 -0
  55. data/ext/bayeselo/consolui.h +154 -0
  56. data/ext/bayeselo/const.cpp +79 -0
  57. data/ext/bayeselo/const.h +42 -0
  58. data/ext/bayeselo/date.cpp +96 -0
  59. data/ext/bayeselo/date.h +44 -0
  60. data/ext/bayeselo/debug.h +58 -0
  61. data/ext/bayeselo/elomain.cpp +26 -0
  62. data/ext/bayeselo/eloratings.cpp +76 -0
  63. data/ext/bayeselo/extconf.rb +6 -0
  64. data/ext/bayeselo/list.h +367 -0
  65. data/ext/bayeselo/listi.h +125 -0
  66. data/ext/bayeselo/move.cpp +249 -0
  67. data/ext/bayeselo/move.h +139 -0
  68. data/ext/bayeselo/pgn.h +62 -0
  69. data/ext/bayeselo/pgnlex.cpp +432 -0
  70. data/ext/bayeselo/pgnlex.h +105 -0
  71. data/ext/bayeselo/pgnstr.cpp +126 -0
  72. data/ext/bayeselo/piece.h +44 -0
  73. data/ext/bayeselo/player.h +31 -0
  74. data/ext/bayeselo/position.h +89 -0
  75. data/ext/bayeselo/random.cpp +114 -0
  76. data/ext/bayeselo/random.h +63 -0
  77. data/ext/bayeselo/readstr.cpp +51 -0
  78. data/ext/bayeselo/readstr.h +19 -0
  79. data/ext/bayeselo/square.h +61 -0
  80. data/ext/bayeselo/str.cpp +81 -0
  81. data/ext/bayeselo/str.h +71 -0
  82. data/ext/bayeselo/version.cpp +30 -0
  83. data/ext/bayeselo/version.h +28 -0
  84. data/ext/bayeselo/version_number.h +1 -0
  85. data/lib/elo_ratings.rb +9 -0
  86. data/lib/elo_ratings/c_bayeselo.rb +5 -0
  87. data/lib/elo_ratings/results.rb +41 -0
  88. data/test/elo_ratings/test_c_bayeselo.rb +84 -0
  89. data/test/elo_ratings/test_results.rb +41 -0
  90. data/test/helper.rb +19 -0
  91. metadata +233 -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
+ }