ebi_arithmetic 0.3.13

Exact arithmetic for Ebi - a stochastic process mining utility
Documentation
use malachite::{base::num::basic::traits::One, rational::Rational};

use crate::{
    IdentityMinus,
    ebi_matrix::EbiMatrix,
    matrix::{
        fraction_matrix_enum::FractionMatrixEnum, fraction_matrix_exact::FractionMatrixExact,
        fraction_matrix_f64::FractionMatrixF64,
    },
};

impl IdentityMinus for FractionMatrixF64 {
    fn identity_minus(&mut self) {
        for i in 0..self.number_of_rows() {
            for j in 0..self.number_of_columns() {
                if i == j {
                    let idx = self.index(i, i);
                    self.values[idx] = 1f64 - self.values[idx];
                } else {
                    let idx = self.index(i, j);
                    self.values[idx] *= -1f64;
                }
            }
        }
    }
}

impl IdentityMinus for FractionMatrixExact {
    fn identity_minus(&mut self) {
        for i in 0..self.number_of_rows() {
            for j in 0..self.number_of_columns() {
                if i == j {
                    let idx = self.index(i, i);
                    self.values[idx] = &Rational::ONE - &self.values[idx];
                } else {
                    let idx = self.index(i, j);
                    self.values[idx] *= -Rational::ONE;
                }
            }
        }
    }
}

impl IdentityMinus for FractionMatrixEnum {
    fn identity_minus(&mut self) {
        match self {
            FractionMatrixEnum::Approx(m) => m.identity_minus(),
            FractionMatrixEnum::Exact(m) => m.identity_minus(),
            FractionMatrixEnum::CannotCombineExactAndApprox => {}
        }
    }
}

#[cfg(test)]
mod tests {

    use crate::{
        f_en,
        fraction::fraction_enum::FractionEnum,
        matrix::{fraction_matrix_enum::FractionMatrixEnum, identity_minus::IdentityMinus},
    };

    #[test]
    fn fraction_matrix_abnormal() {
        let mut m1: FractionMatrixEnum = vec![vec![f_en!(8, 3), f_en!(3, 8)]].try_into().unwrap();

        m1.identity_minus();

        let m3: FractionMatrixEnum = vec![vec![-f_en!(5, 3), -f_en!(3, 8)]].try_into().unwrap();

        assert_eq!(m1, m3)
    }
}