use crate::glicko2::{constants, tuning::Tuning};
#[derive(Debug, Copy, Clone)]
pub struct Rating<'a> {
pub mu: f64,
pub phi: f64,
pub sigma: f64,
pub(crate) is_scaled: bool,
pub(crate) tuning: &'a Tuning,
}
impl Rating<'_> {
pub fn new(tuning: &Tuning) -> Rating {
Rating {
mu: tuning.mu,
phi: tuning.phi,
sigma: tuning.sigma,
is_scaled: false,
tuning,
}
}
pub(crate) fn scale_down(&mut self) {
if !self.is_scaled {
let mu = (self.mu - self.tuning.mu) / constants::RATIO;
let phi = self.phi / constants::RATIO;
self.mu = mu;
self.phi = phi;
self.is_scaled = true;
}
}
pub(crate) fn scale_up(&mut self) {
if self.is_scaled {
let mu = (self.mu * constants::RATIO) + self.tuning.mu;
let phi = self.phi * constants::RATIO;
self.mu = mu;
self.phi = phi;
self.is_scaled = false;
}
}
pub fn decay(&mut self) {
if !self.is_scaled {
self.scale_down();
}
let vinculum = self.phi.powi(2) + self.sigma.powi(2);
self.phi = vinculum.sqrt();
self.scale_up();
}
}
impl std::fmt::Display for Rating<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Rating(μ={:.2}, φ={:.2}, σ={:.4})",
self.mu, self.phi, self.sigma
)
}
}