Codeforces Round 1133 (Div. 1, Div. 2) is coming soon! Register here. ×

greateric's blog

By greateric, history, 4 months ago, In English

Alright, clickbait title aside, how do tourist and jiangly get to 4000 rating? In chess, real life ratings cap out at around 2900, and even on online sites like Lichess, the highest bullet players are 3300-3400, and just around 3000 for the other modes.

Also, anecdotally, if rating is correct, the model predicts that someone who is 2940 should beat me 99.1% of the time. I have a gut feeling I beat more than 0.9% of GMs and LGMs in round 1105 and round 1108.

Review on rating models if you forgot

The mechanistic explanation

Okay, let me explain two reasons that could potentially cause this and why this isn't pure cope.

1. Event variance

A 400 higher rating implies a 10x higher chance to win a game. But what is a "game"?

Suppose I have created a game called "Super-Chess" where you play best 2 out of 3. Assume for simplicity that there are no draws. If A is rated 400 higher than B, then A should win $$$\frac{10}{11}$$$ of the time against B in a single game. But in a round of 3 game of "Super-Chess", A's win chance is actually

$$$\displaystyle P(A^3) + P(A^2B^1) = \left(\frac{10}{11}\right)^3 + 3\left( \frac{10}{11} \right)^2\left( \frac{1}{11} \right) \approx 97.67\%.$$$

So, in "Super-Chess", A would be rated about 649 points higher (because $$$\sigma(649/\beta) = 0.9767$$$), instead of 400.

The main point here is that if a "game" has less variance, then ratings will be stretched out more. In the case of Codeforces, a "game" is an entire contest, which contains multiple problems. So this can serve to reduce variance and stretch the ratings out a bit more.

2. (What we're going to investigate today) Flawed rating calculation

According to Mike's blog, the rating delta is half of the difference between (old rating) and (performance of the place that is the geometric mean between the expected place and actual place).

This calculation might be biased upwards, since by AM-GM the geometric mean is always smaller than the arithmetic mean. Also, near the top of the leaderboard, this difference can be dramatic, since performance can change by 50-100 by moving a single place.

Methodology

We will sample a few div1 or div1+2 rounds (and we're doing both modern and pre-AI rounds for fun). For each one, we'll run simulations of a user with rating $$$r$$$:

  • Use code I already wrote for the old "are div1 ratings harder" blog to calculate the performance of each placing
  • Calculate this user's expected placing if their rating is $$$r$$$
  • Simulate the user's actual placing by just randomly rolling 0/1 for each participant. This should, at least in theory, model a realistic perf that the user gets.
  • Calculate the delta if they got this placing in round, and calculate the expected value over many trials (1000 per rating per contest).

We'll then aggregate total values and see if there are differences in the expected rating change if you are of different ratings.

Results

Here's your high-res graph again:

The relation is almost perfectly exponential — it turns into a line when you change the Y to a log scale. If you're 3600, you could be earning 5-10 undeserved points of delta every contest! But if you're 3000 or below, you get less than a point.

Does this actually affect us in real life?

These differences don't seem to be big enough to matter.

  • If your rating is 3500, you can maintain it with around 3480 level skill.
  • If your rating is 3400, you can maintain it with around 3385 level skill.

That seems inconsequential.

So this blog is complete cope. Unless...

Community simulation

It's possible that the high rated LGMs can pull each other up. Rating is relative — if Mike manually added 300 rating to every LGM, and they only did div0s with each other, their inflated ratings would stay.

But is this a big enough effect in practice? Could the LGMs keep their inflated ratings without leaking them back to everyone else? Let's simulate again.

Methods

We simulate all div1 players, with their ratings rounded down to the nearest 50 just to make things a bit easier. The playerbase looks like:

{3750: 1, 3700: 1, 3650: 2, 3600: 1, 3550: 2, 3500: 1, 3400: 2, 3350: 4, 3300: 3, ..., 2100: 993, 2050: 357, 2000: 531, 1950: 765, 1900: 1165}

We'll initialize each player with their real rating / their actual skill, and nominal rating / CF rating. For example, Benq becomes a Player(real_rating=3750, rating=3750).

How to simulate a the randomness in placings?

We simulated 200 trials, each of 100 contests in sequence. After each contest, nominal ratings are updated, but we assume their true ratings/skills do not change.

Results

Here are the graphs:

  • 1900-2400

  • 2400-3000

  • 3000+

  • Everything

So, it seems like this is true! There is some fairly dramatic inflation at the top. And it only takes maybe 40 contests for it to fully converge. And surprisingly, it starts as early as deep red level: if your true skill is 2600, your actual rating will probably be around 2702. For LGMs, the inflation can be as high as 150-200 points.

Table of results for each rating

Is this a big problem?

Not really. It just means that the scale is a bit more stretched out than it should, especially near the top. The ratings still maintain the ability to compare.

I would assume it would also be possible to fix with some math by switching the update formula to something based on likelihood estimation. We can't simply use performance is that the performance of 1st place is infinitely large. We could do numerical max a posteriori estimation — with some rating deviation (either explicitly stored or implicitly set to, say, 100, for everyone), and we numerically update the distribution (as in, we store the distribution as a table of probability densities at, say, 0.1 rating increments) and calculate the new center (whether that be expectation, median, mode, or whatever). Also I guess calculating likelihood (which is $$$P(\text{get place 67} | \text{rating 2900})$$$) is not trivial, since you have some weird sum of Bernoulli variables.

Math rant about making the perfect system

That's it for today! As always, thanks for reading, and you can find the code and figures on my GitHub.

  • Vote: I like it
  • +211
  • Vote: I do not like it

»
4 months ago, hide # |
 
Vote: I like it +34 Vote: I do not like it

Bro did a deep analysis just for fun

»
4 months ago, hide # |
 
Vote: I like it +63 Vote: I do not like it

if the top 1% of users hold 50% of CF's weighted rating...

»
4 months ago, hide # |
 
Vote: I like it +8 Vote: I do not like it

greateric is currently rated 2141 and just placed 29th in round 1108 div 2, and because he blackmailed Mike, this round is rated for him.

don't ask me why there are police outside your house.

»
4 months ago, hide # |
 
Vote: I like it +8 Vote: I do not like it

This is not a CF blog this is an entire short research paper XD

»
3 months ago, hide # |
← Rev. 2  
Vote: I like it -10 Vote: I do not like it

I got to say the rating inflation at the bottom is caused by AI usage on the bottom, since at this time, most people can't pay for the smart AI models to cheat their way up, also it's way easier to catch TOP Cheaters and ban them. There is significant rating deflation at the bottom, by around 200pts at least, therefore the people at the top are being boosted. While the people at the bottom keep dragging each other down lol.

  • »
    »
    3 months ago, hide # ^ |
    ← Rev. 3  
    Vote: I like it 0 Vote: I do not like it

    The simulation runs as if the internal rating is ground truth. As in, Benq will play like an idealized 3750 that satisfies all the modeling assumptions of Elo points (400 points = 10x win ratio) and a 1400 will play like an idealized 1400 (not a cheater).

    This simulation only attempts to test if there are mathematical weaknesses in the CF rating system. If we have cheaters (some 1400s play like 3000s), I would expect them to siphon rating from all high rated players.

»
3 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Waiting for the next useless blog...

»
3 months ago, hide # |
← Rev. 2  
Vote: I like it +8 Vote: I do not like it

i've wanted to ask this for a while, especially bcz of A2OJ ladders, how do the ratings of old problems map to ratings of current problems, "adjusted for inflation"?

  • »
    »
    3 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    This one is fairly harder to do. What you could do is try to get a random-ish sample of volunteers to try to solve old and new problems, and compare the solve rates to get a "rating adjustment"

    e.g. if old problems of a specific rating are soled by 91% and new problems of the same rating are solved by 50%, they are effectively 400 points harder.

»
3 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

@greateric why all submissions of your initial contests have AI comments and very obvious AI variable names?