Thurstone models, fast.
thurstone is a Python package for inferring relative ability from multi-entrant winning probabilities. This is the model: five horses, each with a Normal performance density, whichever draws the smallest wins. Drag the sliders.
Winning probabilities update live via the lattice algorithm — multiplicity-aware, no Lucian renormalisation. For more room, open the full forward-pricing demo →
The rest of this site is a tour: what Thurstone-class models are, why they were historically hard to use, and how a lattice algorithm makes them O(N) per race and trivially invertible. Every demo runs a pure JavaScript port of the Python analytics, verified against Python via JSON golden fixtures.
Four short reads
Thurstone models
Latent performance, the “tractability vs purity” trade-off, and where Bradley–Terry, Plackett–Luce and Mallows actually break.
Read →The fast ability transform
The $(f, S, m)$ triple, union, removal and comparison — the multiplicity calculus that makes the inverse loop scale.
Read →Rating systems across races
Stitching many races into a single coherent ability scale. Curve-based Gauss–Newton vs the fast LS baseline.
Read →Multi-dimensional ability
Items as vectors, races as directions. Sprinter-vs-stayer, clay-vs-grass, and the rest of the world where one number per item isn't enough.
Read →Six interactive demos
The Triple Crown
Three generative models, identical winning probabilities. The case for Thurstone over Luce.
Multi-race stitching
Paste several races sharing runners; recover one global ability scale.
Density playground
Skew-normal performance densities on the lattice; shift, convolve, dilate.
Cite
Cotton, Peter. “Inferring Relative Ability from Winning Probability in Multientrant Contests,” SIAM Journal on Financial Mathematics, 12(1), 295–317 (2021). DOI: 10.1137/19M1276261.