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 SACADO_INLINE_FUNCTION \
80 explicit Expr(const ExprT& expr_) : expr(expr_) {} \
82 SACADO_INLINE_FUNCTION \
83 int size() const { return expr.size(); } \
86 SACADO_INLINE_FUNCTION \
87 bool isActive() const { return expr.template isActive<Arg>(); } \
89 SACADO_INLINE_FUNCTION \
90 bool isActive2(int j) const { return expr.isActive2(j); } \
92 SACADO_INLINE_FUNCTION \
93 bool updateValue() const { return expr.updateValue(); } \
95 SACADO_INLINE_FUNCTION \
96 void cache() const {} \
98 SACADO_INLINE_FUNCTION \
99 value_type val() const { \
103 SACADO_INLINE_FUNCTION \
104 void computePartials(const value_type& bar, \
105 value_type partials[]) const { \
106 expr.computePartials(ADJOINT, partials); \
109 SACADO_INLINE_FUNCTION \
110 void getTangents(int i, value_type dots[]) const { \
111 expr.getTangents(i, dots); } \
114 SACADO_INLINE_FUNCTION \
115 const value_type& getTangent(int i) const { \
116 return expr.template getTangent<Arg>(i); \
119 SACADO_INLINE_FUNCTION \
120 bool isLinear() const { \
124 SACADO_INLINE_FUNCTION \
125 bool hasFastAccess() const { \
126 return expr.hasFastAccess(); \
129 SACADO_INLINE_FUNCTION \
130 const value_type dx(int i) const { \
134 SACADO_INLINE_FUNCTION \
135 const value_type fastAccessDx(int i) const { \
136 return FASTACCESSDX; \
139 SACADO_INLINE_FUNCTION \
140 const value_type* getDx(int j) const { \
141 return expr.getDx(j); \
144 SACADO_INLINE_FUNCTION \
145 int numActiveArgs() const { \
146 return expr.numActiveArgs(); \
149 SACADO_INLINE_FUNCTION \
150 void computeActivePartials(const value_type& bar, \
151 value_type *partials) const { \
152 expr.computePartials(ADJOINT, partials); \
160 template <typename T> \
161 SACADO_INLINE_FUNCTION \
162 Expr< OP< Expr<T> > > \
163 OPNAME (const Expr<T>& expr) \
165 typedef OP< Expr<T> > expr_t; \
167 return Expr<expr_t>(expr); \
178 expr.fastAccessDx(
i))
185 -expr.fastAccessDx(
i))
192 std::exp(expr.val())*expr.fastAccessDx(
i))
198 expr.dx(
i)/expr.val(),
199 expr.fastAccessDx(
i)/expr.val())
206 expr.fastAccessDx(
i) / (
std::log(value_type(10))*expr.val()))
209 std::sqrt(expr.
val()),
210 value_type(0.5)*
bar/std::sqrt(expr.val()),
212 expr.
dx(
i)/(value_type(2)* std::sqrt(expr.val())),
216 std::sqrt(expr.val()),
217 expr.val() == value_type(0.0) ? value_type(0.0) : value_type(value_type(0.5)*
bar/std::sqrt(expr.val())),
219 expr.val() == value_type(0.0) ? value_type(0.0) : value_type(expr.
dx(
i)/(value_type(2)*std::sqrt(expr.val()))),
220 expr.val() == value_type(0.0) ? value_type(0.0) : value_type(expr.
fastAccessDx(
i)/(value_type(2)*std::sqrt(expr.val()))))
223 std::cos(expr.val()),
224 -
bar*std::
sin(expr.val()),
226 -expr.
dx(
i)* std::
sin(expr.val()),
230 std::sin(expr.val()),
231 bar*std::cos(expr.val()),
233 expr.
dx(
i)* std::cos(expr.val()),
237 std::tan(expr.val()),
238 bar*(value_type(1.)+ std::tan(expr.val())*std::tan(expr.val())),
241 (value_type(1)+ std::tan(expr.val())* std::tan(expr.val())),
243 (value_type(1)+ std::tan(expr.val())* std::tan(expr.val())))
246 std::acos(expr.val()),
247 -
bar/std::sqrt(value_type(1.)-expr.val()*expr.val()),
249 -expr.
dx(
i)/ std::sqrt(value_type(1)-expr.val()*expr.val()),
251 std::sqrt(value_type(1)-expr.val()*expr.val()))
254 std::asin(expr.val()),
255 bar/std::sqrt(value_type(1.)-expr.val()*expr.val()),
257 expr.
dx(
i)/ std::sqrt(value_type(1)-expr.val()*expr.val()),
259 std::sqrt(value_type(1)-expr.val()*expr.val()))
262 std::atan(expr.val()),
263 bar/(value_type(1.)+expr.val()*expr.val()),
265 expr.
dx(
i)/(value_type(1)+expr.val()*expr.val()),
269 std::cosh(expr.val()),
272 expr.
dx(
i)* std::
sinh(expr.val()),
276 std::sinh(expr.val()),
277 bar*std::cosh(expr.val()),
279 expr.
dx(
i)* std::cosh(expr.val()),
283 std::tanh(expr.val()),
284 bar*(value_type(1)-std::tanh(expr.val())*std::tanh(expr.val())),
286 expr.
dx(
i)*(value_type(1)-std::tanh(expr.val())*std::tanh(expr.val())),
287 expr.
fastAccessDx(
i)*(value_type(1)-std::tanh(expr.val())*std::tanh(expr.val())))
290 std::acosh(expr.val()),
291 bar/std::sqrt((expr.val()-value_type(1.)) *
292 (expr.val()+value_type(1.))),
294 expr.
dx(
i)/ std::sqrt((expr.val()-value_type(1)) *
295 (expr.val()+value_type(1))),
297 (expr.val()+value_type(1))))
300 std::asinh(expr.val()),
301 bar/std::sqrt(value_type(1.)+expr.val()*expr.val()),
303 expr.
dx(
i)/ std::sqrt(value_type(1)+expr.val()*expr.val()),
305 expr.val()*expr.val()))
308 std::atanh(expr.val()),
309 bar/(value_type(1.)-expr.val()*expr.val()),
311 expr.
dx(
i)/(value_type(1)-expr.val()*expr.val()),
313 expr.val()*expr.val()))
316 std::abs(expr.val()),
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)),
325 std::fabs(expr.val()),
326 (expr.val() >= value_type(0.)) ? bar : value_type(-bar),
328 expr.val() >= 0 ? value_type(+expr.
dx(i)) :
329 value_type(-expr.
dx(i)),
334 std::cbrt(expr.val()),
335 bar/(value_type(3)*std::cbrt(expr.val()*expr.val())),
337 expr.
dx(i)/(value_type(3)*std::cbrt(expr.val()*expr.val())),
338 expr.
fastAccessDx(i)/(value_type(3)*std::cbrt(expr.val()*expr.val())))
340 #undef FAD_UNARYOP_MACRO
342 #define FAD_BINARYOP_MACRO( \
343 OPNAME,OP,VALUE,LADJOINT,RADJOINT, \
344 LINEAR,CONST_LINEAR_1, CONST_LINEAR_2, \
345 LINEAR_2,CONST_LINEAR_1_2, CONST_LINEAR_2_2, \
346 DX,FASTACCESSDX,CONST_DX_1,CONST_DX_2, \
347 CONST_FASTACCESSDX_1,CONST_FASTACCESSDX_2) \
351 template <typename ExprT1, typename ExprT2> \
354 template <typename ExprT1, typename ExprT2> \
355 class Expr< OP<ExprT1,ExprT2> > { \
359 typedef typename ExprT1::value_type value_type_1; \
360 typedef typename ExprT2::value_type value_type_2; \
361 typedef typename Sacado::Promote<value_type_1, \
362 value_type_2>::type value_type; \
364 typedef typename ExprT1::scalar_type scalar_type_1; \
365 typedef typename ExprT2::scalar_type scalar_type_2; \
366 typedef typename Sacado::Promote<scalar_type_1, \
367 scalar_type_2>::type scalar_type; \
369 typedef typename ExprT1::base_expr_type base_expr_type_1; \
370 typedef typename ExprT2::base_expr_type base_expr_type_2; \
371 typedef typename Sacado::Promote<base_expr_type_1, \
372 base_expr_type_2>::type base_expr_type; \
374 static const int num_args1 = ExprT1::num_args; \
375 static const int num_args2 = ExprT2::num_args; \
376 static const int num_args = num_args1 + num_args2; \
378 static const bool is_linear = LINEAR_2; \
380 SACADO_INLINE_FUNCTION \
381 Expr(const ExprT1& expr1_, const ExprT2& expr2_) : \
382 expr1(expr1_), expr2(expr2_) {} \
384 SACADO_INLINE_FUNCTION \
386 int sz1 = expr1.size(), sz2 = expr2.size(); \
387 return sz1 > sz2 ? sz1 : sz2; \
391 SACADO_INLINE_FUNCTION \
392 bool isActive() const { \
393 if (Arg < num_args1) \
394 return expr1.template isActive<Arg>(); \
396 return expr2.template isActive<Arg-num_args1>(); \
399 SACADO_INLINE_FUNCTION \
400 bool isActive2(int j) const { \
402 return expr1.isActive2(j); \
404 return expr2.isActive2(j); \
407 SACADO_INLINE_FUNCTION \
408 bool updateValue() const { \
409 return expr1.updateValue() && expr2.updateValue(); \
412 SACADO_INLINE_FUNCTION \
413 void cache() const {} \
415 SACADO_INLINE_FUNCTION \
416 value_type val() const { \
420 SACADO_INLINE_FUNCTION \
421 void computePartials(const value_type& bar, \
422 value_type partials[]) const { \
424 expr1.computePartials(LADJOINT, partials); \
426 expr2.computePartials(RADJOINT, partials+num_args1); \
429 SACADO_INLINE_FUNCTION \
430 void getTangents(int i, value_type dots[]) const { \
431 expr1.getTangents(i, dots); \
432 expr2.getTangents(i, dots+num_args1); \
436 SACADO_INLINE_FUNCTION \
437 const value_type& getTangent(int i) const { \
438 if (Arg < num_args1) \
439 return expr1.template getTangent<Arg>(i); \
441 return expr2.template getTangent<Arg-num_args1>(i); \
444 SACADO_INLINE_FUNCTION \
445 bool isLinear() const { \
449 SACADO_INLINE_FUNCTION \
450 bool hasFastAccess() const { \
451 return expr1.hasFastAccess() && expr2.hasFastAccess(); \
454 SACADO_INLINE_FUNCTION \
455 const value_type dx(int i) const { \
459 SACADO_INLINE_FUNCTION \
460 const value_type fastAccessDx(int i) const { \
461 return FASTACCESSDX; \
464 SACADO_INLINE_FUNCTION \
465 const value_type* getDx(int j) const { \
467 return expr1.getDx(j); \
469 return expr2.getDx(j-num_args1); \
472 SACADO_INLINE_FUNCTION \
473 int numActiveArgs() const { \
474 return expr1.numActiveArgs() + expr2.numActiveArgs(); \
477 SACADO_INLINE_FUNCTION \
478 void computeActivePartials(const value_type& bar, \
479 value_type *partials) const { \
480 if (expr1.numActiveArgs() > 0) \
481 expr1.computePartials(LADJOINT, partials); \
482 if (expr2.numActiveArgs() > 0) \
483 expr2.computePartials(RADJOINT, partials+expr2.numActiveArgs()); \
487 typename ExprConstRef<ExprT1>::type expr1; \
488 typename ExprConstRef<ExprT2>::type expr2; \
492 template <typename ExprT1, typename T2> \
493 class Expr< OP<ExprT1, ConstExpr<T2> > > { \
497 typedef ConstExpr<T2> ExprT2; \
498 typedef typename ExprT1::value_type value_type_1; \
499 typedef typename ExprT2::value_type value_type_2; \
500 typedef typename Sacado::Promote<value_type_1, \
501 value_type_2>::type value_type; \
503 typedef typename ExprT1::scalar_type scalar_type_1; \
504 typedef typename ExprT2::scalar_type scalar_type_2; \
505 typedef typename Sacado::Promote<scalar_type_1, \
506 scalar_type_2>::type scalar_type; \
508 typedef typename ExprT1::base_expr_type base_expr_type_1; \
509 typedef typename ExprT2::base_expr_type base_expr_type_2; \
510 typedef typename Sacado::Promote<base_expr_type_1, \
511 base_expr_type_2>::type base_expr_type; \
513 static const int num_args = ExprT1::num_args; \
515 static const bool is_linear = CONST_LINEAR_2_2; \
517 SACADO_INLINE_FUNCTION \
518 Expr(const ExprT1& expr1_, const ExprT2& expr2_) : \
519 expr1(expr1_), expr2(expr2_) {} \
521 SACADO_INLINE_FUNCTION \
523 return expr1.size(); \
527 SACADO_INLINE_FUNCTION \
528 bool isActive() const { \
529 return expr1.template isActive<Arg>(); \
532 SACADO_INLINE_FUNCTION \
533 bool isActive2(int j) const { return expr1.isActive2(j); } \
535 SACADO_INLINE_FUNCTION \
536 bool updateValue() const { \
537 return expr1.updateValue(); \
540 SACADO_INLINE_FUNCTION \
541 void cache() const {} \
543 SACADO_INLINE_FUNCTION \
544 value_type val() const { \
548 SACADO_INLINE_FUNCTION \
549 void computePartials(const value_type& bar, \
550 value_type partials[]) const { \
551 expr1.computePartials(LADJOINT, partials); \
554 SACADO_INLINE_FUNCTION \
555 void getTangents(int i, value_type dots[]) const { \
556 expr1.getTangents(i, dots); \
560 SACADO_INLINE_FUNCTION \
561 const value_type& getTangent(int i) const { \
562 return expr1.template getTangent<Arg>(i); \
565 SACADO_INLINE_FUNCTION \
566 bool isLinear() const { \
567 return CONST_LINEAR_2; \
570 SACADO_INLINE_FUNCTION \
571 bool hasFastAccess() const { \
572 return expr1.hasFastAccess(); \
575 SACADO_INLINE_FUNCTION \
576 const value_type dx(int i) const { \
580 SACADO_INLINE_FUNCTION \
581 const value_type fastAccessDx(int i) const { \
582 return CONST_FASTACCESSDX_2; \
585 SACADO_INLINE_FUNCTION \
586 const value_type* getDx(int j) const { \
587 return expr1.getDx(j); \
590 SACADO_INLINE_FUNCTION \
591 int numActiveArgs() const { \
592 return expr1.numActiveArgs(); \
595 SACADO_INLINE_FUNCTION \
596 void computeActivePartials(const value_type& bar, \
597 value_type *partials) const { \
598 expr1.computePartials(LADJOINT, partials); \
603 typename ExprConstRef<ExprT1>::type expr1; \
604 typename ExprConstRef<ExprT2>::type expr2; \
608 template <typename T1, typename ExprT2> \
609 class Expr< OP<ConstExpr<T1>,ExprT2> > { \
613 typedef ConstExpr<T1> ExprT1; \
614 typedef typename ExprT1::value_type value_type_1; \
615 typedef typename ExprT2::value_type value_type_2; \
616 typedef typename Sacado::Promote<value_type_1, \
617 value_type_2>::type value_type; \
619 typedef typename ExprT1::scalar_type scalar_type_1; \
620 typedef typename ExprT2::scalar_type scalar_type_2; \
621 typedef typename Sacado::Promote<scalar_type_1, \
622 scalar_type_2>::type scalar_type; \
624 typedef typename ExprT1::base_expr_type base_expr_type_1; \
625 typedef typename ExprT2::base_expr_type base_expr_type_2; \
626 typedef typename Sacado::Promote<base_expr_type_1, \
627 base_expr_type_2>::type base_expr_type; \
629 static const int num_args = ExprT2::num_args; \
631 static const bool is_linear = CONST_LINEAR_1_2; \
633 SACADO_INLINE_FUNCTION \
634 Expr(const ExprT1& expr1_, const ExprT2& expr2_) : \
635 expr1(expr1_), expr2(expr2_) {} \
637 SACADO_INLINE_FUNCTION \
639 return expr2.size(); \
643 SACADO_INLINE_FUNCTION \
644 bool isActive() const { \
645 return expr2.template isActive<Arg>(); \
648 SACADO_INLINE_FUNCTION \
649 bool isActive2(int j) const { return expr2.isActive2(j); } \
651 SACADO_INLINE_FUNCTION \
652 bool updateValue() const { \
653 return expr2.updateValue(); \
656 SACADO_INLINE_FUNCTION \
657 void cache() const {} \
659 SACADO_INLINE_FUNCTION \
660 value_type val() const { \
664 SACADO_INLINE_FUNCTION \
665 void computePartials(const value_type& bar, \
666 value_type partials[]) const { \
667 expr2.computePartials(RADJOINT, partials); \
670 SACADO_INLINE_FUNCTION \
671 void getTangents(int i, value_type dots[]) const { \
672 expr2.getTangents(i, dots); \
676 SACADO_INLINE_FUNCTION \
677 const value_type& getTangent(int i) const { \
678 return expr2.template getTangent<Arg>(i); \
681 SACADO_INLINE_FUNCTION \
682 bool isLinear() const { \
683 return CONST_LINEAR_1; \
686 SACADO_INLINE_FUNCTION \
687 bool hasFastAccess() const { \
688 return expr2.hasFastAccess(); \
691 SACADO_INLINE_FUNCTION \
692 const value_type dx(int i) const { \
696 SACADO_INLINE_FUNCTION \
697 const value_type fastAccessDx(int i) const { \
698 return CONST_FASTACCESSDX_1; \
701 SACADO_INLINE_FUNCTION \
702 const value_type* getDx(int j) const { \
703 return expr2.getDx(j); \
706 SACADO_INLINE_FUNCTION \
707 int numActiveArgs() const { \
708 return expr2.numActiveArgs(); \
711 SACADO_INLINE_FUNCTION \
712 void computeActivePartials(const value_type& bar, \
713 value_type *partials) const { \
714 expr2.computePartials(RADJOINT, partials); \
718 typename ExprConstRef<ExprT1>::type expr1; \
719 typename ExprConstRef<ExprT2>::type expr2; \
723 template <typename T1, typename T2> \
724 SACADO_INLINE_FUNCTION \
725 SACADO_FAD_OP_ENABLE_EXPR_EXPR(OP) \
726 OPNAME (const T1& expr1, const T2& expr2) \
728 typedef OP< T1, T2 > expr_t; \
730 return Expr<expr_t>(expr1, expr2); \
733 template <typename T> \
734 SACADO_INLINE_FUNCTION \
735 Expr< OP< Expr<T>, Expr<T> > > \
736 OPNAME (const Expr<T>& expr1, const Expr<T>& expr2) \
738 typedef OP< Expr<T>, Expr<T> > expr_t; \
740 return Expr<expr_t>(expr1, expr2); \
743 template <typename T> \
744 SACADO_INLINE_FUNCTION \
745 Expr< OP< ConstExpr<typename Expr<T>::value_type>, \
747 OPNAME (const typename Expr<T>::value_type& c, \
748 const Expr<T>& expr) \
750 typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
751 typedef OP< ConstT, Expr<T> > expr_t; \
753 return Expr<expr_t>(ConstT(c), expr); \
756 template <typename T> \
757 SACADO_INLINE_FUNCTION \
759 ConstExpr<typename Expr<T>::value_type> > > \
760 OPNAME (const Expr<T>& expr, \
761 const typename Expr<T>::value_type& c) \
763 typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
764 typedef OP< Expr<T>, ConstT > expr_t; \
766 return Expr<expr_t>(expr, ConstT(c)); \
769 template <typename T> \
770 SACADO_INLINE_FUNCTION \
771 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(OP) \
772 OPNAME (const typename Expr<T>::scalar_type& c, \
773 const Expr<T>& expr) \
775 typedef ConstExpr<typename Expr<T>::scalar_type> ConstT; \
776 typedef OP< ConstT, Expr<T> > expr_t; \
778 return Expr<expr_t>(ConstT(c), expr); \
781 template <typename T> \
782 SACADO_INLINE_FUNCTION \
783 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(OP) \
784 OPNAME (const Expr<T>& expr, \
785 const typename Expr<T>::scalar_type& c) \
787 typedef ConstExpr<typename Expr<T>::scalar_type> ConstT; \
788 typedef OP< Expr<T>, ConstT > expr_t; \
790 return Expr<expr_t>(expr, ConstT(c)); \
798 expr1.val() + expr2.val(),
801 expr1.isLinear() && expr2.isLinear(),
804 ExprT1::is_linear && ExprT2::is_linear,
807 expr1.dx(i) + expr2.dx(i),
808 expr1.fastAccessDx(i) + expr2.fastAccessDx(i),
811 expr2.fastAccessDx(i),
812 expr1.fastAccessDx(i))
815 expr1.val() - expr2.val(),
818 expr1.isLinear() && expr2.isLinear(),
821 ExprT1::is_linear && ExprT2::is_linear,
824 expr1.dx(i) - expr2.dx(i),
825 expr1.fastAccessDx(i) - expr2.fastAccessDx(i),
828 -expr2.fastAccessDx(i),
829 expr1.fastAccessDx(i))
832 expr1.val() * expr2.val(),
841 expr1.val()*expr2.dx(i) + expr1.dx(i)*expr2.val(),
842 expr1.val()*expr2.fastAccessDx(i) +
843 expr1.fastAccessDx(i)*expr2.val(),
844 expr1.val()*expr2.dx(i),
845 expr1.dx(i)*expr2.val(),
846 expr1.val()*expr2.fastAccessDx(i),
847 expr1.fastAccessDx(i)*expr2.val())
850 expr1.val() / expr2.val(),
852 -bar*expr1.val()/(expr2.val()*expr2.val()),
859 (expr1.dx(i)*expr2.val() - expr2.dx(i)*expr1.val()) /
860 (expr2.val()*expr2.val()),
861 (expr1.fastAccessDx(i)*expr2.val() -
862 expr2.fastAccessDx(i)*expr1.val()) /
863 (expr2.val()*expr2.val()),
864 -expr2.dx(i)*expr1.val() / (expr2.val()*expr2.val()),
865 expr1.dx(i)/expr2.val(),
866 -expr2.fastAccessDx(i)*expr1.val() / (expr2.val()*expr2.val()),
867 expr1.fastAccessDx(i)/expr2.val())
872 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
874 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
881 (expr2.val()*expr1.dx(i) - expr1.val()*expr2.dx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
882 (expr2.val()*expr1.fastAccessDx(i) - expr1.val()*expr2.fastAccessDx(i))/
883 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
884 (-expr1.val()*expr2.dx(i)) / (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
885 (expr2.val()*expr1.dx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
886 (-expr1.val()*expr2.fastAccessDx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
887 (expr2.val()*expr1.fastAccessDx(i))/ (expr1.val()*expr1.val() + expr2.val()*expr2.val()))
890 std::pow(expr1.val(), expr2.val()),
891 expr2.size() == 0 && expr2.val() == value_type(1) ? bar : expr1.val() == value_type(0) ? value_type(0) : value_type(bar*std::pow(expr1.val(),expr2.val())*expr2.val()/expr1.val()),
892 expr1.val() == value_type(0) ? value_type(0) : value_type(bar*std::pow(expr1.val(),expr2.val())*std::
log(expr1.val())),
899 expr1.val() == value_type(0) ? value_type(0) : value_type((expr2.
dx(i)*std::
log(expr1.val())+expr2.val()*expr1.
dx(i)/expr1.val())*std::pow(expr1.val(),expr2.val())),
900 expr1.val() == value_type(0) ? value_type(0) : value_type((expr2.
fastAccessDx(i)*std::
log(expr1.val())+expr2.val()*expr1.
fastAccessDx(i)/expr1.val())*std::pow(expr1.val(),expr2.val())),
901 expr1.val() == value_type(0) ? value_type(0) : value_type(expr2.
dx(i)*std::
log(expr1.val())*std::pow(expr1.val(),expr2.val())),
902 expr2.val() == value_type(1) ? expr1.
dx(i) : expr1.val() == value_type(0) ? value_type(0) : value_type(expr2.val()*expr1.
dx(i)/expr1.val()*std::pow(expr1.val(),expr2.val())),
903 expr1.val() == value_type(0) ? value_type(0) : value_type(expr2.
fastAccessDx(i)*std::
log(expr1.val())*std::pow(expr1.val(),expr2.val())),
904 expr2.val() == value_type(1) ? expr1.
fastAccessDx(i) : expr1.val() == value_type(0) ? value_type(0) : value_type(expr2.val()*expr1.
fastAccessDx(i)/expr1.val()*std::pow(expr1.val(),expr2.val())))
907 expr1.val() >= expr2.val() ? expr1.val() : expr2.val(),
908 expr1.val() >= expr2.val() ? bar : value_type(0.),
909 expr2.val() > expr1.val() ? bar : value_type(0.),
910 expr1.isLinear() && expr2.isLinear(),
913 ExprT1::is_linear && ExprT2::is_linear,
916 expr1.val() >= expr2.val() ? expr1.
dx(i) : expr2.
dx(i),
919 expr1.val() >= expr2.val() ? value_type(0) : expr2.
dx(i),
920 expr1.val() >= expr2.val() ? expr1.
dx(i) : value_type(0),
921 expr1.val() >= expr2.val() ? value_type(0) :
927 expr1.val() <= expr2.val() ? expr1.val() : expr2.val(),
928 expr1.val() <= expr2.val() ? bar : value_type(0.),
929 expr2.val() < expr1.val() ? bar : value_type(0.),
930 expr1.isLinear() && expr2.isLinear(),
933 ExprT1::is_linear && ExprT2::is_linear,
936 expr1.val() <= expr2.val() ? expr1.
dx(i) : expr2.
dx(i),
939 expr1.val() <= expr2.val() ? value_type(0) : expr2.
dx(i),
940 expr1.val() <= expr2.val() ? expr1.
dx(i) : value_type(0),
941 expr1.val() <= expr2.val() ? value_type(0) :
946 #undef FAD_BINARYOP_MACRO
950 #define FAD_RELOP_MACRO(OP) \
953 template <typename ExprT1, typename ExprT2> \
954 SACADO_INLINE_FUNCTION \
956 operator OP (const Expr<ExprT1>& expr1, \
957 const Expr<ExprT2>& expr2) \
959 return expr1.val() OP expr2.val(); \
962 template <typename ExprT2> \
963 SACADO_INLINE_FUNCTION \
965 operator OP (const typename Expr<ExprT2>::value_type& a, \
966 const Expr<ExprT2>& expr2) \
968 return a OP expr2.val(); \
971 template <typename ExprT1> \
972 SACADO_INLINE_FUNCTION \
974 operator OP (const Expr<ExprT1>& expr1, \
975 const typename Expr<ExprT1>::value_type& b) \
977 return expr1.val() OP b; \
993 #undef FAD_RELOP_MACRO
999 template <
typename ExprT>
1003 return ! expr.val();
1015 template <
typename ExprT>
1018 bool is_zero = (x.val() == 0.0);
1019 for (
int i=0; i<x.size(); i++)
1020 is_zero = is_zero && (x.dx(i) == 0.0);
1028 #define FAD_BOOL_MACRO(OP) \
1029 namespace Sacado { \
1030 namespace ELRFad { \
1031 template <typename ExprT1, typename ExprT2> \
1032 SACADO_INLINE_FUNCTION \
1034 operator OP (const Expr<ExprT1>& expr1, \
1035 const Expr<ExprT2>& expr2) \
1037 return toBool(expr1) OP toBool(expr2); \
1040 template <typename ExprT2> \
1041 SACADO_INLINE_FUNCTION \
1043 operator OP (const typename Expr<ExprT2>::value_type& a, \
1044 const Expr<ExprT2>& expr2) \
1046 return a OP toBool(expr2); \
1049 template <typename ExprT1> \
1050 SACADO_INLINE_FUNCTION \
1052 operator OP (const Expr<ExprT1>& expr1, \
1053 const typename Expr<ExprT1>::value_type& b) \
1055 return toBool(expr1) OP b; \
1063 #undef FAD_BOOL_MACRO
1071 template <
typename ExprT>
1072 std::ostream& operator << (std::ostream& os, const Expr<ExprT>&
x) {
1073 os <<
x.val() <<
" [";
1075 for (
int i=0; i<
x.size(); i++) {
1076 os <<
" " <<
x.dx(i);
1087 #endif // SACADO_FAD_OPS_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)
#define FAD_BOOL_MACRO(OP)
SACADO_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
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
#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
atan2(expr1.val(), expr2.val())
#define FAD_RELOP_MACRO(OP)
Wrapper for a generic expression template.
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
SACADO_INLINE_FUNCTION T safe_sqrt(const T &x)
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 SACADO_INLINE_FUNCTION
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