31#if defined (__clang__) && !defined (__INTEL_COMPILER)
32#pragma clang system_header
86 coeff_(), deg_(x.deg_), len_(x.deg_+1)
169resize(
int d,
bool keep_coeffs)
247 x.
th->deg_ =
th->deg_;
248 x.
th->len_ =
th->deg_+1;
250 for (
int i=0; i<=
th->deg_; i++)
251 x.
th->coeff_[i] = -
th->coeff_[i];
287 for (
int i=0; i<=
th->deg_; i++)
300 for (
int i=0; i<=
th->deg_; i++)
315 int dmin = xd < d ? xd : d;
318 bool need_resize = l >
length();
322 for (
int i=0; i<=d; i++)
327 T* xc = x.
th->coeff_;
329 for (
int i=0; i<=dmin; i++)
332 for (
int i=d+1; i<=xd; i++)
355 int dmin = xd < d ? xd : d;
358 bool need_resize = l >
length();
362 for (
int i=0; i<=d; i++)
367 T* xc = x.
th->coeff_;
369 for (
int i=0; i<=dmin; i++)
372 for (
int i=d+1; i<=xd; i++)
395 if ((xd != d) && (xd != 0) && (d != 0))
396 throw "Taylor Error: Attempt to assign with incompatible degrees";
400 T* xc = x.
th->coeff_;
402 if (d > 0 && xd > 0) {
406 for (
int i=0; i<=d; i++) {
408 for (
int k=0; k<=i; ++k)
416 for (
int i=0; i<=d; i++)
423 for (
int i=0; i<=xd; i++)
429 for (
int i=d; i>=0; i--)
446 if ((xd != d) && (xd != 0) && (d != 0))
447 throw "Taylor Error: Attempt to assign with incompatible degrees";
451 T* xc = x.
th->coeff_;
453 if (d > 0 && xd > 0) {
457 for(
int i=0; i<=d; i++) {
459 for (
int k=1; k<=i; ++k)
460 tmp -= xc[k]*cc[i-k];
467 for (
int i=0; i<=d; i++)
474 cc[0] =
c[0] / xc[0];
475 for (
int i=1; i<=xd; i++) {
477 for (
int k=1; k<=i; ++k)
478 tmp -= xc[k]*cc[i-k];
508 int dc = da > db ? da : db;
511 if ((da != db) && (da != 0) && (db != 0))
512 throw "operator+(): Arguments have incompatible degrees!";
516 const T* ca =
a.coeff();
520 if (da > 0 && db > 0) {
521 for (
int i=0; i<=dc; i++)
522 cc[i] = ca[i] + cb[i];
525 cc[0] = ca[0] + cb[0];
526 for (
int i=1; i<=dc; i++)
530 cc[0] = ca[0] + cb[0];
531 for (
int i=1; i<=dc; i++)
552 for (
int i=1; i<=dc; i++)
568 const T* ca =
a.coeff();
572 for (
int i=1; i<=dc; i++)
588 int dc = da > db ? da : db;
591 if ((da != db) && (da != 0) && (db != 0))
592 throw "operator+(): Arguments have incompatible degrees!";
596 const T* ca =
a.coeff();
600 if (da > 0 && db > 0) {
601 for (
int i=0; i<=dc; i++)
602 cc[i] = ca[i] - cb[i];
605 cc[0] = ca[0] - cb[0];
606 for (
int i=1; i<=dc; i++)
610 cc[0] = ca[0] - cb[0];
611 for (
int i=1; i<=dc; i++)
632 for (
int i=1; i<=dc; i++)
648 const T* ca =
a.coeff();
652 for (
int i=1; i<=dc; i++)
668 int dc = da > db ? da : db;
671 if ((da != db) && (da != 0) && (db != 0))
672 throw "operator+(): Arguments have incompatible degrees!";
676 const T* ca =
a.coeff();
680 if (da > 0 && db > 0) {
682 for (
int i=0; i<=dc; i++) {
684 for (
int k=0; k<=i; k++)
685 tmp += ca[k]*cb[i-k];
690 for (
int i=0; i<=dc; i++)
694 for (
int i=0; i<=dc; i++)
714 for (
int i=0; i<=dc; i++)
730 const T* ca =
a.coeff();
733 for (
int i=0; i<=dc; i++)
749 int dc = da > db ? da : db;
752 if ((da != db) && (da != 0) && (db != 0))
753 throw "operator+(): Arguments have incompatible degrees!";
757 const T* ca =
a.coeff();
761 if (da > 0 && db > 0) {
763 for (
int i=0; i<=dc; i++) {
765 for (
int k=0; k<=i; k++)
766 tmp -= cb[k]*cc[i-k];
771 for (
int i=0; i<=dc; i++)
776 cc[0] = ca[0] / cb[0];
777 for (
int i=1; i<=dc; i++) {
779 for (
int k=0; k<=i; k++)
780 tmp -= cb[k]*cc[i-k];
803 for (
int i=1; i<=dc; i++) {
805 for (
int k=0; k<=i; k++)
806 tmp -= cb[k]*cc[i-k];
823 const T* ca =
a.coeff();
826 for (
int i=0; i<=dc; i++)
840 const T* ca =
a.coeff();
844 cc[0] = std::exp(ca[0]);
845 for (
int i=1; i<=dc; i++) {
847 for (
int k=1; k<=i; k++)
848 tmp += k*cc[i-k]*ca[k];
863 const T* ca =
a.coeff();
867 cc[0] = std::log(ca[0]);
868 for (
int i=1; i<=dc; i++) {
870 for (
int k=1; k<=i-1; k++)
871 tmp -= k*ca[i-k]*cc[k];
872 cc[i] = tmp / (i*ca[0]);
883 return log(
a) / std::log(10.0);
894 const T* ca =
a.coeff();
898 cc[0] = std::sqrt(ca[0]);
899 for (
int i=1; i<=dc; i++) {
901 for (
int k=1; k<=i-1; k++)
902 tmp -= cc[k]*cc[i-k];
903 cc[i] = tmp / (2.0*cc[0]);
932 return exp(b*std::log(
a));
954 if (
c.degree() != dc)
957 const T* ca =
a.coeff();
963 cs[0] = std::sin(ca[0]);
964 cc[0] = std::cos(ca[0]);
965 for (
int i=1; i<=dc; i++) {
968 for (
int k=1; k<=i; k++) {
969 tmp1 += k*ca[k]*cc[i-k];
970 tmp2 -= k*ca[k]*cs[i-k];
1003template <
typename T>
1008 int dc =
a.degree();
1017template <
typename T>
1024 int dc =
a.degree();
1027 if (
c.degree() != dc)
1028 c.resize(dc,
false);
1030 const T* ca =
a.coeff();
1036 cs[0] = std::sinh(ca[0]);
1037 cc[0] = std::cosh(ca[0]);
1038 for (
int i=1; i<=dc; i++) {
1041 for (
int k=1; k<=i; k++) {
1042 tmp1 += k*ca[k]*cc[i-k];
1043 tmp2 += k*ca[k]*cs[i-k];
1050template <
typename T>
1055 int dc =
a.degree();
1063template <
typename T>
1068 int dc =
a.degree();
1076template <
typename T>
1081 int dc =
a.degree();
1090template <
typename T>
1098 int dc =
a.degree();
1101 const T* ca =
a.coeff();
1107 for (
int i=1; i<=dc; i++) {
1109 for (
int k=1; k<=i; k++)
1110 tmp += k*ca[k]*cb[i-k];
1117template <
typename T>
1126template <
typename T>
1135template <
typename T>
1144template <
typename T>
1157template <
typename T>
1169template <
typename T>
1177 c.fastAccessCoeff(0) =
atan2(
a.coeff(0),b);
1181template <
typename T>
1190template <
typename T>
1199template <
typename T>
1208template <
typename T>
1213 if (
a.coeff(0) >= 0)
1219template <
typename T>
1224 if (
a.coeff(0) >= 0)
1230template <
typename T>
1238 if (
a.coeff(0) >= b.
coeff(0))
1244template <
typename T>
1257template <
typename T>
1264 if (
a.coeff(0) >= b)
1270template <
typename T>
1278 if (
a.coeff(0) <= b.
coeff(0))
1284template <
typename T>
1297template <
typename T>
1304 if (
a.coeff(0) <= b)
1310template <
typename T>
1317 return a.coeff(0) == b.
coeff(0);
1320template <
typename T>
1329template <
typename T>
1335 return a.coeff(0) == b;
1338template <
typename T>
1345 return a.coeff(0) != b.
coeff(0);
1348template <
typename T>
1357template <
typename T>
1363 return a.coeff(0) != b;
1366template <
typename T>
1373 return a.coeff(0) <= b.
coeff(0);
1376template <
typename T>
1385template <
typename T>
1391 return a.coeff(0) <= b;
1394template <
typename T>
1401 return a.coeff(0) >= b.
coeff(0);
1404template <
typename T>
1413template <
typename T>
1419 return a.coeff(0) >= b;
1422template <
typename T>
1429 return a.coeff(0) < b.
coeff(0);
1432template <
typename T>
1441template <
typename T>
1447 return a.coeff(0) < b;
1450template <
typename T>
1457 return a.coeff(0) > b.
coeff(0);
1460template <
typename T>
1469template <
typename T>
1475 return a.coeff(0) > b;
1478template <
typename T>
1480 bool is_zero =
true;
1481 for (
int i=0; i<=x.
degree(); i++)
1482 is_zero = is_zero && (x.
coeff(i) == 0.0);
1486template <
typename T>
1495template <
typename T>
1504template <
typename T>
1513template <
typename T>
1522template <
typename T>
1531template <
typename T>
1540template <
typename T>
1547 for (
int i=0; i<=
a.degree(); i++) {
1548 os <<
a.coeff(i) <<
" ";
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
Taylor< T > & operator-=(const T &x)
Subtraction-assignment operator with constant right-hand-side.
Taylor< T > & operator/=(const T &x)
Division-assignment operator with constant right-hand-side.
Sacado::Handle< TaylorData > th
void resizeCoeffs(int len)
Resize coefficient array to new size.
void reserve(int d)
Reserve space for a degree d polynomial.
Taylor< T > & operator=(const T &val)
Assignment operator with constant right-hand-side.
T & fastAccessCoeff(int i)
Returns degree i term without bounds checking.
Taylor< T > & operator+=(const T &x)
Addition-assignment operator with constant right-hand-side.
int degree() const
Returns degree of polynomial.
Taylor< T > & operator*=(const T &x)
Multiplication-assignment operator with constant right-hand-side.
Taylor< T > operator+() const
Unary-plus operator.
T value_type
Typename of values.
int length() const
Return length of array.
Taylor< T > operator-() const
Unary-minus operator.
const T * coeff() const
Returns Taylor coefficient array.
void resize(int d, bool keep_coeffs)
Resize polynomial to degree d.
Taylor()
Default constructor.
Namespace for Taylor polynomial AD classes.
Taylor< T > operator*(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Taylor< T > operator-(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
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)
Taylor< T > cos(const Base< Taylor< T > > &a)
Taylor< T > asinh(const Base< Taylor< T > > &a)
bool operator==(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Taylor< T > operator+(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Taylor< T > acosh(const Base< Taylor< T > > &a)
Taylor< T > log(const Base< Taylor< T > > &a)
bool operator!=(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
bool operator>=(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
PowExprType< Expr< T1 >, Expr< T2 > >::expr_type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
Taylor< T > operator/(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Log10ExprType< T >::expr_type log10(const Expr< T > &expr)
void sincos(const Base< Taylor< T > > &a, Taylor< T > &s, Taylor< T > &c)
bool operator&&(const Base< Taylor< T > > &xx1, const Base< Taylor< T > > &xx2)
void sinhcosh(const Base< Taylor< T > > &a, Taylor< T > &s, Taylor< T > &c)
Taylor< T > exp(const Base< Taylor< T > > &a)
Taylor< T > abs(const Base< Taylor< T > > &a)
Taylor< T > atan2(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
bool operator||(const Base< Taylor< T > > &xx1, const Base< Taylor< T > > &xx2)
Taylor< T > sinh(const Base< Taylor< T > > &a)
bool operator>(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
std::ostream & operator<<(std::ostream &os, const Expr< ExprT > &x)
Taylor< T > atanh(const Base< Taylor< T > > &a)
Taylor< T > sin(const Base< Taylor< T > > &a)
Taylor< T > cbrt(const Base< Taylor< T > > &a)
Taylor< T > sqrt(const Base< Taylor< T > > &a)
ATanExprType< T >::expr_type atan(const Expr< T > &expr)
TanhExprType< T >::expr_type tanh(const Expr< T > &expr)
bool operator<=(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
bool toBool(const Taylor< T > &x)
TanExprType< T >::expr_type tan(const Expr< T > &expr)
Taylor< T > cosh(const Base< Taylor< T > > &a)
Taylor< T > quad(const typename Taylor< T >::value_type &c0, const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Taylor< T > fabs(const Base< Taylor< T > > &a)
ASinExprType< T >::expr_type asin(const Expr< T > &expr)
bool operator<(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
ACosExprType< T >::expr_type acos(const Expr< T > &expr)
ATanExprType< T >::expr_type atan(const Expr< T > &expr)
ASinExprType< T >::expr_type asin(const Expr< T > &expr)
Base class for Sacado types to control overload resolution.
const derived_type & derived() const
T * coeff_
Taylor polynomial coefficients.
TaylorData & operator=(const TaylorData &x)
Assignment operator.
int deg_
Degree of polynomial.
int len_
Length of allocated polynomial array.
TaylorData()
Default constructor.
static SACADO_INLINE_FUNCTION T * get_and_fill(int sz)
Get memory for new array of length sz and fill with zeros.
static SACADO_INLINE_FUNCTION void destroy_and_release(T *m, int sz)
Destroy array elements and release memory.
static SACADO_INLINE_FUNCTION void zero(T *dest, int sz)
Zero out array dest of length sz.
static SACADO_INLINE_FUNCTION void copy(const T *src, T *dest, int sz)
Copy array from src to dest of length sz.