use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct GlickoRating { pub rating: f64, // Display scale (e.g., 1500) pub rd: f64, // Rating deviation (350 for new) pub volatility: f64, // Consistency (0.06 default) } impl GlickoRating { pub fn new_player() -> Self { Self { rating: 1500.0, rd: 350.0, volatility: 0.06, } } pub fn to_glicko2_scale(&self) -> (f64, f64, f64) { // Convert to internal scale: μ, φ, σ let mu = (self.rating - 1500.0) / 173.7178; let phi = self.rd / 173.7178; (mu, phi, self.volatility) } pub fn from_glicko2_scale(mu: f64, phi: f64, sigma: f64) -> Self { // Convert back to display scale Self { rating: mu * 173.7178 + 1500.0, rd: phi * 173.7178, volatility: sigma, } } }