A restrictive WIP beginnings of a library attempting to implement auto-differentiation in Rust.
Why would I use this over \
It's all messy be warned.
f32
, u32
etc.) support*if
, if else
and else
supportfor
, while
and loop
support*typeof
(e.g. decltype
) not being currently implemented in Rust makes support more difficult.
°Support limited to the basic blas-like operations.
Auto-differentiation is implemented via 2 attribute procedural macros, e.g.
```rust fn multitest() { let (f, (derx, dery)) = forward!(multi, 3f32, 5f32); asserteq!(f, 15.4f32); asserteq!(derx, 8f32); asserteq!(dery, -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;
}
}
rust
fn multitest() {
let (f, (derx, dery)) = reverse!(multi, (3f32, 5f32), (1f32));
asserteq!(f, 15.4f32);
asserteq!(derx, 8f32);
asserteq!(dery, -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;
}
} ```