1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
//! //! This crate provides a library for performing automatic differentiation. //! //! # Examples //! //! The following example differentiates a 1D function defined by a closure. //! //! ```rust //! use autodiff::*; //! // Define a function `f(x) = e^{-0.5*x^2}` //! let f = |x: F1| (-x * x / F::cst(2.0)).exp(); //! //! // Differentiate `f` at zero. //! println!("{}", diff(f, 0.0)); // prints `0` //! # assert_eq!(diff(f, 0.0), 0.0); //! ``` //! //! To compute the gradient of a function, use the function `grad` as follows: //! //! ```rust //! use autodiff::*; //! // Define a function `f(x,y) = x*y^2` //! let f = |x: &[F1]| x[0] * x[1] * x[1]; //! //! // Differentiate `f` at `(1,2)`. //! let g = grad(f, &vec![1.0, 2.0]); //! println!("({}, {})", g[0], g[1]); // prints `(4, 4)` //! # assert_eq!(g, vec![4.0, 4.0]); //! ``` //! //! Compute a specific derivative of a multi-variable function: //! //! ```rust //! use autodiff::*; //! // Define a function `f(x,y) = x*y^2`. //! let f = |v: &[F1]| v[0] * v[1] * v[1]; //! //! // Differentiate `f` at `(1,2)` with respect to `x` (the first unknown) only. //! let v = vec![ //! F::var(1.0), // Create a variable. //! F::cst(2.0), // Create a constant. //! ]; //! println!("{}", f(&v).deriv()); // prints `4` //! # assert_eq!(f(&v).deriv(), 4.0); //! ``` //! //! Compute higher order derivatives by nesting the generic parameter of `F`. For convenience we //! provide type aliases for the first 3 orders: //! //! ```ignore //! type F1 = F<f64> //! type F2 = F<F<f64>> //! type F3 = F<F<F<f64>>> //! ``` //! //! To compute the third order derivative, we can use the `F3` type as follows. //! //! ```rust //! use autodiff::*; //! // Define a function `f(x) = (x - 1)^3`. //! let f = |x: F3| (x - 1.0_f64).powi(3); //! //! // Compute the 3rd derivative of `f` at `x = 0`. //! println!("{}", f(F3::var(0.0)).deriv().deriv().deriv()); // prints `6` //! # assert_eq!(f(F3::var(0.0)).deriv().deriv().deriv(), 6.0); //! ``` #[cfg(feature = "bytemuck")] pub mod bytemuck; #[cfg(feature = "cgmath")] pub mod cgmath; pub mod forward_autodiff; #[cfg(feature = "cgmath")] pub use crate::cgmath::*; pub use forward_autodiff::*; // Re-export useful traits for performing computations. pub use num_traits::{Float, FloatConst, NumCast, One, ToPrimitive, Zero};