icu_ratings 1.2.2 → 1.3.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.
@@ -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