Skip to content

Instantly share code, notes, and snippets.

@jsomers
Created September 27, 2011 03:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsomers/1244233 to your computer and use it in GitHub Desktop.
Save jsomers/1244233 to your computer and use it in GitHub Desktop.
# See http://www.glicko.net/glicko/glicko.pdf
DEFAULT_RATING = 1500.0
AVERAGE_RD = 50.0 # Could be determined empirically.
PERIODS_TO_RESET = 400.0 # If you sit out 400 games your rating is as uncertain as a new player's.
UNRATED_RD = 350.0
MINIMUM_RD = 30.0
C = Math::sqrt((UNRATED_RD ** 2 - AVERAGE_RD ** 2) / PERIODS_TO_RESET)
Q = 0.0057565
def update_rd(rd, periods_since_last_competition)
[Math::sqrt(rd.to_f ** 2 + (C ** 2) * periods_since_last_competition.to_f), UNRATED_RD].min
end
def g(rd)
1.0 / Math::sqrt((1.0 + (3.0 * Q ** 2.0 * rd ** 2.0) / Math::PI ** 2.0))
end
def expected_outcome(rating, rating_opponent, rd_opponent)
1.0 / (1 + 10.0 ** ((-1.0 * g(rd_opponent) * (rating - rating_opponent)) / 400.0))
end
def d_squared(rating, rating_opponent, rd_opponent)
1.0 / ((Q ** 2.0) * ((g(rd_opponent)) ** 2.0) * expected_outcome(rating, rating_opponent, rd_opponent) * (1.0 - expected_outcome(rating, rating_opponent, rd_opponent)))
end
def new_rating(rating, rating_opponent, rd, rd_opponent, outcome)
rating + (Q / ((1.0 / rd ** 2.0) + (1.0 / d_squared(rating, rating_opponent, rd_opponent)))) * g(rd_opponent) * (outcome - expected_outcome(rating, rating_opponent, rd_opponent))
end
def new_rd(rd, d2)
Math::sqrt( 1.0 / ((1.0 / rd ** 2.0) + (1.0 / d2)) )
end
matches = File.open("./matches.txt").read.split("\n").reverse
ratings = {}
matches.each_with_index do |match, t|
winner, loser = match.split(" -- ")
ratings[winner] = {:rating => DEFAULT_RATING, :rd => UNRATED_RD, :last_played => t} if ratings[winner].nil?
ratings[loser] = {:rating => DEFAULT_RATING, :rd => UNRATED_RD, :last_played => t} if ratings[loser].nil?
win, los = ratings[winner], ratings[loser]
winner_rd = update_rd(win[:rd], t - win[:last_played])
loser_rd = update_rd(los[:rd], t - los[:last_played])
new_rating_for_winner = new_rating(win[:rating], los[:rating], win[:rd], los[:rd], 1)
new_rd_for_winner = new_rd(win[:rd], d_squared(win[:rating], los[:rating], los[:rd]))
new_rating_for_loser = new_rating(los[:rating], win[:rating], los[:rd], win[:rd], 0)
new_rd_for_loser = new_rd(los[:rd], d_squared(los[:rating], win[:rating], win[:rd]))
ratings[winner] = {:rating => new_rating_for_winner, :rd => new_rd_for_winner, :last_played => t}
ratings[loser] = {:rating => new_rating_for_loser, :rd => new_rd_for_loser, :last_played => t}
end
ratings.sort {|a, b| b[1][:rating] <=> a[1][:rating]}.each {|r| p r}
["Edward Hieatt", {:rating=>1875.93496947786, :rd=>155.891674592078, :last_played=>165}]
["Rob Mee", {:rating=>1857.6080321866, :rd=>178.966140648547, :last_played=>97}]
["Paul Dix", {:rating=>1808.73368783549, :rd=>234.370387388258, :last_played=>6}]
["Wes Harris", {:rating=>1797.6492107295, :rd=>216.644486934151, :last_played=>144}]
["Kevin Prentiss", {:rating=>1789.13594729398, :rd=>276.976047785662, :last_played=>11}]
["Santosh Kumar", {:rating=>1761.19756027359, :rd=>197.596618175713, :last_played=>693}]
["Chris Heisterkamp", {:rating=>1745.57205268304, :rd=>166.406059036709, :last_played=>242}]
["Dave Lane", {:rating=>1731.72509723127, :rd=>286.823229125972, :last_played=>723}]
["Jordan Brenner", {:rating=>1725.16876780629, :rd=>216.417026102232, :last_played=>185}]
["Dan Herman", {:rating=>1717.13884427488, :rd=>224.409136042475, :last_played=>540}]
["Dave Goddard", {:rating=>1706.11719737879, :rd=>99.3334482980538, :last_played=>982}]
["Rosemary King", {:rating=>1702.50913849912, :rd=>168.201972127245, :last_played=>977}]
["Micah Young", {:rating=>1698.33417922185, :rd=>218.450856930982, :last_played=>716}]
["Edgar Gonzalez", {:rating=>1697.53469590316, :rd=>110.140865549766, :last_played=>846}]
["Suman Gurung", {:rating=>1695.80015178658, :rd=>50.8005107717473, :last_played=>988}]
["David Stevenson", {:rating=>1693.65280313697, :rd=>174.263046163727, :last_played=>668}]
["Jeff Wilf", {:rating=>1686.49781602636, :rd=>218.287578356071, :last_played=>485}]
["James Somers", {:rating=>1680.83489196704, :rd=>97.9646046312914, :last_played=>963}]
["Thomas Bukowski", {:rating=>1678.66601025705, :rd=>248.350170543669, :last_played=>968}]
["Pat Colgan", {:rating=>1678.40753366401, :rd=>250.077183151257, :last_played=>960}]
["Stefan Gunther", {:rating=>1662.21217901066, :rd=>290.230243344137, :last_played=>906}]
["3an", {:rating=>1658.15498842803, :rd=>255.46916594841, :last_played=>396}]
["Benny Wong", {:rating=>1656.63303427478, :rd=>137.383810035848, :last_played=>781}]
["Jacobo Blasco", {:rating=>1640.8044774086, :rd=>251.389040687565, :last_played=>935}]
["Tommy Sullivan", {:rating=>1637.67713680082, :rd=>158.74930593908, :last_played=>967}]
["Rajan Agaskar", {:rating=>1636.30802589623, :rd=>31.0816350171575, :last_played=>981}]
["Haddad", {:rating=>1635.96006785121, :rd=>274.857297130654, :last_played=>31}]
["Heather Weston", {:rating=>1633.17698075528, :rd=>254.323634053797, :last_played=>209}]
["David Tisch", {:rating=>1630.89402526793, :rd=>232.793389675345, :last_played=>575}]
["Jake Quain", {:rating=>1617.50647652886, :rd=>62.1010870144198, :last_played=>985}]
["Adam Berlin", {:rating=>1599.47632128037, :rd=>26.4024964069591, :last_played=>985}]
["William Hill", {:rating=>1589.65121918768, :rd=>238.29087583978, :last_played=>907}]
["Noah Slimak", {:rating=>1585.25765360573, :rd=>119.236696571501, :last_played=>846}]
["Dave Bellona", {:rating=>1583.04767921526, :rd=>74.4731219645127, :last_played=>843}]
["Nicholas Hippenmeyer", {:rating=>1579.98037996312, :rd=>116.558832541568, :last_played=>747}]
["Merrick Zoubeiri", {:rating=>1568.44409325277, :rd=>289.239408861363, :last_played=>122}]
["Alex Guttler", {:rating=>1567.20929644573, :rd=>288.281942845176, :last_played=>679}]
["Austin Putman", {:rating=>1561.21199955351, :rd=>92.4912816494267, :last_played=>427}]
["Ian Mcfarland", {:rating=>1555.18794547116, :rd=>173.109847233039, :last_played=>89}]
["Meka Asonye", {:rating=>1554.40390571596, :rd=>299.636679759632, :last_played=>579}]
["Sean Moon", {:rating=>1553.08605652276, :rd=>30.0380319153634, :last_played=>983}]
["Will Anderson", {:rating=>1540.60609300987, :rd=>44.323758678918, :last_played=>959}]
["Cathy O'connell", {:rating=>1528.0197759526, :rd=>44.7846397847963, :last_played=>983}]
["Brent Wheeldon", {:rating=>1518.12188214527, :rd=>73.2212372902084, :last_played=>909}]
["Andrew Fader", {:rating=>1511.79194149001, :rd=>52.0504511145462, :last_played=>973}]
["Steve Ellis", {:rating=>1511.21469196334, :rd=>28.1599113787115, :last_played=>981}]
["Rosie Richards", {:rating=>1511.11111349654, :rd=>64.2386986003504, :last_played=>732}]
["Nick Stamas", {:rating=>1497.62172387154, :rd=>256.152198230543, :last_played=>723}]
["Jim Lindstrom", {:rating=>1495.95971507674, :rd=>75.1143898383687, :last_played=>960}]
["Nicholas Monje", {:rating=>1495.35304107691, :rd=>134.099733575073, :last_played=>739}]
["Mark Gangl", {:rating=>1494.98289359981, :rd=>114.697257958818, :last_played=>921}]
["Kris Hicks", {:rating=>1490.35969469631, :rd=>47.0055028802185, :last_played=>988}]
["Jt Archie", {:rating=>1485.48264131945, :rd=>145.523399783339, :last_played=>958}]
["Sam Coward", {:rating=>1482.32384487792, :rd=>167.711298057728, :last_played=>573}]
["Serguei Filimonov", {:rating=>1465.44243755754, :rd=>72.296665616863, :last_played=>203}]
["Alex Kwiatkowski", {:rating=>1465.35025581769, :rd=>44.2245186870028, :last_played=>953}]
["Josh Knowles", {:rating=>1454.15509508414, :rd=>199.06270346655, :last_played=>161}]
["Nick Monje", {:rating=>1423.42714104242, :rd=>291.895587367163, :last_played=>667}]
["Sam Obukwelu", {:rating=>1413.54725597974, :rd=>55.6411839388444, :last_played=>937}]
["Nick Greenfield", {:rating=>1403.23530017606, :rd=>38.5110827437075, :last_played=>972}]
["Tim Connor", {:rating=>1396.07402824524, :rd=>225.1116560824, :last_played=>297}]
["Jerred Cook", {:rating=>1370.54069327489, :rd=>230.084834191144, :last_played=>499}]
["Parker Thompson", {:rating=>1355.65984087136, :rd=>249.822930846058, :last_played=>353}]
["Ben Moss", {:rating=>1350.75462614181, :rd=>144.954978602798, :last_played=>868}]
["Dan Storms", {:rating=>1342.80942901554, :rd=>248.927084777352, :last_played=>219}]
["Jesse Lamb", {:rating=>1337.78782098934, :rd=>290.230243344137, :last_played=>523}]
["Mike Mazur", {:rating=>1331.89017821027, :rd=>248.47126610222, :last_played=>947}]
["Samantha John", {:rating=>1331.09344279217, :rd=>121.633145502651, :last_played=>685}]
["Todd Persen", {:rating=>1330.7408289141, :rd=>52.2181227019945, :last_played=>973}]
["Jonathan Berger", {:rating=>1325.08461208031, :rd=>50.0561379266114, :last_played=>958}]
["Lee Byrd", {:rating=>1319.42285644457, :rd=>104.489189944963, :last_played=>815}]
["Andrew Marshall", {:rating=>1317.77167283812, :rd=>150.387880651882, :last_played=>539}]
["Zach Soudan", {:rating=>1302.56892307331, :rd=>226.404896898002, :last_played=>977}]
["Charles Simon", {:rating=>1274.32643309579, :rd=>187.776932365244, :last_played=>603}]
["Jeronimo Colon", {:rating=>1272.07545225423, :rd=>116.300832760299, :last_played=>615}]
["Jason Goodrell", {:rating=>1231.32079681902, :rd=>222.840211804299, :last_played=>526}]
["Peter Jaros", {:rating=>1229.97111398439, :rd=>158.063481265808, :last_played=>532}]
["Evan Farrar", {:rating=>1199.58105067703, :rd=>70.3970828746577, :last_played=>899}]
["Grant Hutchins", {:rating=>1188.03666014658, :rd=>119.649315753085, :last_played=>749}]
["Andy Cramer", {:rating=>1187.91949388583, :rd=>173.279495193893, :last_played=>857}]
["Luke Crawford", {:rating=>1114.14800552816, :rd=>157.034729115407, :last_played=>491}]
["Ian Zabel", {:rating=>1111.79832743287, :rd=>103.996570938539, :last_played=>816}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment