XAD

# XAD: The fastest automatic differentiation library for C++ XAD is a high-performance C++ automatic differentiation library designed for large-scale, performance-critical systems. It provides forward and adjoint (reverse) mode automatic differentiation via operator overloading, with a strong focus on: * Low runtime overhead * Minimal memory footprint * Straightforward integration into existing C++ codebases For Monte Carlo and other repetitive workloads, XAD also provides an abstract JIT backend interface, enabling record-once / replay-many execution for additional performance.

Download PRs Welcome Build Status Coverage Codacy Quality

## Key Features - **Forward & Reverse (Adjoint) Mode**: Supports any order using operator overloading. - **Vector mode**: Compute multiple derivatives at once. - **Checkpointing Support**: Efficient tape memory management for large-scale applications. - **External Function Interface**: Seamlessly connect with external libraries. - **Eigen support**: Works with the popular linear algebra library [Eigen](https://eigen.tuxfamily.org/index.php?title=Main_Page). - **JIT Backend Support** *(optional)*: Infrastructure for pluggable JIT backends, enabling record-once/replay-many workflows. See [samples/jit_tutorial](samples/jit_tutorial). ## Benchmarks Compared against [CppAD](https://github.com/coin-or/CppAD), [Adept 2](https://github.com/rjhogan/Adept-2), [autodiff](https://github.com/autodiff/autodiff), and finite differences on four quant-finance workloads (Intel Xeon Platinum 8488C, GCC 13.3, `-O3 -mavx2 -mfma`):

Benchmark chart

Full methodology, source code, and reproducible CSV: **[auto-differentiation/ad-benchmarks](https://github.com/auto-differentiation/ad-benchmarks)** ## Ecosystem | Repository | Description | |---|---| | [xad-py](https://github.com/auto-differentiation/xad-py) | Python bindings for XAD | | [QuantLibAAD](https://github.com/auto-differentiation/QuantLibAAD) | Full QuantLib integration — compute all Greeks at once, up to 3 orders of magnitude faster than bump-and-reval | | [QuantLib-Risks-Py](https://github.com/auto-differentiation/QuantLib-Risks-Py) | QuantLib risks from Python | | [xad-codegen](https://www.xcelerit.com/xad-enterprise-support) | Native code generation backend — maximum throughput (commercial) | | [AAD Training](https://www.xcelerit.com/solutions/training-aad) | Hands-on AAD training for quants and quant developers - delivered to dozens of tier 1 banks and financial services firms | ## Example Calculate first-order derivatives of an arbitrary function with two inputs and one output using XAD in adjoint mode. ```c++ Adouble x0 = 1.3; // initialise inputs Adouble x1 = 5.2; tape.registerInput(x0); // register independent variables tape.registerInput(x1); // with the tape tape.newRecording(); // start recording derivatives Adouble y = func(x0, x1); // run main function tape.registerOutput(y); // register the output variable derivative(y) = 1.0; // seed output adjoint to 1.0 tape.computeAdjoints(); // roll back adjoints to inputs cout << "dy/dx0=" << derivative(x0) << "\n" << "dy/dx1=" << derivative(x1) << "\n"; ``` ## Getting Started Build XAD from source using CMake: ```bash git clone https://github.com/auto-differentiation/xad.git cd xad mkdir build cd build cmake .. make ``` For more detailed guides, refer to our [**Installation Guide**](https://auto-differentiation.github.io/installation/cxx/) and explore [**Tutorials**](https://auto-differentiation.github.io/tutorials/). ## Documentation Full documentation, including API reference and usage examples, is available at: [**https://auto-differentiation.github.io/**](https://auto-differentiation.github.io/) ## Contributing Contributions are welcome. Please see the [**Contributing Guide**](CONTRIBUTING.md) for details, and feel free to start a discussion in our [**GitHub Discussions**](https://github.com/auto-differentiation/xad/discussions). ## Found a Bug? Please report bugs and issues via the [**GitHub Issue Tracker**](https://github.com/auto-differentiation/xad/issues).