17个版本 (7个重大变更)

0.8.0 2022年1月7日
0.7.1 2021年12月31日

#2#auto-differentiation

Download history 2/week @ 2024-03-09 5/week @ 2024-03-30

每月60次下载

Apache-2.0

16KB
176 代码行

RustAD - Rust自动微分

Crates.io lib.rs.io docs

一个限制性的WIP,尝试在Rust中实现自动微分。

我为什么要用这个而不是其他库? 你现在不会,我会说等到ndarray支持更加全面时,这可能是最方便的Rust AutoDiff库。

警告:非常混乱。

状态

  • 正向自动微分
  • 反向自动微分
  • 数值原语(例如 f32, u32 等)支持*
  • 有限° ndarray 支持*
  • 有限° nalgebra 支持*
  • if, if elseelse 支持
  • for, whileloop 支持

*typeof(例如 decltype)目前未在Rust中实现,使得支持变得更加困难。

°支持限于基本的BLAS-like操作。

应用

通过2个属性过程宏实现自动微分,例如

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;
    }
}

依赖项

~2MB
~44K SLoC