Eigen-unsupported  5.0.1-dev+284dcc12
 
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
11#ifndef EIGEN_BESSELFUNCTIONS_FUNCTORS_H
12#define EIGEN_BESSELFUNCTIONS_FUNCTORS_H
13
14// IWYU pragma: private
15#include "./InternalHeaderCheck.h"
16
17namespace Eigen {
18
19namespace internal {
20
26template <typename Scalar>
27struct 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};
35template <typename Scalar>
36struct 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
51template <typename Scalar>
52struct 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};
60template <typename Scalar>
61struct 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
75template <typename Scalar>
76struct 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};
84template <typename Scalar>
85struct 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
100template <typename Scalar>
101struct 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};
109template <typename Scalar>
110struct 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
124template <typename Scalar>
125struct 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};
133template <typename Scalar>
134struct 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
149template <typename Scalar>
150struct 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};
158template <typename Scalar>
159struct 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
174template <typename Scalar>
175struct 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};
183template <typename Scalar>
184struct 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
199template <typename Scalar>
200struct 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};
208template <typename Scalar>
209struct 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
224template <typename Scalar>
225struct 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};
233template <typename Scalar>
234struct 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
249template <typename Scalar>
250struct 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};
258template <typename Scalar>
259struct 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
274template <typename Scalar>
275struct 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};
283template <typename Scalar>
284struct 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
299template <typename Scalar>
300struct 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};
308template <typename Scalar>
309struct 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
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:269
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_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_i1_op< typename Derived::Scalar >, const Derived > bessel_i1(const Eigen::ArrayBase< Derived > &x)
Definition BesselFunctionsArrayAPI.h:77
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_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_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_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_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_j0_op< typename Derived::Scalar >, const Derived > bessel_j0(const Eigen::ArrayBase< Derived > &x)
Definition BesselFunctionsArrayAPI.h:206