skillratings

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.

Installation

Add the following to your Cargo.toml file:

toml [dependencies] skillratings = "0.6.0"

Usage

For a detailed guide on how to use this crate, head over to the documentation.

Elo rating system

```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); ```

Glicko rating system

```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); ```

Glicko-2 rating system

```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); ```

TrueSkill rating system

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!()

DWZ rating system

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); ```

License

This project is licensed under the MIT License.