15个版本 (5个重大更新)

0.8.0 2022年1月7日
0.7.2 2022年1月2日
0.7.1 2021年12月31日
0.4.2 2021年12月30日
0.1.0 2021年12月20日

#1082 in 进程宏


用于 2 个crate(通过 rust-ad-macros

Apache-2.0

83KB
1.5K SLoC

RustAD - Rust自动微分

Crates.io lib.rs.io docs

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

为什么我会选择这个而不是 <插入库>? 你现在不会,我会说等到ndarray的支持更加全面,这个库可能成为最方便的Rust AutoDiff库。

一切都很混乱,请注意。

状态

  • 正向自动微分
  • 反向自动微分
  • 数值原语(例如 f32u32 等)支持*
  • 有限° ndarray 支持*
  • 有限° nalgebra 支持*
  • ifif elseelse 支持
  • forwhileloop 支持

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

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

应用

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

#[rust_ad::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 main() {
    let (f, der_x, der_y) = rust_ad::forward!(multi, 3f32, 5f32);
    assert_eq!(f, 15.4f32);
    assert_eq!(der_x, 8f32);
    assert_eq!(der_y, -0.08f32);
}
#[rust_ad::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;
}
fn main() {
    let (f, der_x, der_y) = rust_ad::reverse!(multi, 3f32, 5f32);
    assert_eq!(f, 15.4f32);
    assert_eq!(der_x, 8f32);
    assert_eq!(der_y, -0.08f32);
}

依赖项

~2MB
~42K SLoC