ebi_arithmetic 0.3.13

Exact arithmetic for Ebi - a stochastic process mining utility
Documentation
use crate::{
    Zero,
    fraction::{
        fraction_enum::FractionEnum, fraction_exact::FractionExact, fraction_f64::FractionF64,
    },
    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::Two};
use std::collections::HashMap;

impl From<Rational> for LogPolynomialExact {
    fn from(value: Rational) -> Self {
        if value.is_zero() {
            Self::zero()
        } else {
            let mut argument2coefficient = HashMap::<_, _, FnvBuildHasher>::default();
            argument2coefficient.insert(Natural::TWO, value);
            Self {
                argument2coefficient,
            }
        }
    }
}

impl From<&Rational> for LogPolynomialExact {
    fn from(value: &Rational) -> Self {
        if value.is_zero() {
            Self::zero()
        } else {
            let mut argument2coefficient = HashMap::<_, _, FnvBuildHasher>::default();
            argument2coefficient.insert(Natural::TWO, value.clone());
            Self {
                argument2coefficient,
            }
        }
    }
}

impl From<FractionExact> for LogPolynomialExact {
    fn from(value: FractionExact) -> Self {
        value.0.into()
    }
}

impl From<&FractionExact> for LogPolynomialExact {
    fn from(value: &FractionExact) -> Self {
        (&value.0).into()
    }
}

macro_rules! from_primitive {
    ($t:ty) => {
        impl From<$t> for LogPolynomialExact {
            fn from(value: $t) -> Self {
                if value.is_zero() {
                    Self::zero()
                } else {
                    let mut argument2coefficient = HashMap::<_, _, FnvBuildHasher>::default();
                    argument2coefficient.insert(Natural::TWO, value.into());
                    Self {
                        argument2coefficient,
                    }
                }
            }
        }

        impl From<$t> for LogPolynomialF64 {
            fn from(value: $t) -> Self {
                Self(value as f64)
            }
        }

        impl From<$t> for LogPolynomialEnum {
            fn from(value: $t) -> Self {
                if is_exact_globally() {
                    Self::Exact(value.into())
                } else {
                    Self::Approx(value.into())
                }
            }
        }
    };
}
from_primitive!(usize);
from_primitive!(u128);
from_primitive!(u64);
from_primitive!(u32);
from_primitive!(u16);
from_primitive!(u8);
from_primitive!(i128);
from_primitive!(i64);
from_primitive!(i32);
from_primitive!(i16);
from_primitive!(i8);

impl From<FractionF64> for LogPolynomialF64 {
    fn from(value: FractionF64) -> Self {
        Self(value.0)
    }
}

impl From<f64> for LogPolynomialF64 {
    fn from(value: f64) -> Self {
        Self(value)
    }
}

impl From<&f64> for LogPolynomialF64 {
    fn from(value: &f64) -> Self {
        Self(*value)
    }
}

impl From<FractionEnum> for LogPolynomialEnum {
    fn from(value: FractionEnum) -> Self {
        match value {
            FractionEnum::Exact(f) => LogPolynomialEnum::Exact(LogPolynomialExact::from(f)),
            FractionEnum::Approx(f) => LogPolynomialEnum::Approx(LogPolynomialF64::from(f)),
            FractionEnum::CannotCombineExactAndApprox => todo!(),
        }
    }
}