Compare commits
4 Commits
db743bc417
...
refactor
| Author | SHA1 | Date | |
|---|---|---|---|
| 3bbddb168f | |||
| 2366c45f6a | |||
| 3a22b20a17 | |||
| 02ae2f0977 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
/target
|
/target
|
||||||
/Cargo.lock
|
/Cargo.lock
|
||||||
|
|
||||||
|
/temp
|
||||||
.justfile
|
.justfile
|
||||||
*.svg
|
*.svg
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ Rust port of [TrueSkillThroughTime.py](https://github.com/glandfried/TrueSkillTh
|
|||||||
|
|
||||||
- [x] Implement approx for Gaussian
|
- [x] Implement approx for Gaussian
|
||||||
- [x] Add more tests from `TrueSkillThroughTime.jl`
|
- [x] Add more tests from `TrueSkillThroughTime.jl`
|
||||||
|
- [ ] Add tests for `quality()` (Use [sublee/trueskill](https://github.com/sublee/trueskill/tree/master) as reference)
|
||||||
- [ ] Benchmark Batch::iteration()
|
- [ ] Benchmark Batch::iteration()
|
||||||
- [ ] Time needs to be an enum so we can have multiple states (see `batch::compute_elapsed()`)
|
- [ ] Time needs to be an enum so we can have multiple states (see `batch::compute_elapsed()`)
|
||||||
- [ ] Add examples (use same TrueSkillThroughTime.(py|jl))
|
- [ ] Add examples (use same TrueSkillThroughTime.(py|jl))
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ impl<'a> Game<'a> {
|
|||||||
weights: &'a [Vec<f64>],
|
weights: &'a [Vec<f64>],
|
||||||
p_draw: f64,
|
p_draw: f64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
assert!(
|
debug_assert!(
|
||||||
(result.len() == teams.len()),
|
(result.len() == teams.len()),
|
||||||
"result must have the same length as teams"
|
"result must have the same length as teams"
|
||||||
);
|
);
|
||||||
|
|
||||||
assert!(
|
debug_assert!(
|
||||||
weights
|
weights
|
||||||
.iter()
|
.iter()
|
||||||
.zip(teams.iter())
|
.zip(teams.iter())
|
||||||
@@ -36,12 +36,12 @@ impl<'a> Game<'a> {
|
|||||||
"weights must have the same dimensions as teams"
|
"weights must have the same dimensions as teams"
|
||||||
);
|
);
|
||||||
|
|
||||||
assert!(
|
debug_assert!(
|
||||||
(0.0..1.0).contains(&p_draw),
|
(0.0..1.0).contains(&p_draw),
|
||||||
"draw probability.must be >= 0.0 and < 1.0"
|
"draw probability.must be >= 0.0 and < 1.0"
|
||||||
);
|
);
|
||||||
|
|
||||||
assert!(
|
debug_assert!(
|
||||||
p_draw > 0.0 || {
|
p_draw > 0.0 || {
|
||||||
let mut r = result.to_vec();
|
let mut r = result.to_vec();
|
||||||
r.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
|
r.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
|
||||||
|
|||||||
13
src/lib.rs
13
src/lib.rs
@@ -256,6 +256,7 @@ pub(crate) fn evidence(d: &[DiffMessage], margin: &[f64], tie: &[bool], e: usize
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Calculates the match quality of the given rating groups. A result is the draw probability in the association
|
||||||
pub fn quality(rating_groups: &[&[Gaussian]], beta: f64) -> f64 {
|
pub fn quality(rating_groups: &[&[Gaussian]], beta: f64) -> f64 {
|
||||||
let flatten_ratings = rating_groups
|
let flatten_ratings = rating_groups
|
||||||
.iter()
|
.iter()
|
||||||
@@ -319,6 +320,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]
|
||||||
@@ -330,4 +333,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