dynamic_expressions 0.10.1

Fast batched evaluation + forward-mode derivatives for symbolic expressions (Rust port of DynamicExpressions.jl).
Documentation
mod common;

use approx::assert_relative_eq;
use common::{TestOps, assert_close_vec, expr_readme_like, make_x, var};
use dynamic_expressions::{EvalOptions, eval_tree_array};

#[test]
fn build_expr_with_algebra_and_eval() {
    let (_x_data, x) = make_x(2, 64);
    let x_view = x.view();

    let x1 = var(0);
    let x2 = var(1);

    let ex = x1 * dynamic_expressions::operators::cos(x2 - 3.2);

    let opts = EvalOptions {
        check_finite: true,
        early_exit: true,
    };
    let (y, ok) = eval_tree_array::<f64, TestOps, 3>(&ex, x_view, &opts);
    assert!(ok);

    let ref_ex = expr_readme_like();
    let (y2, ok2) = eval_tree_array::<f64, TestOps, 3>(&ref_ex, x_view, &opts);
    assert!(ok2);

    assert_close_vec(&y, &y2, 1e-12);
}

#[test]
fn lit_left_mul_works() {
    let (x_data, x) = make_x(2, 32);
    let x_view = x.view();

    let ex = dynamic_expressions::lit(2.0) * var(0);
    let opts = EvalOptions {
        check_finite: true,
        early_exit: true,
    };
    let (y, ok) = eval_tree_array::<f64, TestOps, 3>(&ex, x_view, &opts);
    assert!(ok);

    for (i, &v) in y.iter().enumerate() {
        assert_relative_eq!(v, 2.0 * x_data[i], epsilon = 1e-12, max_relative = 1e-12);
    }
}