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.
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 +23 -0
  6. data/Rakefile +54 -0
  7. data/VERSION +1 -0
  8. data/elo-ratings.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/extconf.rb +6 -0
  63. data/ext/bayeselo/list.h +367 -0
  64. data/ext/bayeselo/listi.h +125 -0
  65. data/ext/bayeselo/move.cpp +249 -0
  66. data/ext/bayeselo/move.h +139 -0
  67. data/ext/bayeselo/pgn.h +62 -0
  68. data/ext/bayeselo/pgnlex.cpp +432 -0
  69. data/ext/bayeselo/pgnlex.h +105 -0
  70. data/ext/bayeselo/pgnstr.cpp +126 -0
  71. data/ext/bayeselo/piece.h +44 -0
  72. data/ext/bayeselo/player.h +31 -0
  73. data/ext/bayeselo/position.h +89 -0
  74. data/ext/bayeselo/random.cpp +114 -0
  75. data/ext/bayeselo/random.h +63 -0
  76. data/ext/bayeselo/rb_bayeselo.cpp +76 -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/bayeselo.rb +6 -0
  86. data/lib/bayeselo/bayeselo.rb +11 -0
  87. data/lib/bayeselo/c_bayeselo.rb +7 -0
  88. data/test/bayeselo/test_bayeselo.rb +33 -0
  89. data/test/bayeselo/test_c_bayeselo.rb +84 -0
  90. data/test/helper.rb +18 -0
  91. 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
+ }