NAG Library Manual, Mark 27.2
```/* nag::ad::c05ay Tangent over Adjoint Example Program.
*/

#include <dco.hpp>
#include <iostream>

// Function which calls NAG AD Library routines.
template <typename T> void func(T r, T &x);

// Driver with the adjoint calls.
// Finds the zero point f(xv) = 0 for the function
// f(x) = exp(-x) - r*x.
// Also, computes the Hessian d2x_dr2 = d2xv/dr2.
void driver(const double &rv, double &xv, double &d2x_dr2);

// The function f
template <typename T>
void NAG_CALL f(void *&ad_handle, const T &x, T &z, Integer iuser[], T ruser[]);

int main()
{

// Set problem parameters
double rv = 2.0;
// Solution x
double xv;
// Derivative of x
double d2x_dr2;

// Call driver
driver(rv, xv, d2x_dr2);

// Print outputs
std::cout << "\n Derivatives calculated: Second order adjoints\n";
std::cout << " Computational mode    : algorithmic\n";

// Print derivatives
std::cout.setf(std::ios::scientific, std::ios::floatfield);
std::cout.precision(12);
std::cout << "\n Solution:\n";
std::cout << " x = " << xv << std::endl;
std::cout << "\n Second derivative of solution x w.r.t. parameter r:\n";
std::cout << " d2x/dr2(x) = " << d2x_dr2 << std::endl;

return 0;
}

// Driver with the adjoint calls.
// Finds the zero point f(xv) = 0 for the function
// f(x) = exp(-x) - r*x.
// Also, computes the Hessian d2x_dr2 = d2xv/dr2.
void driver(const double &rv, double &xv, double &d2x_dr2)
{
using mode = dco::ga1s<dco::gt1s<double>::type>;
using T    = mode::type;

mode::global_tape = mode::tape_t::create();

// Function parameter r
T r = rv;

// Register variable to differentiate w.r.t.
dco::derivative(dco::value(r)) = 1.0;
mode::global_tape->register_variable(r);

// Variable to differentiate
T x;

// Call the NAG AD Lib functions
func(r, x);

// Extract the computed solution
xv = dco::passive_value(x);

mode::global_tape->register_output_variable(x);
dco::derivative(x) = 1.0;
// Extract the derivatives
d2x_dr2 = dco::derivative(dco::derivative(r));

// Remove tape
mode::tape_t::remove(mode::global_tape);
}

// Function which calls NAG AD Library routines.
template <typename T> void func(T r, T &x)
{
// Active variables
T a = 0.0, b = 1.0;
T eps = 1.0e-5, eta = 0.0;
// Create AD configuration data object
Integer ifail     = 0;
// Routine for computing an approximation to a simple zero of the function f
ifail = 0;
nag::ad::c05ay(ad_handle, a, b, eps, eta, f<T>, x, 0, nullptr, 1, &r, ifail);
// Remove computational data object
ifail = 0;