User Defined Atomic AD Functions
Keywords: user defined atomic ad functions syntax purpose virtual examples getting started scalar function vector range hessian sparsity patterns general case

| Prev | Next |  |  |  |  |  |  |

User Defined Atomic AD Functions
Syntax
`
atomic_user afun(ctor_arg_list)
afun(ax, ay)
ok = afun.forward(p, q, vx, vy, tx, ty)
ok = afun.reverse(q, tx, ty, px, py)
ok = afun.for_sparse_jac(q, r, s)
ok = afun.rev_sparse_jac(q, r, s)
ok = afun.rev_sparse_hes(vx, s, t, q, r, u, v)
atomic_base<Base>::clear()`
Purpose
In some cases, the user knows how to compute derivatives of a function y = f ( x ) where f : B n → B m more efficiently than by coding it using `AD<Base>` atomic operations and letting CppAD do the rest. In this case `atomic_base<Base>` can use the user code for f ( x ) , and its derivatives, as `AD<Base>` atomic operations.
Virtual Functions
User defined derivatives are implemented by defining the following virtual functions in the `base_atomic` class: forward , reverse , for_sparse_jac , rev_sparse_jac , and rev_sparse_hes . These virtual functions have a default implementation that returns `ok == false` . The `forward` function, for the case `q == 0` , must be implemented. Otherwise, only those functions required by the your calculations need to be implemented. For example, `forward` for the case `q == 2` can just return `ok == false` unless you require forward mode calculation of second derivatives.
Contents

atomic_ctor | Atomic Function Constructor
atomic_option | Set Atomic Function Options
atomic_afun | Using AD Version of Atomic Function
atomic_forward | Atomic Forward Mode
atomic_reverse | Atomic Reverse Mode
atomic_for_sparse_jac | Atomic Forward Jacobian Sparsity Patterns
atomic_rev_sparse_jac | Atomic Reverse Jacobian Sparsity Patterns
atomic_rev_sparse_hes | Atomic Reverse Hessian Sparsity Patterns
atomic_base_clear | Free Static Variables
atomic_get_started.cpp | Getting Started with Atomic Operations: Example and Test
atomic_norm_sq.cpp | Atomic Euclidean Norm Squared: Example and Test
atomic_reciprocal.cpp | Reciprocal as an Atomic Operation: Example and Test
atomic_sparsity.cpp | Atomic Sparsity Patterns: Example and Test
atomic_tangent.cpp | Tan and Tanh as User Atomic Operations: Example and Test
atomic_hes_sparse.cpp | Atomic Operation Hessian Sparsity: Example and Test
atomic_mat_mul.cpp | User Atomic Matrix Multiply: Example and Test

Examples
Getting Started
The file atomic_get_started.cpp contains an example and test that shows the minimal amount of information required to create a user defined atomic operation.
Scalar Function
The file atomic_reciprocal.cpp contains an example and test where the user provides the code for computing derivatives. This example is simple because the domain and range are scalars.
Vector Range
The file atomic_tangent.cpp contains another example where the user provides the code for computing derivatives. This example is more complex because the range has two components.
Hessian Sparsity Patterns
The file atomic_hes_sparse.cpp contains an minimal example where the user provides the code for computing Hessian sparsity patterns.
General Case
The file atomic_mat_mul.cpp contains a more general example where the user provides the code for computing derivatives. This example is more complex because both the domain and range dimensions are arbitrary.

Input File: omh/atomic_base.omh