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); \
122 std::log(expr.
val()))
125 std::log10(expr.
val()))
128 std::sqrt(expr.
val()))
131 std::cos(expr.
val()))
134 std::sin(expr.
val()))
137 std::tan(expr.
val()))
140 std::acos(expr.
val()))
143 std::asin(expr.
val()))
146 std::atan(expr.
val()))
149 std::cosh(expr.
val()))
152 std::sinh(expr.
val()))
155 std::tanh(expr.
val()))
167 std::abs(expr.
val()))
170 std::fabs(expr.
val()))
173 std::cbrt(expr.
val()))
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))
423 expr1.dx(
i) || expr2.dx(
i),
424 expr1.fastAccessDx(
i) || expr2.fastAccessDx(
i),
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),
462 c <= expr2.
val() ? logical_type(0) : expr2.
dx(
i),
463 expr1.
val() <=
c ? expr1.
dx(
i) : logical_type(0),
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>
533 bool toBool(
const Expr<ExprT>&
x) {
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; \
576 #undef FAD_BOOL_MACRO
584 template <
typename ExprT>
585 std::ostream& operator << (std::ostream& os, const Expr<ExprT>&
x) {
586 os << x.val() <<
" [";
588 for (
int i=0;
i< x.size();
i++) {
589 os <<
" " << x.dx(
i);
601 #endif // SACADO_LFAD_LOGICALSPARSEOPS_HPP
expr2 expr1 expr2 expr2 c *expr2 c *expr1 c *expr2 c *expr1 MaxOp
SACADO_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)
#define FAD_UNARYOP_MACRO(OPNAME, OP, USING, VALUE, DX, FASTACCESSDX)
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 MultiplicationOp
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
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_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)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
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_RELOP_MACRO(OP)
atan2(expr1.val(), expr2.val())
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
SACADO_INLINE_FUNCTION bool toBool(const Expr< T > &xx)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SACADO_INLINE_FUNCTION mpl::enable_if_c< ExprLevel< Expr< T1 > >::value==ExprLevel< Expr< T2 > >::value, Expr< PowerOp< Expr< T1 >, Expr< T2 > > > >::type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
#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