Base Type Requirements for Conditional Expressions
Keywords: base type requirements conditional expressions Condexp require Cppad_cond_exp_rel purpose compareop condexptemplate ordered not condexprel

| Prev | Next |  |  |  |  |  | base_cond_exp |

Base 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 `
result = CppAD::CondExpOp(
cop, left, right, exp_if_true, exp_if_false
)
` 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& left
const Base& right
const Base& exp_if_true
const Base& exp_if_false
`
Ordered 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, the `CondExpOp` function does not make sense. In this case one might (but need not) define `CondExpOp` as follows: `
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 .

Input File: cppad/local/base_cond_exp.hpp