$darkmode
Eigen-unsupported  5.0.1-dev
BesselFunctionsFunctors.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2016 Eugene Brevdo <ebrevdo@gmail.com>
5 // Copyright (C) 2016 Gael Guennebaud <gael.guennebaud@inria.fr>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_BESSELFUNCTIONS_FUNCTORS_H
12 #define EIGEN_BESSELFUNCTIONS_FUNCTORS_H
13 
14 // IWYU pragma: private
15 #include "./InternalHeaderCheck.h"
16 
17 namespace Eigen {
18 
19 namespace internal {
20 
26 template <typename Scalar>
27 struct scalar_bessel_i0_op {
28  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
29  using numext::bessel_i0;
30  return bessel_i0(x);
31  }
32  typedef typename packet_traits<Scalar>::type Packet;
33  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i0(x); }
34 };
35 template <typename Scalar>
36 struct functor_traits<scalar_bessel_i0_op<Scalar> > {
37  enum {
38  // On average, a Chebyshev polynomial of order N=20 is computed.
39  // The cost is N multiplications and 2N additions. We also add
40  // the cost of an additional exp over i0e.
41  Cost = 28 * NumTraits<Scalar>::MulCost + 48 * NumTraits<Scalar>::AddCost,
42  PacketAccess = packet_traits<Scalar>::HasBessel
43  };
44 };
45 
51 template <typename Scalar>
52 struct scalar_bessel_i0e_op {
53  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
54  using numext::bessel_i0e;
55  return bessel_i0e(x);
56  }
57  typedef typename packet_traits<Scalar>::type Packet;
58  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i0e(x); }
59 };
60 template <typename Scalar>
61 struct functor_traits<scalar_bessel_i0e_op<Scalar> > {
62  enum {
63  // On average, a Chebyshev polynomial of order N=20 is computed.
64  // The cost is N multiplications and 2N additions.
65  Cost = 20 * NumTraits<Scalar>::MulCost + 40 * NumTraits<Scalar>::AddCost,
66  PacketAccess = packet_traits<Scalar>::HasBessel
67  };
68 };
69 
75 template <typename Scalar>
76 struct scalar_bessel_i1_op {
77  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
78  using numext::bessel_i1;
79  return bessel_i1(x);
80  }
81  typedef typename packet_traits<Scalar>::type Packet;
82  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i1(x); }
83 };
84 template <typename Scalar>
85 struct functor_traits<scalar_bessel_i1_op<Scalar> > {
86  enum {
87  // On average, a Chebyshev polynomial of order N=20 is computed.
88  // The cost is N multiplications and 2N additions. We also add
89  // the cost of an additional exp over i1e.
90  Cost = 28 * NumTraits<Scalar>::MulCost + 48 * NumTraits<Scalar>::AddCost,
91  PacketAccess = packet_traits<Scalar>::HasBessel
92  };
93 };
94 
100 template <typename Scalar>
101 struct scalar_bessel_i1e_op {
102  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
103  using numext::bessel_i1e;
104  return bessel_i1e(x);
105  }
106  typedef typename packet_traits<Scalar>::type Packet;
107  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i1e(x); }
108 };
109 template <typename Scalar>
110 struct functor_traits<scalar_bessel_i1e_op<Scalar> > {
111  enum {
112  // On average, a Chebyshev polynomial of order N=20 is computed.
113  // The cost is N multiplications and 2N additions.
114  Cost = 20 * NumTraits<Scalar>::MulCost + 40 * NumTraits<Scalar>::AddCost,
115  PacketAccess = packet_traits<Scalar>::HasBessel
116  };
117 };
118 
124 template <typename Scalar>
125 struct scalar_bessel_j0_op {
126  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
127  using numext::bessel_j0;
128  return bessel_j0(x);
129  }
130  typedef typename packet_traits<Scalar>::type Packet;
131  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_j0(x); }
132 };
133 template <typename Scalar>
134 struct functor_traits<scalar_bessel_j0_op<Scalar> > {
135  enum {
136  // 6 polynomial of order ~N=8 is computed.
137  // The cost is N multiplications and N additions each, along with a
138  // sine, cosine and rsqrt cost.
139  Cost = 63 * NumTraits<Scalar>::MulCost + 48 * NumTraits<Scalar>::AddCost,
140  PacketAccess = packet_traits<Scalar>::HasBessel
141  };
142 };
143 
149 template <typename Scalar>
150 struct scalar_bessel_y0_op {
151  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
152  using numext::bessel_y0;
153  return bessel_y0(x);
154  }
155  typedef typename packet_traits<Scalar>::type Packet;
156  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_y0(x); }
157 };
158 template <typename Scalar>
159 struct functor_traits<scalar_bessel_y0_op<Scalar> > {
160  enum {
161  // 6 polynomial of order ~N=8 is computed.
162  // The cost is N multiplications and N additions each, along with a
163  // sine, cosine, rsqrt and j0 cost.
164  Cost = 126 * NumTraits<Scalar>::MulCost + 96 * NumTraits<Scalar>::AddCost,
165  PacketAccess = packet_traits<Scalar>::HasBessel
166  };
167 };
168 
174 template <typename Scalar>
175 struct scalar_bessel_j1_op {
176  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
177  using numext::bessel_j1;
178  return bessel_j1(x);
179  }
180  typedef typename packet_traits<Scalar>::type Packet;
181  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_j1(x); }
182 };
183 template <typename Scalar>
184 struct functor_traits<scalar_bessel_j1_op<Scalar> > {
185  enum {
186  // 6 polynomial of order ~N=8 is computed.
187  // The cost is N multiplications and N additions each, along with a
188  // sine, cosine and rsqrt cost.
189  Cost = 63 * NumTraits<Scalar>::MulCost + 48 * NumTraits<Scalar>::AddCost,
190  PacketAccess = packet_traits<Scalar>::HasBessel
191  };
192 };
193 
199 template <typename Scalar>
200 struct scalar_bessel_y1_op {
201  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
202  using numext::bessel_y1;
203  return bessel_y1(x);
204  }
205  typedef typename packet_traits<Scalar>::type Packet;
206  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_y1(x); }
207 };
208 template <typename Scalar>
209 struct functor_traits<scalar_bessel_y1_op<Scalar> > {
210  enum {
211  // 6 polynomial of order ~N=8 is computed.
212  // The cost is N multiplications and N additions each, along with a
213  // sine, cosine, rsqrt and j1 cost.
214  Cost = 126 * NumTraits<Scalar>::MulCost + 96 * NumTraits<Scalar>::AddCost,
215  PacketAccess = packet_traits<Scalar>::HasBessel
216  };
217 };
218 
224 template <typename Scalar>
225 struct scalar_bessel_k0_op {
226  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
227  using numext::bessel_k0;
228  return bessel_k0(x);
229  }
230  typedef typename packet_traits<Scalar>::type Packet;
231  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k0(x); }
232 };
233 template <typename Scalar>
234 struct functor_traits<scalar_bessel_k0_op<Scalar> > {
235  enum {
236  // On average, a Chebyshev polynomial of order N=10 is computed.
237  // The cost is N multiplications and 2N additions. In addition we compute
238  // i0, a log, exp and prsqrt and sin and cos.
239  Cost = 68 * NumTraits<Scalar>::MulCost + 88 * NumTraits<Scalar>::AddCost,
240  PacketAccess = packet_traits<Scalar>::HasBessel
241  };
242 };
243 
249 template <typename Scalar>
250 struct scalar_bessel_k0e_op {
251  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
252  using numext::bessel_k0e;
253  return bessel_k0e(x);
254  }
255  typedef typename packet_traits<Scalar>::type Packet;
256  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k0e(x); }
257 };
258 template <typename Scalar>
259 struct functor_traits<scalar_bessel_k0e_op<Scalar> > {
260  enum {
261  // On average, a Chebyshev polynomial of order N=10 is computed.
262  // The cost is N multiplications and 2N additions. In addition we compute
263  // i0, a log, exp and prsqrt and sin and cos.
264  Cost = 68 * NumTraits<Scalar>::MulCost + 88 * NumTraits<Scalar>::AddCost,
265  PacketAccess = packet_traits<Scalar>::HasBessel
266  };
267 };
268 
274 template <typename Scalar>
275 struct scalar_bessel_k1_op {
276  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
277  using numext::bessel_k1;
278  return bessel_k1(x);
279  }
280  typedef typename packet_traits<Scalar>::type Packet;
281  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k1(x); }
282 };
283 template <typename Scalar>
284 struct functor_traits<scalar_bessel_k1_op<Scalar> > {
285  enum {
286  // On average, a Chebyshev polynomial of order N=10 is computed.
287  // The cost is N multiplications and 2N additions. In addition we compute
288  // i1, a log, exp and prsqrt and sin and cos.
289  Cost = 68 * NumTraits<Scalar>::MulCost + 88 * NumTraits<Scalar>::AddCost,
290  PacketAccess = packet_traits<Scalar>::HasBessel
291  };
292 };
293 
299 template <typename Scalar>
300 struct scalar_bessel_k1e_op {
301  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
302  using numext::bessel_k1e;
303  return bessel_k1e(x);
304  }
305  typedef typename packet_traits<Scalar>::type Packet;
306  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k1e(x); }
307 };
308 template <typename Scalar>
309 struct functor_traits<scalar_bessel_k1e_op<Scalar> > {
310  enum {
311  // On average, a Chebyshev polynomial of order N=10 is computed.
312  // The cost is N multiplications and 2N additions. In addition we compute
313  // i1, a log, exp and prsqrt and sin and cos.
314  Cost = 68 * NumTraits<Scalar>::MulCost + 88 * NumTraits<Scalar>::AddCost,
315  PacketAccess = packet_traits<Scalar>::HasBessel
316  };
317 };
318 
319 } // end namespace internal
320 
321 } // end namespace Eigen
322 
323 #endif // EIGEN_BESSELFUNCTIONS_FUNCTORS_H
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i0_op< typename Derived::Scalar >, const Derived > bessel_i0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:34
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_j0_op< typename Derived::Scalar >, const Derived > bessel_j0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:206
Namespace containing all symbols from the Eigen library.
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_j1_op< typename Derived::Scalar >, const Derived > bessel_j1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:248
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_y0_op< typename Derived::Scalar >, const Derived > bessel_y0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:227
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k1e_op< typename Derived::Scalar >, const Derived > bessel_k1e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:185
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k0_op< typename Derived::Scalar >, const Derived > bessel_k0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:120
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k1_op< typename Derived::Scalar >, const Derived > bessel_k1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:163
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i1e_op< typename Derived::Scalar >, const Derived > bessel_i1e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:99
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k0e_op< typename Derived::Scalar >, const Derived > bessel_k0e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:142
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i0e_op< typename Derived::Scalar >, const Derived > bessel_i0e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:56
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_y1_op< typename Derived::Scalar >, const Derived > bessel_y1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:269
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i1_op< typename Derived::Scalar >, const Derived > bessel_i1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:77