#dual-numbers #dual #numbers #multidimentional #autodifferentiate

hyperdual

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

19 releases (5 stable)

1.4.0 Oct 22, 2025
1.3.0 Jul 7, 2024
1.2.0 Feb 15, 2023
1.1.0 Jun 1, 2022
0.3.1 Jul 16, 2019

#156 in Math

Download history 175/week @ 2025-11-16 122/week @ 2025-11-23 113/week @ 2025-11-30 190/week @ 2025-12-07 114/week @ 2025-12-14 82/week @ 2025-12-21 211/week @ 2025-12-28 265/week @ 2026-01-04 239/week @ 2026-01-11 344/week @ 2026-01-18 534/week @ 2026-01-25 1225/week @ 2026-02-01 881/week @ 2026-02-08 534/week @ 2026-02-15 524/week @ 2026-02-22 665/week @ 2026-03-01

2,935 downloads per month
Used in 9 crates (3 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
~65K SLoC