|
| 1 | +.. _scoring: |
| 2 | + |
| 3 | +Scoring and scoreboard caching implementation |
| 4 | +============================================= |
| 5 | + |
| 6 | +Currently, DOMjudge only supports ICPC-style 'pass-fail' problems, where a problem is either accepted or rejected. |
| 7 | +In this mode, we try to follow this specification, but have some additional configuration options: |
| 8 | +https://ccs-specs.icpc.io/draft/ccs_system_requirements#scoring |
| 9 | + |
| 10 | +Key points: |
| 11 | + |
| 12 | +- Teams are sorted by their sortorder first; this is frequently used to group teams into actual participants and other |
| 13 | + groups (e.g. company teams, non-eligible teams, staff, etc.). |
| 14 | +- Then teams are sorted ascending by the sum of their problem points. Each correctly solved problems scores a |
| 15 | + pre-defined number of points (integer, by default 1). |
| 16 | +- Then teams are sorted descending by either their penalty time (or runtime, can be configured at contest level). The |
| 17 | + penalty time per problem is rounded down to the nearest minute by default, but can be configured to use second |
| 18 | + granularity instead. |
| 19 | +- If two teams have the same score, they are sorted by the time of their last accepted submission. |
| 20 | + |
| 21 | +The scoreboard is updated in real-time, which can be a performance bottleneck when there are many teams and problems, so |
| 22 | +we employ some caching techniques to speed it up. The scoreboard cache is implemented in two tables, `scorecache` and |
| 23 | +`rankcache`. |
| 24 | + |
| 25 | +The ``scorecache`` table is used to store individual scoreboard cells, i.e. information about a single team's score for |
| 26 | +a particular problem. Whenever a submission has completed judging, the scorecache is updated for that team and problem. |
| 27 | +The table holds all relevant information for the team/problem combination, both for the public and restricted audience |
| 28 | +(i.e. jury) who has full information during the freeze. |
| 29 | + |
| 30 | +The ``scorecache`` table is then used to compute the ``rankcache`` table, which holds the aggregated information for each |
| 31 | +team in order to quickly compute the rank of each team. For this, we do first compute the teams that are definitely |
| 32 | +better than the current team based on problem points and time (either penalty time or runtime). Then for all teams that |
| 33 | +are tied with the current team, we apply the tie breaker (time of last accepted submission). |
0 commit comments