use crate::{AlgebraError, Gf2, Matrix};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SemiringMatrixDemo {
pub dimensions: (usize, usize),
pub matrix: Vec<bool>,
pub identity_product: Vec<bool>,
pub square: Vec<bool>,
}
pub fn semiring_matrix_demo() -> Result<SemiringMatrixDemo, AlgebraError> {
let matrix = Matrix::from_rows(vec![
vec![Gf2(true), Gf2(false)],
vec![Gf2(true), Gf2(true)],
])?;
let identity = Matrix::<Gf2>::identity(2);
let identity_product = matrix.matmul(&identity)?;
let square = matrix.matmul(&matrix)?;
Ok(SemiringMatrixDemo {
dimensions: (matrix.rows, matrix.cols),
matrix: bits(&matrix),
identity_product: bits(&identity_product),
square: bits(&square),
})
}
fn bits(matrix: &Matrix<Gf2>) -> Vec<bool> {
matrix.data.iter().map(|bit| bit.0).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn semiring_demo_uses_identity_and_gf2_multiply() {
let demo = semiring_matrix_demo().expect("valid semiring demo");
assert_eq!(demo.dimensions, (2, 2));
assert_eq!(demo.identity_product, demo.matrix);
assert_eq!(demo.square, vec![true, false, false, true]);
}
}