\(\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}} }\)
base_cond_exp¶
View page sourceBase Type Requirements for Conditional Expressions¶
Purpose¶
These definitions are required by the user’s code to support the
AD
< Base > type for CondExp operations:
CompareOp¶
The following enum
type is used in the specifications below:
namespace CppAD {
// The conditional expression operator enum type
enum CompareOp
{ CompareLt, // less than
CompareLe, // less than or equal
CompareEq, // equal
CompareGe, // greater than or equal
CompareGt, // greater than
CompareNe // not equal
};
}
CondExpTemplate¶
The type Base must support the syntax
CppAD::CondExpOp
(which computes implements the corresponding CondExp function when the result has prototype
Base result
The argument cop has prototype
enum CppAD::CompareOp
cop
The other arguments have the prototype
const
Base & leftconst
Base & rightconst
Base & exp_if_trueconst
Base & exp_if_falseOrdered Type¶
If Base is a relatively simple type
that supports
<
, <=
, ==
, >=
, and >
operators
its CondExpOp
function can be defined by
namespace CppAD
{inline
Base CondExpOp
(enum CppAD::CompareOp
cop ,const
Base & left ,const
Base & right ,const
Base & exp_if_true ,const
Base & exp_if_false )return CondExpTemplate
(cop
, left
, right
, trueCase
, falseCase
);For example, see
double CondExpOp .
For an example of and implementation of CondExpOp
with
a more involved Base type see
adolc CondExpOp .
Not Ordered¶
If the type Base does not support ordering; i.e., does not support
the <
, <=
, >=
, or >
operator they should be defined
as resulting in error when used; e.g.
namespace CppAD
{inline bool operator<
(const
Base & left ,const
Base & right )attempt to use < operator with
Base arguments
assert
(0);return
false;Using the CondExpOp
function does should also be defined a an error; e.g.,
namespace CppAD
{inline
Base CondExpOp
(enum CompareOp
cop ,const
Base & left ,const
Base & right ,const
Base & exp_if_true ,const
Base & exp_if_false )attempt to use CondExp with a
Base argument
assert
(0);return
Base (0);For example, see complex CondExpOp .
CondExpRel¶
The macro invocation
CPPAD_COND_EXP_REL
( Base )
uses CondExpOp
above to define the following functions
CondExpLt
( left , right , exp_if_true , exp_if_false )CondExpLe
( left , right , exp_if_true , exp_if_false )CondExpEq
( left , right , exp_if_true , exp_if_false )CondExpGe
( left , right , exp_if_true , exp_if_false )CondExpGt
( left , right , exp_if_true , exp_if_false )where the arguments have type Base . This should be done inside of the CppAD namespace. For example, see base_alloc .