Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/chad3814/elo-mmr
A node implementation of the ELO-MMR player ranking
https://github.com/chad3814/elo-mmr
elo elo-mmr ranking ranking-system
Last synced: about 2 months ago
JSON representation
A node implementation of the ELO-MMR player ranking
- Host: GitHub
- URL: https://github.com/chad3814/elo-mmr
- Owner: chad3814
- License: mit
- Created: 2024-08-28T22:17:42.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2024-09-26T14:58:16.000Z (3 months ago)
- Last Synced: 2024-10-31T07:22:19.017Z (about 2 months ago)
- Topics: elo, elo-mmr, ranking, ranking-system
- Language: TypeScript
- Homepage: https://arxiv.org/abs/2101.00400
- Size: 63.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# elo-mmr
A node implementation of the [ELO-MMR player ranking](https://youtu.be/sUbE1tPDmnk).
This code is based on the Python version https://github.com/duhby/elommr which is Copyright 2023-2024 [duhby](https://github.com/duhby), and released under the MIT license. It wouldn't be possible without their help and code.
## Quick Example
This is the conversion from python example, and is in `[node_example.ts](https://github.com/chad3814/elo-mmr/blob/main/node_example.ts)`:```typescript
import { EloMmr, Standing } from "./lib/elo_mmr"
import { Player } from "./lib/player";
import { Rating } from "./lib/rating";function main(): void {
const elo_mmr = new EloMmr();
const player1 = new Player(new Rating());
const player2 = new Player(new Rating())
const standings: Standing[] = [
[
player1,
0, 0 // Range of players that got or tied for first
],
[
player2,
1, 1 // Range of players that got or tied for second
],
];// Note that the contest_time does not do anything in this example
// because EloMMR.drift_per_sec defaults to 0, so contest_time
// can be omitted from the round_update call, but it is included
// here to show how it can be used.
// Do note, though, that you should either always include
// contest_time or never include it, because if you include it
// in some competitions and not others, the ratings will be skewed
// incorrectly.
const contest_time = new Date();
elo_mmr.roundUpdate(standings, contest_time);const next_contest_time = new Date(contest_time.getMilliseconds() + 10000);
// Assumes the outcome of the next competition is the same as the
// previous, so the standings aren't changed.
elo_mmr.roundUpdate(standings, next_contest_time);for (const player of [player1, player2]) {
console.log("\nrating_mu, rating_sig, perf_score, place");
for(const event of player.eventHistory) {
console.log(`${event.rating.mu}, ${event.rating.sig}, ${event.performanceScore}, ${event.place}`);
}
console.log(`Final rating: ${player.eventHistory[player.eventHistory.length - 1].toString()}`);
}
// >>>
// rating_mu, rating_sig, perf_score, place
// 1629, 171, 1654, 0
// 1645, 130, 1663, 0
// Final rating: 1645 ± 100
//
// rating_mu, rating_sig, perf_score, place
// 1371, 171, 1346, 1
// 1355, 130, 1337, 1
// Final rating: 1355 ± 100
}main();
```