elementary-row-operation-verifier 0.0.1

A tool to verify the correctness of elementary row operations on matrices
Documentation
pub mod row;
pub mod col;

use crate::matrix::Matrix;
use crate::parser::OpKind;

pub fn apply(
    m: &Matrix,
    kind: OpKind,
    op: &crate::math::RowOperation,
) -> Result<Matrix, String> {
    let target = op.target.saturating_sub(1);
    let mult = op.first_operand().map(|o| o.to_f64()).unwrap_or(1.0);
    let src = op.source_row().map(|s| s.saturating_sub(1));
    let col_src = op.source_col().map(|s| s.saturating_sub(1));

    match kind {
        OpKind::Row => match op.operator {
            crate::math::Operator::Add => Ok(row::add_multiple(m, target, src.ok_or("missing src")?, mult)),
            crate::math::Operator::Subtract => Ok(row::add_multiple(m, target, src.ok_or("missing src")?, -mult)),
            crate::math::Operator::Multiply => Ok(row::multiply_row(m, target, mult)),
            crate::math::Operator::Replace => Ok(row::replace_row(m, target, src.ok_or("missing src")?)),
        },
        OpKind::Col => match op.operator {
            crate::math::Operator::Add => Ok(col::add_multiple(m, target, col_src.ok_or("missing src")?, mult)),
            crate::math::Operator::Subtract => Ok(col::add_multiple(m, target, col_src.ok_or("missing src")?, -mult)),
            crate::math::Operator::Multiply => Ok(col::multiply_col(m, target, mult)),
            crate::math::Operator::Replace => Ok(col::replace_col(m, target, col_src.ok_or("missing src")?)),
        },
    }
}