Compare commits
4 Commits
3a22b20a17
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 853f177fa8 | |||
| fc0efcdc52 | |||
| 3bbddb168f | |||
| 2366c45f6a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
/target
|
/target
|
||||||
/Cargo.lock
|
/Cargo.lock
|
||||||
|
|
||||||
|
/temp
|
||||||
.justfile
|
.justfile
|
||||||
*.svg
|
*.svg
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "trueskill-tt"
|
name = "trueskill-tt"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
bench = false
|
bench = false
|
||||||
|
|||||||
30
src/lib.rs
30
src/lib.rs
@@ -82,7 +82,7 @@ where
|
|||||||
pub fn key(&self, idx: Index) -> Option<&K> {
|
pub fn key(&self, idx: Index) -> Option<&K> {
|
||||||
self.0
|
self.0
|
||||||
.iter()
|
.iter()
|
||||||
.find(|(_, &value)| value == idx)
|
.find(|&(_, value)| *value == idx)
|
||||||
.map(|(key, _)| key)
|
.map(|(key, _)| key)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,11 +115,7 @@ fn erfc(x: f64) -> f64 {
|
|||||||
|
|
||||||
let r = t * (-z * z - 1.26551223 + t * h).exp();
|
let r = t * (-z * z - 1.26551223 + t * h).exp();
|
||||||
|
|
||||||
if x >= 0.0 {
|
if x >= 0.0 { r } else { 2.0 - r }
|
||||||
r
|
|
||||||
} else {
|
|
||||||
2.0 - r
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn erfc_inv(mut y: f64) -> f64 {
|
fn erfc_inv(mut y: f64) -> f64 {
|
||||||
@@ -147,11 +143,7 @@ fn erfc_inv(mut y: f64) -> f64 {
|
|||||||
x += err / (FRAC_2_SQRT_PI * (-(x.powi(2))).exp() - x * err)
|
x += err / (FRAC_2_SQRT_PI * (-(x.powi(2))).exp() - x * err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if y < 1.0 {
|
if y < 1.0 { x } else { -x }
|
||||||
x
|
|
||||||
} else {
|
|
||||||
-x
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ppf(p: f64, mu: f64, sigma: f64) -> f64 {
|
fn ppf(p: f64, mu: f64, sigma: f64) -> f64 {
|
||||||
@@ -239,9 +231,9 @@ pub(crate) fn sort_time(xs: &[i64], reverse: bool) -> Vec<usize> {
|
|||||||
let mut x = xs.iter().enumerate().collect::<Vec<_>>();
|
let mut x = xs.iter().enumerate().collect::<Vec<_>>();
|
||||||
|
|
||||||
if reverse {
|
if reverse {
|
||||||
x.sort_by_key(|(_, &x)| Reverse(x));
|
x.sort_by_key(|&(_, x)| Reverse(x));
|
||||||
} else {
|
} else {
|
||||||
x.sort_by_key(|(_, &x)| x);
|
x.sort_by_key(|&(_, x)| x);
|
||||||
}
|
}
|
||||||
|
|
||||||
x.into_iter().map(|(i, _)| i).collect()
|
x.into_iter().map(|(i, _)| i).collect()
|
||||||
@@ -320,6 +312,8 @@ pub fn quality(rating_groups: &[&[Gaussian]], beta: f64) -> f64 {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use ::approx::assert_ulps_eq;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -331,4 +325,14 @@ mod tests {
|
|||||||
fn test_sort_time() {
|
fn test_sort_time() {
|
||||||
assert_eq!(sort_time(&[0, 1, 2, 0], true), vec![2, 1, 0, 3]);
|
assert_eq!(sort_time(&[0, 1, 2, 0], true), vec![2, 1, 0, 3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_quality() {
|
||||||
|
let a = Gaussian::from_ms(25.0, 3.0);
|
||||||
|
let b = Gaussian::from_ms(25.0, 3.0);
|
||||||
|
|
||||||
|
let q = quality(&[&[a], &[b]], 25.0 / 3.0 / 2.0);
|
||||||
|
|
||||||
|
assert_ulps_eq!(q, 0.8115343414514944, epsilon = 1e-6)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user