Prev | Next | base_cond_exp |
AD<Base>
type for CondExp
operations:
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
};
}
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
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
.
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
.
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
.