52 #ifndef SACADO_ELRFAD_OPS_HPP 53 #define SACADO_ELRFAD_OPS_HPP 59 #define FAD_UNARYOP_MACRO(OPNAME,OP,VALUE,ADJOINT, \ 60 LINEAR,DX,FASTACCESSDX) \ 64 template <typename ExprT> \ 67 template <typename ExprT> \ 68 class Expr< OP<ExprT> > { \ 71 typedef typename ExprT::value_type value_type; \ 72 typedef typename ExprT::scalar_type scalar_type; \ 73 typedef typename ExprT::base_expr_type base_expr_type; \ 75 static const int num_args = ExprT::num_args; \ 77 static const bool is_linear = LINEAR; \ 79 KOKKOS_INLINE_FUNCTION \ 80 Expr(const ExprT& expr_) : expr(expr_) {} \ 82 KOKKOS_INLINE_FUNCTION \ 83 int size() const { return expr.size(); } \ 86 KOKKOS_INLINE_FUNCTION \ 87 bool isActive() const { return expr.template isActive<Arg>(); } \ 89 KOKKOS_INLINE_FUNCTION \ 90 bool isActive2(int j) const { return expr.isActive2(j); } \ 92 KOKKOS_INLINE_FUNCTION \ 93 bool updateValue() const { return expr.updateValue(); } \ 95 KOKKOS_INLINE_FUNCTION \ 96 value_type val() const { \ 100 KOKKOS_INLINE_FUNCTION \ 101 void computePartials(const value_type& bar, \ 102 value_type partials[]) const { \ 103 expr.computePartials(ADJOINT, partials); \ 106 KOKKOS_INLINE_FUNCTION \ 107 void getTangents(int i, value_type dots[]) const { \ 108 expr.getTangents(i, dots); } \ 111 KOKKOS_INLINE_FUNCTION \ 112 const value_type& getTangent(int i) const { \ 113 return expr.template getTangent<Arg>(i); \ 116 KOKKOS_INLINE_FUNCTION \ 117 bool isLinear() const { \ 121 KOKKOS_INLINE_FUNCTION \ 122 bool hasFastAccess() const { \ 123 return expr.hasFastAccess(); \ 126 KOKKOS_INLINE_FUNCTION \ 127 const value_type dx(int i) const { \ 131 KOKKOS_INLINE_FUNCTION \ 132 const value_type fastAccessDx(int i) const { \ 133 return FASTACCESSDX; \ 136 KOKKOS_INLINE_FUNCTION \ 137 const value_type* getDx(int j) const { \ 138 return expr.getDx(j); \ 141 KOKKOS_INLINE_FUNCTION \ 142 int numActiveArgs() const { \ 143 return expr.numActiveArgs(); \ 146 KOKKOS_INLINE_FUNCTION \ 147 void computeActivePartials(const value_type& bar, \ 148 value_type *partials) const { \ 149 expr.computePartials(ADJOINT, partials); \ 157 template <typename T> \ 158 KOKKOS_INLINE_FUNCTION \ 159 Expr< OP< Expr<T> > > \ 160 OPNAME (const Expr<T>& expr) \ 162 typedef OP< Expr<T> > expr_t; \ 164 return Expr<expr_t>(expr); \ 175 expr.fastAccessDx(i))
182 -expr.fastAccessDx(i))
189 std::exp(expr.val())*expr.fastAccessDx(i))
195 expr.dx(i)/expr.val(),
196 expr.fastAccessDx(i)/expr.val())
202 expr.dx(i)/(
std::log(value_type(10))*expr.val()),
203 expr.fastAccessDx(i) / (
std::log(value_type(10))*expr.val()))
253 bar/(value_type(1.)+expr.
val()*expr.
val()),
255 expr.
dx(i)/(value_type(1)+expr.
val()*expr.
val()),
283 (expr.
val()+value_type(1.))),
286 (expr.
val()+value_type(1))),
288 (expr.
val()+value_type(1))))
300 bar/(value_type(1.)-expr.
val()*expr.
val()),
302 expr.
dx(i)/(value_type(1)-expr.
val()*expr.
val()),
308 (expr.
val() >= value_type(0.)) ?
bar : value_type(-
bar),
310 expr.
val() >= 0 ? value_type(+expr.
dx(i)) :
311 value_type(-expr.
dx(i)),
317 (expr.
val() >= value_type(0.)) ?
bar : value_type(-
bar),
319 expr.
val() >= 0 ? value_type(+expr.
dx(i)) :
320 value_type(-expr.
dx(i)),
323 #ifdef HAVE_SACADO_CXX11 326 std::cbrt(expr.val()),
327 bar/(value_type(3)*std::cbrt(expr.val()*expr.val())),
329 expr.dx(i)/(value_type(3)*std::cbrt(expr.val()*expr.val())),
330 expr.fastAccessDx(i)/(value_type(3)*std::cbrt(expr.val()*expr.val())))
336 OPNAME,OP,VALUE,LADJOINT,RADJOINT, \
337 LINEAR,CONST_LINEAR_1, CONST_LINEAR_2, \
338 LINEAR_2,CONST_LINEAR_1_2, CONST_LINEAR_2_2, \
339 DX,FASTACCESSDX,CONST_DX_1,CONST_DX_2, \
340 CONST_FASTACCESSDX_1,CONST_FASTACCESSDX_2) \
344 template <typename ExprT1, typename ExprT2> \
347 template <typename ExprT1, typename ExprT2> \
348 class Expr< OP<ExprT1,ExprT2> > { \
352 typedef
typename ExprT1::value_type value_type_1; \
353 typedef
typename ExprT2::value_type value_type_2; \
355 value_type_2>::type value_type; \
357 typedef
typename ExprT1::scalar_type scalar_type_1; \
358 typedef
typename ExprT2::scalar_type scalar_type_2; \
360 scalar_type_2>::type scalar_type; \
362 typedef
typename ExprT1::base_expr_type base_expr_type_1; \
363 typedef
typename ExprT2::base_expr_type base_expr_type_2; \
365 base_expr_type_2>::type base_expr_type; \
367 static
const int num_args1 = ExprT1::num_args; \
368 static
const int num_args2 = ExprT2::num_args; \
369 static
const int num_args = num_args1 + num_args2; \
371 static
const bool is_linear = LINEAR_2; \
373 KOKKOS_INLINE_FUNCTION \
374 Expr(
const ExprT1& expr1_,
const ExprT2& expr2_) : \
375 expr1(expr1_), expr2(expr2_) {} \
377 KOKKOS_INLINE_FUNCTION \
379 int sz1 = expr1.size(), sz2 = expr2.size(); \
380 return sz1 > sz2 ? sz1 : sz2; \
384 KOKKOS_INLINE_FUNCTION \
385 bool isActive()
const { \
386 if (Arg < num_args1) \
387 return expr1.template isActive<Arg>(); \
389 return expr2.template isActive<Arg-num_args1>(); \
392 KOKKOS_INLINE_FUNCTION \
393 bool isActive2(
int j)
const { \
395 return expr1.isActive2(j); \
397 return expr2.isActive2(j); \
400 KOKKOS_INLINE_FUNCTION \
401 bool updateValue()
const { \
402 return expr1.updateValue() && expr2.updateValue(); \
405 KOKKOS_INLINE_FUNCTION \
406 value_type
val()
const { \
410 KOKKOS_INLINE_FUNCTION \
411 void computePartials(
const value_type&
bar, \
412 value_type partials[])
const { \
414 expr1.computePartials(LADJOINT, partials); \
416 expr2.computePartials(RADJOINT, partials+num_args1); \
419 KOKKOS_INLINE_FUNCTION \
420 void getTangents(
int i, value_type dots[])
const { \
421 expr1.getTangents(i, dots); \
422 expr2.getTangents(i, dots+num_args1); \
426 KOKKOS_INLINE_FUNCTION \
427 const value_type& getTangent(
int i)
const { \
428 if (Arg < num_args1) \
429 return expr1.template getTangent<Arg>(i); \
431 return expr2.template getTangent<Arg-num_args1>(i); \
434 KOKKOS_INLINE_FUNCTION \
435 bool isLinear()
const { \
439 KOKKOS_INLINE_FUNCTION \
440 bool hasFastAccess()
const { \
441 return expr1.hasFastAccess() && expr2.hasFastAccess(); \
444 KOKKOS_INLINE_FUNCTION \
445 const value_type
dx(
int i)
const { \
449 KOKKOS_INLINE_FUNCTION \
451 return FASTACCESSDX; \
454 KOKKOS_INLINE_FUNCTION \
455 const value_type* getDx(
int j)
const { \
457 return expr1.getDx(j); \
459 return expr2.getDx(j-num_args1); \
462 KOKKOS_INLINE_FUNCTION \
463 int numActiveArgs()
const { \
464 return expr1.numActiveArgs() + expr2.numActiveArgs(); \
467 KOKKOS_INLINE_FUNCTION \
468 void computeActivePartials(
const value_type&
bar, \
469 value_type *partials)
const { \
470 if (expr1.numActiveArgs() > 0) \
471 expr1.computePartials(LADJOINT, partials); \
472 if (expr2.numActiveArgs() > 0) \
473 expr2.computePartials(RADJOINT, partials+expr2.numActiveArgs()); \
477 typename ExprConstRef<ExprT1>::type expr1; \
478 typename ExprConstRef<ExprT2>::type expr2; \
482 template <typename ExprT1, typename T2> \
483 class Expr< OP<ExprT1, ConstExpr<T2> > > { \
487 typedef ConstExpr<T2> ExprT2; \
488 typedef
typename ExprT1::value_type value_type_1; \
489 typedef
typename ExprT2::value_type value_type_2; \
491 value_type_2>::type value_type; \
493 typedef
typename ExprT1::scalar_type scalar_type_1; \
494 typedef
typename ExprT2::scalar_type scalar_type_2; \
496 scalar_type_2>::type scalar_type; \
498 typedef
typename ExprT1::base_expr_type base_expr_type_1; \
499 typedef
typename ExprT2::base_expr_type base_expr_type_2; \
501 base_expr_type_2>::type base_expr_type; \
503 static
const int num_args = ExprT1::num_args; \
505 static
const bool is_linear = CONST_LINEAR_2_2; \
507 KOKKOS_INLINE_FUNCTION \
508 Expr(
const ExprT1& expr1_,
const ExprT2& expr2_) : \
509 expr1(expr1_), expr2(expr2_) {} \
511 KOKKOS_INLINE_FUNCTION \
513 return expr1.size(); \
517 KOKKOS_INLINE_FUNCTION \
518 bool isActive()
const { \
519 return expr1.template isActive<Arg>(); \
522 KOKKOS_INLINE_FUNCTION \
523 bool isActive2(
int j)
const {
return expr1.isActive2(j); } \
525 KOKKOS_INLINE_FUNCTION \
526 bool updateValue()
const { \
527 return expr1.updateValue(); \
530 KOKKOS_INLINE_FUNCTION \
531 value_type
val()
const { \
535 KOKKOS_INLINE_FUNCTION \
536 void computePartials(
const value_type&
bar, \
537 value_type partials[])
const { \
538 expr1.computePartials(LADJOINT, partials); \
541 KOKKOS_INLINE_FUNCTION \
542 void getTangents(
int i, value_type dots[])
const { \
543 expr1.getTangents(i, dots); \
547 KOKKOS_INLINE_FUNCTION \
548 const value_type& getTangent(
int i)
const { \
549 return expr1.template getTangent<Arg>(i); \
552 KOKKOS_INLINE_FUNCTION \
553 bool isLinear()
const { \
554 return CONST_LINEAR_2; \
557 KOKKOS_INLINE_FUNCTION \
558 bool hasFastAccess()
const { \
559 return expr1.hasFastAccess(); \
562 KOKKOS_INLINE_FUNCTION \
563 const value_type
dx(
int i)
const { \
567 KOKKOS_INLINE_FUNCTION \
569 return CONST_FASTACCESSDX_2; \
572 KOKKOS_INLINE_FUNCTION \
573 const value_type* getDx(
int j)
const { \
574 return expr1.getDx(j); \
577 KOKKOS_INLINE_FUNCTION \
578 int numActiveArgs()
const { \
579 return expr1.numActiveArgs(); \
582 KOKKOS_INLINE_FUNCTION \
583 void computeActivePartials(
const value_type&
bar, \
584 value_type *partials)
const { \
585 expr1.computePartials(LADJOINT, partials); \
590 typename ExprConstRef<ExprT1>::type expr1; \
591 typename ExprConstRef<ExprT2>::type expr2; \
595 template <typename T1, typename ExprT2> \
596 class Expr< OP<ConstExpr<T1>,ExprT2> > { \
600 typedef ConstExpr<T1> ExprT1; \
601 typedef
typename ExprT1::value_type value_type_1; \
602 typedef
typename ExprT2::value_type value_type_2; \
604 value_type_2>::type value_type; \
606 typedef
typename ExprT1::scalar_type scalar_type_1; \
607 typedef
typename ExprT2::scalar_type scalar_type_2; \
609 scalar_type_2>::type scalar_type; \
611 typedef
typename ExprT1::base_expr_type base_expr_type_1; \
612 typedef
typename ExprT2::base_expr_type base_expr_type_2; \
614 base_expr_type_2>::type base_expr_type; \
616 static
const int num_args = ExprT2::num_args; \
618 static
const bool is_linear = CONST_LINEAR_1_2; \
620 KOKKOS_INLINE_FUNCTION \
621 Expr(
const ExprT1& expr1_,
const ExprT2& expr2_) : \
622 expr1(expr1_), expr2(expr2_) {} \
624 KOKKOS_INLINE_FUNCTION \
626 return expr2.size(); \
630 KOKKOS_INLINE_FUNCTION \
631 bool isActive()
const { \
632 return expr2.template isActive<Arg>(); \
635 KOKKOS_INLINE_FUNCTION \
636 bool isActive2(
int j)
const {
return expr2.isActive2(j); } \
638 KOKKOS_INLINE_FUNCTION \
639 bool updateValue()
const { \
640 return expr2.updateValue(); \
643 KOKKOS_INLINE_FUNCTION \
644 value_type
val()
const { \
648 KOKKOS_INLINE_FUNCTION \
649 void computePartials(
const value_type&
bar, \
650 value_type partials[])
const { \
651 expr2.computePartials(RADJOINT, partials); \
654 KOKKOS_INLINE_FUNCTION \
655 void getTangents(
int i, value_type dots[])
const { \
656 expr2.getTangents(i, dots); \
660 KOKKOS_INLINE_FUNCTION \
661 const value_type& getTangent(
int i)
const { \
662 return expr2.template getTangent<Arg>(i); \
665 KOKKOS_INLINE_FUNCTION \
666 bool isLinear()
const { \
667 return CONST_LINEAR_1; \
670 KOKKOS_INLINE_FUNCTION \
671 bool hasFastAccess()
const { \
672 return expr2.hasFastAccess(); \
675 KOKKOS_INLINE_FUNCTION \
676 const value_type
dx(
int i)
const { \
680 KOKKOS_INLINE_FUNCTION \
682 return CONST_FASTACCESSDX_1; \
685 KOKKOS_INLINE_FUNCTION \
686 const value_type* getDx(
int j)
const { \
687 return expr2.getDx(j); \
690 KOKKOS_INLINE_FUNCTION \
691 int numActiveArgs()
const { \
692 return expr2.numActiveArgs(); \
695 KOKKOS_INLINE_FUNCTION \
696 void computeActivePartials(
const value_type&
bar, \
697 value_type *partials)
const { \
698 expr2.computePartials(RADJOINT, partials); \
702 typename ExprConstRef<ExprT1>::type expr1; \
703 typename ExprConstRef<ExprT2>::type expr2; \
707 template <typename T1, typename T2>
\ 710 OPNAME (
const T1& expr1,
const T2& expr2) \
712 typedef OP< T1, T2 > expr_t; \
714 return Expr<expr_t>(expr1, expr2); \
717 template <typename T> \
718 KOKKOS_INLINE_FUNCTION \
719 Expr< OP< Expr<T>, Expr<T> > > \
720 OPNAME (
const Expr<T>& expr1,
const Expr<T>& expr2) \
722 typedef OP< Expr<T>, Expr<T> > expr_t; \
724 return Expr<expr_t>(expr1, expr2); \
727 template <typename T> \
728 KOKKOS_INLINE_FUNCTION \
729 Expr< OP< ConstExpr<typename Expr<T>::value_type>, \
731 OPNAME (
const typename Expr<T>::value_type&
c, \
732 const Expr<T>& expr) \
734 typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
735 typedef OP< ConstT, Expr<T> > expr_t; \
737 return Expr<expr_t>(ConstT(
c), expr); \
740 template <typename T> \
741 KOKKOS_INLINE_FUNCTION \
743 ConstExpr<typename Expr<T>::value_type> > > \
744 OPNAME (
const Expr<T>& expr, \
745 const typename Expr<T>::value_type&
c) \
747 typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
748 typedef OP< Expr<T>, ConstT > expr_t; \
750 return Expr<expr_t>(expr, ConstT(
c)); \
753 template <typename T>
\ 756 OPNAME (
const typename Expr<T>::scalar_type&
c, \
757 const Expr<T>& expr) \
759 typedef ConstExpr<typename Expr<T>::scalar_type> ConstT; \
760 typedef OP< ConstT, Expr<T> > expr_t; \
762 return Expr<expr_t>(ConstT(
c), expr); \
765 template <typename T>
\ 768 OPNAME (
const Expr<T>& expr, \
769 const typename Expr<T>::scalar_type&
c) \
771 typedef ConstExpr<typename Expr<T>::scalar_type> ConstT; \
772 typedef OP< Expr<T>, ConstT > expr_t; \
774 return Expr<expr_t>(expr, ConstT(
c)); \
782 expr1.val() + expr2.val(),
785 expr1.isLinear() && expr2.isLinear(),
788 ExprT1::is_linear && ExprT2::is_linear,
791 expr1.dx(i) + expr2.dx(i),
792 expr1.fastAccessDx(i) + expr2.fastAccessDx(i),
795 expr2.fastAccessDx(i),
796 expr1.fastAccessDx(i))
799 expr1.val() - expr2.val(),
802 expr1.isLinear() && expr2.isLinear(),
805 ExprT1::is_linear && ExprT2::is_linear,
808 expr1.dx(i) - expr2.dx(i),
809 expr1.fastAccessDx(i) - expr2.fastAccessDx(i),
812 -expr2.fastAccessDx(i),
813 expr1.fastAccessDx(i))
816 expr1.val() * expr2.val(),
825 expr1.val()*expr2.dx(i) + expr1.dx(i)*expr2.val(),
826 expr1.val()*expr2.fastAccessDx(i) +
827 expr1.fastAccessDx(i)*expr2.val(),
828 expr1.val()*expr2.dx(i),
829 expr1.dx(i)*expr2.val(),
830 expr1.val()*expr2.fastAccessDx(i),
831 expr1.fastAccessDx(i)*expr2.val())
834 expr1.val() / expr2.val(),
836 -
bar*expr1.val()/(expr2.val()*expr2.val()),
843 (expr1.dx(i)*expr2.val() - expr2.dx(i)*expr1.val()) /
844 (expr2.val()*expr2.val()),
845 (expr1.fastAccessDx(i)*expr2.val() -
846 expr2.fastAccessDx(i)*expr1.val()) /
847 (expr2.val()*expr2.val()),
848 -expr2.dx(i)*expr1.val() / (expr2.val()*expr2.val()),
849 expr1.dx(i)/expr2.val(),
850 -expr2.fastAccessDx(i)*expr1.val() / (expr2.val()*expr2.val()),
851 expr1.fastAccessDx(i)/expr2.val())
856 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
858 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
865 (expr2.val()*expr1.dx(i) - expr1.val()*expr2.dx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
866 (expr2.val()*expr1.fastAccessDx(i) - expr1.val()*expr2.fastAccessDx(i))/
867 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
868 (-expr1.val()*expr2.dx(i)) / (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
869 (expr2.val()*expr1.dx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
870 (-expr1.val()*expr2.fastAccessDx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
871 (expr2.val()*expr1.fastAccessDx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()))
875 expr1.
val() == value_type(0) ? value_type(0) : value_type(
bar*
std::
pow(expr1.
val(),expr2.
val())*expr2.
val()/expr1.
val()),
885 expr1.
val() == value_type(0) ? value_type(0) : value_type(expr2.
dx(i)*
std::
log(expr1.
val())*
std::
pow(expr1.
val(),expr2.
val())),
886 expr1.
val() == value_type(0) ? value_type(0.0) : value_type(expr2.
val()*expr1.
dx(i)/expr1.
val()*
std::
pow(expr1.
val(),expr2.
val())),
892 expr1.
val() >= expr2.
val() ?
bar : value_type(0.),
893 expr2.
val() > expr1.
val() ?
bar : value_type(0.),
894 expr1.isLinear() && expr2.isLinear(),
897 ExprT1::is_linear && ExprT2::is_linear,
900 expr1.
val() >= expr2.
val() ? expr1.
dx(i) : expr2.
dx(i),
903 expr1.
val() >= expr2.
val() ? value_type(0) : expr2.
dx(i),
904 expr1.
val() >= expr2.
val() ? expr1.
dx(i) : value_type(0),
905 expr1.
val() >= expr2.
val() ? value_type(0) :
912 expr1.
val() <= expr2.
val() ?
bar : value_type(0.),
913 expr2.
val() < expr1.
val() ?
bar : value_type(0.),
914 expr1.isLinear() && expr2.isLinear(),
917 ExprT1::is_linear && ExprT2::is_linear,
920 expr1.
val() <= expr2.
val() ? expr1.
dx(i) : expr2.
dx(i),
923 expr1.
val() <= expr2.
val() ? value_type(0) : expr2.
dx(i),
924 expr1.
val() <= expr2.
val() ? expr1.
dx(i) : value_type(0),
925 expr1.
val() <= expr2.
val() ? value_type(0) :
930 #undef FAD_BINARYOP_MACRO 934 #define FAD_RELOP_MACRO(OP) \ 937 template <typename ExprT1, typename ExprT2> \ 938 KOKKOS_INLINE_FUNCTION \ 940 operator OP (const Expr<ExprT1>& expr1, \ 941 const Expr<ExprT2>& expr2) \ 943 return expr1.val() OP expr2.val(); \ 946 template <typename ExprT2> \ 947 KOKKOS_INLINE_FUNCTION \ 949 operator OP (const typename Expr<ExprT2>::value_type& a, \ 950 const Expr<ExprT2>& expr2) \ 952 return a OP expr2.val(); \ 955 template <typename ExprT1> \ 956 KOKKOS_INLINE_FUNCTION \ 958 operator OP (const Expr<ExprT1>& expr1, \ 959 const typename Expr<ExprT1>::value_type& b) \ 961 return expr1.val() OP b; \ 977 #undef FAD_RELOP_MACRO 983 template <
typename ExprT>
999 template <
typename ExprT>
1001 bool toBool(
const Expr<ExprT>& x) {
1002 bool is_zero = (x.val() == 0.0);
1003 for (
int i=0; i<x.size(); i++)
1004 is_zero = is_zero && (x.dx(i) == 0.0);
1012 #define FAD_BOOL_MACRO(OP) \ 1013 namespace Sacado { \ 1014 namespace ELRFad { \ 1015 template <typename ExprT1, typename ExprT2> \ 1016 KOKKOS_INLINE_FUNCTION \ 1018 operator OP (const Expr<ExprT1>& expr1, \ 1019 const Expr<ExprT2>& expr2) \ 1021 return toBool(expr1) OP toBool(expr2); \ 1024 template <typename ExprT2> \ 1025 KOKKOS_INLINE_FUNCTION \ 1027 operator OP (const typename Expr<ExprT2>::value_type& a, \ 1028 const Expr<ExprT2>& expr2) \ 1030 return a OP toBool(expr2); \ 1033 template <typename ExprT1> \ 1034 KOKKOS_INLINE_FUNCTION \ 1036 operator OP (const Expr<ExprT1>& expr1, \ 1037 const typename Expr<ExprT1>::value_type& b) \ 1039 return toBool(expr1) OP b; \ 1047 #undef FAD_BOOL_MACRO 1055 template <
typename ExprT>
1056 std::ostream& operator << (std::ostream& os, const Expr<ExprT>& x) {
1057 os << x.val() <<
" [";
1059 for (
int i=0; i< x.size(); i++) {
1060 os <<
" " << x.dx(i);
1072 #endif // SACADO_FAD_OPS_HPP
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 SubtractionOp
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 MultiplicationOp
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 Atan2Op
#define FAD_BOOL_MACRO(OP)
#define SACADO_FAD_OP_ENABLE_EXPR_EXPR(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 expr1 expr1 expr2 expr1 expr2 expr1 MaxOp
SimpleFad< ValueT > atan2(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
KOKKOS_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
#define SACADO_FAD_OP_ENABLE_SCALAR_EXPR(OP)
SimpleFad< ValueT > sqrt(const SimpleFad< ValueT > &a)
#define FAD_BINARYOP_MACRO( OPNAME, OP, VALUE, LADJOINT, RADJOINT, LINEAR, CONST_LINEAR_1, CONST_LINEAR_2, LINEAR_2, CONST_LINEAR_1_2, CONST_LINEAR_2_2, DX, FASTACCESSDX, CONST_DX_1, CONST_DX_2, CONST_FASTACCESSDX_1, CONST_FASTACCESSDX_2)
SimpleFad< ValueT > asin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > log(const SimpleFad< ValueT > &a)
#define KOKKOS_INLINE_FUNCTION
#define FAD_UNARYOP_MACRO(OPNAME, OP, VALUE, ADJOINT, LINEAR, DX, FASTACCESSDX)
SimpleFad< ValueT > exp(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
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
KOKKOS_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > sin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sinh(const SimpleFad< ValueT > &a)
#define FAD_RELOP_MACRO(OP)
SimpleFad< ValueT > pow(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > tan(const SimpleFad< ValueT > &a)
expr acosh(expr.val())) FAD_UNARYOP_MACRO(asinh
#define SACADO_FAD_OP_ENABLE_EXPR_SCALAR(OP)
expr asinh(expr.val())) FAD_UNARYOP_MACRO(atanh
SimpleFad< ValueT > cos(const SimpleFad< ValueT > &a)
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 DivisionOp
SimpleFad< ValueT > cosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
KOKKOS_INLINE_FUNCTION Expr< AbsOp< Expr< T > > > abs(const Expr< T > &expr)
KOKKOS_INLINE_FUNCTION Expr< FAbsOp< Expr< T > > > fabs(const Expr< T > &expr)
expr atanh(expr.val())) FAD_UNARYOP_MACRO(abs
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)
expr expr expr bar bar expr expr expr Log10Op
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