1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_STEM_FUNCTION
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STEM_FUNCTION
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup MatrixFunctions_Module
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Stem functions corresponding to standard mathematical functions.
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar>
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass StdStemFunctions
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief The exponential function (and its derivatives). */
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static Scalar exp(Scalar x, int)
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return std::exp(x);
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief Cosine (and its derivatives). */
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static Scalar cos(Scalar x, int n)
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar res;
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      switch (n % 4) {
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 0:
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::cos(x);
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 1:
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = -std::sin(x);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 2:
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = -std::cos(x);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 3:
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::sin(x);
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return res;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief Sine (and its derivatives). */
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static Scalar sin(Scalar x, int n)
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar res;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      switch (n % 4) {
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 0:
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::sin(x);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 1:
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::cos(x);
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 2:
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = -std::sin(x);
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 3:
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = -std::cos(x);
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return res;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief Hyperbolic cosine (and its derivatives). */
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static Scalar cosh(Scalar x, int n)
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar res;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      switch (n % 2) {
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 0:
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::cosh(x);
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 1:
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::sinh(x);
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return res;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief Hyperbolic sine (and its derivatives). */
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static Scalar sinh(Scalar x, int n)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar res;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      switch (n % 2) {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 0:
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::sinh(x);
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      case 1:
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	res = std::cosh(x);
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath	break;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return res;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; // end of class StdStemFunctions
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_STEM_FUNCTION
106