cagra 0.2.0

Calculation Graph Library
Documentation
use approx::abs_diff_eq;
use cagra::{error::Result, graph::Graph};

#[test]
fn test_exp() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.exp(x);
    abs_diff_eq!(g.eval_value(y)?, x0.exp());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, x0.exp());
    Ok(())
}

#[test]
fn test_ln() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.ln(x);
    abs_diff_eq!(g.eval_value(y)?, x0.ln());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, 1.0 / x0);
    Ok(())
}

#[test]
fn test_ln_exp() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.exp(x);
    let z = g.exp(y);
    abs_diff_eq!(g.eval_value(z)?, x0);
    g.eval_deriv(z)?;
    abs_diff_eq!(g.get_deriv(x)?, 0.0);
    Ok(())
}

#[test]
fn test_sin() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.sin(x);
    abs_diff_eq!(g.eval_value(y)?, x0.sin());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, x0.cos());
    Ok(())
}

#[test]
fn test_cos() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.cos(x);
    abs_diff_eq!(g.eval_value(y)?, x0.cos());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, -x0.sin());
    Ok(())
}

#[test]
fn test_sin_cos() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let s = g.sin(x);
    let ss = g.square(s);
    let c = g.cos(x);
    let cc = g.square(c);
    let z = g.add(ss, cc);
    abs_diff_eq!(g.eval_value(z)?, 1.0);
    g.eval_deriv(z)?;
    abs_diff_eq!(g.get_deriv(x)?, 0.0);
    Ok(())
}

#[test]
fn test_tan() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let t = g.tan(x);
    let s = g.sin(x);
    let c = g.cos(x);
    let tc = g.mul(t, c);
    let z = g.div(tc, s);
    abs_diff_eq!(g.eval_value(z)?, 1.0);
    g.eval_deriv(z)?;
    abs_diff_eq!(g.get_deriv(x)?, 0.0);
    Ok(())
}

#[test]
fn test_sinh() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.sinh(x);
    abs_diff_eq!(g.eval_value(y)?, x0.sinh());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, x0.cosh());
    Ok(())
}

#[test]
fn test_cosh() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let y = g.cosh(x);
    abs_diff_eq!(g.eval_value(y)?, x0.cosh());
    g.eval_deriv(y)?;
    abs_diff_eq!(g.get_deriv(x)?, x0.sinh());
    Ok(())
}

#[test]
fn test_sinh_cosh() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let s = g.sinh(x);
    let ss = g.square(s);
    let c = g.cosh(x);
    let cc = g.square(c);
    let z = g.sub(cc, ss);
    abs_diff_eq!(g.eval_value(z)?, 1.0);
    g.eval_deriv(z)?;
    abs_diff_eq!(g.get_deriv(x)?, 0.0);
    Ok(())
}

#[test]
fn test_tanh() -> Result<()> {
    let mut g = Graph::new();
    let x0: f32 = 1.234;
    let x = g.variable("x", x0)?;
    let t = g.tanh(x);
    let s = g.sinh(x);
    let c = g.cosh(x);
    let tc = g.mul(t, c);
    let z = g.div(tc, s);
    abs_diff_eq!(g.eval_value(z)?, 1.0);
    g.eval_deriv(z)?;
    abs_diff_eq!(g.get_deriv(x)?, 0.0);
    Ok(())
}