frnt3

The initial design for frnt3 was to collect together as much data for competition as I could, to create a better way to view different leagues and rankings.

During the process I needed a way to compare the results of athletes across leagues (a generalised performance score) and I wanted a way of working out how difficult problems were.

Defining the problem

On the surface problem difficulty seems straight forward... Just get the percentage of athletes that managed to send it...

However:

  • How strong are those athletes that sent it?
  • How strong is the field overall?
  • What about attempts? Flashes?

Could this data be converted into a grade? But grades are a bit loaded and doesn't really provide a numeric value that can be worked with.

Ok, so let's try a simple definition of problem difficulty based on those questions:

athlete performance = athlete strength * attempts
field strength = Σ[athlete strength] / n competing athletes
difficulty = field strength + Σ[athlete performance]

Right, progress, really all we need is athlete strength and the competition results. So let's shift focus, how do we define athlete strength?

There is of course world cup rankings score, a numerical value, that roughly tracks athlete competition performance compared to other athletes in world cups... Is that what we want? What about none IFSC competitions? And does it even correlate to the athlete's ability to climb a problem?

Let's take a look at where this IFSC rank score comes from, I'll simplify here but full details are published by the IFSC [here](https://images.ifsc-climbing.org/ifsc/image/private/t_q_good/prd/okcq1nf8riudxekbcx6q.pdf).

1. athlete attempts a problem
2. s = athlete's progress on the problem converted to a number
3. r = s1 + s2 + s3...
4. positional order = sort r
5. position = index of r in positional order
6. rank score = position * score function

Initially this looks promising, although step 5 hides some subtlety. A loss of resolution. Suddenly the athletes performance on problems is collapsed into an index in a list. We are no longer tracking their ability to climb problems and we begin tracking their 1 dimesional performance relative to other athletes. E.g.

Two athletes could climb the exact same problems in the semi-finals and finals, in the same number of attempts and then get separated in the rankings based on attempts in qualification. That would end up being represented by a point difference ranging from 40 to 195.

Right, we need a more stable metric based directly on problems climbed, preferably it would be nice if it could be based on a basic statistical metric...

What about Elo?

If every athlete had an Elo and every problem had an Elo then you could compare the two and spit out a probability of the athlete climbing that problem.

It is neat and has a track record in chess and tennis and plenty of other sports.

Model 1

Now we can start putting together a first model.

  1. Seed athletes at 1500 Elo
  2. Seed problems at 1500 Elo
  3. Start at the top of the start list
  4. Perform the matchup based on if the athlete sent the problem
  5. Adjust the athlete and problem Elos

But this does not account for attempts and giving an advantage to the athlete. In reality during the 4 minutes athletes are actually playing a few chess games. We want the Elo to show the athlete's ability to just walk up and climb a problem, most the time it takes 2 or 3 attempts so we should expect the problem Elo to be higher than the athlete most the time (except Janja, of course). In fact roughly we should expect the given probability of an athlete climbing a problem to be ~25-50%. Therefore:

  1. Perform matchup for each failed attempt
  2. Perform send matchup
  3. Adjust the athlete and problem Elo

Second issue is the time to convergence, athlete's at the start of the order are not matching up against an accurate measure of the problem difficulty and it could be a long way off. A traditional way to address this is to increase the "k" value in the Elo algorithm when there hasn't been many matchups, this increases changes in Elo due to each match up. This will still suck for the first few athletes.

Returning to steps 1 and 2, athlete seeding at a fixed value is fine, new athletes are unknown entities anyway and overtime they become more rare. Unknown problems happen every event and need to be estimated by the end of that round. Maybe we can improve our seed value with something closer to reality, in order to speed up the process.

Previously we guessed problem difficulty like this:

athlete performance = athlete strength * attempts
field strength = Σ[athlete strength] / n competing athletes
difficulty = field strength + Σ[athlete performance]

Now we have the missing pieces to solve this equation:

Problem Elo = (Σ[athlete Elo] / n competing athletes) + (athlete Elo * attempts) * m
m = difficulty modifier constant

I like this estimation of Elo, it vaguely models what the setters are trying to do: "set problems based on the difficulty of the field which will separate out the stronger climbers". Even if it is not too accurate, it at least nudges the problem seed Elo in the direction it is likely to end up.

After all is said and done, we end up with a performance metric for athletes which is transferable to all competitions and provides statistical value; and a difficulty metric for problems in a round.

Back to frnt3

While most of the time these values will resemble the ordering of the world rankings, it is in the subtle variations where interesting athlete insights can be teased out.

This is the fundamental goal with this project as a whole. We all know "x climber is always going to make the final" or "y climber is killing it this season", but away from the headlines there has to be sea of interesting details... For a sport that is all about the details...

This is just version 1, I will continue to work on the site in my spare time. Hopefully the 2026 season will give me a chance to refine my models and find as much cool stats as possible. So if any other nerds are interested: frnt3