17个版本 (7个重大变更)
0.8.0 | 2022年1月7日 |
---|---|
0.7.1 | 2021年12月31日 |
每月60次下载
16KB
176 代码行
RustAD - Rust自动微分
一个限制性的WIP,尝试在Rust中实现自动微分。
我为什么要用这个而不是其他库? 你现在不会,我会说等到ndarray支持更加全面时,这可能是最方便的Rust AutoDiff库。
警告:非常混乱。
状态
- 正向自动微分
- 反向自动微分
- 数值原语(例如
f32
,u32
等)支持* - 有限° ndarray 支持*
- 有限° nalgebra 支持*
-
if
,if else
和else
支持 -
for
,while
和loop
支持
*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