numra_autodiff/lib.rs
1//! Automatic differentiation for Numra: forward-mode and reverse-mode.
2//!
3//! This crate provides two AD modes:
4//!
5//! - **Forward-mode** ([`Dual`]): Augments values with directional derivatives.
6//! Cost: O(n) passes for n inputs. Best when outputs >> inputs.
7//! - **Reverse-mode** ([`reverse::Var`]): Tape-based computation graph with backward pass.
8//! Cost: O(m) passes for m outputs. Best when inputs >> outputs (optimization).
9//!
10//! # Forward-mode example
11//!
12//! ```rust
13//! use numra_autodiff::{Dual, gradient};
14//!
15//! let grad = gradient(|x: &[Dual<f64>]| x[0] * x[0] + x[1] * x[1], &[3.0, 4.0]);
16//! assert!((grad[0] - 6.0).abs() < 1e-12); // df/dx0 = 2*x0 = 6
17//! assert!((grad[1] - 8.0).abs() < 1e-12); // df/dx1 = 2*x1 = 8
18//! ```
19//!
20//! # Reverse-mode example
21//!
22//! ```rust
23//! use numra_autodiff::reverse::grad;
24//!
25//! let g = grad(|x| x[0].clone() * x[0].clone() + x[1].clone() * x[1].clone(), &[3.0, 4.0]);
26//! assert!((g[0] - 6.0).abs() < 1e-12);
27//! assert!((g[1] - 8.0).abs() < 1e-12);
28//! ```
29//!
30//! Author: Moussa Leblouba
31//! Date: 9 February 2026
32//! Modified: 2 May 2026
33
34pub mod bridge;
35pub mod dual;
36pub mod gradient;
37pub mod reverse;
38pub mod tape;
39
40pub use bridge::{gradient_closure, model_jacobian_closure};
41pub use dual::Dual;
42pub use gradient::{gradient, jacobian};