openskill 0.0.1

Rust implementation of OpenSkill (license free TrueSkill)
Documentation
use crate::{
    constant::*,
    env::Env,
    model::{
        bradley_terry_full::BradleyTerryFull, bradley_terry_part::BradleyTerryPart,
        kind::ModelKind, model::Model, plackett_luce::PlackettLuce,
        thurstone_mosteller_full::ThurstoneMostellerFull,
        thurstone_mosteller_part::ThurstoneMostellerPart,
    },
    rating::{default_gamma, default_ordinal, GammaFunc, OrdinalFunc},
};

#[derive(Default)]
pub struct EnvBuilder {
    beta: Option<f64>,
    gamma: Option<GammaFunc>,
    kappa: Option<f64>,
    model: Option<ModelKind>,
    mu: Option<f64>,
    ordinal: Option<OrdinalFunc>,
    sigma: Option<f64>,
    z: Option<f64>,
}

impl EnvBuilder {
    pub fn beta(mut self, beta: f64) -> Self {
        self.beta = Some(beta);
        self
    }

    pub fn gamma(mut self, gamma: GammaFunc) -> Self {
        self.gamma = Some(gamma);
        self
    }

    pub fn kappa(mut self, kappa: f64) -> Self {
        self.kappa = Some(kappa);
        self
    }

    pub fn model(mut self, model: ModelKind) -> Self {
        self.model = Some(model);
        self
    }

    pub fn mu(mut self, mu: f64) -> Self {
        self.mu = Some(mu);
        self
    }

    pub fn ordinal(mut self, ordinal: OrdinalFunc) -> Self {
        self.ordinal = Some(ordinal);
        self
    }

    pub fn sigma(mut self, sigma: f64) -> Self {
        self.sigma = Some(sigma);
        self
    }

    pub fn z(mut self, z: f64) -> Self {
        self.z = Some(z);
        self
    }

    pub fn build(self) -> Env {
        let mu = self.mu.unwrap_or(DEFAULT_MU);
        let z = self.z.unwrap_or(DEFAULT_Z);
        let sigma = self.sigma.unwrap_or(mu / z);
        let beta = self.beta.unwrap_or(sigma / 2.0);
        let kappa = self.kappa.unwrap_or(KAPPA);
        let gamma = self.gamma.unwrap_or(default_gamma);
        let ordinal = self.ordinal.unwrap_or(default_ordinal);
        let model: Box<dyn Model> = match self.model.unwrap_or_default() {
            ModelKind::PlackettLuce => Box::new(PlackettLuce::new(beta, kappa, gamma)),
            ModelKind::BradleyTerryFull => Box::new(BradleyTerryFull::new(beta, kappa, gamma)),
            ModelKind::BradleyTerryPart => Box::new(BradleyTerryPart::new(beta, kappa, gamma)),
            ModelKind::ThurstoneMostellerPart => {
                Box::new(ThurstoneMostellerPart::new(beta, kappa, gamma))
            }
            ModelKind::ThurstoneMostellerFull => {
                Box::new(ThurstoneMostellerFull::new(beta, kappa, gamma))
            }
        };

        Env::new(model, z, mu, sigma, beta, ordinal)
    }
}