52#ifndef SACADO_LFAD_LOGICALSPARSEOPS_HPP
53#define SACADO_LFAD_LOGICALSPARSEOPS_HPP
59#define FAD_UNARYOP_MACRO(OPNAME,OP,VALUE) \
63 template <typename ExprT> \
66 template <typename ExprT> \
67 class Expr< OP<ExprT> > { \
70 typedef typename ExprT::value_type value_type; \
71 typedef typename ExprT::scalar_type scalar_type; \
72 typedef typename ExprT::base_expr_type base_expr_type; \
73 typedef typename ExprT::logical_type logical_type; \
75 Expr(const ExprT& expr_) : expr(expr_) {} \
77 int size() const { return expr.size(); } \
79 bool hasFastAccess() const { return expr.hasFastAccess(); } \
81 bool isPassive() const { return expr.isPassive();} \
83 value_type val() const { \
87 logical_type dx(int i) const { \
91 logical_type fastAccessDx(int i) const { \
92 return expr.fastAccessDx(i); \
100 template <typename T> \
101 inline Expr< OP< Expr<T> > > \
102 OPNAME (const Expr<T>& expr) \
104 typedef OP< Expr<T> > expr_t; \
106 return Expr<expr_t>(expr); \
175#undef FAD_UNARYOP_MACRO
177#define FAD_BINARYOP_MACRO(OPNAME,OP,VALUE,DX,FASTACCESSDX,VAL_CONST_DX_1,VAL_CONST_DX_2,CONST_DX_1,CONST_DX_2,CONST_FASTACCESSDX_1,CONST_FASTACCESSDX_2) \
181 template <typename ExprT1, typename ExprT2> \
184 template <typename T1, typename T2> \
185 class Expr< OP< Expr<T1>, Expr<T2> > > { \
189 typedef Expr<T1> ExprT1; \
190 typedef Expr<T2> ExprT2; \
191 typedef typename ExprT1::value_type value_type_1; \
192 typedef typename ExprT2::value_type value_type_2; \
193 typedef typename Sacado::Promote<value_type_1, \
194 value_type_2>::type value_type; \
196 typedef typename ExprT1::scalar_type scalar_type_1; \
197 typedef typename ExprT2::scalar_type scalar_type_2; \
198 typedef typename Sacado::Promote<scalar_type_1, \
199 scalar_type_2>::type scalar_type; \
201 typedef typename ExprT1::base_expr_type base_expr_type_1; \
202 typedef typename ExprT2::base_expr_type base_expr_type_2; \
203 typedef typename Sacado::Promote<base_expr_type_1, \
204 base_expr_type_2>::type base_expr_type; \
206 typedef typename ExprT1::logical_type logical_type; \
208 Expr(const ExprT1& expr1_, const ExprT2& expr2_) : \
209 expr1(expr1_), expr2(expr2_) {} \
212 int sz1 = expr1.size(), sz2 = expr2.size(); \
213 return sz1 > sz2 ? sz1 : sz2; \
216 bool hasFastAccess() const { \
217 return expr1.hasFastAccess() && expr2.hasFastAccess(); \
220 bool isPassive() const { \
221 return expr1.isPassive() && expr2.isPassive(); \
224 const value_type val() const { \
228 const logical_type dx(int i) const { \
232 const logical_type fastAccessDx(int i) const { \
233 return FASTACCESSDX; \
238 const ExprT1& expr1; \
239 const ExprT2& expr2; \
243 template <typename T1> \
244 class Expr< OP< Expr<T1>, typename Expr<T1>::value_type> > { \
248 typedef Expr<T1> ExprT1; \
249 typedef typename ExprT1::value_type value_type; \
250 typedef typename ExprT1::scalar_type scalar_type; \
251 typedef typename ExprT1::base_expr_type base_expr_type; \
252 typedef typename ExprT1::value_type ConstT; \
253 typedef typename ExprT1::logical_type logical_type; \
255 Expr(const ExprT1& expr1_, const ConstT& c_) : \
256 expr1(expr1_), c(c_) {} \
259 return expr1.size(); \
262 bool hasFastAccess() const { \
263 return expr1.hasFastAccess(); \
266 bool isPassive() const { \
267 return expr1.isPassive(); \
270 const value_type val() const { \
271 return VAL_CONST_DX_2; \
274 const logical_type dx(int i) const { \
278 const logical_type fastAccessDx(int i) const { \
279 return CONST_FASTACCESSDX_2; \
284 const ExprT1& expr1; \
288 template <typename T2> \
289 class Expr< OP< typename Expr<T2>::value_type, Expr<T2> > > { \
293 typedef Expr<T2> ExprT2; \
294 typedef typename ExprT2::value_type value_type; \
295 typedef typename ExprT2::scalar_type scalar_type; \
296 typedef typename ExprT2::base_expr_type base_expr_type; \
297 typedef typename ExprT2::value_type ConstT; \
298 typedef typename ExprT2::logical_type logical_type; \
300 Expr(const ConstT& c_, const ExprT2& expr2_) : \
301 c(c_), expr2(expr2_) {} \
304 return expr2.size(); \
307 bool hasFastAccess() const { \
308 return expr2.hasFastAccess(); \
311 bool isPassive() const { \
312 return expr2.isPassive(); \
315 const value_type val() const { \
316 return VAL_CONST_DX_1; \
319 const logical_type dx(int i) const { \
323 const logical_type fastAccessDx(int i) const { \
324 return CONST_FASTACCESSDX_1; \
330 const ExprT2& expr2; \
333 template <typename T1, typename T2> \
334 inline Expr< OP< Expr<T1>, Expr<T2> > > \
335 OPNAME (const Expr<T1>& expr1, const Expr<T2>& expr2) \
337 typedef OP< Expr<T1>, Expr<T2> > expr_t; \
339 return Expr<expr_t>(expr1, expr2); \
342 template <typename T> \
343 inline Expr< OP< Expr<T>, Expr<T> > > \
344 OPNAME (const Expr<T>& expr1, const Expr<T>& expr2) \
346 typedef OP< Expr<T>, Expr<T> > expr_t; \
348 return Expr<expr_t>(expr1, expr2); \
351 template <typename T> \
352 inline Expr< OP< typename Expr<T>::value_type, Expr<T> > > \
353 OPNAME (const typename Expr<T>::value_type& c, \
354 const Expr<T>& expr) \
356 typedef typename Expr<T>::value_type ConstT; \
357 typedef OP< ConstT, Expr<T> > expr_t; \
359 return Expr<expr_t>(c, expr); \
362 template <typename T> \
363 inline Expr< OP< Expr<T>, typename Expr<T>::value_type > > \
364 OPNAME (const Expr<T>& expr, \
365 const typename Expr<T>::value_type& c) \
367 typedef typename Expr<T>::value_type ConstT; \
368 typedef OP< Expr<T>, ConstT > expr_t; \
370 return Expr<expr_t>(expr, c); \
378 expr1.val() + expr2.val(),
379 expr1.dx(i) || expr2.dx(i),
380 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
385 expr2.fastAccessDx(i),
386 expr1.fastAccessDx(i))
389 expr1.val() - expr2.val(),
390 expr1.dx(i) || expr2.dx(i),
391 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
396 expr2.fastAccessDx(i),
397 expr1.fastAccessDx(i))
400 expr1.val() * expr2.val(),
401 expr1.dx(i) || expr2.dx(i),
402 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
407 expr2.fastAccessDx(i),
408 expr1.fastAccessDx(i))
411 expr1.val() / expr2.val(),
412 expr1.dx(i) || expr2.dx(i),
413 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
418 expr2.fastAccessDx(i),
419 expr1.fastAccessDx(i))
422 std::atan2(expr1.val(), expr2.val()),
423 expr1.dx(i) || expr2.dx(i),
424 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
425 std::atan2(
c, expr2.val()),
426 std::atan2(expr1.val(),
c),
429 expr2.fastAccessDx(i),
430 expr1.fastAccessDx(i))
434 expr1.dx(i) || expr2.dx(i),
435 expr1.fastAccessDx(i) || expr2.fastAccessDx(i),
440 expr2.fastAccessDx(i),
441 expr1.fastAccessDx(i))
445 expr1.val() >= expr2.val() ? expr1.dx(i) : expr2.dx(i),
446 expr1.val() >= expr2.val() ? expr1.fastAccessDx(i) :
447 expr2.fastAccessDx(i),
450 c >= expr2.val() ? logical_type(0) : expr2.dx(i),
451 expr1.val() >=
c ? expr1.dx(i) : logical_type(0),
452 c >= expr2.val() ? logical_type(0) : expr2.fastAccessDx(i),
453 expr1.val() >=
c ? expr1.fastAccessDx(i) : logical_type(0))
457 expr1.
val() <= expr2.
val() ? expr1.
dx(i) : expr2.
dx(i),
462 c <= expr2.
val() ? logical_type(0) : expr2.
dx(i),
463 expr1.
val() <=
c ? expr1.
dx(i) : logical_type(0),
467#undef FAD_BINARYOP_MACRO
471#define FAD_RELOP_MACRO(OP) \
474 template <typename ExprT1, typename ExprT2> \
476 operator OP (const Expr<ExprT1>& expr1, \
477 const Expr<ExprT2>& expr2) \
479 return expr1.val() OP expr2.val(); \
482 template <typename ExprT2> \
484 operator OP (const typename Expr<ExprT2>::value_type& a, \
485 const Expr<ExprT2>& expr2) \
487 return a OP expr2.val(); \
490 template <typename ExprT1> \
492 operator OP (const Expr<ExprT1>& expr1, \
493 const typename Expr<ExprT1>::value_type& b) \
495 return expr1.val() OP b; \
511#undef FAD_RELOP_MACRO
517 template <
typename ExprT>
518 inline bool operator ! (
const Expr<ExprT>& expr)
532 template <
typename ExprT>
534 bool is_zero = (x.val() == 0.0);
535 for (
int i=0; i<x.size(); i++)
536 is_zero = is_zero && (x.dx(i) == 0.0);
544#define FAD_BOOL_MACRO(OP) \
547 template <typename ExprT1, typename ExprT2> \
549 operator OP (const Expr<ExprT1>& expr1, \
550 const Expr<ExprT2>& expr2) \
552 return toBool(expr1) OP toBool(expr2); \
555 template <typename ExprT2> \
557 operator OP (const typename Expr<ExprT2>::value_type& a, \
558 const Expr<ExprT2>& expr2) \
560 return a OP toBool(expr2); \
563 template <typename ExprT1> \
565 operator OP (const Expr<ExprT1>& expr1, \
566 const typename Expr<ExprT1>::value_type& b) \
568 return toBool(expr1) OP b; \
584 template <
typename ExprT>
586 os << x.val() <<
" [";
588 for (
int i=0; i< x.size(); i++) {
589 os <<
" " << x.dx(i);
#define FAD_UNARYOP_MACRO(OPNAME, OP, USING, VALUE, DX, FASTACCESSDX)
expr2 expr1 expr2 expr2 c *expr2 c *expr1 c *expr2 c *expr1 MaxOp
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 expr1 expr1 c *expr2 expr1 c *expr2 expr1 c *expr2 expr1 DivisionOp
#define FAD_BINARYOP_MACRO(OPNAME, OP, USING, VALUE, DX, CDX1, CDX2, FASTACCESSDX, VAL_CONST_DX_1, VAL_CONST_DX_2, CONST_DX_1, CONST_DX_2, CONST_FASTACCESSDX_1, CONST_FASTACCESSDX_2)
#define FAD_RELOP_MACRO(OP)
#define FAD_BOOL_MACRO(OP)
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
atan2(expr1.val(), expr2.val())
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 expr1 expr1 c *expr2 expr1 c *expr2 expr1 c *expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 Atan2Op
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 MultiplicationOp
#define FAD_UNARYOP_MACRO(OPNAME, OP, VALUE)
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
#define FAD_RELOP_MACRO(OP)
#define FAD_BINARYOP_MACRO(OPNAME, OP, VALUE, DX, FASTACCESSDX, VAL_CONST_DX_1, VAL_CONST_DX_2, CONST_DX_1, CONST_DX_2, CONST_FASTACCESSDX_1, CONST_FASTACCESSDX_2)
#define FAD_BOOL_MACRO(OP)
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 PowerOp
adouble max(const adouble &a, const adouble &b)
adouble min(const adouble &a, const adouble &b)
Wrapper for a generic expression template.
SACADO_INLINE_FUNCTION bool toBool(const Expr< T > &xx)
Namespace for logical forward-mode AD classes.
std::ostream & operator<<(std::ostream &os, const ParameterLibraryBase< FamilyType, EntryType > &pl)
Taylor< T > max(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
PowExprType< Expr< T1 >, Expr< T2 > >::expr_type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)