#automatic-differentiation #numbers #dual #autodifferentiate #multidimentional

hyperdual

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

17 releases (3 stable)

Uses old Rust 2015

1.2.0 Feb 15, 2023
1.1.0 Jun 1, 2022
1.0.0 Mar 24, 2022
0.5.2 Dec 13, 2021
0.3.1 Jul 16, 2019

#178 in Math

Download history 118/week @ 2023-12-06 90/week @ 2023-12-13 233/week @ 2023-12-20 250/week @ 2023-12-27 158/week @ 2024-01-03 150/week @ 2024-01-10 162/week @ 2024-01-17 188/week @ 2024-01-24 125/week @ 2024-01-31 77/week @ 2024-02-07 86/week @ 2024-02-14 132/week @ 2024-02-21 170/week @ 2024-02-28 195/week @ 2024-03-06 168/week @ 2024-03-13 196/week @ 2024-03-20

749 downloads per month
Used in 5 crates (2 directly)

MIT license

41KB
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

~3MB
~57K SLoC