32#ifndef SACADO_FAD_SIMPLEFADOPS_HPP
33#define SACADO_FAD_SIMPLEFADOPS_HPP
42 template <
typename ValueT>
48 template <
typename ValueT>
54 template <
typename ValueT>
57 ValueT t1 = std::exp(
a.val());
61 template <
typename ValueT>
67 template <
typename ValueT>
71 1.0/(std::log(10.0)*
a.val()));
74 template <
typename ValueT>
77 ValueT t1 = std::sqrt(
a.val());
78 ValueT t2 = 1.0/(2.0*t1);
82 template <
typename ValueT>
85 ValueT t1 = std::cbrt(
a.val());
86 ValueT t2 = 1.0/(3.0*t1*t1);
90 template <
typename ValueT>
96 template <
typename ValueT>
102 template <
typename ValueT>
106 ValueT t2 = 1.0 + t1*t1;
110 template <
typename ValueT>
114 -1.0/std::sqrt(1.0 -
a.val()*
a.val()));
117 template <
typename ValueT>
121 1.0/std::sqrt(1.0 -
a.val()*
a.val()));
124 template <
typename ValueT>
128 1.0/(1.0 +
a.val()*
a.val()));
131 template <
typename ValueT>
137 template <
typename ValueT>
143 template <
typename ValueT>
150 template <
typename ValueT>
154 1.0/std::sqrt(
a.val()*
a.val()-1.0));
157 template <
typename ValueT>
161 1.0/std::sqrt(1.0 +
a.val()*
a.val()));
164 template <
typename ValueT>
168 1.0 /(1.0 -
a.val()*
a.val()));
171 template <
typename ValueT>
180 template <
typename ValueT>
189 template <
typename ValueT>
193 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
196 for (
int i=0; i<sz; i++)
198 else if (
a.hasFastAccess())
199 for (
int i=0; i<sz; i++)
200 c.fastAccessDx(i) =
a.fastAccessDx(i);
202 for (
int i=0; i<sz; i++)
208 template <
typename ValueT>
215 template <
typename ValueT>
222 template <
typename ValueT>
226 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
229 for (
int i=0; i<sz; i++)
231 else if (
a.hasFastAccess())
232 for (
int i=0; i<sz; i++)
233 c.fastAccessDx(i) =
a.fastAccessDx(i);
235 for (
int i=0; i<sz; i++)
241 template <
typename ValueT>
248 template <
typename ValueT>
255 template <
typename ValueT>
259 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
262 for (
int i=0; i<sz; i++)
265 else if (
a.hasFastAccess())
266 for (
int i=0; i<sz; i++)
267 c.fastAccessDx(i) =
a.fastAccessDx(i)*b.
val();
269 for (
int i=0; i<sz; i++)
275 template <
typename ValueT>
282 template <
typename ValueT>
289 template <
typename ValueT>
293 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
296 ValueT t = b.
val()*b.
val();
297 for (
int i=0; i<sz; i++)
301 else if (
a.hasFastAccess())
302 for (
int i=0; i<sz; i++)
303 c.fastAccessDx(i) =
a.fastAccessDx(i)/b.
val();
305 ValueT t = -
a.val()/(b.
val()*b.
val());
306 for (
int i=0; i<sz; i++)
313 template <
typename ValueT>
320 template <
typename ValueT>
327 template <
typename ValueT>
331 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
336 ValueT t1 =
c.val()*b.
val()/
a.val();
337 ValueT t2 =
c.val()*std::log(
a.val());
338 for (
int i=0; i<sz; i++)
343 else if (
a.hasFastAccess()) {
345 for (
int i=0; i<sz; i++)
346 c.fastAccessDx(i) =
a.fastAccessDx(i);
349 ValueT t1 =
c.val()*b.
val()/
a.val();
350 for (
int i=0; i<sz; i++)
351 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
356 ValueT t2 =
c.val()*std::log(
a.val());
357 for (
int i=0; i<sz; i++)
365 template <
typename ValueT>
377 template <
typename ValueT>
391 template <
typename ValueT>
395 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
398 ValueT t =
a.val()*
a.val() + b.
val()*b.
val();
399 ValueT t1 = b.
val()/t;
400 ValueT t2 =
a.val()/t;
401 for (
int i=0; i<sz; i++)
405 else if (
a.hasFastAccess()) {
406 ValueT t1 = b.
val()/(
a.val()*
a.val() + b.
val()*b.
val());
407 for (
int i=0; i<sz; i++)
408 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
411 ValueT t2 = -
a.val()/(
a.val()*
a.val() + b.
val()*b.
val());
412 for (
int i=0; i<sz; i++)
419 template <
typename ValueT>
427 template <
typename ValueT>
432 b/(
a.val()*
a.val() + b*b));
435 template <
typename ValueT>
439 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
442 if (
a.val() >= b.
val())
443 for (
int i=0; i<sz; i++)
444 c.fastAccessDx(i) =
a.fastAccessDx(i);
446 for (
int i=0; i<sz; i++)
449 else if (
a.hasFastAccess()) {
450 if (
a.val() >= b.
val())
451 for (
int i=0; i<sz; i++)
452 c.fastAccessDx(i) =
a.fastAccessDx(i);
454 for (
int i=0; i<sz; i++)
455 c.fastAccessDx(i) = 0.0;
458 if (
a.val() >= b.
val())
459 for (
int i=0; i<sz; i++)
460 c.fastAccessDx(i) = 0.0;
462 for (
int i=0; i<sz; i++)
469 template <
typename ValueT>
475 for (
int i=0; i<
c.size(); i++)
476 c.fastAccessDx(i) = 0.0;
478 for (
int i=0; i<
c.size(); i++)
484 template <
typename ValueT>
490 for (
int i=0; i<
c.size(); i++)
491 c.fastAccessDx(i) =
a.fastAccessDx(i);
493 for (
int i=0; i<
c.size(); i++)
494 c.fastAccessDx(i) = 0.0;
499 template <
typename ValueT>
503 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
506 if (
a.val() <= b.
val())
507 for (
int i=0; i<sz; i++)
508 c.fastAccessDx(i) =
a.fastAccessDx(i);
510 for (
int i=0; i<sz; i++)
513 else if (
a.hasFastAccess()) {
514 if (
a.val() <= b.
val())
515 for (
int i=0; i<sz; i++)
516 c.fastAccessDx(i) =
a.fastAccessDx(i);
518 for (
int i=0; i<sz; i++)
519 c.fastAccessDx(i) = 0.0;
522 if (
a.val() <= b.
val())
523 for (
int i=0; i<sz; i++)
524 c.fastAccessDx(i) = 0.0;
526 for (
int i=0; i<sz; i++)
533 template <
typename ValueT>
539 for (
int i=0; i<
c.size(); i++)
540 c.fastAccessDx(i) = 0.0;
542 for (
int i=0; i<
c.size(); i++)
548 template <
typename ValueT>
554 for (
int i=0; i<
c.size(); i++)
555 c.fastAccessDx(i) =
a.fastAccessDx(i);
557 for (
int i=0; i<
c.size(); i++)
558 c.fastAccessDx(i) = 0.0;
569#define FAD_RELOP_MACRO(OP) \
572 template <typename ValueT> \
574 operator OP (const SimpleFad<ValueT>& a, \
575 const SimpleFad<ValueT>& b) \
577 return a.val() OP b.val(); \
580 template <typename ValueT> \
582 operator OP (const ValueT& a, \
583 const SimpleFad<ValueT>& b) \
585 return a OP b.val(); \
588 template <typename ValueT> \
590 operator OP (const SimpleFad<ValueT>& a, \
593 return a.val() OP b; \
609#undef FAD_RELOP_MACRO
615 template <
typename ValueT>
630 template <
typename T>
632 bool is_zero = (x.
val() == 0.0);
633 for (
int i=0; i<x.
size(); i++)
634 is_zero = is_zero && (x.
dx(i) == 0.0);
642#define FAD_BOOL_MACRO(OP) \
645 template <typename T1, typename T2> \
647 operator OP (const SimpleFad<T1>& expr1, \
648 const SimpleFad<T2>& expr2) \
650 return toBool(expr1) OP toBool(expr2); \
653 template <typename T2> \
655 operator OP (const typename SimpleFad<T2>::value_type& a, \
656 const SimpleFad<T2>& expr2) \
658 return a OP toBool(expr2); \
661 template <typename T1> \
663 operator OP (const SimpleFad<T1>& expr1, \
664 const typename SimpleFad<T1>::value_type& b) \
666 return toBool(expr1) OP b; \
682 template <
typename ValueT>
685 os << x.
val() <<
" [";
687 for (
int i=0; i< x.
size(); i++) {
688 os <<
" " << x.
dx(i);
#define FAD_RELOP_MACRO(OP)
#define FAD_BOOL_MACRO(OP)
#define FAD_RELOP_MACRO(OP)
#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 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
SACADO_INLINE_FUNCTION const U * dx() const
Returns derivative array.
SACADO_INLINE_FUNCTION int size() const
Returns number of derivative components.
SACADO_INLINE_FUNCTION U & fastAccessDx(int i)
Returns derivative component i without bounds checking.
SACADO_INLINE_FUNCTION const T & val() const
Returns value.
SACADO_INLINE_FUNCTION bool hasFastAccess() const
Returns true if derivative array is not empty.
Forward-mode AD class using dynamic memory allocation but no expression templates.
GeneralFadType::value_type value_type
Typename of values.
Namespace for forward-mode AD classes.
SimpleFad< ValueT > operator-(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > fabs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan2(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > cosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > acosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > log(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > asinh(const SimpleFad< ValueT > &a)
std::ostream & operator<<(std::ostream &os, const Expr< ExprT > &x)
SimpleFad< ValueT > asin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sqrt(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator*(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > abs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator/(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
SACADO_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
SimpleFad< ValueT > cbrt(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > exp(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sinh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator+(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atanh(const SimpleFad< ValueT > &a)
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)
SACADO_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)
Taylor< T > max(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Taylor< T > min(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
ACosExprType< T >::expr_type acos(const Expr< T > &expr)
PowExprType< Expr< T1 >, Expr< T2 > >::expr_type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
Log10ExprType< T >::expr_type log10(const Expr< T > &expr)
ATanExprType< T >::expr_type atan(const Expr< T > &expr)
TanhExprType< T >::expr_type tanh(const Expr< T > &expr)
TanExprType< T >::expr_type tan(const Expr< T > &expr)
ASinExprType< T >::expr_type asin(const Expr< T > &expr)