math_utils_lib 0.4.1

A library providing math utilities such as a parser/evaluator and a LaTeX export to export a history of parsed expressions and solved equations to LaTeX.
Documentation
use crate::basetypes::Value;

#[doc(hidden)]
pub fn ssmult(a: &f64, b: &f64) -> Result<Value, String> {
    Ok(Value::Scalar(a*b))
}

#[doc(hidden)]
pub fn svmult(a: &f64, b: &Vec<f64>) -> Result<Value, String> {
    let mut output_v = vec![];
    for i in b {
        output_v.push(i*a);
    }
    Ok(Value::Vector(output_v))
}

#[doc(hidden)]
pub fn smmult(a: &f64, b: &Vec<Vec<f64>>) -> Result<Value, String> {
    let mut output_m = vec![];
    for i in 0..b.len() {
        let mut row = vec![];
        for j in 0..b[0].len() {
            row.push(b[i][j]*a);
        }
        output_m.push(row);
    }
    Ok(Value::Matrix(output_m))
}

#[doc(hidden)]
pub fn vvmult(a: &Vec<f64>, b: &Vec<f64>) -> Result<Value, String> {
    if a.len() != b.len() {
        return Err("Vectors have different dimensions!".to_string());
    }
    let mut sum = 0f64;
    for i in 0..a.len() {
        sum += a[i]*b[i];
    }
    return Ok(Value::Scalar(sum));
}

#[doc(hidden)]
pub fn mvmult(a: &Vec<Vec<f64>>, b: &Vec<f64>) -> Result<Value, String> {
    if a[0].len() != b.len() {
        return Err("Vector and matrix have incompatible dimensions!".to_string());
    }
    let mut output_v = vec![];
    for i in 0..a.len() {
        let mut sum = 0f64;
        for j in 0..a[i].len() {
            sum += a[i][j]*b[j]
        }
        output_v.push(sum);
    }
    return Ok(Value::Vector(output_v));
}

#[doc(hidden)]
pub fn mmmult(a: &Vec<Vec<f64>>, b: &Vec<Vec<f64>>) -> Result<Value, String> {
    if a[0].len() != b.len() {
        return Err("Matrices have incompatible dimensions!".to_string());
    }
    let mut output_m = vec![];
    for i in 0..a.len() {
        let mut row = vec![];
        for j in 0..b[0].len() {
            let mut sum = 0f64;
            for k in 0..a[0].len() {
                sum += a[i][k]*b[k][j]
            }
            row.push(sum);
        }
        output_m.push(row);
    }
    return Ok(Value::Matrix(output_m))
}

#[doc(hidden)]
pub fn ssdiv(a: &f64, b: &f64) -> Result<Value, String> {
    return Ok(Value::Scalar(a/b));
}

#[doc(hidden)]
pub fn vsdiv(a: &Vec<f64>, b: &f64) -> Result<Value, String> {
    return svmult(&(1f64/b), a);
}

#[doc(hidden)]
pub fn vvdiv(a: &Vec<f64>, b: &Vec<f64>) -> Result<Value, String> {
    if a.len() != b.len() {
        return Err("Vectors have incompatible dimensions!".to_string());
    }
    let mut sum = 0.;
    for i in 0..a.len() {
        sum += a[i]/b[i];
    }

    return Ok(Value::Scalar(sum));
}

#[doc(hidden)]
pub fn msdiv(a: &Vec<Vec<f64>>, b: &f64) -> Result<Value, String> {
    return smmult(&(1f64/b), a);
}