icu_ratings 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -260,10 +260,10 @@ module ICU
260
260
  end
261
261
  end
262
262
 
263
- def update_performance # :nodoc:
263
+ def update_performance(thresh) # :nodoc:
264
264
  stable = case
265
265
  when @performance && @estimated_performance then
266
- (@performance - @estimated_performance).abs < 0.5
266
+ (@performance - @estimated_performance).abs < thresh
267
267
  when !@performance && !@estimated_performance then
268
268
  true
269
269
  else
@@ -57,6 +57,16 @@ module ICU
57
57
  #
58
58
  # See ICU::RatedPlayer and ICU::RatedResult for more details.
59
59
  #
60
+ # The <em>rate!</em> method takes some optional arguments to control the algoritm, for example:
61
+ #
62
+ # t.rate!(max_iterations2: 30)
63
+ #
64
+ # The complete set of current options is:
65
+ #
66
+ # * <em>max_iterations1</em>: the maximum number of re-estimation iterations before the bonus calculation (default <b>30</b>)
67
+ # * <em>max_iterations2</em>: the maximum number of re-estimation iterations after the bonus calculation (default <b>1</b>)
68
+ # * <em>threshold</em>: the maximum difference allowed between re-estimated ratings in a stabe solution (default <b>0.5</b>)
69
+ #
60
70
  # == Error Handling
61
71
  #
62
72
  # Some of the above methods have the potential to raise RuntimeError exceptions.
@@ -66,12 +76,12 @@ module ICU
66
76
  # of unrated players failed to converge. However an instance of non-convergence
67
77
  # has yet to be observed in practice.
68
78
  #
69
- # Since exception throwing is how errors are signalled, you should arrange for them
70
- # to be caught and handled in some suitable place in your code.
79
+ # Since exception throwing is how errors are signalled, you should arrange
80
+ # for them to be caught and handled in some suitable place in your code.
71
81
  #
72
82
  class RatedTournament
73
83
  attr_accessor :desc
74
- attr_reader :start, :no_bonuses
84
+ attr_reader :start, :no_bonuses, :iterations1, :iterations2
75
85
 
76
86
  # Add a new player to the tournament. Returns the instance of ICU::RatedPlayer created.
77
87
  # See ICU::RatedPlayer for details.
@@ -97,14 +107,19 @@ module ICU
97
107
  end
98
108
 
99
109
  # Rate the tournament. Called after all players and results have been added.
100
- def rate!
110
+ def rate!(opt={})
111
+ max_iterations1 = opt[:max_iterations1] || 30
112
+ max_iterations2 = opt[:max_iterations2] || 1
113
+ threshold = opt[:threshold] || 0.5
101
114
  players.each { |p| p.init }
102
- performance_ratings(30)
115
+ @iterations1 = performance_ratings(max_iterations1, threshold)
103
116
  players.each { |p| p.rate! }
104
117
  if !no_bonuses && calculate_bonuses > 0
105
118
  players.each { |p| p.rate! }
106
- performance_ratings(1)
119
+ @iterations2 = performance_ratings(max_iterations2, threshold)
107
120
  calculate_bonuses
121
+ else
122
+ @iterations2 = 0
108
123
  end
109
124
  end
110
125
 
@@ -123,7 +138,7 @@ module ICU
123
138
  @start = ICU::Util.parsedate!(date)
124
139
  end
125
140
 
126
- # Set whether there are no bonuses (false by default)
141
+ # Set whether there are no bonuses (false by default).
127
142
  def no_bonuses=(no_bonuses)
128
143
  @no_bonuses = no_bonuses ? true : false
129
144
  end
@@ -137,14 +152,15 @@ module ICU
137
152
  end
138
153
 
139
154
  # Calculate performance ratings either iteratively or with just one sweep for bonus calculations.
140
- def performance_ratings(max)
155
+ def performance_ratings(max, thresh)
141
156
  stable, count = false, 0
142
157
  while !stable && count < max
143
158
  @player.values.each { |p| p.estimate_performance }
144
- stable = @player.values.inject(true) { |ok, p| p.update_performance && ok }
159
+ stable = @player.values.inject(true) { |ok, p| p.update_performance(thresh) && ok }
145
160
  count+= 1
146
161
  end
147
162
  raise "performance rating estimation did not converge" if max > 1 && !stable
163
+ count
148
164
  end
149
165
 
150
166
  # Calculate bonuses for all players and return the number who got one.
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ICU
4
4
  class Ratings
5
- VERSION = "1.2.2"
5
+ VERSION = "1.3.0"
6
6
  end
7
7
  end
@@ -994,5 +994,1054 @@ module ICU
994
994
  @p2.new_rating.should be_within(0.5).of(1722)
995
995
  end
996
996
  end
997
+
998
+ context "#rate - Jonathan Peoples in the Irish Junior U12 Championships 2012" do
999
+ before(:each) do
1000
+ @t = ICU::RatedTournament.new(desc: 'Irish U12 Junior Championships 2012')
1001
+
1002
+ @t.add_player(4289, desc: "Jeffrey Alfred", rating: 1090, kfactor: 40)
1003
+ @t.add_player(4290, desc: "Piotr Baczkowski", rating: 557, games: 10)
1004
+ @t.add_player(4291, desc: "Ross Beatty", rating: 890, games: 17)
1005
+ @t.add_player(4292, desc: "Katherine Bolger")
1006
+ @t.add_player(4293, desc: "Liam Coman", rating: 415, games: 16)
1007
+ @t.add_player(4294, desc: "Darragh Flynn", rating: 320, kfactor: 40)
1008
+ @t.add_player(4295, desc: "David Halpenny", rating: 794, games: 8)
1009
+ @t.add_player(4296, desc: "Will Hartery", rating: 288, games: 18)
1010
+ @t.add_player(4297, desc: "Michael Higgins", rating: 839, kfactor: 40)
1011
+ @t.add_player(4298, desc: "Padraig Hughes", rating: 1385, kfactor: 40)
1012
+ @t.add_player(4299, desc: "Mihailo Manojlovic", rating: 742, kfactor: 40)
1013
+ @t.add_player(4300, desc: "Joe McEntegert")
1014
+ @t.add_player(4301, desc: "Tom McGrath", rating: 1058, kfactor: 40)
1015
+ @t.add_player(4302, desc: "Colin McKenna")
1016
+ @t.add_player(4303, desc: "Thomas McStay", rating: 234, games: 6)
1017
+ @t.add_player(4304, desc: "Shane Melaugh", rating: 683, kfactor: 40)
1018
+ @t.add_player(4305, desc: "Diana Mirza", rating: 1485, kfactor: 40)
1019
+ @t.add_player(4306, desc: "Keerthi Mohan", rating: 336, games: 5)
1020
+ @t.add_player(4307, desc: "Ellen Murray", rating: 126, games: 11)
1021
+ @t.add_player(4308, desc: "Eibhia Ni Mhuireagain", rating: 864, kfactor: 40)
1022
+ @t.add_player(4309, desc: "Joe O'Neill")
1023
+ @t.add_player(4310, desc: "Jim O'Reilly", rating: 782, kfactor: 40)
1024
+ @t.add_player(4311, desc: "Jonathon Peoples")
1025
+ @t.add_player(4312, desc: "Nobin Rebi")
1026
+ @t.add_player(4313, desc: "Fiachra Scallan", rating: 1000, kfactor: 40)
1027
+ @t.add_player(4314, desc: "Shanly Sebastian")
1028
+ @t.add_player(4315, desc: "Finnian Wingfield")
1029
+
1030
+ @t.add_result(1, 4289, 4307, "W")
1031
+ @t.add_result(1, 4290, 4309, "W")
1032
+ @t.add_result(1, 4291, 4311, "W")
1033
+ @t.add_result(1, 4292, 4312, "L")
1034
+ @t.add_result(1, 4293, 4303, "D")
1035
+ @t.add_result(1, 4294, 4314, "W")
1036
+ @t.add_result(1, 4295, 4305, "L")
1037
+ @t.add_result(1, 4296, 4298, "L")
1038
+ @t.add_result(1, 4297, 4306, "W")
1039
+ @t.add_result(1, 4298, 4296, "W")
1040
+ @t.add_result(1, 4299, 4301, "W")
1041
+ @t.add_result(1, 4300, 4310, "L")
1042
+ @t.add_result(1, 4301, 4299, "L")
1043
+ @t.add_result(1, 4302, 4313, "L")
1044
+ @t.add_result(1, 4303, 4293, "D")
1045
+ @t.add_result(1, 4304, 4308, "L")
1046
+ @t.add_result(1, 4305, 4295, "W")
1047
+ @t.add_result(1, 4306, 4297, "L")
1048
+ @t.add_result(1, 4307, 4289, "L")
1049
+ @t.add_result(1, 4308, 4304, "W")
1050
+ @t.add_result(1, 4309, 4290, "L")
1051
+ @t.add_result(1, 4310, 4300, "W")
1052
+ @t.add_result(1, 4311, 4291, "L")
1053
+ @t.add_result(1, 4312, 4292, "W")
1054
+ @t.add_result(1, 4313, 4302, "W")
1055
+ @t.add_result(1, 4314, 4294, "L")
1056
+ @t.add_result(2, 4290, 4305, "L")
1057
+ @t.add_result(2, 4291, 4308, "D")
1058
+ @t.add_result(2, 4292, 4302, "W")
1059
+ @t.add_result(2, 4293, 4301, "L")
1060
+ @t.add_result(2, 4294, 4313, "L")
1061
+ @t.add_result(2, 4295, 4306, "W")
1062
+ @t.add_result(2, 4296, 4307, "W")
1063
+ @t.add_result(2, 4297, 4315, "W")
1064
+ @t.add_result(2, 4298, 4314, "W")
1065
+ @t.add_result(2, 4299, 4310, "D")
1066
+ @t.add_result(2, 4300, 4309, "W")
1067
+ @t.add_result(2, 4301, 4293, "W")
1068
+ @t.add_result(2, 4302, 4292, "L")
1069
+ @t.add_result(2, 4303, 4312, "W")
1070
+ @t.add_result(2, 4304, 4311, "L")
1071
+ @t.add_result(2, 4305, 4290, "W")
1072
+ @t.add_result(2, 4306, 4295, "L")
1073
+ @t.add_result(2, 4307, 4296, "L")
1074
+ @t.add_result(2, 4308, 4291, "D")
1075
+ @t.add_result(2, 4309, 4300, "L")
1076
+ @t.add_result(2, 4310, 4299, "D")
1077
+ @t.add_result(2, 4311, 4304, "W")
1078
+ @t.add_result(2, 4312, 4303, "L")
1079
+ @t.add_result(2, 4313, 4294, "W")
1080
+ @t.add_result(2, 4314, 4298, "L")
1081
+ @t.add_result(2, 4315, 4297, "L")
1082
+ @t.add_result(3, 4289, 4291, "W")
1083
+ @t.add_result(3, 4290, 4311, "L")
1084
+ @t.add_result(3, 4291, 4289, "L")
1085
+ @t.add_result(3, 4292, 4315, "L")
1086
+ @t.add_result(3, 4293, 4302, "W")
1087
+ @t.add_result(3, 4294, 4300, "L")
1088
+ @t.add_result(3, 4295, 4312, "W")
1089
+ @t.add_result(3, 4296, 4301, "L")
1090
+ @t.add_result(3, 4297, 4298, "L")
1091
+ @t.add_result(3, 4298, 4297, "W")
1092
+ @t.add_result(3, 4299, 4308, "W")
1093
+ @t.add_result(3, 4300, 4294, "W")
1094
+ @t.add_result(3, 4301, 4296, "W")
1095
+ @t.add_result(3, 4302, 4293, "L")
1096
+ @t.add_result(3, 4303, 4310, "L")
1097
+ @t.add_result(3, 4304, 4307, "W")
1098
+ @t.add_result(3, 4305, 4313, "D")
1099
+ @t.add_result(3, 4306, 4309, "L")
1100
+ @t.add_result(3, 4307, 4304, "L")
1101
+ @t.add_result(3, 4308, 4299, "L")
1102
+ @t.add_result(3, 4309, 4306, "W")
1103
+ @t.add_result(3, 4310, 4303, "W")
1104
+ @t.add_result(3, 4311, 4290, "W")
1105
+ @t.add_result(3, 4312, 4295, "L")
1106
+ @t.add_result(3, 4313, 4305, "D")
1107
+ @t.add_result(3, 4315, 4292, "W")
1108
+ @t.add_result(4, 4289, 4299, "L")
1109
+ @t.add_result(4, 4290, 4312, "D")
1110
+ @t.add_result(4, 4291, 4303, "W")
1111
+ @t.add_result(4, 4292, 4304, "L")
1112
+ @t.add_result(4, 4293, 4308, "L")
1113
+ @t.add_result(4, 4294, 4309, "L")
1114
+ @t.add_result(4, 4295, 4315, "W")
1115
+ @t.add_result(4, 4296, 4314, "W")
1116
+ @t.add_result(4, 4297, 4300, "W")
1117
+ @t.add_result(4, 4298, 4305, "W")
1118
+ @t.add_result(4, 4299, 4289, "W")
1119
+ @t.add_result(4, 4300, 4297, "L")
1120
+ @t.add_result(4, 4301, 4311, "W")
1121
+ @t.add_result(4, 4302, 4306, "W")
1122
+ @t.add_result(4, 4303, 4291, "L")
1123
+ @t.add_result(4, 4304, 4292, "W")
1124
+ @t.add_result(4, 4305, 4298, "L")
1125
+ @t.add_result(4, 4306, 4302, "L")
1126
+ @t.add_result(4, 4308, 4293, "W")
1127
+ @t.add_result(4, 4309, 4294, "W")
1128
+ @t.add_result(4, 4310, 4313, "L")
1129
+ @t.add_result(4, 4311, 4301, "L")
1130
+ @t.add_result(4, 4312, 4290, "D")
1131
+ @t.add_result(4, 4313, 4310, "W")
1132
+ @t.add_result(4, 4314, 4296, "L")
1133
+ @t.add_result(4, 4315, 4295, "L")
1134
+ @t.add_result(5, 4289, 4310, "W")
1135
+ @t.add_result(5, 4290, 4293, "D")
1136
+ @t.add_result(5, 4291, 4296, "W")
1137
+ @t.add_result(5, 4292, 4307, "D")
1138
+ @t.add_result(5, 4293, 4290, "D")
1139
+ @t.add_result(5, 4294, 4312, "W")
1140
+ @t.add_result(5, 4295, 4297, "L")
1141
+ @t.add_result(5, 4296, 4291, "L")
1142
+ @t.add_result(5, 4297, 4295, "W")
1143
+ @t.add_result(5, 4298, 4299, "D")
1144
+ @t.add_result(5, 4299, 4298, "D")
1145
+ @t.add_result(5, 4300, 4311, "L")
1146
+ @t.add_result(5, 4301, 4313, "D")
1147
+ @t.add_result(5, 4302, 4314, "W")
1148
+ @t.add_result(5, 4303, 4315, "W")
1149
+ @t.add_result(5, 4304, 4309, "L")
1150
+ @t.add_result(5, 4305, 4308, "W")
1151
+ @t.add_result(5, 4307, 4292, "D")
1152
+ @t.add_result(5, 4308, 4305, "L")
1153
+ @t.add_result(5, 4309, 4304, "W")
1154
+ @t.add_result(5, 4310, 4289, "L")
1155
+ @t.add_result(5, 4311, 4300, "W")
1156
+ @t.add_result(5, 4312, 4294, "L")
1157
+ @t.add_result(5, 4313, 4301, "D")
1158
+ @t.add_result(5, 4314, 4302, "L")
1159
+ @t.add_result(5, 4315, 4303, "L")
1160
+ @t.add_result(6, 4289, 4301, "L")
1161
+ @t.add_result(6, 4290, 4304, "D")
1162
+ @t.add_result(6, 4291, 4305, "W")
1163
+ @t.add_result(6, 4292, 4314, "D")
1164
+ @t.add_result(6, 4293, 4300, "D")
1165
+ @t.add_result(6, 4294, 4302, "W")
1166
+ @t.add_result(6, 4295, 4311, "W")
1167
+ @t.add_result(6, 4296, 4315, "W")
1168
+ @t.add_result(6, 4297, 4299, "W")
1169
+ @t.add_result(6, 4298, 4313, "W")
1170
+ @t.add_result(6, 4299, 4297, "L")
1171
+ @t.add_result(6, 4300, 4293, "D")
1172
+ @t.add_result(6, 4301, 4289, "W")
1173
+ @t.add_result(6, 4302, 4294, "L")
1174
+ @t.add_result(6, 4303, 4308, "L")
1175
+ @t.add_result(6, 4304, 4290, "D")
1176
+ @t.add_result(6, 4305, 4291, "L")
1177
+ @t.add_result(6, 4307, 4312, "W")
1178
+ @t.add_result(6, 4308, 4303, "W")
1179
+ @t.add_result(6, 4309, 4310, "L")
1180
+ @t.add_result(6, 4310, 4309, "W")
1181
+ @t.add_result(6, 4311, 4295, "L")
1182
+ @t.add_result(6, 4312, 4307, "L")
1183
+ @t.add_result(6, 4313, 4298, "L")
1184
+ @t.add_result(6, 4314, 4292, "D")
1185
+ @t.add_result(6, 4315, 4296, "L")
1186
+
1187
+ # Get the players of interest (Jonathan Peoples and his opponents).
1188
+ @p = @t.player(4311)
1189
+ @o1 = @t.player(4291)
1190
+ @o2 = @t.player(4304)
1191
+ @o3 = @t.player(4290)
1192
+ @o4 = @t.player(4301)
1193
+ @o5 = @t.player(4300)
1194
+ @o6 = @t.player(4295)
1195
+ end
1196
+
1197
+ it "should be setup properly" do
1198
+ @p.desc.should == "Jonathon Peoples"
1199
+ @o1.desc.should == "Ross Beatty"
1200
+ @o2.desc.should == "Shane Melaugh"
1201
+ @o3.desc.should == "Piotr Baczkowski"
1202
+ @o4.desc.should == "Tom McGrath"
1203
+ @o5.desc.should == "Joe McEntegert"
1204
+ @o6.desc.should == "David Halpenny"
1205
+
1206
+ @p.type.should == :unrated
1207
+ @o1.type.should == :provisional
1208
+ @o2.type.should == :rated
1209
+ @o3.type.should == :provisional
1210
+ @o4.type.should == :rated
1211
+ @o5.type.should == :unrated
1212
+ @o6.type.should == :provisional
1213
+
1214
+ @o2.rating.should == 683
1215
+ @o4.rating.should == 1058
1216
+
1217
+ @t.iterations1.should be_nil
1218
+ @t.iterations2.should be_nil
1219
+ end
1220
+
1221
+ it "should produce inconsistent results with default settings" do
1222
+ @t.rate!
1223
+
1224
+ @p.new_rating.should be_within(0.5).of(763) # the original calculation
1225
+
1226
+ @o1.new_rating.should == @o1.performance
1227
+ @o2.bonus.should == 0
1228
+ @o3.new_rating.should == @o3.performance
1229
+ @o4.bonus.should == 0
1230
+ @o5.new_rating.should == @o5.performance
1231
+ @o6.new_rating.should == @o6.performance
1232
+
1233
+ ratings = [@o1, @o2, @o3, @o4, @o5, @o6].map { |o| o.type == :rated ? o.rating : o.new_rating }
1234
+
1235
+ average_of_ratings = ratings.inject(0.0){ |m,r| m = m + r } / 6.0
1236
+ average_of_ratings.should_not be_within(0.5).of(@p.new_rating)
1237
+
1238
+ @t.iterations1.should be > 1
1239
+ @t.iterations2.should == 1
1240
+ end
1241
+
1242
+ it "should produce consistent results with more iterations after the bonus stage" do
1243
+ @t.rate!(max_iterations2: 30)
1244
+
1245
+ @p.new_rating.should_not be_within(0.5).of(763) # the new calculation is different
1246
+
1247
+ @o1.new_rating.should == @o1.performance
1248
+ @o2.bonus.should == 0
1249
+ @o3.new_rating.should == @o3.performance
1250
+ @o4.bonus.should == 0
1251
+ @o5.new_rating.should == @o5.performance
1252
+ @o6.new_rating.should == @o6.performance
1253
+
1254
+ ratings = [@o1, @o2, @o3, @o4, @o5, @o6].map { |o| o.type == :rated ? o.rating : o.new_rating }
1255
+
1256
+ average_of_ratings = ratings.inject(0.0){ |m,r| m = m + r } / 6.0
1257
+ average_of_ratings.should be_within(0.5).of(@p.new_rating)
1258
+
1259
+ @t.iterations1.should be > 1
1260
+ @t.iterations2.should be > 1
1261
+ end
1262
+ end
1263
+
1264
+ context "#rate - Sasha-Ettore Faleschini in the Bunratty Minor 2012" do
1265
+ before(:each) do
1266
+ @t = ICU::RatedTournament.new(desc: "Bunratty Minor 2012")
1267
+
1268
+ # Add the player's of most interest (Sasha-Ettore Faleschini and his opponents).
1269
+ @p = @t.add_player(1752, desc: "Sasha-Ettore Faleschini")
1270
+ @o1 = @t.add_player(1748, desc: "John P. Dunne", rating: 946, kfactor: 40)
1271
+ @o2 = @t.add_player(1755, desc: "Jack Fitzgerald", rating: 913, kfactor: 40)
1272
+ @o3 = @t.add_player(1766, desc: "Mikolaj Glegolski", rating: 841, kfactor: 40)
1273
+ @o4 = @t.add_player(1732, desc: "Daniel Boland", rating: 793, kfactor: 40)
1274
+ @o5 = @t.add_player(1776, desc: "Noel Keating", rating: 667, kfactor: 32)
1275
+ @o6 = @t.add_player(1798, desc: "Cathal Minnock", rating: 917, kfactor: 40)
1276
+
1277
+ # Add all the other players.
1278
+ @t.add_player(1730, desc: "Jeffrey Alfred", rating: 1058, kfactor: 40)
1279
+ @t.add_player(1731, desc: "Suliman Ali", rating: 1166, rating: 17)
1280
+ @t.add_player(1733, desc: "Dylan Boland")
1281
+ @t.add_player(1734, desc: "Shane Briggs", rating: 1079, kfactor: 24)
1282
+ @t.add_player(1735, desc: "Joe Browne", rating: 919, kfactor: 24)
1283
+ @t.add_player(1736, desc: "Kieran Burke", rating: 765, rating: 10)
1284
+ @t.add_player(1737, desc: "Liam Cadogan", rating: 1002, kfactor: 24)
1285
+ @t.add_player(1738, desc: "Evan Cahill", rating: 494, rating: 4)
1286
+ @t.add_player(1739, desc: "Joseph Cesar", rating: 751, kfactor: 40)
1287
+ @t.add_player(1740, desc: "Joshua Cesar", rating: 403, rating: 10)
1288
+ @t.add_player(1741, desc: "John G. Connolly", rating: 952, kfactor: 32)
1289
+ @t.add_player(1742, desc: "Fiona Cormican", rating: 483, kfactor: 32)
1290
+ @t.add_player(1743, desc: "Joe Cronin", rating: 601, rating: 6)
1291
+ @t.add_player(1744, desc: "Aaron Daly", rating: 699, rating: 12)
1292
+ @t.add_player(1745, desc: "Conor Devilly", rating: 676, kfactor: 40)
1293
+ @t.add_player(1746, desc: "Charles Dillon")
1294
+ @t.add_player(1747, desc: "Jack Donovan")
1295
+ @t.add_player(1749, desc: "Thomas Dunne", rating: 887, kfactor: 32)
1296
+ @t.add_player(1750, desc: "Michael Eyers", rating: 857, kfactor: 32)
1297
+ @t.add_player(1751, desc: "Sean Fagan", rating: 243, rating: 10)
1298
+ @t.add_player(1753, desc: "Victoria Fennell", rating: 166, rating: 11)
1299
+ @t.add_player(1754, desc: "Mark Finn-Lynch")
1300
+ @t.add_player(1756, desc: "Peter Fletcher", rating: 680, rating: 18)
1301
+ @t.add_player(1757, desc: "Darragh Flynn", rating: 296, kfactor: 40)
1302
+ @t.add_player(1758, desc: "Geordan Freeman", rating: 413, rating: 4)
1303
+ @t.add_player(1759, desc: "Ruairi Freeman", rating: 582, kfactor: 40)
1304
+ @t.add_player(1760, desc: "Aoife Gallagher")
1305
+ @t.add_player(1761, desc: "Hannah Gallagher")
1306
+ @t.add_player(1762, desc: "Tommy Gallagher")
1307
+ @t.add_player(1763, desc: "Leslie Garabedian")
1308
+ @t.add_player(1764, desc: "Alexander Gillett", rating: 850, rating: 19)
1309
+ @t.add_player(1765, desc: "Jan Glegolski", rating: 525, rating: 16)
1310
+ @t.add_player(1767, desc: "Mark Halley", rating: 1280, kfactor: 40)
1311
+ @t.add_player(1768, desc: "Siobhan Halley", rating: 434, rating: 18)
1312
+ @t.add_player(1769, desc: "Luke Hayden", rating: 781, rating: 6)
1313
+ @t.add_player(1770, desc: "Colm Hehir", rating: 564, rating: 16)
1314
+ @t.add_player(1771, desc: "Donal Hehir", rating: 424, rating: 6)
1315
+ @t.add_player(1772, desc: "Andrew Ingram", rating: 859, kfactor: 32)
1316
+ @t.add_player(1773, desc: "Rory Jackson")
1317
+ @t.add_player(1774, desc: "Tom Kearney", rating: 924, kfactor: 40)
1318
+ @t.add_player(1775, desc: "Jamie Kearns", rating: 753, rating: 11)
1319
+ @t.add_player(1777, desc: "Thomas Keating", rating: 864, kfactor: 40)
1320
+ @t.add_player(1778, desc: "Darragh Kennedy", rating: 1052, kfactor: 40)
1321
+ @t.add_player(1779, desc: "Stephen Kennedy", rating: 490, kfactor: 40)
1322
+ @t.add_player(1780, desc: "Jonathan Kiely", rating: 1117, kfactor: 24)
1323
+ @t.add_player(1781, desc: "Kevin Kilduff", rating: 1116, kfactor: 40)
1324
+ @t.add_player(1782, desc: "Conor Kirby MacGuill", rating: 410, rating: 9)
1325
+ @t.add_player(1783, desc: "Wiktor Kwapinski")
1326
+ @t.add_player(1784, desc: "Andrew Kyne-Delaney", rating: 869, kfactor: 40)
1327
+ @t.add_player(1785, desc: "Samuel Lenihan", rating: 683, kfactor: 40)
1328
+ @t.add_player(1786, desc: "Haoang Li", rating: 667, kfactor: 40)
1329
+ @t.add_player(1787, desc: "Stephen Li", rating: 880, rating: 17)
1330
+ @t.add_player(1788, desc: "Desmond Martin", rating: 1018, kfactor: 24)
1331
+ @t.add_player(1789, desc: "Clare McCarrick", rating: 805, kfactor: 40)
1332
+ @t.add_player(1790, desc: "Padraig McCullough", rating: 676, kfactor: 24)
1333
+ @t.add_player(1791, desc: "Finn McDonnell", rating: 740, kfactor: 40)
1334
+ @t.add_player(1792, desc: "Odhran McDonnell", rating: 752, kfactor: 40)
1335
+ @t.add_player(1793, desc: "John McGann", rating: 885, kfactor: 32)
1336
+ @t.add_player(1794, desc: "Tom McGrath", rating: 1076, kfactor: 40)
1337
+ @t.add_player(1795, desc: "Robbie Meaney", rating: 859, kfactor: 40)
1338
+ @t.add_player(1796, desc: "Stephen Meaney", rating: 782, kfactor: 40)
1339
+ @t.add_player(1797, desc: "Jacob Miller")
1340
+ @t.add_player(1799, desc: "Diarmuid Minnock", rating: 760, kfactor: 40)
1341
+ @t.add_player(1800, desc: "Michael Morgan", rating: 889, kfactor: 32)
1342
+ @t.add_player(1801, desc: "Alex Mulligan", rating: 603, rating: 17)
1343
+ @t.add_player(1802, desc: "Scott Mulligan", rating: 1100, kfactor: 40)
1344
+ @t.add_player(1803, desc: "Jessica Mulqueen-Danaher", rating: 286, kfactor: 40)
1345
+ @t.add_player(1804, desc: "Christopher Murphy", rating: 990, kfactor: 40)
1346
+ @t.add_player(1805, desc: "Aleksander Nalewajka")
1347
+ @t.add_player(1806, desc: "Eibhia Ni Mhuireagain", rating: 875, kfactor: 40)
1348
+ @t.add_player(1807, desc: "Dan O'Brien", rating: 789, kfactor: 40)
1349
+ @t.add_player(1808, desc: "Pat O'Brien", rating: 970, kfactor: 24)
1350
+ @t.add_player(1809, desc: "Michael Joseph O'Connell", rating: 1010, kfactor: 32)
1351
+ @t.add_player(1810, desc: "John P. O'Connor", rating: 242, rating: 6)
1352
+ @t.add_player(1811, desc: "Ross O'Connor", rating: 812, kfactor: 40)
1353
+ @t.add_player(1812, desc: "Colm O'Muireagain", rating: 950, kfactor: 32)
1354
+ @t.add_player(1813, desc: "Barry O'Reilly", rating: 736, rating: 6)
1355
+ @t.add_player(1814, desc: "Jim O'Reilly", rating: 784, kfactor: 40)
1356
+ @t.add_player(1815, desc: "David Piercy", rating: 970, kfactor: 32)
1357
+ @t.add_player(1816, desc: "Agnieszka Pozniak", rating: 906, kfactor: 40)
1358
+ @t.add_player(1817, desc: "Denis Savage")
1359
+ @t.add_player(1818, desc: "Fiachra Scallan", rating: 789, kfactor: 40)
1360
+ @t.add_player(1819, desc: "Nick Scallan", rating: 1034, kfactor: 32)
1361
+ @t.add_player(1820, desc: "John Shanley", rating: 1186, kfactor: 24)
1362
+ @t.add_player(1821, desc: "Stephen Sheehan")
1363
+ @t.add_player(1822, desc: "Kevin Singpurwala", rating: 790, kfactor: 40)
1364
+ @t.add_player(1823, desc: "Kaj Skubiszak")
1365
+ @t.add_player(1824, desc: "Jack Staed", rating: 133, rating: 10)
1366
+ @t.add_player(1825, desc: "Devin Tarleton", rating: 852, rating: 11)
1367
+ @t.add_player(1826, desc: "M. Thangaramanujam", rating: 813, kfactor: 24)
1368
+ @t.add_player(1827, desc: "Haley Tomlinson")
1369
+ @t.add_player(1828, desc: "Peter Urwin", rating: 848, kfactor: 40)
1370
+ @t.add_player(1829, desc: "Cian Wall", rating: 510, kfactor: 40)
1371
+ @t.add_player(1830, desc: "Robert Wall", rating: 855, kfactor: 24)
1372
+ @t.add_player(1831, desc: "Conor Ward")
1373
+
1374
+ # Add results.
1375
+ @t.add_result(1, 1730, 1757, "W")
1376
+ @t.add_result(1, 1731, 1778, "D")
1377
+ @t.add_result(1, 1732, 1797, "W")
1378
+ @t.add_result(1, 1733, 1819, "L")
1379
+ @t.add_result(1, 1734, 1779, "W")
1380
+ @t.add_result(1, 1735, 1758, "W")
1381
+ @t.add_result(1, 1736, 1815, "D")
1382
+ @t.add_result(1, 1737, 1740, "W")
1383
+ @t.add_result(1, 1738, 1808, "L")
1384
+ @t.add_result(1, 1739, 1809, "L")
1385
+ @t.add_result(1, 1740, 1737, "L")
1386
+ @t.add_result(1, 1741, 1746, "W")
1387
+ @t.add_result(1, 1742, 1767, "L")
1388
+ @t.add_result(1, 1743, 1804, "L")
1389
+ @t.add_result(1, 1744, 1755, "W")
1390
+ @t.add_result(1, 1745, 1825, "W")
1391
+ @t.add_result(1, 1746, 1741, "L")
1392
+ @t.add_result(1, 1747, 1781, "L")
1393
+ @t.add_result(1, 1748, 1752, "W")
1394
+ @t.add_result(1, 1749, 1759, "W")
1395
+ @t.add_result(1, 1750, 1764, "W")
1396
+ @t.add_result(1, 1751, 1812, "L")
1397
+ @t.add_result(1, 1752, 1748, "L")
1398
+ @t.add_result(1, 1753, 1774, "L")
1399
+ @t.add_result(1, 1754, 1798, "L")
1400
+ @t.add_result(1, 1755, 1744, "L")
1401
+ @t.add_result(1, 1756, 1794, "L")
1402
+ @t.add_result(1, 1757, 1730, "L")
1403
+ @t.add_result(1, 1758, 1735, "L")
1404
+ @t.add_result(1, 1759, 1749, "L")
1405
+ @t.add_result(1, 1760, 1800, "L")
1406
+ @t.add_result(1, 1761, 1784, "L")
1407
+ @t.add_result(1, 1762, 1806, "L")
1408
+ @t.add_result(1, 1763, 1772, "L")
1409
+ @t.add_result(1, 1764, 1750, "L")
1410
+ @t.add_result(1, 1767, 1742, "W")
1411
+ @t.add_result(1, 1768, 1830, "L")
1412
+ @t.add_result(1, 1769, 1777, "W")
1413
+ @t.add_result(1, 1770, 1826, "W")
1414
+ @t.add_result(1, 1771, 1814, "D")
1415
+ @t.add_result(1, 1772, 1763, "W")
1416
+ @t.add_result(1, 1773, 1795, "L")
1417
+ @t.add_result(1, 1774, 1753, "W")
1418
+ @t.add_result(1, 1775, 1789, "D")
1419
+ @t.add_result(1, 1776, 1828, "L")
1420
+ @t.add_result(1, 1777, 1769, "L")
1421
+ @t.add_result(1, 1778, 1731, "D")
1422
+ @t.add_result(1, 1779, 1734, "L")
1423
+ @t.add_result(1, 1780, 1829, "W")
1424
+ @t.add_result(1, 1781, 1747, "W")
1425
+ @t.add_result(1, 1782, 1811, "W")
1426
+ @t.add_result(1, 1784, 1761, "W")
1427
+ @t.add_result(1, 1785, 1831, "W")
1428
+ @t.add_result(1, 1786, 1817, "W")
1429
+ @t.add_result(1, 1788, 1803, "W")
1430
+ @t.add_result(1, 1789, 1775, "D")
1431
+ @t.add_result(1, 1790, 1827, "W")
1432
+ @t.add_result(1, 1791, 1821, "W")
1433
+ @t.add_result(1, 1792, 1820, "L")
1434
+ @t.add_result(1, 1793, 1816, "L")
1435
+ @t.add_result(1, 1794, 1756, "W")
1436
+ @t.add_result(1, 1795, 1773, "W")
1437
+ @t.add_result(1, 1796, 1813, "W")
1438
+ @t.add_result(1, 1797, 1732, "L")
1439
+ @t.add_result(1, 1798, 1754, "W")
1440
+ @t.add_result(1, 1799, 1802, "L")
1441
+ @t.add_result(1, 1800, 1760, "W")
1442
+ @t.add_result(1, 1801, 1822, "W")
1443
+ @t.add_result(1, 1802, 1799, "W")
1444
+ @t.add_result(1, 1803, 1788, "L")
1445
+ @t.add_result(1, 1804, 1743, "W")
1446
+ @t.add_result(1, 1806, 1762, "W")
1447
+ @t.add_result(1, 1807, 1824, "W")
1448
+ @t.add_result(1, 1808, 1738, "W")
1449
+ @t.add_result(1, 1809, 1739, "W")
1450
+ @t.add_result(1, 1810, 1818, "L")
1451
+ @t.add_result(1, 1811, 1782, "L")
1452
+ @t.add_result(1, 1812, 1751, "W")
1453
+ @t.add_result(1, 1813, 1796, "L")
1454
+ @t.add_result(1, 1814, 1771, "D")
1455
+ @t.add_result(1, 1815, 1736, "D")
1456
+ @t.add_result(1, 1816, 1793, "W")
1457
+ @t.add_result(1, 1817, 1786, "L")
1458
+ @t.add_result(1, 1818, 1810, "W")
1459
+ @t.add_result(1, 1819, 1733, "W")
1460
+ @t.add_result(1, 1820, 1792, "W")
1461
+ @t.add_result(1, 1821, 1791, "L")
1462
+ @t.add_result(1, 1822, 1801, "L")
1463
+ @t.add_result(1, 1824, 1807, "L")
1464
+ @t.add_result(1, 1825, 1745, "L")
1465
+ @t.add_result(1, 1826, 1770, "L")
1466
+ @t.add_result(1, 1827, 1790, "L")
1467
+ @t.add_result(1, 1828, 1776, "W")
1468
+ @t.add_result(1, 1829, 1780, "L")
1469
+ @t.add_result(1, 1830, 1768, "W")
1470
+ @t.add_result(1, 1831, 1785, "L")
1471
+ @t.add_result(2, 1730, 1750, "D")
1472
+ @t.add_result(2, 1731, 1805, "W")
1473
+ @t.add_result(2, 1732, 1809, "L")
1474
+ @t.add_result(2, 1733, 1810, "D")
1475
+ @t.add_result(2, 1734, 1830, "D")
1476
+ @t.add_result(2, 1735, 1802, "L")
1477
+ @t.add_result(2, 1736, 1823, "W")
1478
+ @t.add_result(2, 1737, 1807, "L")
1479
+ @t.add_result(2, 1738, 1817, "L")
1480
+ @t.add_result(2, 1739, 1797, "L")
1481
+ @t.add_result(2, 1740, 1824, "W")
1482
+ @t.add_result(2, 1741, 1791, "L")
1483
+ @t.add_result(2, 1742, 1764, "D")
1484
+ @t.add_result(2, 1743, 1813, "W")
1485
+ @t.add_result(2, 1744, 1774, "W")
1486
+ @t.add_result(2, 1745, 1812, "W")
1487
+ @t.add_result(2, 1746, 1821, "W")
1488
+ @t.add_result(2, 1747, 1827, "W")
1489
+ @t.add_result(2, 1748, 1785, "W")
1490
+ @t.add_result(2, 1749, 1801, "W")
1491
+ @t.add_result(2, 1750, 1730, "D")
1492
+ @t.add_result(2, 1751, 1825, "L")
1493
+ @t.add_result(2, 1752, 1755, "W")
1494
+ @t.add_result(2, 1753, 1793, "L")
1495
+ @t.add_result(2, 1754, 1777, "L")
1496
+ @t.add_result(2, 1755, 1752, "L")
1497
+ @t.add_result(2, 1756, 1826, "D")
1498
+ @t.add_result(2, 1757, 1768, "W")
1499
+ @t.add_result(2, 1758, 1799, "L")
1500
+ @t.add_result(2, 1759, 1811, "L")
1501
+ @t.add_result(2, 1760, 1776, "L")
1502
+ @t.add_result(2, 1761, 1822, "L")
1503
+ @t.add_result(2, 1762, 1792, "L")
1504
+ @t.add_result(2, 1763, 1829, "L")
1505
+ @t.add_result(2, 1764, 1742, "D")
1506
+ @t.add_result(2, 1765, 1778, "L")
1507
+ @t.add_result(2, 1766, 1771, "D")
1508
+ @t.add_result(2, 1767, 1806, "W")
1509
+ @t.add_result(2, 1768, 1757, "L")
1510
+ @t.add_result(2, 1769, 1798, "W")
1511
+ @t.add_result(2, 1770, 1794, "L")
1512
+ @t.add_result(2, 1771, 1766, "D")
1513
+ @t.add_result(2, 1772, 1780, "W")
1514
+ @t.add_result(2, 1773, 1803, "L")
1515
+ @t.add_result(2, 1774, 1744, "L")
1516
+ @t.add_result(2, 1775, 1814, "L")
1517
+ @t.add_result(2, 1776, 1760, "W")
1518
+ @t.add_result(2, 1777, 1754, "W")
1519
+ @t.add_result(2, 1778, 1765, "W")
1520
+ @t.add_result(2, 1780, 1772, "L")
1521
+ @t.add_result(2, 1781, 1790, "W")
1522
+ @t.add_result(2, 1782, 1816, "L")
1523
+ @t.add_result(2, 1783, 1815, "L")
1524
+ @t.add_result(2, 1784, 1820, "W")
1525
+ @t.add_result(2, 1785, 1748, "L")
1526
+ @t.add_result(2, 1786, 1808, "L")
1527
+ @t.add_result(2, 1787, 1789, "W")
1528
+ @t.add_result(2, 1788, 1795, "D")
1529
+ @t.add_result(2, 1789, 1787, "L")
1530
+ @t.add_result(2, 1790, 1781, "L")
1531
+ @t.add_result(2, 1791, 1741, "W")
1532
+ @t.add_result(2, 1792, 1762, "W")
1533
+ @t.add_result(2, 1793, 1753, "W")
1534
+ @t.add_result(2, 1794, 1770, "W")
1535
+ @t.add_result(2, 1795, 1788, "D")
1536
+ @t.add_result(2, 1796, 1804, "W")
1537
+ @t.add_result(2, 1797, 1739, "W")
1538
+ @t.add_result(2, 1798, 1769, "L")
1539
+ @t.add_result(2, 1799, 1758, "W")
1540
+ @t.add_result(2, 1800, 1828, "L")
1541
+ @t.add_result(2, 1801, 1749, "L")
1542
+ @t.add_result(2, 1802, 1735, "W")
1543
+ @t.add_result(2, 1803, 1773, "W")
1544
+ @t.add_result(2, 1804, 1796, "L")
1545
+ @t.add_result(2, 1805, 1731, "L")
1546
+ @t.add_result(2, 1806, 1767, "L")
1547
+ @t.add_result(2, 1807, 1737, "W")
1548
+ @t.add_result(2, 1808, 1786, "W")
1549
+ @t.add_result(2, 1809, 1732, "W")
1550
+ @t.add_result(2, 1810, 1733, "D")
1551
+ @t.add_result(2, 1811, 1759, "W")
1552
+ @t.add_result(2, 1812, 1745, "L")
1553
+ @t.add_result(2, 1813, 1743, "L")
1554
+ @t.add_result(2, 1814, 1775, "W")
1555
+ @t.add_result(2, 1815, 1783, "W")
1556
+ @t.add_result(2, 1816, 1782, "W")
1557
+ @t.add_result(2, 1817, 1738, "W")
1558
+ @t.add_result(2, 1818, 1819, "L")
1559
+ @t.add_result(2, 1819, 1818, "W")
1560
+ @t.add_result(2, 1820, 1784, "L")
1561
+ @t.add_result(2, 1821, 1746, "L")
1562
+ @t.add_result(2, 1822, 1761, "W")
1563
+ @t.add_result(2, 1823, 1736, "L")
1564
+ @t.add_result(2, 1824, 1740, "L")
1565
+ @t.add_result(2, 1825, 1751, "W")
1566
+ @t.add_result(2, 1826, 1756, "D")
1567
+ @t.add_result(2, 1827, 1747, "L")
1568
+ @t.add_result(2, 1828, 1800, "W")
1569
+ @t.add_result(2, 1829, 1763, "W")
1570
+ @t.add_result(2, 1830, 1734, "D")
1571
+ @t.add_result(3, 1730, 1814, "W")
1572
+ @t.add_result(3, 1731, 1815, "L")
1573
+ @t.add_result(3, 1732, 1825, "L")
1574
+ @t.add_result(3, 1733, 1783, "W")
1575
+ @t.add_result(3, 1734, 1828, "L")
1576
+ @t.add_result(3, 1735, 1803, "W")
1577
+ @t.add_result(3, 1736, 1778, "L")
1578
+ @t.add_result(3, 1737, 1790, "W")
1579
+ @t.add_result(3, 1738, 1761, "W")
1580
+ @t.add_result(3, 1739, 1762, "W")
1581
+ @t.add_result(3, 1740, 1800, "L")
1582
+ @t.add_result(3, 1741, 1757, "W")
1583
+ @t.add_result(3, 1742, 1775, "L")
1584
+ @t.add_result(3, 1743, 1812, "L")
1585
+ @t.add_result(3, 1744, 1749, "W")
1586
+ @t.add_result(3, 1745, 1816, "D")
1587
+ @t.add_result(3, 1746, 1774, "W")
1588
+ @t.add_result(3, 1747, 1806, "L")
1589
+ @t.add_result(3, 1748, 1802, "L")
1590
+ @t.add_result(3, 1749, 1744, "L")
1591
+ @t.add_result(3, 1750, 1787, "L")
1592
+ @t.add_result(3, 1751, 1768, "D")
1593
+ @t.add_result(3, 1752, 1766, "L")
1594
+ @t.add_result(3, 1753, 1773, "L")
1595
+ @t.add_result(3, 1754, 1813, "W")
1596
+ @t.add_result(3, 1755, 1760, "W")
1597
+ @t.add_result(3, 1756, 1823, "W")
1598
+ @t.add_result(3, 1757, 1741, "L")
1599
+ @t.add_result(3, 1758, 1824, "L")
1600
+ @t.add_result(3, 1759, 1821, "L")
1601
+ @t.add_result(3, 1760, 1755, "L")
1602
+ @t.add_result(3, 1761, 1738, "L")
1603
+ @t.add_result(3, 1762, 1739, "L")
1604
+ @t.add_result(3, 1764, 1810, "W")
1605
+ @t.add_result(3, 1765, 1826, "L")
1606
+ @t.add_result(3, 1766, 1752, "W")
1607
+ @t.add_result(3, 1767, 1784, "W")
1608
+ @t.add_result(3, 1768, 1751, "D")
1609
+ @t.add_result(3, 1769, 1781, "L")
1610
+ @t.add_result(3, 1770, 1811, "D")
1611
+ @t.add_result(3, 1771, 1777, "L")
1612
+ @t.add_result(3, 1772, 1819, "L")
1613
+ @t.add_result(3, 1773, 1753, "W")
1614
+ @t.add_result(3, 1774, 1746, "L")
1615
+ @t.add_result(3, 1775, 1742, "W")
1616
+ @t.add_result(3, 1776, 1820, "L")
1617
+ @t.add_result(3, 1777, 1771, "W")
1618
+ @t.add_result(3, 1778, 1736, "W")
1619
+ @t.add_result(3, 1779, 1805, "L")
1620
+ @t.add_result(3, 1780, 1795, "L")
1621
+ @t.add_result(3, 1781, 1769, "W")
1622
+ @t.add_result(3, 1782, 1822, "L")
1623
+ @t.add_result(3, 1783, 1733, "L")
1624
+ @t.add_result(3, 1784, 1767, "L")
1625
+ @t.add_result(3, 1785, 1798, "W")
1626
+ @t.add_result(3, 1786, 1801, "W")
1627
+ @t.add_result(3, 1787, 1750, "W")
1628
+ @t.add_result(3, 1788, 1830, "W")
1629
+ @t.add_result(3, 1789, 1797, "L")
1630
+ @t.add_result(3, 1790, 1737, "L")
1631
+ @t.add_result(3, 1791, 1794, "D")
1632
+ @t.add_result(3, 1792, 1804, "L")
1633
+ @t.add_result(3, 1793, 1829, "W")
1634
+ @t.add_result(3, 1794, 1791, "D")
1635
+ @t.add_result(3, 1795, 1780, "W")
1636
+ @t.add_result(3, 1796, 1809, "W")
1637
+ @t.add_result(3, 1797, 1789, "W")
1638
+ @t.add_result(3, 1798, 1785, "L")
1639
+ @t.add_result(3, 1799, 1831, "W")
1640
+ @t.add_result(3, 1800, 1740, "W")
1641
+ @t.add_result(3, 1801, 1786, "L")
1642
+ @t.add_result(3, 1802, 1748, "W")
1643
+ @t.add_result(3, 1803, 1735, "L")
1644
+ @t.add_result(3, 1804, 1792, "W")
1645
+ @t.add_result(3, 1805, 1779, "W")
1646
+ @t.add_result(3, 1806, 1747, "W")
1647
+ @t.add_result(3, 1807, 1808, "L")
1648
+ @t.add_result(3, 1808, 1807, "W")
1649
+ @t.add_result(3, 1809, 1796, "L")
1650
+ @t.add_result(3, 1810, 1764, "L")
1651
+ @t.add_result(3, 1811, 1770, "D")
1652
+ @t.add_result(3, 1812, 1743, "W")
1653
+ @t.add_result(3, 1813, 1754, "L")
1654
+ @t.add_result(3, 1814, 1730, "L")
1655
+ @t.add_result(3, 1815, 1731, "W")
1656
+ @t.add_result(3, 1816, 1745, "D")
1657
+ @t.add_result(3, 1817, 1818, "L")
1658
+ @t.add_result(3, 1818, 1817, "W")
1659
+ @t.add_result(3, 1819, 1772, "W")
1660
+ @t.add_result(3, 1820, 1776, "W")
1661
+ @t.add_result(3, 1821, 1759, "W")
1662
+ @t.add_result(3, 1822, 1782, "W")
1663
+ @t.add_result(3, 1823, 1756, "L")
1664
+ @t.add_result(3, 1824, 1758, "W")
1665
+ @t.add_result(3, 1825, 1732, "W")
1666
+ @t.add_result(3, 1826, 1765, "W")
1667
+ @t.add_result(3, 1828, 1734, "W")
1668
+ @t.add_result(3, 1829, 1793, "L")
1669
+ @t.add_result(3, 1830, 1788, "L")
1670
+ @t.add_result(3, 1831, 1799, "L")
1671
+ @t.add_result(4, 1730, 1795, "D")
1672
+ @t.add_result(4, 1731, 1764, "W")
1673
+ @t.add_result(4, 1732, 1752, "W")
1674
+ @t.add_result(4, 1733, 1734, "L")
1675
+ @t.add_result(4, 1734, 1733, "W")
1676
+ @t.add_result(4, 1735, 1785, "W")
1677
+ @t.add_result(4, 1736, 1826, "L")
1678
+ @t.add_result(4, 1737, 1822, "L")
1679
+ @t.add_result(4, 1738, 1824, "W")
1680
+ @t.add_result(4, 1739, 1831, "L")
1681
+ @t.add_result(4, 1740, 1780, "L")
1682
+ @t.add_result(4, 1741, 1799, "D")
1683
+ @t.add_result(4, 1742, 1783, "L")
1684
+ @t.add_result(4, 1743, 1755, "L")
1685
+ @t.add_result(4, 1744, 1819, "D")
1686
+ @t.add_result(4, 1745, 1815, "W")
1687
+ @t.add_result(4, 1746, 1749, "W")
1688
+ @t.add_result(4, 1747, 1798, "L")
1689
+ @t.add_result(4, 1748, 1786, "W")
1690
+ @t.add_result(4, 1749, 1746, "L")
1691
+ @t.add_result(4, 1750, 1775, "L")
1692
+ @t.add_result(4, 1751, 1827, "W")
1693
+ @t.add_result(4, 1752, 1732, "L")
1694
+ @t.add_result(4, 1753, 1810, "L")
1695
+ @t.add_result(4, 1754, 1776, "W")
1696
+ @t.add_result(4, 1755, 1743, "W")
1697
+ @t.add_result(4, 1756, 1811, "L")
1698
+ @t.add_result(4, 1757, 1821, "D")
1699
+ @t.add_result(4, 1758, 1761, "W")
1700
+ @t.add_result(4, 1759, 1762, "L")
1701
+ @t.add_result(4, 1760, 1813, "L")
1702
+ @t.add_result(4, 1761, 1758, "L")
1703
+ @t.add_result(4, 1762, 1759, "W")
1704
+ @t.add_result(4, 1763, 1768, "D")
1705
+ @t.add_result(4, 1764, 1731, "L")
1706
+ @t.add_result(4, 1765, 1789, "L")
1707
+ @t.add_result(4, 1766, 1809, "L")
1708
+ @t.add_result(4, 1767, 1796, "W")
1709
+ @t.add_result(4, 1768, 1763, "D")
1710
+ @t.add_result(4, 1769, 1800, "L")
1711
+ @t.add_result(4, 1770, 1830, "L")
1712
+ @t.add_result(4, 1771, 1792, "L")
1713
+ @t.add_result(4, 1772, 1820, "L")
1714
+ @t.add_result(4, 1773, 1774, "W")
1715
+ @t.add_result(4, 1774, 1773, "L")
1716
+ @t.add_result(4, 1775, 1750, "W")
1717
+ @t.add_result(4, 1776, 1754, "L")
1718
+ @t.add_result(4, 1777, 1804, "D")
1719
+ @t.add_result(4, 1778, 1791, "W")
1720
+ @t.add_result(4, 1779, 1823, "W")
1721
+ @t.add_result(4, 1780, 1740, "W")
1722
+ @t.add_result(4, 1781, 1828, "L")
1723
+ @t.add_result(4, 1782, 1790, "L")
1724
+ @t.add_result(4, 1783, 1742, "W")
1725
+ @t.add_result(4, 1784, 1797, "L")
1726
+ @t.add_result(4, 1785, 1735, "L")
1727
+ @t.add_result(4, 1786, 1748, "L")
1728
+ @t.add_result(4, 1787, 1794, "L")
1729
+ @t.add_result(4, 1788, 1816, "L")
1730
+ @t.add_result(4, 1789, 1765, "W")
1731
+ @t.add_result(4, 1790, 1782, "W")
1732
+ @t.add_result(4, 1791, 1778, "L")
1733
+ @t.add_result(4, 1792, 1771, "W")
1734
+ @t.add_result(4, 1793, 1807, "W")
1735
+ @t.add_result(4, 1794, 1787, "W")
1736
+ @t.add_result(4, 1795, 1730, "D")
1737
+ @t.add_result(4, 1796, 1767, "L")
1738
+ @t.add_result(4, 1797, 1784, "W")
1739
+ @t.add_result(4, 1798, 1747, "W")
1740
+ @t.add_result(4, 1799, 1741, "D")
1741
+ @t.add_result(4, 1800, 1769, "W")
1742
+ @t.add_result(4, 1801, 1829, "W")
1743
+ @t.add_result(4, 1802, 1808, "D")
1744
+ @t.add_result(4, 1803, 1817, "L")
1745
+ @t.add_result(4, 1804, 1777, "D")
1746
+ @t.add_result(4, 1805, 1814, "L")
1747
+ @t.add_result(4, 1806, 1825, "W")
1748
+ @t.add_result(4, 1807, 1793, "L")
1749
+ @t.add_result(4, 1808, 1802, "D")
1750
+ @t.add_result(4, 1809, 1766, "W")
1751
+ @t.add_result(4, 1810, 1753, "W")
1752
+ @t.add_result(4, 1811, 1756, "W")
1753
+ @t.add_result(4, 1812, 1818, "L")
1754
+ @t.add_result(4, 1813, 1760, "W")
1755
+ @t.add_result(4, 1814, 1805, "W")
1756
+ @t.add_result(4, 1815, 1745, "L")
1757
+ @t.add_result(4, 1816, 1788, "W")
1758
+ @t.add_result(4, 1817, 1803, "W")
1759
+ @t.add_result(4, 1818, 1812, "W")
1760
+ @t.add_result(4, 1819, 1744, "D")
1761
+ @t.add_result(4, 1820, 1772, "W")
1762
+ @t.add_result(4, 1821, 1757, "D")
1763
+ @t.add_result(4, 1822, 1737, "W")
1764
+ @t.add_result(4, 1823, 1779, "L")
1765
+ @t.add_result(4, 1824, 1738, "L")
1766
+ @t.add_result(4, 1825, 1806, "L")
1767
+ @t.add_result(4, 1826, 1736, "W")
1768
+ @t.add_result(4, 1827, 1751, "L")
1769
+ @t.add_result(4, 1828, 1781, "W")
1770
+ @t.add_result(4, 1829, 1801, "L")
1771
+ @t.add_result(4, 1830, 1770, "W")
1772
+ @t.add_result(4, 1831, 1739, "W")
1773
+ @t.add_result(5, 1730, 1806, "W")
1774
+ @t.add_result(5, 1731, 1741, "W")
1775
+ @t.add_result(5, 1732, 1831, "W")
1776
+ @t.add_result(5, 1733, 1756, "L")
1777
+ @t.add_result(5, 1734, 1811, "D")
1778
+ @t.add_result(5, 1735, 1797, "W")
1779
+ @t.add_result(5, 1736, 1810, "W")
1780
+ @t.add_result(5, 1737, 1785, "L")
1781
+ @t.add_result(5, 1738, 1798, "W")
1782
+ @t.add_result(5, 1739, 1771, "D")
1783
+ @t.add_result(5, 1740, 1782, "W")
1784
+ @t.add_result(5, 1741, 1731, "L")
1785
+ @t.add_result(5, 1742, 1823, "W")
1786
+ @t.add_result(5, 1743, 1824, "W")
1787
+ @t.add_result(5, 1744, 1808, "D")
1788
+ @t.add_result(5, 1745, 1794, "L")
1789
+ @t.add_result(5, 1746, 1788, "D")
1790
+ @t.add_result(5, 1747, 1813, "L")
1791
+ @t.add_result(5, 1748, 1818, "W")
1792
+ @t.add_result(5, 1749, 1817, "W")
1793
+ @t.add_result(5, 1750, 1801, "W")
1794
+ @t.add_result(5, 1751, 1821, "L")
1795
+ @t.add_result(5, 1752, 1776, "W")
1796
+ @t.add_result(5, 1753, 1761, "W")
1797
+ @t.add_result(5, 1754, 1784, "L")
1798
+ @t.add_result(5, 1755, 1790, "L")
1799
+ @t.add_result(5, 1756, 1733, "W")
1800
+ @t.add_result(5, 1757, 1805, "L")
1801
+ @t.add_result(5, 1758, 1829, "L")
1802
+ @t.add_result(5, 1759, 1760, "W")
1803
+ @t.add_result(5, 1760, 1759, "L")
1804
+ @t.add_result(5, 1761, 1753, "L")
1805
+ @t.add_result(5, 1762, 1765, "D")
1806
+ @t.add_result(5, 1764, 1789, "W")
1807
+ @t.add_result(5, 1765, 1762, "D")
1808
+ @t.add_result(5, 1766, 1825, "W")
1809
+ @t.add_result(5, 1767, 1828, "W")
1810
+ @t.add_result(5, 1768, 1803, "L")
1811
+ @t.add_result(5, 1769, 1772, "L")
1812
+ @t.add_result(5, 1770, 1774, "D")
1813
+ @t.add_result(5, 1771, 1739, "D")
1814
+ @t.add_result(5, 1772, 1769, "W")
1815
+ @t.add_result(5, 1773, 1786, "D")
1816
+ @t.add_result(5, 1774, 1770, "D")
1817
+ @t.add_result(5, 1775, 1777, "W")
1818
+ @t.add_result(5, 1776, 1752, "L")
1819
+ @t.add_result(5, 1777, 1775, "L")
1820
+ @t.add_result(5, 1778, 1816, "W")
1821
+ @t.add_result(5, 1779, 1783, "W")
1822
+ @t.add_result(5, 1780, 1807, "W")
1823
+ @t.add_result(5, 1781, 1822, "L")
1824
+ @t.add_result(5, 1782, 1740, "L")
1825
+ @t.add_result(5, 1783, 1779, "L")
1826
+ @t.add_result(5, 1784, 1754, "W")
1827
+ @t.add_result(5, 1785, 1737, "W")
1828
+ @t.add_result(5, 1786, 1773, "D")
1829
+ @t.add_result(5, 1787, 1826, "W")
1830
+ @t.add_result(5, 1788, 1746, "D")
1831
+ @t.add_result(5, 1789, 1764, "L")
1832
+ @t.add_result(5, 1790, 1755, "W")
1833
+ @t.add_result(5, 1791, 1830, "L")
1834
+ @t.add_result(5, 1792, 1812, "L")
1835
+ @t.add_result(5, 1793, 1796, "W")
1836
+ @t.add_result(5, 1794, 1745, "W")
1837
+ @t.add_result(5, 1795, 1809, "L")
1838
+ @t.add_result(5, 1796, 1793, "L")
1839
+ @t.add_result(5, 1797, 1735, "L")
1840
+ @t.add_result(5, 1798, 1738, "L")
1841
+ @t.add_result(5, 1799, 1804, "D")
1842
+ @t.add_result(5, 1800, 1820, "W")
1843
+ @t.add_result(5, 1801, 1750, "L")
1844
+ @t.add_result(5, 1802, 1819, "L")
1845
+ @t.add_result(5, 1803, 1768, "W")
1846
+ @t.add_result(5, 1804, 1799, "D")
1847
+ @t.add_result(5, 1805, 1757, "W")
1848
+ @t.add_result(5, 1806, 1730, "L")
1849
+ @t.add_result(5, 1807, 1780, "L")
1850
+ @t.add_result(5, 1808, 1744, "D")
1851
+ @t.add_result(5, 1809, 1795, "W")
1852
+ @t.add_result(5, 1810, 1736, "L")
1853
+ @t.add_result(5, 1811, 1734, "D")
1854
+ @t.add_result(5, 1812, 1792, "W")
1855
+ @t.add_result(5, 1813, 1747, "W")
1856
+ @t.add_result(5, 1814, 1815, "W")
1857
+ @t.add_result(5, 1815, 1814, "L")
1858
+ @t.add_result(5, 1816, 1778, "L")
1859
+ @t.add_result(5, 1817, 1749, "L")
1860
+ @t.add_result(5, 1818, 1748, "L")
1861
+ @t.add_result(5, 1819, 1802, "W")
1862
+ @t.add_result(5, 1820, 1800, "L")
1863
+ @t.add_result(5, 1821, 1751, "W")
1864
+ @t.add_result(5, 1822, 1781, "W")
1865
+ @t.add_result(5, 1823, 1742, "L")
1866
+ @t.add_result(5, 1824, 1743, "L")
1867
+ @t.add_result(5, 1825, 1766, "L")
1868
+ @t.add_result(5, 1826, 1787, "L")
1869
+ @t.add_result(5, 1828, 1767, "L")
1870
+ @t.add_result(5, 1829, 1758, "W")
1871
+ @t.add_result(5, 1830, 1791, "W")
1872
+ @t.add_result(5, 1831, 1732, "L")
1873
+ @t.add_result(6, 1730, 1735, "L")
1874
+ @t.add_result(6, 1731, 1830, "W")
1875
+ @t.add_result(6, 1732, 1804, "D")
1876
+ @t.add_result(6, 1733, 1763, "W")
1877
+ @t.add_result(6, 1734, 1795, "L")
1878
+ @t.add_result(6, 1735, 1730, "W")
1879
+ @t.add_result(6, 1736, 1741, "L")
1880
+ @t.add_result(6, 1737, 1821, "D")
1881
+ @t.add_result(6, 1738, 1772, "L")
1882
+ @t.add_result(6, 1739, 1783, "W")
1883
+ @t.add_result(6, 1740, 1817, "L")
1884
+ @t.add_result(6, 1741, 1736, "W")
1885
+ @t.add_result(6, 1742, 1831, "D")
1886
+ @t.add_result(6, 1743, 1825, "L")
1887
+ @t.add_result(6, 1744, 1793, "W")
1888
+ @t.add_result(6, 1745, 1802, "L")
1889
+ @t.add_result(6, 1746, 1820, "W")
1890
+ @t.add_result(6, 1747, 1768, "W")
1891
+ @t.add_result(6, 1748, 1828, "W")
1892
+ @t.add_result(6, 1749, 1796, "D")
1893
+ @t.add_result(6, 1750, 1756, "W")
1894
+ @t.add_result(6, 1751, 1810, "L")
1895
+ @t.add_result(6, 1752, 1798, "L")
1896
+ @t.add_result(6, 1753, 1782, "L")
1897
+ @t.add_result(6, 1754, 1755, "L")
1898
+ @t.add_result(6, 1755, 1754, "W")
1899
+ @t.add_result(6, 1756, 1750, "L")
1900
+ @t.add_result(6, 1757, 1771, "L")
1901
+ @t.add_result(6, 1758, 1827, "W")
1902
+ @t.add_result(6, 1759, 1824, "W")
1903
+ @t.add_result(6, 1761, 1823, "L")
1904
+ @t.add_result(6, 1762, 1774, "L")
1905
+ @t.add_result(6, 1763, 1733, "L")
1906
+ @t.add_result(6, 1764, 1791, "W")
1907
+ @t.add_result(6, 1765, 1776, "W")
1908
+ @t.add_result(6, 1766, 1788, "D")
1909
+ @t.add_result(6, 1767, 1778, "W")
1910
+ @t.add_result(6, 1768, 1747, "L")
1911
+ @t.add_result(6, 1769, 1792, "L")
1912
+ @t.add_result(6, 1770, 1807, "W")
1913
+ @t.add_result(6, 1771, 1757, "W")
1914
+ @t.add_result(6, 1772, 1738, "W")
1915
+ @t.add_result(6, 1773, 1826, "L")
1916
+ @t.add_result(6, 1774, 1762, "W")
1917
+ @t.add_result(6, 1775, 1816, "L")
1918
+ @t.add_result(6, 1776, 1765, "L")
1919
+ @t.add_result(6, 1777, 1797, "L")
1920
+ @t.add_result(6, 1778, 1767, "L")
1921
+ @t.add_result(6, 1780, 1811, "L")
1922
+ @t.add_result(6, 1781, 1818, "W")
1923
+ @t.add_result(6, 1782, 1753, "W")
1924
+ @t.add_result(6, 1783, 1739, "L")
1925
+ @t.add_result(6, 1784, 1790, "D")
1926
+ @t.add_result(6, 1785, 1806, "W")
1927
+ @t.add_result(6, 1786, 1805, "W")
1928
+ @t.add_result(6, 1787, 1814, "L")
1929
+ @t.add_result(6, 1788, 1766, "D")
1930
+ @t.add_result(6, 1790, 1784, "D")
1931
+ @t.add_result(6, 1791, 1764, "L")
1932
+ @t.add_result(6, 1792, 1769, "W")
1933
+ @t.add_result(6, 1793, 1744, "L")
1934
+ @t.add_result(6, 1794, 1819, "D")
1935
+ @t.add_result(6, 1795, 1734, "W")
1936
+ @t.add_result(6, 1796, 1749, "D")
1937
+ @t.add_result(6, 1797, 1777, "W")
1938
+ @t.add_result(6, 1798, 1752, "W")
1939
+ @t.add_result(6, 1799, 1812, "D")
1940
+ @t.add_result(6, 1800, 1809, "W")
1941
+ @t.add_result(6, 1801, 1803, "L")
1942
+ @t.add_result(6, 1802, 1745, "W")
1943
+ @t.add_result(6, 1803, 1801, "W")
1944
+ @t.add_result(6, 1804, 1732, "D")
1945
+ @t.add_result(6, 1805, 1786, "L")
1946
+ @t.add_result(6, 1806, 1785, "L")
1947
+ @t.add_result(6, 1807, 1770, "L")
1948
+ @t.add_result(6, 1808, 1822, "W")
1949
+ @t.add_result(6, 1809, 1800, "L")
1950
+ @t.add_result(6, 1810, 1751, "W")
1951
+ @t.add_result(6, 1811, 1780, "W")
1952
+ @t.add_result(6, 1812, 1799, "D")
1953
+ @t.add_result(6, 1813, 1829, "W")
1954
+ @t.add_result(6, 1814, 1787, "W")
1955
+ @t.add_result(6, 1816, 1775, "W")
1956
+ @t.add_result(6, 1817, 1740, "W")
1957
+ @t.add_result(6, 1818, 1781, "L")
1958
+ @t.add_result(6, 1819, 1794, "D")
1959
+ @t.add_result(6, 1820, 1746, "L")
1960
+ @t.add_result(6, 1821, 1737, "D")
1961
+ @t.add_result(6, 1822, 1808, "L")
1962
+ @t.add_result(6, 1823, 1761, "W")
1963
+ @t.add_result(6, 1824, 1759, "L")
1964
+ @t.add_result(6, 1825, 1743, "W")
1965
+ @t.add_result(6, 1826, 1773, "W")
1966
+ @t.add_result(6, 1827, 1758, "L")
1967
+ @t.add_result(6, 1828, 1748, "L")
1968
+ @t.add_result(6, 1829, 1813, "L")
1969
+ @t.add_result(6, 1830, 1731, "L")
1970
+ @t.add_result(6, 1831, 1742, "D")
1971
+ end
1972
+
1973
+ it "should be setup properly" do
1974
+ @p.desc.should == "Sasha-Ettore Faleschini"
1975
+ @o1.desc.should == "John P. Dunne"
1976
+ @o2.desc.should == "Jack Fitzgerald"
1977
+ @o3.desc.should == "Mikolaj Glegolski"
1978
+ @o4.desc.should == "Daniel Boland"
1979
+ @o5.desc.should == "Noel Keating"
1980
+ @o6.desc.should == "Cathal Minnock"
1981
+
1982
+ @p.type.should == :unrated
1983
+ @o1.type.should == :rated
1984
+ @o2.type.should == :rated
1985
+ @o3.type.should == :rated
1986
+ @o4.type.should == :rated
1987
+ @o5.type.should == :rated
1988
+ @o6.type.should == :rated
1989
+
1990
+ @o1.rating.should == 946
1991
+ @o2.rating.should == 913
1992
+ @o3.rating.should == 841
1993
+ @o4.rating.should == 793
1994
+ @o5.rating.should == 667
1995
+ @o6.rating.should == 917
1996
+
1997
+ @t.iterations1.should be_nil
1998
+ @t.iterations2.should be_nil
1999
+ end
2000
+
2001
+ it "should produce inconsistent results with default settings" do
2002
+ @t.rate!
2003
+
2004
+ @p.new_rating.should be_within(0.5).of(713) # the original inconsistent calculation
2005
+ @p.new_rating.should == @p.performance
2006
+
2007
+ @o1.bonus.should == 16
2008
+ @o1.new_rating.should be_within(0.5).of(1013)
2009
+ @o2.bonus.should == 0
2010
+ @o3.bonus.should == 0
2011
+ @o4.bonus.should == 0
2012
+ @o5.bonus.should == 0
2013
+ @o6.bonus.should == 0
2014
+
2015
+ ratings = [@o1, @o2, @o3, @o4, @o5, @o6].map { |o| o.bonus == 0 ? o.rating : o.new_rating }
2016
+
2017
+ performance = ratings.inject(0.0){ |m,r| m = m + r } / 6.0 - 400.0 / 3.0
2018
+ performance.should_not be_within(0.5).of(@p.new_rating)
2019
+
2020
+ @t.iterations1.should be > 1
2021
+ @t.iterations2.should == 1
2022
+ end
2023
+
2024
+ it "should produce consistent results somehow" do
2025
+ pending "a fix to the algorithm (the number of iterations does not help)"
2026
+
2027
+ @t.rate!(max_iterations2: 30)
2028
+
2029
+ @o1.bonus.should == 16
2030
+ @o1.new_rating.should be_within(0.5).of(1013)
2031
+ @o2.bonus.should == 0
2032
+ @o3.bonus.should == 0
2033
+ @o4.bonus.should == 0
2034
+ @o5.bonus.should == 0
2035
+ @o6.bonus.should == 0
2036
+
2037
+ ratings = [@o1, @o2, @o3, @o4, @o5, @o6].map { |o| o.bonus == 0 ? o.rating : o.new_rating }
2038
+
2039
+ performance = ratings.inject(0.0){ |m,r| m = m + r } / 6.0 - 400.0 / 3.0
2040
+ performance.should be_within(0.5).of(@p.new_rating)
2041
+
2042
+ @t.iterations1.should be > 1
2043
+ @t.iterations2.should be > 1
2044
+ end
2045
+ end
997
2046
  end
998
2047
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icu_ratings
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-12 00:00:00.000000000 Z
12
+ date: 2012-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  version: '0'
112
112
  segments:
113
113
  - 0
114
- hash: -4296117158656412484
114
+ hash: -3581814330556862991
115
115
  required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  segments:
122
122
  - 0
123
- hash: -4296117158656412484
123
+ hash: -3581814330556862991
124
124
  requirements: []
125
125
  rubyforge_project: icu_ratings
126
126
  rubygems_version: 1.8.24