TrueSkill in F#

Following the publication of the F# source code for the TrueSkill Through Time paper, we have used the same inference library code to demonstrate how the original TrueSkill algorithm can be coded. In the attached source code, only the program.fs file is different to the TrueSkill through Time blog post and it builds up the factor graph for an arbitrary N-player game with an arbitrary draw probability. Both these numbers can be entered on the command line when running the resulting sample. We tried to make sure to stay as close as possible to the description on page 3 of the TrueSkill technical report.

The attached ZIP file contains the entire source code which should compile without problems with F# 1.9.3.14. You can either load the solution in Visual Studio 2008 or simply run build.bat form the command line – in either case you will end up with a trueskill.exe program.

Update: Following the release of the F# September 2008 CTP we have updated the source code to work with F# 1.9.6.2. Also, we added one of the new features of F#, namely units-of-measure, which makes the TrueSkill update invocation calls now read as follows:

Note that one can no longer accidentally pass the variance instead of the standard deviation because the former being of type float<SkillPoints^2>. Try yourself!

Update 2: We had some feedback from Andrew Kennedy that we exploited a current “bug” in the units-of-measure code where literals (such as 1.0) can have generic units. We removed the incorrect usages and re-posted the ZIP file.

Update 3: We extended the example to work with draws. Thanks to Chih-Jen Lin for the suggestion!

No. Even in an absolutely lopsided situation where TrueSkill would avoid making the matchup if at all possible, the best you can do is remain at your current ranking.

For instance, run a situation where the winning player has 100 mu, and 0.1 sigma, and the losing player has 1 mu and 0.1 sigma. In this case, the system knows pretty much definitively that these two players are a very bad match (0.0% match quality), and the losing player still won’t gain anything by losing, even though he lost to a player who was much higher ranked.

The same is going to pretty much hold true in a less theoretical situation, where a very good Halo player (rank 50) who has played a lot of games (and therefore has a low sigma) plays against a freshman player (rank 25, sigma 8.333). The lower ranked player will lose very little mu for losing the match, but won’t gain any mu. Their sigma will also not decrease very much because the match was so bad.