ebi_arithmetic 0.3.13

Exact arithmetic for Ebi - a stochastic process mining utility
Documentation
use crate::{
    One, is_exact_globally,
    log_polynomial::{
        log_polynomial_enum::LogPolynomialEnum, log_polynomial_exact::LogPolynomialExact,
        log_polynomial_f64::LogPolynomialF64,
    },
};
use fnv::FnvBuildHasher;
use malachite::{
    Natural, Rational,
    base::num::basic::traits::{One as _, Two},
};
use std::collections::HashMap;

impl One for LogPolynomialExact {
    fn one() -> Self {
        let mut argument2coefficient = HashMap::<_, _, FnvBuildHasher>::default();
        argument2coefficient.insert(Natural::TWO, Rational::ONE);
        Self {
            argument2coefficient,
        }
    }

    fn is_one(&self) -> bool {
        if self.argument2coefficient.len() == 1 {
            if let Some((argument, coefficient)) = self.argument2coefficient.iter().next() {
                return coefficient.is_one() && argument == &Natural::TWO;
            }
        }
        false
    }
}

impl One for LogPolynomialF64 {
    fn one() -> Self {
        Self(1.0)
    }

    fn is_one(&self) -> bool {
        self.0.is_one()
    }
}

impl One for LogPolynomialEnum {
    fn one() -> Self {
        if is_exact_globally() {
            Self::Exact(LogPolynomialExact::one())
        } else {
            Self::Approx(LogPolynomialF64::one())
        }
    }

    fn is_one(&self) -> bool {
        match self {
            LogPolynomialEnum::Approx(log_polynomial_f64) => log_polynomial_f64.is_one(),
            LogPolynomialEnum::Exact(log_polynomial_exact) => log_polynomial_exact.is_one(),
            LogPolynomialEnum::CannotCombineExactAndApprox => false,
        }
    }
}

#[cfg(test)]
pub mod tests {
    use crate::{One, Zero, log_polynomial::log_polynomial::LogPolynomial};

    #[test]
    fn one() {
        assert!(LogPolynomial::one().is_one());
        assert_eq!(LogPolynomial::one(), LogPolynomial::one());
        assert_eq!(LogPolynomial::from(1), LogPolynomial::one());
        assert_ne!(LogPolynomial::from(1), LogPolynomial::zero());
    }
}