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