#dual #number #hyperdual #multidimentional #autodifferentiate

hyperdual

Fully-featured Dual Number implementation with features for automatic differentiation of multivariate vectorial functions

16 releases (2 stable)

Uses old Rust 2015

1.1.0 Jun 1, 2022
1.0.0 Mar 24, 2022
0.5.2 Dec 13, 2021
0.5.1 Nov 24, 2021
0.3.1 Jul 16, 2019

#158 in Rust patterns

Download history 151/week @ 2022-08-14 53/week @ 2022-08-21 164/week @ 2022-08-28 203/week @ 2022-09-04 31/week @ 2022-09-11 35/week @ 2022-09-18 61/week @ 2022-09-25 79/week @ 2022-10-02 44/week @ 2022-10-09 37/week @ 2022-10-16 57/week @ 2022-10-23 164/week @ 2022-10-30 242/week @ 2022-11-06 185/week @ 2022-11-13 59/week @ 2022-11-20 160/week @ 2022-11-27

682 downloads per month
Used in 2 crates

MIT license

39KB
1K SLoC

hyperdual Build Status

Fully-featured Dual Number implementation with features for automatic differentiation of multivariate vectorial functions into gradients.

Usage

extern crate hyperdual;

use hyperdual::{Dual, Hyperdual, Float, differentiate};

fn main() {
    // find partial derivative at x=4.0
    let univariate = differentiate(4.0f64, |x| x.sqrt() + Dual::from_real(1.0));
    assert!((univariate - 0.4500).abs() < 1e-16, "wrong derivative");

    // find the partial derivatives of a multivariate function
    let x: Hyperdual<f64, 3> = Hyperdual::from_slice(&[4.0, 1.0, 0.0]);
    let y: Hyperdual<f64, 3> = Hyperdual::from_slice(&[5.0, 0.0, 1.0]);

    let multivariate = x * x + (x * y).sin() + y.powi(3);
    assert!((res[0] - 141.91294525072763).abs() < 1e-13, "f(4, 5) incorrect");
    assert!((res[1] - 10.04041030906696).abs() < 1e-13, "df/dx(4, 5) incorrect");
    assert!((res[2] - 76.63232824725357).abs() < 1e-13, "df/dy(4, 5) incorrect");
}

Change log

Version 0.5.2

  • Re-add support for nalgebra Owned Vectors for structures that do not yet support const generics.
Previous Work

Dependencies

~2.5MB
~56K SLoC