Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Sacado_Tay_CacheTaylorOps.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Sacado Package
4 //
5 // Copyright 2006 NTESS and the Sacado contributors.
6 // SPDX-License-Identifier: LGPL-2.1-or-later
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef SACADO_TAY_CACHETAYLOROPS_HPP
11 #define SACADO_TAY_CACHETAYLOROPS_HPP
12 
14 
15 #include <cmath>
16 #include <valarray>
17 #include <algorithm> // for std::min and std::max
18 #include <ostream> // for std::ostream
19 
20 namespace Sacado {
21 
22  namespace Tay {
23 
24  // ---------------------- Unary Addition operator ------------------------
25 
26  template <typename ExprT>
27  class UnaryPlusOp {
28  public:
29 
30  typedef typename ExprT::value_type value_type;
31  typedef typename ExprT::scalar_type scalar_type;
32  typedef typename ExprT::base_expr_type base_expr_type;
33 
34  UnaryPlusOp(const ExprT& expr) {}
35 
36  void allocateCache(int d) const {}
37 
38  value_type computeCoeff(int i, const ExprT& expr) const {
39  return expr.coeff(i);
40  }
41 
43  const ExprT& expr) const {
44  return expr.fastAccessCoeff(i);
45  }
46 
47  }; // class UnaryPlusOp
48 
49  // ---------------------- Unary Subtraction operator ---------------------
50 
51  template <typename ExprT>
52  class UnaryMinusOp {
53  public:
54 
55  typedef typename ExprT::value_type value_type;
56  typedef typename ExprT::scalar_type scalar_type;
57  typedef typename ExprT::base_expr_type base_expr_type;
58 
59  UnaryMinusOp(const ExprT& expr) {}
60 
61  void allocateCache(int d) const {}
62 
63  value_type computeCoeff(int i, const ExprT& expr) const {
64  return -expr.coeff(i);
65  }
66 
68  const ExprT& expr) const {
69  return -expr.fastAccessCoeff(i);
70  }
71 
72  }; // class UnaryPlusOp
73 
74  // -------------------------- exp() function -----------------------------
75 
76  template <typename ExprT>
77  class ExpOp {
78  public:
79 
80  typedef typename ExprT::value_type value_type;
81  typedef typename ExprT::scalar_type scalar_type;
82  typedef typename ExprT::base_expr_type base_expr_type;
83 
84  ExpOp(const ExprT& expr) :
85  c(),
86  dc(-1) {}
87 
88  void allocateCache(int d) const {
89  c.resize(d+1,value_type(0));
90  }
91 
92  value_type computeCoeff(int i, const ExprT& expr) const {
93  if (static_cast<int>(i) > dc) {
94  if (dc < 0) {
95  c[0] = std::exp(expr.fastAccessCoeff(0));
96  dc = 0;
97  }
98  for (int k=dc+1; k<=i; k++) {
99  for (int j=1; j<=k; j++)
100  c[k] += value_type(j)*c[k-j]*expr.coeff(j);
101  c[k] /= value_type(k);
102  }
103  dc = i;
104  }
105  return c[i];
106  }
107 
109  const ExprT& expr) const
110  {
111  if (static_cast<int>(i) > dc) {
112  if (dc < 0) {
113  c[0] = std::exp(expr.fastAccessCoeff(0));
114  dc = 0;
115  }
116  for (int k=dc+1; k<=i; k++) {
117  for (int j=1; j<=k; j++)
118  c[k] += value_type(j)*c[k-j]*expr.fastAccessCoeff(j);
119  c[k] /= value_type(k);
120  }
121  dc = i;
122  }
123  return c[i];
124  }
125 
126  protected:
127 
128  mutable std::valarray<value_type> c;
129  mutable int dc;
130 
131  }; // class ExpOp
132 
133  // -------------------------- log() function -----------------------------
134 
135  template <typename ExprT>
136  class LogOp {
137  public:
138 
139  typedef typename ExprT::value_type value_type;
140  typedef typename ExprT::scalar_type scalar_type;
141  typedef typename ExprT::base_expr_type base_expr_type;
142 
143  LogOp(const ExprT& expr) :
144  c(),
145  dc(-1)
146  {}
147 
148  void allocateCache(int d) const {
149  c.resize(d+1,value_type(0));
150  }
151 
152  value_type computeCoeff(int i, const ExprT& expr) const {
153  if (static_cast<int>(i) > dc) {
154  if (dc < 0) {
155  c[0] = std::log(expr.fastAccessCoeff(0));
156  dc = 0;
157  }
158  for (int k=dc+1; k<=i; k++) {
159  c[k] = value_type(k)*expr.coeff(k);
160  for (int j=1; j<=k-1; j++)
161  c[k] -= value_type(j)*expr.coeff(k-j)*c[j];
162  c[k] /= (value_type(k)*expr.fastAccessCoeff(0));
163  }
164  dc = i;
165  }
166  return c[i];
167  }
168 
170  const ExprT& expr) const
171  {
172  if (static_cast<int>(i) > dc) {
173  if (dc < 0) {
174  c[0] = std::log(expr.fastAccessCoeff(0));
175  dc = 0;
176  }
177  for (int k=dc+1; k<=i; k++) {
178  c[k] = value_type(k)*expr.fastAccessCoeff(k);
179  for (int j=1; j<=k-1; j++)
180  c[k] -= value_type(j)*expr.fastAccessCoeff(k-j)*c[j];
181  c[k] /= (value_type(k)*expr.fastAccessCoeff(0));
182  }
183  dc = i;
184  }
185  return c[i];
186  }
187 
188  protected:
189 
190  mutable std::valarray<value_type> c;
191  mutable int dc;
192 
193  }; // class LogOp
194 
195  // -------------------------- sqrt() function -----------------------------
196 
197  template <typename ExprT>
198  class SqrtOp {
199  public:
200 
201  typedef typename ExprT::value_type value_type;
202  typedef typename ExprT::scalar_type scalar_type;
203  typedef typename ExprT::base_expr_type base_expr_type;
204 
205  SqrtOp(const ExprT& expr) :
206  c(),
207  dc(-1) {}
208 
209  void allocateCache(int d) const {
210  c.resize(d+1,value_type(0));
211  }
212 
213  value_type computeCoeff(int i, const ExprT& expr) const {
214  if (static_cast<int>(i) > dc) {
215  if (dc < 0) {
216  c[0] = std::sqrt(expr.fastAccessCoeff(0));
217  dc = 0;
218  }
219  value_type tmp = value_type(2)*c[0];
220  for (int k=dc+1; k<=i; k++) {
221  c[k] = expr.coeff(k);
222  for (int j=1; j<=k-1; j++)
223  c[k] -= c[j]*c[k-j];
224  c[k] /= tmp;
225  }
226  dc = i;
227  }
228  return c[i];
229  }
230 
232  const ExprT& expr) const
233  {
234  if (static_cast<int>(i) > dc) {
235  if (dc < 0) {
236  c[0] = std::sqrt(expr.fastAccessCoeff(0));
237  dc = 0;
238  }
239  value_type tmp = value_type(2)*c[0];
240  for (int k=dc+1; k<=i; k++) {
241  c[k] = expr.fastAccessCoeff(k);
242  for (int j=1; j<=k-1; j++)
243  c[k] -= c[j]*c[k-j];
244  c[k] /= tmp;
245  }
246  dc = i;
247  }
248  return c[i];
249  }
250 
251  protected:
252 
253  mutable std::valarray<value_type> c;
254  mutable int dc;
255 
256  }; // class SqrtOp
257 
258  // -------------------------- cos() function -----------------------------
259 
260  template <typename ExprT>
261  class CosOp {
262  public:
263 
264  typedef typename ExprT::value_type value_type;
265  typedef typename ExprT::scalar_type scalar_type;
266  typedef typename ExprT::base_expr_type base_expr_type;
267 
268  CosOp(const ExprT& expr) :
269  c(),
270  s(),
271  dc(-1) {}
272 
273  void allocateCache(int d) const {
274  c.resize(d+1,value_type(0));
275  s.resize(d+1,value_type(0));
276  }
277 
278  value_type computeCoeff(int i, const ExprT& expr) const {
279  if (static_cast<int>(i) > dc) {
280  if (dc < 0) {
281  c[0] = std::cos(expr.fastAccessCoeff(0));
282  s[0] = std::sin(expr.fastAccessCoeff(0));
283  dc = 0;
284  }
285  for (int k=dc+1; k<=i; k++) {
286  for (int j=1; j<=k; j++) {
287  c[k] -= value_type(j)*expr.coeff(j)*s[k-j];
288  s[k] += value_type(j)*expr.coeff(j)*c[k-j];
289  }
290  c[k] /= value_type(k);
291  s[k] /= value_type(k);
292  }
293  dc = i;
294  }
295  return c[i];
296  }
297 
299  const ExprT& expr) const
300  {
301  if (static_cast<int>(i) > dc) {
302  if (dc < 0) {
303  c[0] = std::cos(expr.fastAccessCoeff(0));
304  s[0] = std::sin(expr.fastAccessCoeff(0));
305  dc = 0;
306  }
307  for (int k=dc+1; k<=i; k++) {
308  for (int j=1; j<=k; j++) {
309  c[k] -= value_type(j)*expr.fastAccessCoeff(j)*s[k-j];
310  s[k] += value_type(j)*expr.fastAccessCoeff(j)*c[k-j];
311  }
312  c[k] /= value_type(k);
313  s[k] /= value_type(k);
314  }
315  dc = i;
316  }
317  return c[i];
318  }
319 
320  protected:
321 
322  mutable std::valarray<value_type> c;
323  mutable std::valarray<value_type> s;
324  mutable int dc;
325 
326  }; // class CosOp
327 
328  // -------------------------- sin() function -----------------------------
329 
330  template <typename ExprT>
331  class SinOp {
332  public:
333 
334  typedef typename ExprT::value_type value_type;
335  typedef typename ExprT::scalar_type scalar_type;
336  typedef typename ExprT::base_expr_type base_expr_type;
337 
338  SinOp(const ExprT& expr) :
339  c(),
340  s(),
341  dc(-1) {}
342 
343  void allocateCache(int d) const {
344  c.resize(d+1,value_type(0));
345  s.resize(d+1,value_type(0));
346  }
347 
348  value_type computeCoeff(int i, const ExprT& expr) const {
349  if (static_cast<int>(i) > dc) {
350  if (dc < 0) {
351  c[0] = std::cos(expr.fastAccessCoeff(0));
352  s[0] = std::sin(expr.fastAccessCoeff(0));
353  dc = 0;
354  }
355  for (int k=dc+1; k<=i; k++) {
356  for (int j=1; j<=k; j++) {
357  c[k] -= value_type(j)*expr.coeff(j)*s[k-j];
358  s[k] += value_type(j)*expr.coeff(j)*c[k-j];
359  }
360  c[k] /= value_type(k);
361  s[k] /= value_type(k);
362  }
363  dc = i;
364  }
365  return s[i];
366  }
367 
369  const ExprT& expr) const
370  {
371  if (static_cast<int>(i) > dc) {
372  if (dc < 0) {
373  c[0] = std::cos(expr.fastAccessCoeff(0));
374  s[0] = std::sin(expr.fastAccessCoeff(0));
375  dc = 0;
376  }
377  for (int k=dc+1; k<=i; k++) {
378  for (int j=1; j<=k; j++) {
379  c[k] -= value_type(j)*expr.fastAccessCoeff(j)*s[k-j];
380  s[k] += value_type(j)*expr.fastAccessCoeff(j)*c[k-j];
381  }
382  c[k] /= value_type(k);
383  s[k] /= value_type(k);
384  }
385  dc = i;
386  }
387  return s[i];
388  }
389 
390  protected:
391 
392  mutable std::valarray<value_type> c;
393  mutable std::valarray<value_type> s;
394  mutable int dc;
395 
396  }; // class SinOp
397 
398  // -------------------------- cosh() function -----------------------------
399 
400  template <typename ExprT>
401  class CoshOp {
402  public:
403 
404  typedef typename ExprT::value_type value_type;
405  typedef typename ExprT::scalar_type scalar_type;
406  typedef typename ExprT::base_expr_type base_expr_type;
407 
408  CoshOp(const ExprT& expr) :
409  c(),
410  s(),
411  dc(-1) {}
412 
413  void allocateCache(int d) const {
414  c.resize(d+1,value_type(0));
415  s.resize(d+1,value_type(0));
416  }
417 
418  value_type computeCoeff(int i, const ExprT& expr) const {
419  if (static_cast<int>(i) > dc) {
420  if (dc < 0) {
421  c[0] = std::cosh(expr.fastAccessCoeff(0));
422  s[0] = std::sinh(expr.fastAccessCoeff(0));
423  dc = 0;
424  }
425  for (int k=dc+1; k<=i; k++) {
426  for (int j=1; j<=k; j++) {
427  c[k] += value_type(j)*expr.coeff(j)*s[k-j];
428  s[k] += value_type(j)*expr.coeff(j)*c[k-j];
429  }
430  c[k] /= value_type(k);
431  s[k] /= value_type(k);
432  }
433  dc = i;
434  }
435  return c[i];
436  }
437 
439  const ExprT& expr) const
440  {
441  if (static_cast<int>(i) > dc) {
442  if (dc < 0) {
443  c[0] = std::cosh(expr.fastAccessCoeff(0));
444  s[0] = std::sinh(expr.fastAccessCoeff(0));
445  dc = 0;
446  }
447  for (int k=dc+1; k<=i; k++) {
448  for (int j=1; j<=k; j++) {
449  c[k] += value_type(j)*expr.fastAccessCoeff(j)*s[k-j];
450  s[k] += value_type(j)*expr.fastAccessCoeff(j)*c[k-j];
451  }
452  c[k] /= value_type(k);
453  s[k] /= value_type(k);
454  }
455  dc = i;
456  }
457  return c[i];
458  }
459 
460  protected:
461 
462  mutable std::valarray<value_type> c;
463  mutable std::valarray<value_type> s;
464  mutable int dc;
465 
466  }; // class CoshOp
467 
468  // -------------------------- sinh() function -----------------------------
469 
470  template <typename ExprT>
471  class SinhOp {
472  public:
473 
474  typedef typename ExprT::value_type value_type;
475  typedef typename ExprT::scalar_type scalar_type;
476  typedef typename ExprT::base_expr_type base_expr_type;
477 
478  SinhOp(const ExprT& expr) :
479  c(),
480  s(),
481  dc(-1) {}
482 
483  void allocateCache(int d) const {
484  c.resize(d+1,value_type(0));
485  s.resize(d+1,value_type(0));
486  }
487 
488  value_type computeCoeff(int i, const ExprT& expr) const {
489  if (static_cast<int>(i) > dc) {
490  if (dc < 0) {
491  c[0] = std::cosh(expr.fastAccessCoeff(0));
492  s[0] = std::sinh(expr.fastAccessCoeff(0));
493  dc = 0;
494  }
495  for (int k=dc+1; k<=i; k++) {
496  for (int j=1; j<=k; j++) {
497  c[k] += value_type(j)*expr.coeff(j)*s[k-j];
498  s[k] += value_type(j)*expr.coeff(j)*c[k-j];
499  }
500  c[k] /= value_type(k);
501  s[k] /= value_type(k);
502  }
503  dc = i;
504  }
505  return s[i];
506  }
507 
509  const ExprT& expr) const
510  {
511  if (static_cast<int>(i) > dc) {
512  if (dc < 0) {
513  c[0] = std::cosh(expr.fastAccessCoeff(0));
514  s[0] = std::sinh(expr.fastAccessCoeff(0));
515  dc = 0;
516  }
517  for (int k=dc+1; k<=i; k++) {
518  for (int j=1; j<=k; j++) {
519  c[k] += value_type(j)*expr.fastAccessCoeff(j)*s[k-j];
520  s[k] += value_type(j)*expr.fastAccessCoeff(j)*c[k-j];
521  }
522  c[k] /= value_type(k);
523  s[k] /= value_type(k);
524  }
525  dc = i;
526  }
527  return s[i];
528  }
529 
530  protected:
531 
532  mutable std::valarray<value_type> c;
533  mutable std::valarray<value_type> s;
534  mutable int dc;
535 
536  }; // class SinhOp
537 
538  // -------------------------- fabs() function -----------------------------
539 
540  template <typename ExprT>
541  class FAbsOp {
542  public:
543 
544  typedef typename ExprT::value_type value_type;
545  typedef typename ExprT::scalar_type scalar_type;
546  typedef typename ExprT::base_expr_type base_expr_type;
547 
548  FAbsOp(const ExprT& expr) {}
549 
550  void allocateCache(int d) const {}
551 
552  value_type computeCoeff(int i, const ExprT& expr) const {
553  if (expr.fastAccessCoeff(0) > 0)
554  return expr.coeff(i);
555  else
556  return -expr.coeff(i);
557  }
558 
560  const ExprT& expr) const
561  {
562  if (expr.fastAccessCoeff(0) > 0)
563  return expr.fastAccessCoeff(i);
564  else
565  return -expr.fastAccessCoeff(i);
566  }
567 
568  }; // class FAbsOp
569 
570  } // namespace Tay
571 
572 } // namespace Sacado
573 
574 #define TAYLOR_UNARYOP_MACRO(OPNAME,OP) \
575 namespace Sacado { \
576  namespace Tay { \
577  template <typename T> \
578  inline Expr< UnaryExpr< Expr<T>, OP > > \
579  OPNAME (const Expr<T>& expr) \
580  { \
581  typedef UnaryExpr< Expr<T>, OP > expr_t; \
582  \
583  return Expr<expr_t>(expr_t(expr)); \
584  } \
585  } \
586 } \
587  \
588 namespace std { \
589  using Sacado::Tay::OPNAME; \
590 }
591 
592 TAYLOR_UNARYOP_MACRO(operator+, UnaryPlusOp)
603 
604 #undef TAYLOR_UNARYOP_MACRO
605 
606 namespace Sacado {
607 
608  namespace Tay {
609 
610  // ---------------------- Addition operator -----------------------------
611 
612  template <typename ExprT1, typename ExprT2>
613  class AdditionOp {
614  public:
615 
616  typedef typename ExprT1::value_type value_type_1;
617  typedef typename ExprT2::value_type value_type_2;
618  typedef typename Sacado::Promote<value_type_1,
620 
621  typedef typename ExprT1::scalar_type scalar_type_1;
622  typedef typename ExprT2::scalar_type scalar_type_2;
623  typedef typename Sacado::Promote<scalar_type_1,
625 
626  typedef typename ExprT1::base_expr_type base_expr_type_1;
627  typedef typename ExprT2::base_expr_type base_expr_type_2;
628  typedef typename Sacado::Promote<base_expr_type_1,
630 
631  AdditionOp(const ExprT1& expr1, const ExprT2 expr2) {}
632 
633  void allocateCache(int d) const {}
634 
635  value_type
636  computeCoeff(int i, const ExprT1& expr1,
637  const ExprT2& expr2) const {
638  return expr1.coeff(i) + expr2.coeff(i);
639  }
640 
641  value_type
642  computeFastAccessCoeff(int i, const ExprT1& expr1,
643  const ExprT2& expr2) const {
644  return expr1.fastAccessCoeff(i) + expr2.fastAccessCoeff(i);
645  }
646 
647  }; // class AdditionOp
648 
649  template <typename ExprT1>
650  class AdditionOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
651  public:
652 
653  typedef typename ExprT1::value_type value_type;
654  typedef typename ExprT1::scalar_type scalar_type;
655  typedef typename ExprT1::base_expr_type base_expr_type;
657 
658  AdditionOp(const ExprT1& expr1, const ExprT2 expr2) {}
659 
660  void allocateCache(int d) const {}
661 
662  value_type
663  computeCoeff(int i, const ExprT1& expr1,
664  const ExprT2& expr2) const {
665  if (i == 0)
666  return expr1.coeff(i) + expr2.coeff(i);
667  else
668  return expr1.coeff(i);
669  }
670 
671  value_type
672  computeFastAccessCoeff(int i, const ExprT1& expr1,
673  const ExprT2& expr2) const {
674  if (i == 0)
675  return expr1.fastAccessCoeff(i) + expr2.fastAccessCoeff(i);
676  else
677  return expr1.fastAccessCoeff(i);
678  }
679 
680  }; // class AdditionOp
681 
682  template <typename ExprT2>
683  class AdditionOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
684  public:
685 
686  typedef typename ExprT2::value_type value_type;
687  typedef typename ExprT2::scalar_type scalar_type;
688  typedef typename ExprT2::base_expr_type base_expr_type;
690 
691  AdditionOp(const ExprT1& expr1, const ExprT2 expr2) {}
692 
693  void allocateCache(int d) const {}
694 
695  value_type
696  computeCoeff(int i, const ExprT1& expr1,
697  const ExprT2& expr2) const {
698  if (i == 0)
699  return expr1.coeff(i) + expr2.coeff(i);
700  else
701  return expr2.coeff(i);
702  }
703 
704  value_type
705  computeFastAccessCoeff(int i, const ExprT1& expr1,
706  const ExprT2& expr2) const {
707  if (i == 0)
708  return expr1.fastAccessCoeff(i) + expr2.fastAccessCoeff(i);
709  else
710  return expr2.fastAccessCoeff(i);
711  }
712 
713  }; // class AdditionOp
714 
715  // ---------------------- Subtraction operator ---------------------------
716 
717  template <typename ExprT1, typename ExprT2>
719  public:
720 
721  typedef typename ExprT1::value_type value_type_1;
722  typedef typename ExprT2::value_type value_type_2;
723  typedef typename Sacado::Promote<value_type_1,
725 
726  typedef typename ExprT1::scalar_type scalar_type_1;
727  typedef typename ExprT2::scalar_type scalar_type_2;
728  typedef typename Sacado::Promote<scalar_type_1,
730 
731  typedef typename ExprT1::base_expr_type base_expr_type_1;
732  typedef typename ExprT2::base_expr_type base_expr_type_2;
733  typedef typename Sacado::Promote<base_expr_type_1,
735 
736  SubtractionOp(const ExprT1& expr1, const ExprT2 expr2) {}
737 
738  void allocateCache(int d) const {}
739 
740  value_type
741  computeCoeff(int i, const ExprT1& expr1,
742  const ExprT2& expr2) const {
743  return expr1.coeff(i) - expr2.coeff(i);
744  }
745 
746  value_type
747  computeFastAccessCoeff(int i, const ExprT1& expr1,
748  const ExprT2& expr2) const {
749  return expr1.fastAccessCoeff(i) - expr2.fastAccessCoeff(i);
750  }
751 
752  }; // class SubtractionOp
753 
754  template <typename ExprT1>
755  class SubtractionOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
756  public:
757 
758  typedef typename ExprT1::value_type value_type;
759  typedef typename ExprT1::scalar_type scalar_type;
760  typedef typename ExprT1::base_expr_type base_expr_type;
762 
763  SubtractionOp(const ExprT1& expr1, const ExprT2 expr2) {}
764 
765  void allocateCache(int d) const {}
766 
767  value_type
768  computeCoeff(int i, const ExprT1& expr1,
769  const ExprT2& expr2) const {
770  if (i == 0)
771  return expr1.coeff(i) - expr2.coeff(i);
772  else
773  return expr1.coeff(i);
774  }
775 
776  value_type
777  computeFastAccessCoeff(int i, const ExprT1& expr1,
778  const ExprT2& expr2) const {
779  if (i == 0)
780  return expr1.fastAccessCoeff(i) - expr2.fastAccessCoeff(i);
781  else
782  return expr1.fastAccessCoeff(i);
783  }
784 
785  }; // class SubtractionOp
786 
787  template <typename ExprT2>
788  class SubtractionOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
789  public:
790 
791  typedef typename ExprT2::value_type value_type;
792  typedef typename ExprT2::scalar_type scalar_type;
793  typedef typename ExprT2::base_expr_type base_expr_type;
795 
796  SubtractionOp(const ExprT1& expr1, const ExprT2 expr2) {}
797 
798  void allocateCache(int d) const {}
799 
800  value_type
801  computeCoeff(int i, const ExprT1& expr1,
802  const ExprT2& expr2) const {
803  if (i == 0)
804  return expr1.coeff(i) - expr2.coeff(i);
805  else
806  return -expr2.coeff(i);
807  }
808 
809  value_type
810  computeFastAccessCoeff(int i, const ExprT1& expr1,
811  const ExprT2& expr2) const {
812  if (i == 0)
813  return expr1.fastAccessCoeff(i) - expr2.fastAccessCoeff(i);
814  else
815  return -expr2.fastAccessCoeff(i);
816  }
817 
818  }; // class SubtractionOp
819 
820  // ---------------------- Multiplication operator -------------------------
821 
822  template <typename ExprT1, typename ExprT2>
824  public:
825 
826  typedef typename ExprT1::value_type value_type_1;
827  typedef typename ExprT2::value_type value_type_2;
828  typedef typename Sacado::Promote<value_type_1,
830 
831  typedef typename ExprT1::scalar_type scalar_type_1;
832  typedef typename ExprT2::scalar_type scalar_type_2;
833  typedef typename Sacado::Promote<scalar_type_1,
835 
836  typedef typename ExprT1::base_expr_type base_expr_type_1;
837  typedef typename ExprT2::base_expr_type base_expr_type_2;
838  typedef typename Sacado::Promote<base_expr_type_1,
840 
841  MultiplicationOp(const ExprT1& expr1, const ExprT2 expr2) :
842  c(),
843  dc(-1) {}
844 
845  void allocateCache(int d) const {
846  c.resize(d+1,value_type(0));
847  }
848 
849  value_type
850  computeCoeff(int i, const ExprT1& expr1,
851  const ExprT2& expr2) const {
852  if (static_cast<int>(i) > dc) {
853  for (int k=dc+1; k<=i; k++) {
854  for (int j=0; j<=k; j++)
855  c[k] += expr1.coeff(j)*expr2.coeff(k-j);
856  }
857  dc = i;
858  }
859  return c[i];
860  }
861 
862  value_type
863  computeFastAccessCoeff(int i, const ExprT1& expr1,
864  const ExprT2& expr2) const {
865  if (static_cast<int>(i) > dc) {
866  for (int k=dc+1; k<=i; k++) {
867  for (int j=0; j<=k; j++)
868  c[k] += expr1.fastAccessCoeff(j)*expr2.fastAccessCoeff(k-j);
869  }
870  dc = i;
871  }
872  return c[i];
873  }
874 
875  protected:
876 
877  mutable std::valarray<value_type> c;
878  mutable int dc;
879 
880  }; // class MultiplicationOp
881 
882  template <typename ExprT1>
883  class MultiplicationOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
884  public:
885 
886  typedef typename ExprT1::value_type value_type;
887  typedef typename ExprT1::scalar_type scalar_type;
888  typedef typename ExprT1::base_expr_type base_expr_type;
890 
891  MultiplicationOp(const ExprT1& expr1, const ExprT2 expr2) {}
892 
893  void allocateCache(int d) const {}
894 
895  value_type
896  computeCoeff(int i, const ExprT1& expr1,
897  const ExprT2& expr2) const {
898  return expr1.coeff(i)*expr2.value();
899  }
900 
901  value_type
902  computeFastAccessCoeff(int i, const ExprT1& expr1,
903  const ExprT2& expr2) const {
904  return expr1.fastAccessCoeff(i)*expr2.value();
905  }
906 
907  }; // class MultiplicationOp
908 
909  template <typename ExprT2>
910  class MultiplicationOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
911  public:
912 
913  typedef typename ExprT2::value_type value_type;
914  typedef typename ExprT2::scalar_type scalar_type;
915  typedef typename ExprT2::base_expr_type base_expr_type;
917 
918  MultiplicationOp(const ExprT1& expr1, const ExprT2 expr2) {}
919 
920  void allocateCache(int d) const {}
921 
922  value_type
923  computeCoeff(int i, const ExprT1& expr1,
924  const ExprT2& expr2) const {
925  return expr1.value()*expr2.coeff(i);
926  }
927 
928  value_type
929  computeFastAccessCoeff(int i, const ExprT1& expr1,
930  const ExprT2& expr2) const {
931  return expr1.value()*expr2.fastAccessCoeff(i);
932  }
933 
934  }; // class MultiplicationOp
935 
936  // ---------------------- Division operator -------------------------
937 
938  template <typename ExprT1, typename ExprT2>
939  class DivisionOp {
940  public:
941 
942  typedef typename ExprT1::value_type value_type_1;
943  typedef typename ExprT2::value_type value_type_2;
944  typedef typename Sacado::Promote<value_type_1,
946 
947  typedef typename ExprT1::scalar_type scalar_type_1;
948  typedef typename ExprT2::scalar_type scalar_type_2;
949  typedef typename Sacado::Promote<scalar_type_1,
951 
952  typedef typename ExprT1::base_expr_type base_expr_type_1;
953  typedef typename ExprT2::base_expr_type base_expr_type_2;
954  typedef typename Sacado::Promote<base_expr_type_1,
956 
957  DivisionOp(const ExprT1& expr1, const ExprT2 expr2) :
958  c(),
959  dc(-1) {}
960 
961  void allocateCache(int d) const {
962  c.resize(d+1,value_type(0));
963  }
964 
965  value_type
966  computeCoeff(int i, const ExprT1& expr1,
967  const ExprT2& expr2) const {
968  if (static_cast<int>(i) > dc) {
969  for (int k=dc+1; k<=i; k++) {
970  c[k] = expr1.coeff(k);
971  for (int j=1; j<=k; j++)
972  c[k] -= expr2.coeff(j)*c[k-j];
973  c[k] /= expr2.fastAccessCoeff(0);
974  }
975  dc = i;
976  }
977  return c[i];
978  }
979 
980  value_type
981  computeFastAccessCoeff(int i, const ExprT1& expr1,
982  const ExprT2& expr2) const {
983  if (static_cast<int>(i) > dc) {
984  for (int k=dc+1; k<=i; k++) {
985  c[k] = expr1.coeff(k);
986  for (int j=1; j<=k; j++)
987  c[k] -= expr2.fastAccessCoeff(j)*c[k-j];
988  c[k] /= expr2.fastAccessCoeff(0);
989  }
990  dc = i;
991  }
992  return c[i];
993  }
994 
995  protected:
996 
997  mutable std::valarray<value_type> c;
998  mutable int dc;
999 
1000  }; // class DivisionOp
1001 
1002  template <typename ExprT1>
1003  class DivisionOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
1004  public:
1005 
1006  typedef typename ExprT1::value_type value_type;
1007  typedef typename ExprT1::scalar_type scalar_type;
1008  typedef typename ExprT1::base_expr_type base_expr_type;
1010 
1011  DivisionOp(const ExprT1& expr1, const ExprT2 expr2) {}
1012 
1013  void allocateCache(int d) const {}
1014 
1015  value_type
1016  computeCoeff(int i, const ExprT1& expr1,
1017  const ExprT2& expr2) const {
1018  return expr1.coeff(i)/expr2.value();
1019  }
1020 
1021  value_type
1022  computeFastAccessCoeff(int i, const ExprT1& expr1,
1023  const ExprT2& expr2) const {
1024  return expr1.fastAccessCoeff(i)/expr2.value();
1025  }
1026 
1027  }; // class DivisionOp
1028 
1029  template <typename ExprT2>
1030  class DivisionOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
1031  public:
1032 
1033  typedef typename ExprT2::value_type value_type;
1034  typedef typename ExprT2::scalar_type scalar_type;
1035  typedef typename ExprT2::base_expr_type base_expr_type;
1037 
1038  DivisionOp(const ExprT1& expr1, const ExprT2 expr2) :
1039  c(),
1040  dc(-1) {}
1041 
1042  void allocateCache(int d) const {
1043  c.resize(d+1,value_type(0));
1044  }
1045 
1046  value_type
1047  computeCoeff(int i, const ExprT1& expr1,
1048  const ExprT2& expr2) const {
1049  if (static_cast<int>(i) > dc) {
1050  if (dc < 0) {
1051  c[0] = expr1.fastAccessCoeff(0) / expr2.fastAccessCoeff(0);
1052  dc = 0;
1053  }
1054  for (int k=dc+1; k<=i; k++) {
1055  for (int j=1; j<=k; j++)
1056  c[k] -= expr2.coeff(j)*c[k-j];
1057  c[k] /= expr2.fastAccessCoeff(0);
1058  }
1059  dc = i;
1060  }
1061  return c[i];
1062  }
1063 
1064  value_type
1065  computeFastAccessCoeff(int i, const ExprT1& expr1,
1066  const ExprT2& expr2) const {
1067  if (static_cast<int>(i) > dc) {
1068  if (dc < 0) {
1069  c[0] = expr1.fastAccessCoeff(0) / expr2.fastAccessCoeff(0);
1070  dc = 0;
1071  }
1072  for (int k=dc+1; k<=i; k++) {
1073  c[k] = expr1.coeff(k);
1074  for (int j=1; j<=k; j++)
1075  c[k] -= expr2.fastAccessCoeff(j)*c[k-j];
1076  c[k] /= expr2.fastAccessCoeff(0);
1077  }
1078  dc = i;
1079  }
1080  return c[i];
1081  }
1082 
1083  protected:
1084 
1085  mutable std::valarray<value_type> c;
1086  mutable int dc;
1087 
1088  }; // class DivisionOp
1089 
1090  // ---------------------- Max operator -----------------------------
1091 
1092  template <typename ExprT1, typename ExprT2>
1093  class MaxOp {
1094  public:
1095 
1096  typedef typename ExprT1::value_type value_type_1;
1097  typedef typename ExprT2::value_type value_type_2;
1098  typedef typename Sacado::Promote<value_type_1,
1100 
1101  typedef typename ExprT1::scalar_type scalar_type_1;
1102  typedef typename ExprT2::scalar_type scalar_type_2;
1103  typedef typename Sacado::Promote<scalar_type_1,
1105 
1106  typedef typename ExprT1::base_expr_type base_expr_type_1;
1107  typedef typename ExprT2::base_expr_type base_expr_type_2;
1108  typedef typename Sacado::Promote<base_expr_type_1,
1110 
1111  MaxOp(const ExprT1& expr1, const ExprT2 expr2) {}
1112 
1113  void allocateCache(int d) const {}
1114 
1115  value_type
1116  computeCoeff(int i, const ExprT1& expr1,
1117  const ExprT2& expr2) const {
1118  if (i == 0)
1119  return std::max(expr1.coeff(0), expr2.coeff(0));
1120  else
1121  return expr1.coeff(0) >= expr2.coeff(0) ? expr1.coeff(i) :
1122  expr2.coeff(i);
1123  }
1124 
1125  value_type
1126  computeFastAccessCoeff(int i, const ExprT1& expr1,
1127  const ExprT2& expr2) const {
1128  if (i == 0)
1129  return std::max(expr1.fastAccessCoeff(0), expr2.fastAccessCoeff(0));
1130  else
1131  return expr1.fastAccessCoeff(0) >= expr2.fastAccessCoeff(0) ?
1132  expr1.fastAccessoeff(i) : expr2.fastAccessCoeff(i);
1133  }
1134 
1135  }; // class MaxOp
1136 
1137  template <typename ExprT1>
1138  class MaxOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
1139  public:
1140 
1141  typedef typename ExprT1::value_type value_type;
1142  typedef typename ExprT1::scalar_type scalar_type;
1143  typedef typename ExprT1::base_expr_type base_expr_type;
1145 
1146  MaxOp(const ExprT1& expr1, const ExprT2 expr2) {}
1147 
1148  void allocateCache(int d) const {}
1149 
1150  value_type
1151  computeCoeff(int i, const ExprT1& expr1,
1152  const ExprT2& expr2) const {
1153  if (i == 0)
1154  return std::max(expr1.coeff(0), expr2.value());
1155  else
1156  return expr1.coeff(0) >= expr2.value() ? expr1.coeff(i) :
1157  value_type(0);
1158  }
1159 
1160  value_type
1161  computeFastAccessCoeff(int i, const ExprT1& expr1,
1162  const ExprT2& expr2) const {
1163  if (i == 0)
1164  return std::max(expr1.fastAccessCoeff(0), expr2.value());
1165  else
1166  return expr1.fastAccessCoeff(0) >= expr2.value() ?
1167  expr1.fastAccessCoeff(i) : value_type(0);
1168  }
1169 
1170  }; // class MaxOp
1171 
1172  template <typename ExprT2>
1173  class MaxOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
1174  public:
1175 
1176  typedef typename ExprT2::value_type value_type;
1177  typedef typename ExprT2::scalar_type scalar_type;
1178  typedef typename ExprT2::base_expr_type base_expr_type;
1180 
1181  MaxOp(const ExprT1& expr1, const ExprT2 expr2) {}
1182 
1183  void allocateCache(int d) const {}
1184 
1185  value_type
1186  computeCoeff(int i, const ExprT1& expr1,
1187  const ExprT2& expr2) const {
1188  if (i == 0)
1189  return std::max(expr1.value(), expr2.coeff(0));
1190  else
1191  return expr1.value() >= expr2.coeff(0) ? value_type(0) :
1192  expr2.coeff(i);
1193  }
1194 
1195  value_type
1196  computeFastAccessCoeff(int i, const ExprT1& expr1,
1197  const ExprT2& expr2) const {
1198  if (i == 0)
1199  return std::max(expr1.value(), expr2.fastAccessCoeff(0));
1200  else
1201  return expr1.value() >= expr2.fastAccessCoeff(0) ? value_type(0) :
1202  expr2.fastAccessCoeff(i);
1203  }
1204 
1205  }; // class MaxOp
1206 
1207  // ---------------------- Min operator -----------------------------
1208 
1209  template <typename ExprT1, typename ExprT2>
1210  class MinOp {
1211  public:
1212 
1213  typedef typename ExprT1::value_type value_type_1;
1214  typedef typename ExprT2::value_type value_type_2;
1215  typedef typename Sacado::Promote<value_type_1,
1217  typedef typename ExprT1::scalar_type scalar_type_1;
1218  typedef typename ExprT2::scalar_type scalar_type_2;
1219  typedef typename Sacado::Promote<scalar_type_1,
1221 
1222  typedef typename ExprT1::base_expr_type base_expr_type_1;
1223  typedef typename ExprT2::base_expr_type base_expr_type_2;
1224  typedef typename Sacado::Promote<base_expr_type_1,
1226 
1227  MinOp(const ExprT1& expr1, const ExprT2 expr2) {}
1228 
1229  void allocateCache(int d) const {}
1230 
1231  value_type
1232  computeCoeff(int i, const ExprT1& expr1,
1233  const ExprT2& expr2) const {
1234  if (i == 0)
1235  return min(expr1.coeff(0), expr2.coeff(0));
1236  else
1237  return expr1.coeff(0) <= expr2.coeff(0) ? expr1.coeff(i) :
1238  expr2.coeff(i);
1239  }
1240 
1241  value_type
1242  computeFastAccessCoeff(int i, const ExprT1& expr1,
1243  const ExprT2& expr2) const {
1244  if (i == 0)
1245  return min(expr1.fastAccessCoeff(0), expr2.fastAccessCoeff(0));
1246  else
1247  return expr1.fastAccessCoeff(0) <= expr2.fastAccessCoeff(0) ?
1248  expr1.fastAccessCoeff(i) : expr2.fastAccessCoeff(i);
1249  }
1250 
1251  }; // class MinOp
1252 
1253  template <typename ExprT1>
1254  class MinOp<ExprT1, ConstExpr<typename ExprT1::value_type> > {
1255  public:
1256 
1257  typedef typename ExprT1::value_type value_type;
1258  typedef typename ExprT1::scalar_type scalar_type;
1259  typedef typename ExprT1::base_expr_type base_expr_type;
1261 
1262  MinOp(const ExprT1& expr1, const ExprT2 expr2) {}
1263 
1264  void allocateCache(int d) const {}
1265 
1266  value_type
1267  computeCoeff(int i, const ExprT1& expr1,
1268  const ExprT2& expr2) const {
1269  if (i == 0)
1270  return std::min(expr1.coeff(0), expr2.value());
1271  else
1272  return expr1.coeff(0) <= expr2.value() ? expr1.coeff(i) :
1273  value_type(0);
1274  }
1275 
1276  value_type
1277  computeFastAccessCoeff(int i, const ExprT1& expr1,
1278  const ExprT2& expr2) const {
1279  if (i == 0)
1280  return std::min(expr1.fastAccessCoeff(0), expr2.value());
1281  else
1282  return expr1.fastAccessCoeff(0) <= expr2.value() ?
1283  expr1.fastAccessCoeff(i) : value_type(0);
1284  }
1285 
1286  }; // class MinOp
1287 
1288  template <typename ExprT2>
1289  class MinOp<ConstExpr<typename ExprT2::value_type>, ExprT2 > {
1290  public:
1291 
1292  typedef typename ExprT2::value_type value_type;
1293  typedef typename ExprT2::scalar_type scalar_type;
1294  typedef typename ExprT2::base_expr_type base_expr_type;
1296 
1297  MinOp(const ExprT1& expr1, const ExprT2 expr2) {}
1298 
1299  void allocateCache(int d) const {}
1300 
1301  value_type
1302  computeCoeff(int i, const ExprT1& expr1,
1303  const ExprT2& expr2) const {
1304  if (i == 0)
1305  return std::min(expr1.value(), expr2.coeff(0));
1306  else
1307  return expr1.value() <= expr2.coeff(0) ? value_type(0) :
1308  expr2.coeff(i);
1309  }
1310 
1311  value_type
1312  computeFastAccessCoeff(int i, const ExprT1& expr1,
1313  const ExprT2& expr2) const {
1314  if (i == 0)
1315  return std::min(expr1.value(), expr2.fastAccessCoeff(0));
1316  else
1317  return expr1.value() <= expr2.fastAccessCoeff(0) ? value_type(0) :
1318  expr2.fastAccessCoeff(i);
1319  }
1320 
1321  }; // class MinOp
1322 
1323  // ------------------------ quadrature function ---------------------------
1324 
1325  template <typename ExprT1, typename ExprT2>
1326  class ASinQuadOp {
1327  public:
1328 
1329  typedef typename ExprT1::value_type value_type_1;
1330  typedef typename ExprT2::value_type value_type_2;
1331  typedef typename Sacado::Promote<value_type_1,
1333 
1334  typedef typename ExprT1::scalar_type scalar_type_1;
1335  typedef typename ExprT2::scalar_type scalar_type_2;
1336  typedef typename Sacado::Promote<scalar_type_1,
1338 
1339  typedef typename ExprT1::base_expr_type base_expr_type_1;
1340  typedef typename ExprT2::base_expr_type base_expr_type_2;
1341  typedef typename Sacado::Promote<base_expr_type_1,
1343 
1344  ASinQuadOp(const ExprT1& expr1, const ExprT2& expr2) :
1345  c(),
1346  dc(-1)
1347  {}
1348 
1349  void allocateCache(int d) const {
1350  c.resize(d+1,value_type(0));
1351  }
1352 
1353  value_type computeCoeff(int i, const ExprT1& expr1,
1354  const ExprT2& expr2) const {
1355  if (static_cast<int>(i) > dc) {
1356  if (dc < 0) {
1357  c[0] = std::asin(expr1.fastAccessCoeff(0));
1358  dc = 0;
1359  }
1360  for (int k=dc+1; k<=i; k++) {
1361  for (int j=1; j<=k; j++)
1362  c[k] += value_type(j)*expr2.coeff(k-j)*expr1.coeff(j);
1363  c[k] /= value_type(k);
1364  }
1365  dc = i;
1366  }
1367  return c[i];
1368  }
1369 
1371  const ExprT1& expr1,
1372  const ExprT2& expr2) const
1373  {
1374  if (static_cast<int>(i) > dc) {
1375  if (dc < 0) {
1376  c[0] = std::asin(expr1.fastAccessCoeff(0));
1377  dc = 0;
1378  }
1379  for (int k=dc+1; k<=i; k++) {
1380  for (int j=1; j<=k; j++)
1381  c[k] += value_type(j)*expr2.fastAccessCoeff(k-j)*
1382  expr1.fastAccessCoeff(j);
1383  c[k] /= value_type(k);
1384  }
1385  dc = i;
1386  }
1387  return c[i];
1388  }
1389 
1390  protected:
1391 
1392  mutable std::valarray<value_type> c;
1393  mutable int dc;
1394 
1395  }; // class ASinQuadOp
1396 
1397  template <typename ExprT1, typename ExprT2>
1398  class ACosQuadOp {
1399  public:
1400 
1401  typedef typename ExprT1::value_type value_type_1;
1402  typedef typename ExprT2::value_type value_type_2;
1403  typedef typename Sacado::Promote<value_type_1,
1405 
1406  typedef typename ExprT1::scalar_type scalar_type_1;
1407  typedef typename ExprT2::scalar_type scalar_type_2;
1408  typedef typename Sacado::Promote<scalar_type_1,
1410 
1411  typedef typename ExprT1::base_expr_type base_expr_type_1;
1412  typedef typename ExprT2::base_expr_type base_expr_type_2;
1413  typedef typename Sacado::Promote<base_expr_type_1,
1415 
1416  ACosQuadOp(const ExprT1& expr1, const ExprT2& expr2) :
1417  c(),
1418  dc(-1)
1419  {}
1420 
1421  void allocateCache(int d) const {
1422  c.resize(d+1,value_type(0));
1423  }
1424 
1425  value_type computeCoeff(int i, const ExprT1& expr1,
1426  const ExprT2& expr2) const {
1427  if (static_cast<int>(i) > dc) {
1428  if (dc < 0) {
1429  c[0] = std::acos(expr1.fastAccessCoeff(0));
1430  dc = 0;
1431  }
1432  for (int k=dc+1; k<=i; k++) {
1433  for (int j=1; j<=k; j++)
1434  c[k] += value_type(j)*expr2.coeff(k-j)*expr1.coeff(j);
1435  c[k] /= value_type(k);
1436  }
1437  dc = i;
1438  }
1439  return c[i];
1440  }
1441 
1443  const ExprT1& expr1,
1444  const ExprT2& expr2) const
1445  {
1446  if (static_cast<int>(i) > dc) {
1447  if (dc < 0) {
1448  c[0] = std::acos(expr1.fastAccessCoeff(0));
1449  dc = 0;
1450  }
1451  for (int k=dc+1; k<=i; k++) {
1452  for (int j=1; j<=k; j++)
1453  c[k] += value_type(j)*expr2.fastAccessCoeff(k-j)*
1454  expr1.fastAccessCoeff(j);
1455  c[k] /= value_type(k);
1456  }
1457  dc = i;
1458  }
1459  return c[i];
1460  }
1461 
1462  protected:
1463 
1464  mutable std::valarray<value_type> c;
1465  mutable int dc;
1466 
1467  }; // class ACosQuadOp
1468 
1469  template <typename ExprT1, typename ExprT2>
1470  class ATanQuadOp {
1471  public:
1472 
1473  typedef typename ExprT1::value_type value_type_1;
1474  typedef typename ExprT2::value_type value_type_2;
1475  typedef typename Sacado::Promote<value_type_1,
1477 
1478  typedef typename ExprT1::scalar_type scalar_type_1;
1479  typedef typename ExprT2::scalar_type scalar_type_2;
1480  typedef typename Sacado::Promote<scalar_type_1,
1482 
1483  typedef typename ExprT1::base_expr_type base_expr_type_1;
1484  typedef typename ExprT2::base_expr_type base_expr_type_2;
1485  typedef typename Sacado::Promote<base_expr_type_1,
1487 
1488  ATanQuadOp(const ExprT1& expr1, const ExprT2& expr2) :
1489  c(),
1490  dc(-1)
1491  {}
1492 
1493  void allocateCache(int d) const {
1494  c.resize(d+1,value_type(0));
1495  }
1496 
1497  value_type computeCoeff(int i, const ExprT1& expr1,
1498  const ExprT2& expr2) const {
1499  if (static_cast<int>(i) > dc) {
1500  if (dc < 0) {
1501  c[0] = std::atan(expr1.fastAccessCoeff(0));
1502  dc = 0;
1503  }
1504  for (int k=dc+1; k<=i; k++) {
1505  for (int j=1; j<=k; j++)
1506  c[k] += value_type(j)*expr2.coeff(k-j)*expr1.coeff(j);
1507  c[k] /= value_type(k);
1508  }
1509  dc = i;
1510  }
1511  return c[i];
1512  }
1513 
1515  const ExprT1& expr1,
1516  const ExprT2& expr2) const
1517  {
1518  if (static_cast<int>(i) > dc) {
1519  if (dc < 0) {
1520  c[0] = std::atan(expr1.fastAccessCoeff(0));
1521  dc = 0;
1522  }
1523  for (int k=dc+1; k<=i; k++) {
1524  for (int j=1; j<=k; j++)
1525  c[k] += value_type(j)*expr2.fastAccessCoeff(k-j)*
1526  expr1.fastAccessCoeff(j);
1527  c[k] /= value_type(k);
1528  }
1529  dc = i;
1530  }
1531  return c[i];
1532  }
1533 
1534  protected:
1535 
1536  mutable std::valarray<value_type> c;
1537  mutable int dc;
1538 
1539  }; // class ATanQuadOp
1540 
1541  } // namespace Tay
1542 
1543 } // namespace Sacado
1544 
1545 #define TAYLOR_BINARYOP_MACRO(OPNAME,OP) \
1546 namespace Sacado { \
1547  namespace Tay { \
1548  template <typename T1, typename T2> \
1549  inline Expr< BinaryExpr< Expr<T1>, Expr<T2>, OP > > \
1550  OPNAME (const Expr<T1>& expr1, const Expr<T2>& expr2) \
1551  { \
1552  typedef BinaryExpr< Expr<T1>, Expr<T2>, OP > expr_t; \
1553  \
1554  return Expr<expr_t>(expr_t(expr1, expr2)); \
1555  } \
1556  \
1557  template <typename T> \
1558  inline Expr< BinaryExpr< ConstExpr<typename Expr<T>::value_type>, \
1559  Expr<T>, OP > > \
1560  OPNAME (const typename Expr<T>::value_type& c, \
1561  const Expr<T>& expr) \
1562  { \
1563  typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
1564  typedef BinaryExpr< ConstT, Expr<T>, OP > expr_t; \
1565  \
1566  return Expr<expr_t>(expr_t(ConstT(c), expr)); \
1567  } \
1568  \
1569  template <typename T> \
1570  inline Expr< BinaryExpr< Expr<T>, \
1571  ConstExpr<typename Expr<T>::value_type>, \
1572  OP > > \
1573  OPNAME (const Expr<T>& expr, \
1574  const typename Expr<T>::value_type& c) \
1575  { \
1576  typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
1577  typedef BinaryExpr< Expr<T>, ConstT, OP > expr_t; \
1578  \
1579  return Expr<expr_t>(expr_t(expr, ConstT(c))); \
1580  } \
1581  } \
1582 }
1583 
1588 
1589 #undef TAYLOR_BINARYOP_MACRO
1590 
1591  // The general definition of max/min works for Taylor variables too, except
1592  // we need to add a case when the argument types are different. This
1593  // can't conflict with the general definition, so we need to use
1594  // Substitution Failure Is Not An Error
1595 #include "Sacado_mpl_disable_if.hpp"
1596 
1597 #define TAYLOR_SFINAE_BINARYOP_MACRO(OPNAME,OP) \
1598 namespace Sacado { \
1599  namespace Tay { \
1600  template <typename T1, typename T2> \
1601  inline \
1602  typename \
1603  mpl::disable_if< std::is_same<T1,T2>, \
1604  Expr<BinaryExpr<Expr<T1>, Expr<T2>, OP> > >::type \
1605  OPNAME (const Expr<T1>& expr1, const Expr<T2>& expr2) \
1606  { \
1607  typedef BinaryExpr< Expr<T1>, Expr<T2>, OP > expr_t; \
1608  \
1609  return Expr<expr_t>(expr_t(expr1, expr2)); \
1610  } \
1611  \
1612  template <typename T> \
1613  inline Expr< BinaryExpr< ConstExpr<typename Expr<T>::value_type>, \
1614  Expr<T>, OP > > \
1615  OPNAME (const typename Expr<T>::value_type& c, \
1616  const Expr<T>& expr) \
1617  { \
1618  typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
1619  typedef BinaryExpr< ConstT, Expr<T>, OP > expr_t; \
1620  \
1621  return Expr<expr_t>(expr_t(ConstT(c), expr)); \
1622  } \
1623  \
1624  template <typename T> \
1625  inline Expr< BinaryExpr< Expr<T>, \
1626  ConstExpr<typename Expr<T>::value_type>, \
1627  OP > > \
1628  OPNAME (const Expr<T>& expr, \
1629  const typename Expr<T>::value_type& c) \
1630  { \
1631  typedef ConstExpr<typename Expr<T>::value_type> ConstT; \
1632  typedef BinaryExpr< Expr<T>, ConstT, OP > expr_t; \
1633  \
1634  return Expr<expr_t>(expr_t(expr, ConstT(c))); \
1635  } \
1636  } \
1637 }
1638 
1641 
1642 #undef TAYLOR_SFINAE_BINARYOP_MACRO
1643 
1644 namespace std {
1645  using Sacado::Tay::min;
1646  using Sacado::Tay::max;
1647 }
1648 
1649 namespace Sacado {
1650 
1651  namespace Tay {
1652 
1653  template <typename T1, typename T2>
1654  inline Expr< BinaryExpr< Expr<T1>, Expr<T2>, ASinQuadOp > >
1655  asin_quad (const Expr<T1>& expr1, const Expr<T2>& expr2)
1656  {
1657  typedef BinaryExpr< Expr<T1>, Expr<T2>, ASinQuadOp > expr_t;
1658 
1659  return Expr<expr_t>(expr_t(expr1, expr2));
1660  }
1661 
1662  template <typename T1, typename T2>
1663  inline Expr< BinaryExpr< Expr<T1>, Expr<T2>, ACosQuadOp > >
1664  acos_quad (const Expr<T1>& expr1, const Expr<T2>& expr2)
1665  {
1666  typedef BinaryExpr< Expr<T1>, Expr<T2>, ACosQuadOp > expr_t;
1667 
1668  return Expr<expr_t>(expr_t(expr1, expr2));
1669  }
1670 
1671  template <typename T1, typename T2>
1672  inline Expr< BinaryExpr< Expr<T1>, Expr<T2>, ATanQuadOp > >
1673  atan_quad (const Expr<T1>& expr1, const Expr<T2>& expr2)
1674  {
1675  typedef BinaryExpr< Expr<T1>, Expr<T2>, ATanQuadOp > expr_t;
1676 
1677  return Expr<expr_t>(expr_t(expr1, expr2));
1678  }
1679 
1680  template <typename ExprT1, typename ExprT2>
1681  struct PowExprType {
1685 
1687  };
1688 
1689  template <typename ExprT2>
1690  struct PowExprType< typename ExprT2::value_type, ExprT2 > {
1691  typedef typename ExprT2::value_type T1;
1694 
1696  };
1697 
1698  template <typename ExprT1>
1699  struct PowExprType<ExprT1,typename ExprT1::value_type> {
1700  typedef typename ExprT1::value_type T2;
1704 
1706  };
1707 
1708  template <typename T1, typename T2>
1709  inline typename PowExprType< Expr<T1>, Expr<T2> >::expr_type
1710  pow (const Expr<T1>& expr1, const Expr<T2>& expr2)
1711  {
1712  // pow(x,y) = exp(y*log(x))
1713  return exp(expr2*log(expr1));
1714  }
1715 
1716  template <typename T>
1717  inline typename PowExprType< typename Expr<T>::value_type, Expr<T> >::expr_type
1718  pow (const typename Expr<T>::value_type& c, const Expr<T>& expr)
1719  {
1720  // pow(x,y) = exp(y*log(x))
1721  return exp(expr*std::log(c));
1722  }
1723 
1724  template <typename T>
1725  inline typename PowExprType< Expr<T>, typename Expr<T>::value_type >::expr_type
1726  pow (const Expr<T>& expr, const typename Expr<T>::value_type& c)
1727  {
1728  // pow(x,y) = exp(y*log(x))
1729  return exp(c*log(expr));
1730  }
1731 
1732  template <typename T>
1733  struct Log10ExprType {
1738  };
1739 
1740  template <typename T>
1741  inline typename Log10ExprType<T>::expr_type
1742  log10 (const Expr<T>& expr)
1743  {
1744  // log10(x) = log(x)/log(10)
1745  return log(expr)/std::log(typename Expr<T>::value_type(10));
1746  }
1747 
1748  template <typename T>
1749  struct TanExprType {
1754  };
1755 
1756  template <typename T>
1757  inline typename TanExprType<T>::expr_type
1758  tan (const Expr<T>& expr)
1759  {
1760  // tan(x) = sin(x)/cos(x)
1761  return sin(expr)/cos(expr);
1762  }
1763 
1764  template <typename T>
1765  struct ASinExprType {
1773  };
1774 
1775  template <typename T>
1776  inline typename ASinExprType<T>::expr_type
1777  asin (const Expr<T>& expr)
1778  {
1779  typedef typename Expr<T>::value_type value_type;
1780 
1781  // asin(x) = integral of 1/sqrt(1-x*x)
1782  return asin_quad(expr, value_type(1)/sqrt(value_type(1)-expr*expr));
1783  }
1784 
1785  template <typename T>
1786  struct ACosExprType {
1794  };
1795 
1796  template <typename T>
1797  inline typename ACosExprType<T>::expr_type
1798  acos (const Expr<T>& expr)
1799  {
1800  typedef typename Expr<T>::value_type value_type;
1801 
1802  // acos(x) = integral of -1/sqrt(1-x*x)
1803  return acos_quad(expr, value_type(-1)/sqrt(value_type(1)-expr*expr));
1804  }
1805 
1806  template <typename T>
1807  struct ATanExprType {
1814  };
1815 
1816  template <typename T>
1817  inline typename ATanExprType<T>::expr_type
1818  atan (const Expr<T>& expr)
1819  {
1820  typedef typename Expr<T>::value_type value_type;
1821 
1822  // atan(x) = integral of 1/(1+x*x)
1823  return atan_quad(expr, value_type(1)/(value_type(1)+expr*expr));
1824  }
1825 
1826  template <typename T>
1827  struct TanhExprType {
1832  };
1833 
1834  template <typename T>
1835  inline typename TanhExprType<T>::expr_type
1836  tanh (const Expr<T>& expr)
1837  {
1838  // tanh(x) = sinh(x)/cosh(x)
1839  return sinh(expr)/cosh(expr);
1840  }
1841 
1842  } // namespace Tay
1843 
1844 } // namespace Sacado
1845 
1846 namespace std {
1847  using Sacado::Tay::pow;
1848  using Sacado::Tay::log10;
1849  using Sacado::Tay::tan;
1850  using Sacado::Tay::asin;
1851  using Sacado::Tay::acos;
1852  using Sacado::Tay::atan;
1853  using Sacado::Tay::tanh;
1854 }
1855 
1856 //-------------------------- Relational Operators -----------------------
1857 
1858 #define TAYLOR_RELOP_MACRO(OP) \
1859 namespace Sacado { \
1860  namespace Tay { \
1861  template <typename ExprT1, typename ExprT2> \
1862  inline bool \
1863  operator OP (const Expr<ExprT1>& expr1, \
1864  const Expr<ExprT2>& expr2) \
1865  { \
1866  return expr1.fastAccessCoeff(0) OP expr2.fastAccessCoeff(0); \
1867  } \
1868  \
1869  template <typename ExprT2> \
1870  inline bool \
1871  operator OP (const typename Expr<ExprT2>::value_type& a, \
1872  const Expr<ExprT2>& expr2) \
1873  { \
1874  return a OP expr2.fastAccessCoeff(0); \
1875  } \
1876  \
1877  template <typename ExprT1> \
1878  inline bool \
1879  operator OP (const Expr<ExprT1>& expr1, \
1880  const typename Expr<ExprT1>::value_type& b) \
1881  { \
1882  return expr1.fastAccessCoeff(0) OP b; \
1883  } \
1884  } \
1885 }
1886 
1893 TAYLOR_RELOP_MACRO(<<=)
1894 TAYLOR_RELOP_MACRO(>>=)
1897 
1898 #undef TAYLOR_RELOP_MACRO
1899 
1900 namespace Sacado {
1901 
1902  namespace Tay {
1903 
1904  template <typename ExprT>
1905  inline bool operator ! (const Expr<ExprT>& expr)
1906  {
1907  return ! expr.fastAccessCoeff(0);
1908  }
1909 
1910  } // namespace Tay
1911 
1912 } // namespace Sacado
1913 
1914 //-------------------------- Boolean Operators -----------------------
1915 namespace Sacado {
1916 
1917  namespace Tay {
1918 
1919  template <typename ExprT>
1920  bool toBool2(const Expr<ExprT>& x) {
1921  bool is_zero = true;
1922  for (int i=0; i<=x.degree(); i++)
1923  is_zero = is_zero && (x.coeff(i) == 0.0);
1924  return !is_zero;
1925  }
1926 
1927  } // namespace Tay
1928 
1929 } // namespace Sacado
1930 
1931 #define TAY_BOOL_MACRO(OP) \
1932 namespace Sacado { \
1933  namespace Tay { \
1934  template <typename ExprT1, typename ExprT2> \
1935  inline bool \
1936  operator OP (const Expr<ExprT1>& expr1, \
1937  const Expr<ExprT2>& expr2) \
1938  { \
1939  return toBool2(expr1) OP toBool2(expr2); \
1940  } \
1941  \
1942  template <typename ExprT2> \
1943  inline bool \
1944  operator OP (const typename Expr<ExprT2>::value_type& a, \
1945  const Expr<ExprT2>& expr2) \
1946  { \
1947  return a OP toBool2(expr2); \
1948  } \
1949  \
1950  template <typename ExprT1> \
1951  inline bool \
1952  operator OP (const Expr<ExprT1>& expr1, \
1953  const typename Expr<ExprT1>::value_type& b) \
1954  { \
1955  return toBool2(expr1) OP b; \
1956  } \
1957  } \
1958 }
1959 
1960 TAY_BOOL_MACRO(&&)
1961 TAY_BOOL_MACRO(||)
1962 
1963 #undef TAY_BOOL_MACRO
1964 
1965 //-------------------------- I/O Operators -----------------------
1966 
1967 namespace Sacado {
1968 
1969  namespace Tay {
1970 
1971  template <typename ExprT>
1972  std::ostream& operator << (std::ostream& os, const Expr<ExprT>& x) {
1973  os.setf(std::ios::fixed, std::ios::floatfield);
1974  os.width(12);
1975  os << "[";
1976 
1977  for (int i=0; i<=x.degree(); i++) {
1978  os.width(12);
1979  os << x.coeff(i);
1980  }
1981 
1982  os << "]";
1983  return os;
1984  }
1985 
1987  template <typename T>
1988  CacheTaylor<T> diff(const CacheTaylor<T>& x, int n = 1) {
1989  const int d = x.degree();
1990  if (n <= 0)
1991  return x;
1992  else if (n > d) {
1993  CacheTaylor<T> y(0);
1994  return y;
1995  }
1996  CacheTaylor<T> y(d-n, 0);
1997  int c = 1;
1998  for (int i=1; i<=n; ++i)
1999  c *= i;
2000  for (int i=n; i<=d; ++i) {
2001  y.fastAccessCoeff(i-n) = x.fastAccessCoeff(i) * T(c);
2002  c = (c / (i-n+1)) * (i+1);
2003  }
2004  return y;
2005  }
2006 
2007  } // namespace Tay
2008 
2009 } // namespace Sacado
2010 
2011 
2012 #endif // SACADO_TAY_CACHETAYLOROPS_HPP
MaxOp(const ExprT1 &expr1, const ExprT2 expr2)
UnaryExpr< Expr< T2 >, SqrtOp > T3
UnaryExpr< Expr< T >, CosOp > T2
BinaryExpr< ConstT, Expr< T3 >, DivisionOp > T4
ExprT::base_expr_type base_expr_type
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
Expr< BinaryExpr< Expr< T1 >, Expr< T2 >, ATanQuadOp > > atan_quad(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
AdditionOp(const ExprT1 &expr1, const ExprT2 expr2)
expr expr SinOp
#define TAYLOR_UNARYOP_MACRO(OPNAME, OP)
ConstExpr< typename Expr< T >::value_type > ConstT
expr2 expr1 expr2 expr2 c *expr2 c *expr1 c *expr2 c *expr1 MaxOp
ASinExprType< T >::expr_type asin(const Expr< T > &expr)
BinaryExpr< Expr< T1 >, ConstT, DivisionOp > T2
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
asin(expr.val())
cosh(expr.val())
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
bool operator!(const Expr< ExprT > &expr)
Constant expression template.
MultiplicationOp(const ExprT1 &expr1, const ExprT2 expr2)
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
ExprT1::base_expr_type base_expr_type_1
abs(expr.val())
Taylor< T > log(const Base< Taylor< T > > &a)
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< Expr< T >, Expr< T4 >, ACosQuadOp > T5
ExprT2::base_expr_type base_expr_type_2
Sacado::Promote< value_type_1, value_type_2 >::type value_type
Forward-mode AD class using dynamic memory allocation.
unsigned int degree() const
Return degree of polynomial.
value_type computeCoeff(int i, const ExprT &expr) const
BinaryExpr< ConstT, Expr< T3 >, DivisionOp > T4
ATanQuadOp(const ExprT1 &expr1, const ExprT2 &expr2)
ExprT1::base_expr_type base_expr_type_1
Expr< BinaryExpr< Expr< T1 >, Expr< T2 >, ACosQuadOp > > acos_quad(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
value_type computeCoeff(int i, const ExprT &expr) const
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
int degree() const
Returns degree of polynomial.
ExprT::value_type value_type
Typename of values.
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
std::valarray< value_type > s
TanhExprType< T >::expr_type tanh(const Expr< T > &expr)
ExprT1::base_expr_type base_expr_type_1
PowExprType< Expr< T1 >, Expr< T2 > >::expr_type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
TanExprType< T >::expr_type tan(const Expr< T > &expr)
Binary expression template.
expr expr CoshOp
UnaryExpr< Expr< T4 >, ExpOp > T5
ACosQuadOp(const ExprT1 &expr1, const ExprT2 &expr2)
bool toBool2(const Expr< ExprT > &x)
ExprT1::base_expr_type base_expr_type_1
ConstExpr< typename Expr< T >::value_type > ConstT
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< ExprT2, Expr< T3 >, MultiplicationOp > T4
value_type fastAccessCoeff(unsigned int i) const
Return degree i term of expression.
Unary expression template.
ConstExpr< typename Expr< T >::value_type > ConstT
DivisionOp(const ExprT1 &expr1, const ExprT2 expr2)
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
void allocateCache(int d) const
std::valarray< value_type > c
std::valarray< value_type > c
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
void allocateCache(int d) const
BinaryExpr< ConstT, Expr< T2 >, DivisionOp > T3
std::valarray< value_type > c
expr expr SqrtOp
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
ConstExpr< typename Expr< T >::value_type > ConstT
std::valarray< value_type > s
atan(expr.val())
value_type computeCoeff(int i, const ExprT &expr) const
std::valarray< value_type > c
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
ExprT2::base_expr_type base_expr_type_2
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Sacado::Promote< value_type_1, value_type_2 >::type value_type
value_type coeff(unsigned int i) const
Return degree i term of expression.
Sacado::Promote< value_type_1, value_type_2 >::type value_type
UnaryExpr< Expr< T2 >, SqrtOp > T3
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 MultiplicationOp
T & fastAccessCoeff(int i)
Returns degree i term without bounds checking.
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
ACosExprType< T >::expr_type acos(const Expr< T > &expr)
#define TAYLOR_RELOP_MACRO(OP)
std::valarray< value_type > c
void allocateCache(int d) const
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Taylor< T > sin(const Base< Taylor< T > > &a)
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
ExprT::base_expr_type base_expr_type
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< Expr< T1 >, Expr< T2 >, DivisionOp > T3
Sacado::Promote< value_type_1, value_type_2 >::type value_type
ExprT2::base_expr_type base_expr_type_2
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
#define T
Definition: Sacado_rad.hpp:553
ExprT2::base_expr_type base_expr_type_2
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
expr expr CosOp
BinaryExpr< Expr< T >, Expr< T3 >, ATanQuadOp > T4
Sacado::Promote< value_type_1, value_type_2 >::type value_type
value_type computeCoeff(int i, const ExprT &expr) const
CacheTaylor< T > diff(const CacheTaylor< T > &x, int n=1)
Compute Taylor series of n-th derivative of x.
ExprT::base_expr_type base_expr_type
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
UnaryExpr< Expr< T >, LogOp > T1
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Taylor< T > cos(const Base< Taylor< T > > &a)
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeCoeff(int i, const ExprT &expr) const
ExprT::base_expr_type base_expr_type
UnaryExpr< Expr< T >, CoshOp > T2
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
std::valarray< value_type > s
ExprT1::base_expr_type base_expr_type_1
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< Expr< T1 >, Expr< T2 >, DivisionOp > T3
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
void allocateCache(int d) const
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
ExprT::base_expr_type base_expr_type
UnaryExpr< Expr< T >, SinOp > T1
#define TAYLOR_BINARYOP_MACRO(OPNAME, OP)
Taylor< T > sinh(const Base< Taylor< T > > &a)
std::valarray< value_type > c
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Taylor< T > sqrt(const Base< Taylor< T > > &a)
ExprT1::scalar_type scalar_type_1
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
sqrt(expr.val())
value_type computeCoeff(int i, const ExprT &expr) const
Log10ExprType< T >::expr_type log10(const Expr< T > &expr)
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Taylor< T > max(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
sinh(expr.val())
BinaryExpr< Expr< T >, Expr< T4 >, ASinQuadOp > T5
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
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
std::valarray< value_type > c
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type coeff(unsigned int i) const
Return degree i term of expression.
ExprT2::base_expr_type base_expr_type_2
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
std::valarray< value_type > c
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< ConstT, Expr< T1 >, SubtractionOp > T2
BinaryExpr< Expr< T >, Expr< T >, MultiplicationOp > T1
ExprT1::base_expr_type base_expr_type_1
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type fastAccessCoeff(unsigned int i) const
Return degree i term of expression.
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
ExprT::base_expr_type base_expr_type
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
BinaryExpr< ConstT, Expr< T1 >, SubtractionOp > T2
ATanExprType< T >::expr_type atan(const Expr< T > &expr)
value_type computeCoeff(int i, const ExprT &expr) const
Sacado::Promote< value_type_1, value_type_2 >::type value_type
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
UnaryExpr< Expr< T >, SinhOp > T1
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
#define TAY_BOOL_MACRO(OP)
sin(expr.val())
Sacado::Promote< value_type_1, value_type_2 >::type value_type
ExprT2::scalar_type scalar_type_2
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
Taylor< T > exp(const Base< Taylor< T > > &a)
BinaryExpr< Expr< T >, Expr< T >, MultiplicationOp > T1
ExprT2::base_expr_type base_expr_type_2
std::valarray< value_type > c
SubtractionOp(const ExprT1 &expr1, const ExprT2 expr2)
value_type computeCoeff(int i, const ExprT &expr) const
std::valarray< value_type > c
log(expr.val())
#define TAYLOR_SFINAE_BINARYOP_MACRO(OPNAME, OP)
ASinQuadOp(const ExprT1 &expr1, const ExprT2 &expr2)
value_type computeCoeff(int i, const ExprT &expr) const
expr expr SinhOp
Sacado::Promote< value_type_1, value_type_2 >::type value_type
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
MinOp(const ExprT1 &expr1, const ExprT2 expr2)
Taylor< T > cosh(const Base< Taylor< T > > &a)
std::valarray< value_type > c
BinaryExpr< Expr< T >, Expr< T >, MultiplicationOp > T1
ExprT::base_expr_type base_expr_type
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
acos(expr.val())
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
ExprT::base_expr_type base_expr_type
ExprT2::scalar_type scalar_type_2
Sacado::Promote< value_type_1, value_type_2 >::type value_type
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
std::valarray< value_type > s
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
ExprT::scalar_type scalar_type
Taylor< T > min(const Base< Taylor< T > > &a, const Base< Taylor< T > > &b)
Wrapper for a generic expression template.
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
exp(expr.val())
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
ExprT::base_expr_type base_expr_type
ExprT2::base_expr_type base_expr_type_2
expr expr expr ExpOp
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
fabs(expr.val())
ExprT1::base_expr_type base_expr_type_1
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
value_type computeFastAccessCoeff(int i, const ExprT &expr) const
value_type computeCoeff(int i, const ExprT &expr) const
Expr< BinaryExpr< Expr< T1 >, Expr< T2 >, ASinQuadOp > > asin_quad(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
Sacado::Promote< base_expr_type_1, base_expr_type_2 >::type base_expr_type
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
int n
Sacado::Promote< scalar_type_1, scalar_type_2 >::type scalar_type
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
BinaryExpr< ExprT2, ConstExpr< T1 >, MultiplicationOp > T4
ExprT1::scalar_type scalar_type_1
value_type computeCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const
Base template specification for Promote.
cos(expr.val())
BinaryExpr< ConstExpr< T2 >, Expr< T3 >, MultiplicationOp > T4
const double y
BinaryExpr< ConstT, Expr< T1 >, AdditionOp > T2
value_type computeFastAccessCoeff(int i, const ExprT1 &expr1, const ExprT2 &expr2) const