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#ifdef HAVE_SACADO_CXX11
83 template <
typename ValueT>
85 cbrt(
const SimpleFad<ValueT>&
a) {
86 ValueT t1 = std::cbrt(
a.val());
87 ValueT t2 = 1.0/(3.0*t1*t1);
88 return SimpleFad<ValueT>(
a, t1, t2);
92 template <
typename ValueT>
98 template <
typename ValueT>
104 template <
typename ValueT>
107 ValueT t1 = std::tan(
a.val());
108 ValueT t2 = 1.0 + t1*t1;
112 template <
typename ValueT>
116 -1.0/std::sqrt(1.0 -
a.val()*
a.val()));
119 template <
typename ValueT>
123 1.0/std::sqrt(1.0 -
a.val()*
a.val()));
126 template <
typename ValueT>
130 1.0/(1.0 +
a.val()*
a.val()));
133 template <
typename ValueT>
139 template <
typename ValueT>
145 template <
typename ValueT>
148 ValueT t = std::tanh(
a.val());
152 template <
typename ValueT>
156 1.0/std::sqrt(
a.val()*
a.val()-1.0));
159 template <
typename ValueT>
163 1.0/std::sqrt(1.0 +
a.val()*
a.val()));
166 template <
typename ValueT>
170 1.0 /(1.0 -
a.val()*
a.val()));
173 template <
typename ValueT>
182 template <
typename ValueT>
191 template <
typename ValueT>
195 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
198 for (
int i=0;
i<sz;
i++)
200 else if (
a.hasFastAccess())
201 for (
int i=0;
i<sz;
i++)
202 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
204 for (
int i=0;
i<sz;
i++)
210 template <
typename ValueT>
217 template <
typename ValueT>
224 template <
typename ValueT>
228 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
231 for (
int i=0;
i<sz;
i++)
233 else if (
a.hasFastAccess())
234 for (
int i=0;
i<sz;
i++)
235 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
237 for (
int i=0;
i<sz;
i++)
243 template <
typename ValueT>
250 template <
typename ValueT>
257 template <
typename ValueT>
261 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
264 for (
int i=0;
i<sz;
i++)
267 else if (
a.hasFastAccess())
268 for (
int i=0;
i<sz;
i++)
269 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*b.
val();
271 for (
int i=0;
i<sz;
i++)
277 template <
typename ValueT>
284 template <
typename ValueT>
291 template <
typename ValueT>
295 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
298 ValueT t = b.
val()*b.
val();
299 for (
int i=0;
i<sz;
i++)
303 else if (
a.hasFastAccess())
304 for (
int i=0;
i<sz;
i++)
305 c.fastAccessDx(
i) =
a.fastAccessDx(
i)/b.
val();
307 ValueT t = -
a.val()/(b.
val()*b.
val());
308 for (
int i=0;
i<sz;
i++)
315 template <
typename ValueT>
322 template <
typename ValueT>
329 template <
typename ValueT>
333 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
337 if (
a.val() != value_type(0)) {
338 ValueT t1 =
c.val()*b.
val()/
a.val();
339 ValueT t2 =
c.val()*std::log(
a.val());
340 for (
int i=0;
i<sz;
i++)
345 else if (
a.hasFastAccess()) {
346 if (b.
val() == value_type(1)) {
347 for (
int i=0;
i<sz;
i++)
348 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
350 else if (
a.val() != value_type(0)) {
351 ValueT t1 =
c.val()*b.
val()/
a.val();
352 for (
int i=0;
i<sz;
i++)
353 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*t1;
357 if (
a.val() != value_type(0)) {
358 ValueT t2 =
c.val()*std::log(
a.val());
359 for (
int i=0;
i<sz;
i++)
367 template <
typename ValueT>
372 ValueT t = std::pow(
a,b.
val());
373 if (
a != value_type(0))
379 template <
typename ValueT>
384 ValueT t = std::pow(
a.val(),b);
385 if (b == value_type(1))
387 else if (
a.val() != value_type(0))
393 template <
typename ValueT>
397 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
400 ValueT t =
a.val()*
a.val() + b.
val()*b.
val();
401 ValueT t1 = b.
val()/t;
402 ValueT t2 =
a.val()/t;
403 for (
int i=0;
i<sz;
i++)
407 else if (
a.hasFastAccess()) {
408 ValueT t1 = b.
val()/(
a.val()*
a.val() + b.
val()*b.
val());
409 for (
int i=0;
i<sz;
i++)
410 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*t1;
413 ValueT t2 = -
a.val()/(
a.val()*
a.val() + b.
val()*b.
val());
414 for (
int i=0;
i<sz;
i++)
421 template <
typename ValueT>
429 template <
typename ValueT>
434 b/(
a.val()*
a.val() + b*b));
437 template <
typename ValueT>
441 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
444 if (
a.val() >= b.
val())
445 for (
int i=0;
i<sz;
i++)
446 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
448 for (
int i=0;
i<sz;
i++)
451 else if (
a.hasFastAccess()) {
452 if (
a.val() >= b.
val())
453 for (
int i=0;
i<sz;
i++)
454 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
456 for (
int i=0;
i<sz;
i++)
457 c.fastAccessDx(
i) = 0.0;
460 if (
a.val() >= b.
val())
461 for (
int i=0;
i<sz;
i++)
462 c.fastAccessDx(
i) = 0.0;
464 for (
int i=0;
i<sz;
i++)
471 template <
typename ValueT>
477 for (
int i=0;
i<
c.size();
i++)
478 c.fastAccessDx(
i) = 0.0;
480 for (
int i=0;
i<
c.size();
i++)
486 template <
typename ValueT>
492 for (
int i=0;
i<
c.size();
i++)
493 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
495 for (
int i=0;
i<
c.size();
i++)
496 c.fastAccessDx(
i) = 0.0;
501 template <
typename ValueT>
505 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
508 if (
a.val() <= b.
val())
509 for (
int i=0;
i<sz;
i++)
510 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
512 for (
int i=0;
i<sz;
i++)
515 else if (
a.hasFastAccess()) {
516 if (
a.val() <= b.
val())
517 for (
int i=0;
i<sz;
i++)
518 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
520 for (
int i=0;
i<sz;
i++)
521 c.fastAccessDx(
i) = 0.0;
524 if (
a.val() <= b.
val())
525 for (
int i=0;
i<sz;
i++)
526 c.fastAccessDx(
i) = 0.0;
528 for (
int i=0;
i<sz;
i++)
535 template <
typename ValueT>
541 for (
int i=0;
i<
c.size();
i++)
542 c.fastAccessDx(
i) = 0.0;
544 for (
int i=0;
i<
c.size();
i++)
550 template <
typename ValueT>
556 for (
int i=0;
i<
c.size();
i++)
557 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
559 for (
int i=0;
i<
c.size();
i++)
560 c.fastAccessDx(
i) = 0.0;
571#define FAD_RELOP_MACRO(OP) \
574 template <typename ValueT> \
576 operator OP (const SimpleFad<ValueT>& a, \
577 const SimpleFad<ValueT>& b) \
579 return a.val() OP b.val(); \
582 template <typename ValueT> \
584 operator OP (const ValueT& a, \
585 const SimpleFad<ValueT>& b) \
587 return a OP b.val(); \
590 template <typename ValueT> \
592 operator OP (const SimpleFad<ValueT>& a, \
595 return a.val() OP b; \
611#undef FAD_RELOP_MACRO
617 template <
typename ValueT>
632 template <
typename T>
634 bool is_zero = (
x.val() == 0.0);
635 for (
int i=0;
i<
x.size();
i++)
636 is_zero = is_zero && (
x.dx(
i) == 0.0);
644#define FAD_BOOL_MACRO(OP) \
647 template <typename T1, typename T2> \
649 operator OP (const SimpleFad<T1>& expr1, \
650 const SimpleFad<T2>& expr2) \
652 return toBool(expr1) OP toBool(expr2); \
655 template <typename T2> \
657 operator OP (const typename SimpleFad<T2>::value_type& a, \
658 const SimpleFad<T2>& expr2) \
660 return a OP toBool(expr2); \
663 template <typename T1> \
665 operator OP (const SimpleFad<T1>& expr1, \
666 const typename SimpleFad<T1>::value_type& b) \
668 return toBool(expr1) OP b; \
684 template <
typename ValueT>
687 os <<
x.val() <<
" [";
689 for (
int i=0;
i<
x.size();
i++) {
690 os <<
" " <<
x.dx(
i);
atan2(expr1.val(), expr2.val())
#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 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.
SimpleFad< ValueT > operator-(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
std::ostream & operator<<(std::ostream &os, const Expr< ExprT > &x)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > operator*(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > operator/(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SACADO_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
SimpleFad< ValueT > operator+(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)