Created
September 27, 2011 03:16
-
-
Save jsomers/1244233 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
["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