rust-ad

Crates.iorust-ad
lib.rsrust-ad
version0.8.0
sourcesrc
created_at2021-12-09 14:38:21.256386
updated_at2022-01-07 23:01:11.666694
descriptionRust Auto-Differentiation.
homepage
repositoryhttps://github.com/JonathanWoollett-Light/rust-ad
max_upload_size
id495200
size8,878
Jonathan Woollett-Light (JonathanWoollett-Light)

documentation

https://docs.rs/rust-ad/

README

RustAD - Rust Auto-Differentiation

Crates.io lib.rs.io docs

A restrictive WIP beginnings of a library attempting to implement auto-differentiation in Rust.

Why would I use this over <insert library>? You wouldn't, not yet anyway. I'd say wait until support for ndarray is more comprehensive, then this becomes probably the most convenient Rust AutoDiff library.

It's all messy be warned.

Status

  • Forward Auto-differentiation
  • Reverse Auto-differentiation
  • Numerical primitives (e.g. f32, u32 etc.) support*
  • limited° ndarray support*
  • limited° nalgebra support*
  • if, if else and else support
  • for, while and loop support

*typeof (e.g. decltype) not being currently implemented in Rust makes support more difficult.

°Support limited to the basic blas-like operations.

Application

Auto-differentiation is implemented via 2 attribute procedural macros, e.g.

fn multi_test() {
    let (f, (der_x, der_y)) = forward!(multi, 3f32, 5f32);
    assert_eq!(f, 15.4f32);
    assert_eq!(der_x, 8f32);
    assert_eq!(der_y, -0.08f32);

    /// f = x^2 + 2x + 2/y
    /// δx|y=5 = 2x + 2
    /// δy|x=3 = 2
    #[forward_autodiff]
    fn multi(x: f32, y: f32) -> f32 {
        let a = x.powi(2i32);
        let b = x * 2f32;
        let c = 2f32 / y;
        let f = a + b + c;
        return f;
    }
}
fn multi_test() {
    let (f, (der_x, der_y)) = reverse!(multi, (3f32, 5f32), (1f32));
    assert_eq!(f, 15.4f32);
    assert_eq!(der_x, 8f32);
    assert_eq!(der_y, -0.08f32);

    /// f = x^2 + 2x + 2/y
    /// δx|y=5 = 2x + 2
    /// δy|x=3 = 2
    #[reverse_autodiff]
    fn multi(x: f32, y: f32) -> f32 {
        let a = x.powi(2i32);
        let b = x * 2f32;
        let c = 2f32 / y;
        let f = a + b + c;
        return f;
    }
}
Commit count: 138

cargo fmt