Loading [MathJax]/extensions/tex2jax.js
Prev
Next
Index->
contents
reference
index
search
external
Up->
CppAD
AD
ADValued
atomic
atomic_four
atomic_four_example
atomic_four_vector
atomic_four_vector_implement
atomic_four_vector_forward_op.hpp
atomic_four_example-> atomic_four_get_started.cpp atomic_four_norm_sq.cpp atomic_four_forward.cpp atomic_four_dynamic.cpp atomic_four_vector atomic_four_mat_mul atomic_four_lin_ode
atomic_four_vector-> atomic_four_vector_implement atomic_four_vector_add.cpp atomic_four_vector_div.cpp atomic_four_vector_hes_sparsity.cpp atomic_four_vector_jac_sparsity.cpp atomic_four_vector_mul.cpp atomic_four_vector_neg.cpp atomic_four_vector_rev_depend.cpp atomic_four_vector_sub.cpp
atomic_four_vector_implement-> atomic_four_vector.hpp atomic_four_vector_forward_op.hpp atomic_four_vector_reverse_op.hpp atomic_four_vector_jac_sparsity.hpp atomic_four_vector_hes_sparsity.hpp atomic_four_vector_for_type.hpp atomic_four_vector_rev_depend.hpp atomic_four_vector_add_op.hpp atomic_four_vector_sub_op.hpp atomic_four_vector_mul_op.hpp atomic_four_vector_div_op.hpp atomic_four_vector_neg_op.hpp
atomic_four_vector_forward_op.hpp
Headings->
Purpose
Source
@(@\newcommand{\W}[1]{ \; #1 \; }
\newcommand{\R}[1]{ {\rm #1} }
\newcommand{\B}[1]{ {\bf #1} }
\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }
\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }
\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }
\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@This is cppad-20221105 documentation . Here is a link to its
current documentation
.
Atomic Vector Forward Mode: Example Implementation
Purpose
The forward
routine overrides the virtual functions
used by the atomic_four base class for forward mode calculations; see
forward
.
It determines which operator is specified for this call and transfers
the call to the operator's implementation.
There are two versions of the forward
routine, one for
Base
and one for AD<Base>
.
Source
# include <cppad/example/atomic_four/vector/vector.hpp>
namespace CppAD { // BEGIN_CPPAD_NAMESPACE
//
// forward override
// this routine called by ADFun<Base> objects
template < class Base >
bool atomic_vector< Base>:: forward (
size_t call_id,
const CppAD:: vector< bool >& select_y,
size_t order_low,
size_t order_up,
const CppAD:: vector< Base>& tx,
CppAD:: vector< Base>& ty)
{
// p, q
size_t p = order_low;
size_t q = order_up + 1 ;
CPPAD_ASSERT_UNKNOWN ( tx. size () % q == 0 );
//
// op, m
op_enum_t op = op_enum_t ( call_id );
size_t n = tx. size () / q;
size_t m = n / 2 ;
if ( is_unary ( op) )
m = n;
CPPAD_ASSERT_UNKNOWN ( ty. size () == m * q );
//
bool ok = false ;
switch ( op)
{
// addition
case add_enum:
forward_add ( m, p, q, tx, ty);
ok = true ;
break ;
// subtraction
case sub_enum:
forward_sub ( m, p, q, tx, ty);
ok = true ;
break ;
// multiplication
case mul_enum:
forward_mul ( m, p, q, tx, ty);
ok = true ;
break ;
// division
case div_enum:
forward_div ( m, p, q, tx, ty);
ok = true ;
break ;
// unary minus
case neg_enum:
forward_neg ( m, p, q, tx, ty);
ok = true ;
break ;
// error
case number_op_enum:
assert ( false );
break ;
}
return ok;
}
// forward override
// this routine called by ADFun< CppAD::AD<Base> , Base> objects
template < class Base >
bool atomic_vector< Base>:: forward (
size_t call_id,
const CppAD:: vector< bool >& select_y,
size_t order_low,
size_t order_up,
const CppAD:: vector< CppAD:: AD< Base> >& atx,
CppAD:: vector< CppAD:: AD< Base> >& aty )
{
// p, q
size_t p = order_low;
size_t q = order_up + 1 ;
CPPAD_ASSERT_UNKNOWN ( atx. size () % q == 0 );
//
// op, m
op_enum_t op = op_enum_t ( call_id );
size_t n = atx. size () / q;
size_t m = n / 2 ;
if ( is_unary ( op) )
m = n;
CPPAD_ASSERT_UNKNOWN ( aty. size () == q * m );
//
bool ok = false ;
switch ( op)
{
// addition
case add_enum:
forward_add ( m, p, q, atx, aty);
ok = true ;
break ;
// subtraction
case sub_enum:
forward_sub ( m, p, q, atx, aty);
ok = true ;
break ;
// multiplication
case mul_enum:
forward_mul ( m, p, q, atx, aty);
ok = true ;
break ;
// division
case div_enum:
forward_div ( m, p, q, atx, aty);
ok = true ;
break ;
// unary minus
case neg_enum:
forward_neg ( m, p, q, atx, aty);
ok = true ;
break ;
// error
case number_op_enum:
assert ( false );
break ;
}
return ok;
}
} // END_CPPAD_NAMESPACE
Input File: include/cppad/example/atomic_four/vector/forward_op.hpp