# AD Mode Interface¶

XAD provides a set of interface structures that conveniently allow access to the data types needed for different AD modes. These are traits classes with member `typedef`

declarations that allow easy access to mode-specific types.

For example, they can be used as:

```
using mode = xad::adj<double>;
using adouble = mode::active_type;
// use active type in functions, etc.
adouble my_function(adouble x) {...}
mode::tape_type tape; // setup tape
```

## Mode Interface Classes¶

### First Order¶

`adj<T>`

¶

Mode interface class for first order adjoint mode, where `T`

is the underlying scalar type (e.g. `double`

).

`fwd<T>`

¶

Mode interface class for first order forward mode, where `T`

is the underlying scalar type (e.g. `double`

).

### Second Order¶

`fwd_adj<T>`

¶

Mode interface class for second order forward over adjoint mode, where `T`

is the underlying scalar type (e.g. `double`

).

`fwd_fwd<T>`

¶

Mode interface class for second order forward over forward mode, where `T`

is the underlying scalar type (e.g. `double`

).

`adj_fwd<T>`

¶

Mode interface class for second order adjoint over forward mode, where `T`

is the underlying scalar type (e.g. `double`

).

`adj_adj<T>`

¶

Mode interface class for second order adjoint over adjoint mode, where `T`

is the underlying scalar type (e.g. `double`

).

## Type Members¶

All mode classes above have type members as described below.

```
template <typename T>
struct mode {
typedef implementation_defined active_type; // active data type
typedef T passive_type; // fully unwrapped passive type
typedef implementation_defined tape_type; // tape (void for forward mode)
typedef passive_type value_type; // alias for passive_type
// for second-order only
typedef implementation_defined inner_type; // first-order active type
};
```