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,253 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // R�mi Coulom
4
+ //
5
+ // December, 2004
6
+ //
7
+ /////////////////////////////////////////////////////////////////////////////
8
+ #include "CCondensedResults.h"
9
+ #include "CResultSet.h"
10
+ #include "debug.h"
11
+
12
+ #include <set>
13
+ #include <iostream>
14
+
15
+ /////////////////////////////////////////////////////////////////////////////
16
+ // Constructor
17
+ /////////////////////////////////////////////////////////////////////////////
18
+ CCondensedResults::CCondensedResults(const CResultSet &rs) :
19
+ Players(rs.GetPlayers())
20
+ {
21
+ pOpponents = new int[Players];
22
+ ppcr = new CCondensedResult*[Players];
23
+
24
+ //
25
+ // Count opponents of each player
26
+ //
27
+ {
28
+ std::set<int> *pset = new std::set<int>[Players];
29
+
30
+ for (int i = rs.GetGames(); --i >= 0;)
31
+ {
32
+ int White = rs.GetWhite(i);
33
+ int Black = rs.GetBlack(i);
34
+ pset[White].insert(Black);
35
+ pset[Black].insert(White);
36
+ }
37
+
38
+ for (int i = Players; --i >= 0;)
39
+ {
40
+ pOpponents[i] = pset[i].size();
41
+ ppcr[i] = new CCondensedResult[pOpponents[i]];
42
+ for (int j = pOpponents[i]; --j >= 0;)
43
+ ppcr[i][j].Reset();
44
+ }
45
+
46
+ delete[] pset;
47
+ }
48
+
49
+ //
50
+ // Fill-in all CCondensedResult's
51
+ //
52
+ for (int i = rs.GetGames(); --i >= 0;)
53
+ {
54
+ int White = rs.GetWhite(i);
55
+ int Black = rs.GetBlack(i);
56
+
57
+ CCondensedResult &crWhite = FindOpponent(White, Black);
58
+ CCondensedResult &crBlack = FindOpponent(Black, White);
59
+ crWhite.TrueGames++;
60
+ crBlack.TrueGames++;
61
+
62
+ switch(rs.GetResult(i))
63
+ {
64
+ case 0: //////////////////////////////////////////////////////////////////
65
+ crWhite.l_ij++;
66
+ crBlack.l_ji++;
67
+ break;
68
+
69
+ case 1: //////////////////////////////////////////////////////////////////
70
+ crWhite.d_ij++;
71
+ crBlack.d_ji++;
72
+ break;
73
+
74
+ case 2: //////////////////////////////////////////////////////////////////
75
+ crWhite.w_ij++;
76
+ crBlack.w_ji++;
77
+ break;
78
+ }
79
+ }
80
+ }
81
+
82
+ /////////////////////////////////////////////////////////////////////////////
83
+ // Add prior
84
+ /////////////////////////////////////////////////////////////////////////////
85
+ void CCondensedResults::AddPrior(float PriorDraw)
86
+ {
87
+ for (int i = Players; --i >= 0;)
88
+ {
89
+ float Prior = PriorDraw * 0.25 / CountTrueGames(i);
90
+ for (int j = pOpponents[i]; --j >= 0;)
91
+ {
92
+ CCondensedResult &crPlayer = ppcr[i][j];
93
+ CCondensedResult &crOpponent = FindOpponent(crPlayer.Opponent, i);
94
+ float ThisPrior = Prior * crPlayer.TrueGames;
95
+ crPlayer.d_ij += ThisPrior;
96
+ crPlayer.d_ji += ThisPrior;
97
+ crOpponent.d_ij += ThisPrior;
98
+ crOpponent.d_ji += ThisPrior;
99
+ }
100
+ }
101
+ }
102
+
103
+ /////////////////////////////////////////////////////////////////////////////
104
+ // Reset
105
+ /////////////////////////////////////////////////////////////////////////////
106
+ void CCondensedResult::Reset()
107
+ {
108
+ Opponent = -1;
109
+ TrueGames = 0;
110
+ w_ij = 0;
111
+ d_ij = 0;
112
+ l_ij = 0;
113
+ w_ji = 0;
114
+ d_ji = 0;
115
+ l_ji = 0;
116
+ }
117
+
118
+ /////////////////////////////////////////////////////////////////////////////
119
+ // Find Opponent
120
+ /////////////////////////////////////////////////////////////////////////////
121
+ CCondensedResult &CCondensedResults::FindOpponent(int Player, int Opponent)
122
+ {
123
+ for (int i = pOpponents[Player]; --i >= 0;)
124
+ {
125
+ CCondensedResult &cr = ppcr[Player][i];
126
+ if (cr.Opponent == Opponent)
127
+ return cr;
128
+ if (cr.Opponent < 0)
129
+ {
130
+ cr.Opponent = Opponent;
131
+ return cr;
132
+ }
133
+ }
134
+
135
+ FATAL(1);
136
+ return ppcr[Player][0];
137
+ }
138
+
139
+ /////////////////////////////////////////////////////////////////////////////
140
+ // Count the number of true games played by one player
141
+ /////////////////////////////////////////////////////////////////////////////
142
+ int CCondensedResults::CountTrueGames(int Player) const
143
+ {
144
+ int Result = 0;
145
+ for (int i = pOpponents[Player]; --i >= 0;)
146
+ {
147
+ CCondensedResult &cr = ppcr[Player][i];
148
+ Result += cr.TrueGames;
149
+ }
150
+ return Result;
151
+ }
152
+
153
+ /////////////////////////////////////////////////////////////////////////////
154
+ // Evaluate the average opponent of one player
155
+ /////////////////////////////////////////////////////////////////////////////
156
+ double CCondensedResults::AverageOpponent(int Player, const double *pelo) const
157
+ {
158
+ double Total = 0;
159
+ int GameCount = 0;
160
+ for (int i = pOpponents[Player]; --i >= 0;)
161
+ {
162
+ CCondensedResult &cr = ppcr[Player][i];
163
+ Total += cr.TrueGames * pelo[cr.Opponent];
164
+ GameCount += cr.TrueGames;
165
+ }
166
+
167
+ if (GameCount)
168
+ return Total / GameCount;
169
+ else
170
+ return 0;
171
+ }
172
+
173
+ /////////////////////////////////////////////////////////////////////////////
174
+ // Count the number of games played by one player
175
+ /////////////////////////////////////////////////////////////////////////////
176
+ float CCondensedResults::CountGames(int Player) const
177
+ {
178
+ float Result = 0;
179
+ for (int i = pOpponents[Player]; --i >= 0;)
180
+ {
181
+ CCondensedResult &cr = ppcr[Player][i];
182
+ Result += cr.w_ij + cr.d_ij + cr.l_ij + cr.w_ji + cr.d_ji + cr.l_ji;
183
+ }
184
+ return Result;
185
+ }
186
+
187
+ /////////////////////////////////////////////////////////////////////////////
188
+ // Count the number of draws played by one player
189
+ /////////////////////////////////////////////////////////////////////////////
190
+ float CCondensedResults::CountDraws(int Player) const
191
+ {
192
+ float Result = 0;
193
+ for (int i = pOpponents[Player]; --i >= 0;)
194
+ {
195
+ CCondensedResult &cr = ppcr[Player][i];
196
+ Result += cr.d_ij + cr.d_ji;
197
+ }
198
+ return Result;
199
+ }
200
+
201
+ /////////////////////////////////////////////////////////////////////////////
202
+ // Get the score of one player
203
+ /////////////////////////////////////////////////////////////////////////////
204
+ float CCondensedResults::Score(int Player) const
205
+ {
206
+ float Result = 0;
207
+ for (int i = pOpponents[Player]; --i >= 0;)
208
+ {
209
+ CCondensedResult &cr = ppcr[Player][i];
210
+ Result += 2 * cr.w_ij + cr.d_ij + cr.d_ji + 2 * cr.l_ji;
211
+ }
212
+ return Result;
213
+ }
214
+
215
+ /////////////////////////////////////////////////////////////////////////////
216
+ // Destructor
217
+ /////////////////////////////////////////////////////////////////////////////
218
+ CCondensedResults::~CCondensedResults()
219
+ {
220
+ for (int i = Players; --i >= 0;)
221
+ delete[] ppcr[i];
222
+ delete[] ppcr;
223
+ delete[] pOpponents;
224
+ }
225
+
226
+ /////////////////////////////////////////////////////////////////////////////
227
+ // Dump
228
+ /////////////////////////////////////////////////////////////////////////////
229
+ void CCondensedResults::Dump(std::ostream &out) const
230
+ {
231
+ out << "Players = " << Players << '\n';
232
+ for (int i = 0; i < Players; i++)
233
+ {
234
+ out << "Player " << i << '\n';
235
+ out << "pOpponents[i] = " << pOpponents[i] << '\n';
236
+ out << "CountTrueGames(i) = " << CountTrueGames(i) << '\n';
237
+ for (int j = 0; j < pOpponents[i]; j++)
238
+ {
239
+ const CCondensedResult &cr = ppcr[i][j];
240
+ out << "Opponent " << j << " = " << cr.Opponent << '\n';
241
+ out << "TrueGames = " << cr.TrueGames << '\n';
242
+ out << "w_ij = " << cr.w_ij << ' ';
243
+ out << "d_ij = " << cr.d_ij << ' ';
244
+ out << "l_ij = " << cr.l_ij << ' ';
245
+ out << "w_ji = " << cr.w_ji << ' ';
246
+ out << "d_ji = " << cr.d_ji << ' ';
247
+ out << "l_ji = " << cr.l_ji;
248
+ out << '\n';
249
+ }
250
+ out << '\n';
251
+ }
252
+ out.flush();
253
+ }
@@ -0,0 +1,64 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // R�mi Coulom
4
+ //
5
+ // December, 2004
6
+ //
7
+ /////////////////////////////////////////////////////////////////////////////
8
+ #ifndef CCondensedResults_Declared
9
+ #define CCondensedResults_Declared
10
+
11
+ #include <iosfwd>
12
+
13
+ class CResultSet;
14
+
15
+ class CCondensedResult // cr
16
+ {
17
+ public:
18
+ int Opponent;
19
+ int TrueGames;
20
+ float w_ij;
21
+ float d_ij;
22
+ float l_ij;
23
+ float w_ji;
24
+ float d_ji;
25
+ float l_ji;
26
+
27
+ void Reset();
28
+ float Games() const {return w_ij + d_ij + l_ij + w_ji + d_ji + l_ji;}
29
+ float Score() const {return w_ij + l_ji + (d_ij + d_ji) * 0.5;}
30
+ };
31
+
32
+ class CCondensedResults // crs
33
+ {
34
+ private: ///////////////////////////////////////////////////////////////////
35
+ int Players;
36
+ int *pOpponents;
37
+ CCondensedResult **ppcr;
38
+
39
+ public: ////////////////////////////////////////////////////////////////////
40
+ CCondensedResults(const CResultSet &rs);
41
+
42
+ void AddPrior(float PriorDraw);
43
+
44
+ int GetPlayers() const {return Players;}
45
+ int GetOpponents(int Player) const {return pOpponents[Player];}
46
+
47
+ const CCondensedResult &GetCondensedResult(int Player, int i) const
48
+ {return ppcr[Player][i];}
49
+ CCondensedResult &GetCondensedResult(int Player, int i)
50
+ {return ppcr[Player][i];}
51
+ CCondensedResult &FindOpponent(int Player, int Opponent);
52
+
53
+ float CountGames(int Player) const;
54
+ int CountTrueGames(int Player) const;
55
+ float CountDraws(int Player) const;
56
+ float Score(int Player) const; // win = 2, draw = 1
57
+ double AverageOpponent(int Player, const double *pelo) const;
58
+
59
+ void Dump(std::ostream &out) const;
60
+
61
+ ~CCondensedResults();
62
+ };
63
+
64
+ #endif
@@ -0,0 +1,40 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // R�mi Coulom
4
+ //
5
+ // January, 2005
6
+ //
7
+ /////////////////////////////////////////////////////////////////////////////
8
+ #ifndef CDiscretization_Declared
9
+ #define CDiscretization_Declared
10
+
11
+ class CDiscretization
12
+ {
13
+ protected: /////////////////////////////////////////////////////////////////
14
+ const int Size;
15
+ const double Min;
16
+ const double Max;
17
+
18
+ public: ////////////////////////////////////////////////////////////////////
19
+ CDiscretization(int SizeInit, double MinInit, double MaxInit):
20
+ Size(SizeInit),
21
+ Min(MinInit),
22
+ Max(MaxInit)
23
+ {}
24
+
25
+ int GetDiscretizationSize() const {return Size;}
26
+
27
+ int IndexFromValue(double x) const
28
+ {
29
+ return int(0.5 + (Size - 1) * (x - Min) / (Max - Min));
30
+ }
31
+
32
+ double ValueFromIndex(int i) const
33
+ {
34
+ return Min + ((i + 0.5) * (Max - Min)) / Size;
35
+ }
36
+
37
+ virtual ~CDiscretization() {}
38
+ };
39
+
40
+ #endif
@@ -0,0 +1,123 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // R�mi Coulom
4
+ //
5
+ // December, 2004
6
+ //
7
+ /////////////////////////////////////////////////////////////////////////////
8
+ #include "CDistribution.h"
9
+
10
+ #include <cmath>
11
+
12
+ /////////////////////////////////////////////////////////////////////////////
13
+ // reset to zero
14
+ /////////////////////////////////////////////////////////////////////////////
15
+ void CDistribution::Reset()
16
+ {
17
+ for (int i = vDistribution.size(); --i >= 0;)
18
+ vDistribution[i] = 0;
19
+ }
20
+
21
+ /////////////////////////////////////////////////////////////////////////////
22
+ // set to uniform distribution
23
+ /////////////////////////////////////////////////////////////////////////////
24
+ void CDistribution::SetUniform()
25
+ {
26
+ for (int i = vDistribution.size(); --i >= 0;)
27
+ vDistribution[i] = 1;
28
+ }
29
+
30
+ /////////////////////////////////////////////////////////////////////////////
31
+ // normalize
32
+ /////////////////////////////////////////////////////////////////////////////
33
+ void CDistribution::Normalize()
34
+ {
35
+ double Total = 0;
36
+ for (int i = vDistribution.size(); --i >= 0;)
37
+ Total += vDistribution[i];
38
+ if (Total > 0)
39
+ for (int i = vDistribution.size(); --i >= 0;)
40
+ vDistribution[i] /= Total;
41
+ }
42
+
43
+ /////////////////////////////////////////////////////////////////////////////
44
+ // Normalize, assuming the distribution contains log-likelihoods
45
+ /////////////////////////////////////////////////////////////////////////////
46
+ void CDistribution::LogNormalize()
47
+ {
48
+ double Max = vDistribution[0];
49
+ for (int i = vDistribution.size(); --i > 0;)
50
+ if (vDistribution[i] > Max)
51
+ Max = vDistribution[i];
52
+
53
+ for (int i = vDistribution.size(); --i >= 0;)
54
+ vDistribution[i] = std::exp(vDistribution[i] - Max);
55
+
56
+ Normalize();
57
+ }
58
+
59
+ /////////////////////////////////////////////////////////////////////////////
60
+ // Discrete GetBound
61
+ /////////////////////////////////////////////////////////////////////////////
62
+ int CDistribution::GetBoundIndex(double Confidence,
63
+ int Begin,
64
+ int End,
65
+ int Direction) const
66
+ {
67
+ const double Threshold = (1 - Confidence) / 2;
68
+ double P = 0;
69
+
70
+ for (int i = Begin; i != End; i += Direction)
71
+ {
72
+ P += vDistribution[i];
73
+ if (P > Threshold)
74
+ return i;
75
+ }
76
+
77
+ return End;
78
+ }
79
+
80
+ /////////////////////////////////////////////////////////////////////////////
81
+ // Discrete lower bound
82
+ /////////////////////////////////////////////////////////////////////////////
83
+ int CDistribution::GetLowerIndex(double Confidence) const
84
+ {
85
+ return GetBoundIndex(Confidence, 0, vDistribution.size(), +1);
86
+ }
87
+
88
+ /////////////////////////////////////////////////////////////////////////////
89
+ // Discrete upper bound
90
+ /////////////////////////////////////////////////////////////////////////////
91
+ int CDistribution::GetUpperIndex(double Confidence) const
92
+ {
93
+ return GetBoundIndex(Confidence, vDistribution.size() - 1, -1, -1);
94
+ }
95
+
96
+ /////////////////////////////////////////////////////////////////////////////
97
+ // Binomial distribution
98
+ /////////////////////////////////////////////////////////////////////////////
99
+ CDistribution BinomialDistribution(double p)
100
+ {
101
+ CDistribution distResult(2);
102
+ distResult.vDistribution[0] = 1 - p;
103
+ distResult.vDistribution[1] = p;
104
+ return distResult;
105
+ }
106
+
107
+ /////////////////////////////////////////////////////////////////////////////
108
+ // Distribution of the sum
109
+ /////////////////////////////////////////////////////////////////////////////
110
+ CDistribution SumDistribution(const CDistribution &dist1,
111
+ const CDistribution &dist2)
112
+ {
113
+ CDistribution distResult(dist1.GetSize() + dist2.GetSize() - 1);
114
+
115
+ distResult.Reset();
116
+
117
+ for (int i1 = dist1.GetSize(); --i1 >= 0;)
118
+ for (int i2 = dist2.GetSize(); --i2 >= 0;)
119
+ distResult.vDistribution[i1 + i2] += dist1.vDistribution[i1] *
120
+ dist2.vDistribution[i2];
121
+
122
+ return distResult;
123
+ }