Calculate a player's skill rating in 1v1 matches instantly using Elo, TrueSkill, DWZ, Glicko and Glicko-2 algorithms known from their usage in chess and online games.
Skillratings is only for calculating 1v1 matches, teams are not supported. Also we calculate the results instantly, instead of at the end of every rating period.
Add the following to your Cargo.toml
file:
toml
[dependencies]
skillratings = "0.6.0"
For a detailed guide on how to use this crate, head over to the documentation.
```rust extern crate skillratings;
use skillratings::{elo::elo, outcomes::Outcomes, rating::EloRating};
let playerone = EloRating { rating: 1000.0 }; let playertwo = EloRating { rating: 1000.0 };
// The outcome is from the perspective of player one. let outcome = Outcomes::WIN;
let (playeronenew, playertwonew) = elo(playerone, playertwo, outcome, 32.0); assert!((playeronenew.rating - 1016.0).abs() < f64::EPSILON); assert!((playertwonew.rating - 984.0).abs() < f64::EPSILON); ```
```rust use skillratings::{glicko::glicko, outcomes::Outcomes, rating::GlickoRating};
let playerone = GlickoRating { rating: 1500.0, deviation: 350.0, }; let playertwo = GlickoRating { rating: 1500.0, deviation: 350.0, };
let outcome = Outcomes::WIN;
let (playeronenew, playertwonew) = glicko(playerone, playertwo, outcome);
assert!((playeronenew.rating.round() - 1662.0).abs() < f64::EPSILON); assert!((playeronenew.deviation.round() - 290.0).abs() < f64::EPSILON);
assert!((playertwonew.rating.round() - 1338.0).abs() < f64::EPSILON); assert!((playertwonew.deviation.round() - 290.0).abs() < f64::EPSILON); ```
```rust extern crate skillratings;
use skillratings::{glicko2::glicko2, outcomes::Outcomes, rating::Glicko2Rating};
let playerone = Glicko2Rating { rating: 1500.0, deviation: 350.0, volatility: 0.06 }; let playertwo = Glicko2Rating { rating: 1500.0, deviation: 350.0, volatility: 0.06 };
let outcome = Outcomes::WIN;
let (playeronenew, playertwonew) = glicko2(playerone, playertwo, outcome, 0.5);
assert!((playeronenew.rating.round() - 1662.0).abs() < f64::EPSILON); assert!((playeronenew.deviation.round() - 290.0).abs() < f64::EPSILON);
assert!((playertwonew.rating.round() - 1338.0).abs() < f64::EPSILON); assert!((playertwonew.deviation.round() - 290.0).abs() < f64::EPSILON); ```
Caution regarding usage of TrueSkill: Microsoft permits only Xbox Live games or non-commercial projects to use TrueSkill(TM). If your project is commercial, you should use another rating system included here.
rust
todo!()
The statements above hold true here as well.
```rust use skillratings::{dwz::dwz, outcomes::Outcomes, rating::DWZRating};
let playerone = DWZRating { rating: 1500.0, index: 42, age: 42, }; let playertwo = DWZRating { rating: 1500.0, index: 12, age: 12, };
let outcome = Outcomes::WIN;
let (playeronenew, playertwonew) = dwz(playerone, playertwo, outcome);
assert!((playeronenew.rating.round() - 1519.0).abs() < f64::EPSILON); asserteq!(playerone_new.index, 43);
assert!((playertwonew.rating.round() - 1464.0).abs() < f64::EPSILON); asserteq!(playertwo_new.index, 13); ```
This project is licensed under the MIT License.