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日

#6#auto-differentiation

Download history 1/week @ 2024-03-26 12/week @ 2024-04-02

每月下载量 54次
用于 rust-ad

Apache-2.0

180KB
3K SLoC

RustAD - Rust自动微分

Crates.io lib.rs.io docs

一个试图在Rust中实现自动微分的库的早期限制性WIP。

为什么我会选择这个而不是 <插入库>? 你不会的,至少现在不会。我会说等到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