8 releases
0.4.4  Jan 8, 2023 

0.4.3  Dec 9, 2022 
0.3.1alpha.1  Aug 29, 2022 
0.2.10  Aug 22, 2022 
0.0.3 

#106 in Math
37 downloads per month
29KB
696 lines
Automatic Differentiation Library
AUTOmatic Derivatives & Jacobians by djmaxus and you
Functionality
Single variables
use autodj::single::*;
let x : DualNumber = 2.0.into_variable();
// values can be borrowed for arithmetic operations
let f = x * x + &1.0.into();
assert_eq!(f.value(), 5.0);
assert_eq!(f.deriv(), 4.0);
// fmt::Display resembles Taylor expansion
assert_eq!(format!("{f}"), "5+4∆");
Multiple variables
Multivariate differentiation is based on multiple dual components. Such an approach requires no repetitive and "backward" differentiations. Each partial derivative is tracked separately from the start, and no repetitive calculations are made.
For builtin multivariate specializations,
independent variables can be created consistently using .into_variables()
method.
Static number of variables
use autodj::array::*;
// consistent set of independent variables
let vars : DualVariables<2> = [2.0, 3.0].into_variables();
let [x, y] = vars.get().to_owned();
let f = x * (y  1.0.into());
assert_eq!(f.value(), 4.);
assert_eq!(f.grad() , &[2., 2.]);
assert_eq!(format!("{f}"), "4+[2.0, 2.0]∆");
Dynamic number of variables
use autodj::vector::*;
let x : DualVariables = vec![1., 2., 3., 4., 5.].into_variables();
let f : DualNumber = x.get()
.iter()
.map(x : &DualNumber x * &2.0.into())
.sum();
assert_eq!(f.value(), 30.);
f.grad()
.iter()
.for_each(deriv assert_eq!(deriv, &2.0) );
Generic dual numbers
// can be specialized for your needs
use autodj::common::Common;
Motivation
I do both academic & business R&D in the area of computational mathematics. As well as many of us, I've written a whole bunch of sophisticated Jacobians by hand.
One day, I learned about automatic differentiation based on dual numbers. Almost the same day, I learned about Rust as well 🦀
Then, I decided to:
 Make it automatic and reliable as much as possible
 Use modern and convenient ecosystem of Rust development
Project goals
 Develop opensource automatic differentiation library for both academic and commercial computational mathematicians
 Gain experience of Rust programming
Anticipated features
You are very welcome to introduce issues to promote most wanted features or to report a bug.
 Generic implementation of dual numbers
 Number of variables to differentiate
 single
 multiple
 static
 dynamic
 sparse
 Jacobians for efficient layouts in memory
 Named variables (UUIDbased)
 Calculation tracking (partial derivatives of intermediate values)
 Thirdparty crates support (as features)

num
 linear algebra crates (
nalgebra
etc.)

 Advanced features
 Arbitrary number types beside
f64
 Interoperability of different dual types (e.g., single and multiple dynamic)
 Numerical verification (or replacement) of derivatives (by definition)
 Macro for automatic extensions of regular (i.e. nondual) functions
 Optional calculation of derivatives
 Iterator implementation as possible approach to lazy evaluation
 Arbitrary number types beside
Comparison with autodiff
As far as I noticed, autodj
currently has the following differences
 Multiple variables out of the box
fmt::Display
for staticallyknown number of variables Lefttoright flow of many operations such as
.intovariables()
,.eval()
, etc.  Number type is restricted to
f64
 No utilization of
num
andnalgebra
crates
Some differences are planned to be eliminated as noted in the roadmap.
Within this crate, you may study & launch test target /tests/autodiff.rs
to follow some differences.
cargo test test autodiff  showoutput