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日 |
每月下载量 54次
用于 rust-ad
180KB
3K SLoC
RustAD - Rust自动微分
一个试图在Rust中实现自动微分的库的早期限制性WIP。
为什么我会选择这个而不是 <插入库>? 你不会的,至少现在不会。我会说等到ndarray的支持更全面时,这可能成为最方便的Rust AutoDiff库。
一切都很混乱,请小心。
状态
- 前向自动微分
- 反向自动微分
- 数值原语(例如
f32
,u32
等)支持* - 有限° ndarray 支持*
- 有限° nalgebra 支持*
-
if
、if else
和else
支持 -
for
、while
和loop
支持
* 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