Crates.io | rust-ad-core-macros |
lib.rs | rust-ad-core-macros |
version | 0.8.0 |
source | src |
created_at | 2021-12-30 12:11:25.42004 |
updated_at | 2022-01-07 22:58:28.587269 |
description | Rust Auto-Differentiation. |
homepage | |
repository | https://github.com/JonathanWoollett-Light/rust-ad |
max_upload_size | |
id | 505298 |
size | 11,120 |
A restrictive WIP beginnings of a library attempting to implement auto-differentiation in Rust.
Why would I use this over <insert library>? You wouldn't, not yet anyway. I'd say wait until support for ndarray is more comprehensive, then this becomes probably the most convenient Rust AutoDiff library.
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_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);
}