4 个版本

0.8.0 2022 年 1 月 7 日
0.7.2 2022 年 1 月 2 日
0.7.1 2021 年 12 月 31 日
0.7.0 2021 年 12 月 31 日

#3 in #auto-differentiation


4 个包中使用 (直接使用 3 个)

Apache-2.0 许可协议

3KB

RustAD - Rust 自动微分

Crates.io lib.rs.io docs

这是一个尝试在 Rust 中实现自动微分的库的早期版本。

为什么我会选择这个库而不是其他库? 目前你还不会,我建议等到 ndarray 的支持更全面时,这个库可能会成为最方便的 Rust 自动微分库。

请注意,代码可能很混乱。

状态

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

*由于 Rust 中尚未实现 typeof (例如 decltype),支持变得更加困难。

°支持限于基本的 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);
}

依赖项

~535KB