Skip to content

Concepts

What Elo-MMR estimates

Elo-MMR models each participant with a rating mean and uncertainty. After a ranked multiplayer contest, it infers a performance and updates every entrant's posterior rating. Unlike pairwise-only Elo adaptations, it handles one ordered standing directly.

Ratings are estimates, not probabilities or guarantees. A participant with a high uncertainty can move farther after the next result than an established participant.

Contest representation

Rating input is ordered chronologically by each Contest.time_seconds. Every contest also contains a list of (name, low_rank, high_rank) tuples. Ranks are zero-based and inclusive.

from elo_mmr_py import Contest

contest = Contest(
    [
        ('alice', 0, 0),
        ('bob', 1, 2),
        ('carol', 1, 2),
        ('dave', 3, 3),
    ],
    time_seconds=1_700_000_000,
)

This means Alice won, Bob and Carol tied for ranks 1–2, and Dave finished last. Every name must be unique and every tie member must repeat the same interval.

Empty contests and contests in which everyone ties are outcome-free. They do not create player events, but they still occupy a global contest index and advance checkpoint time.

Full history versus latest state

rate() returns a Player with every PlayerEvent. This is useful for plots, audits, and historical analysis. Returning the history requires O(events) Python objects.

rate_latest() returns one immutable PlayerRating per participant. The Rust algorithm still uses its internal history, but historical Python objects are not materialized; the returned object count is O(players).