Skip to content



XAD implements specialisations of std::complex for the XAD active data types AReal and FReal. They are are provided in the header XAD/Complex.hpp, along with all the mathematical operations defined in the standard.

Note that the complex header is not automatically included with XAD/XAD.hpp. Users must include it as needed.

std::complex Specialisations

Both std::complex<AReal<T>> and std::complex<FReal<T>> are provided specialisations for the standard complex type (in std namespace), for adjoint and forward modes respectively.

Member Functions

All standard complex member functions are implemented.

Below are the non-standard additions and changes of the interface only, using the placeholder XReal<T> as a placeholder inner type, which can be FReal<T> or AReal<T>.


XReal<T>& complex::real() returns a reference rather than a copy of the real part, to allow for easy access and adjusting of derivatives using derivative(). This applies to both the modifyable and the const versions.


Returns a reference rather than a copy, for both the modifyable and the const versions.


void complex::setDerivative(const T& real_derivative, const T& imag_derivative = T()) sets the derivatives (either \(\dot{x}\) or \(\bar{x}\)) for both the real and imaginary parts.


void complex::setAdjoint(const T& real_derivative, const T& imag_derivative = T()) is an alias for setDerivative


std::complex<T> getDerivative() const gets the derivatives (either \(\dot{x}\) or \(\bar{x}\) for both the real and imaginary parts, represented as a complex of the underlying (double) type.


std::complex<T> getAdjoint() const is an alias for getDerivative

None-Member Functions


template <typename T> 
std::complex<T> derivative(const std::complex<XReal<T> >& z)

Returns the adjoints of the z variable, represented as a complex number of the underlying double type.

Note that since the return type is not a reference, setting derivatives should be done by using the member functions setDerivative or using the real and imag member functions instead.


template <typename T> 
std::complex<T> value(const std::complex<XReal<T> >& z)

Returns the value of the z variable (underlying double type), represented as a complex number.


template <typename T>
XReal<T>& real(std::complex<XReal<T> >& z)

Access to the real part by reference.


template <typename T> 
XReal<T>& imag(std::complex<XReal<T> >& z)

Access to the imaginary part by reference.

Math Operations

All arithmetic operators and mathematical functions in the C++11 standard have been specialised with the XAD complex data types as well. This also includes the stream read and write operations.