MOAB  4.9.3pre
UnaryFunctors.h
Go to the documentation of this file.
00001 // This file is part of Eigen, a lightweight C++ template library
00002 // for linear algebra.
00003 //
00004 // Copyright (C) 2008-2010 Gael Guennebaud <[email protected]>
00005 //
00006 // This Source Code Form is subject to the terms of the Mozilla
00007 // Public License v. 2.0. If a copy of the MPL was not distributed
00008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
00009 
00010 #ifndef EIGEN_UNARY_FUNCTORS_H
00011 #define EIGEN_UNARY_FUNCTORS_H
00012 
00013 namespace Eigen {
00014 
00015 namespace internal {
00016 
00022 template<typename Scalar> struct scalar_opposite_op {
00023   EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
00024   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
00025   template<typename Packet>
00026   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
00027   { return internal::pnegate(a); }
00028 };
00029 template<typename Scalar>
00030 struct functor_traits<scalar_opposite_op<Scalar> >
00031 { enum {
00032     Cost = NumTraits<Scalar>::AddCost,
00033     PacketAccess = packet_traits<Scalar>::HasNegate };
00034 };
00035 
00041 template<typename Scalar> struct scalar_abs_op {
00042   EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
00043   typedef typename NumTraits<Scalar>::Real result_type;
00044   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }
00045   template<typename Packet>
00046   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
00047   { return internal::pabs(a); }
00048 };
00049 template<typename Scalar>
00050 struct functor_traits<scalar_abs_op<Scalar> >
00051 {
00052   enum {
00053     Cost = NumTraits<Scalar>::AddCost,
00054     PacketAccess = packet_traits<Scalar>::HasAbs
00055   };
00056 };
00057 
00063 template<typename Scalar> struct scalar_score_coeff_op : scalar_abs_op<Scalar>
00064 {
00065   typedef void Score_is_abs;
00066 };
00067 template<typename Scalar>
00068 struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {};
00069 
00070 /* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor.  */
00071 template<typename Scalar, typename=void> struct abs_knowing_score
00072 {
00073   EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
00074   typedef typename NumTraits<Scalar>::Real result_type;
00075   template<typename Score>
00076   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&) const { using std::abs; return abs(a); }
00077 };
00078 template<typename Scalar> struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs>
00079 {
00080   EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
00081   typedef typename NumTraits<Scalar>::Real result_type;
00082   template<typename Scal>
00083   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a) const { return a; }
00084 };
00085 
00091 template<typename Scalar> struct scalar_abs2_op {
00092   EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
00093   typedef typename NumTraits<Scalar>::Real result_type;
00094   EIGEN_DEVICE_FUNC
00095   EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }
00096   template<typename Packet>
00097   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
00098   { return internal::pmul(a,a); }
00099 };
00100 template<typename Scalar>
00101 struct functor_traits<scalar_abs2_op<Scalar> >
00102 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
00103 
00109 template<typename Scalar> struct scalar_conjugate_op {
00110   EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
00111   EIGEN_DEVICE_FUNC
00112   EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); }
00113   template<typename Packet>
00114   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
00115 };
00116 template<typename Scalar>
00117 struct functor_traits<scalar_conjugate_op<Scalar> >
00118 {
00119   enum {
00120     Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
00121     PacketAccess = packet_traits<Scalar>::HasConj
00122   };
00123 };
00124 
00130 template<typename Scalar> struct scalar_arg_op {
00131   EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op)
00132   typedef typename NumTraits<Scalar>::Real result_type;
00133   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using numext::arg; return arg(a); }
00134   template<typename Packet>
00135   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
00136   { return internal::parg(a); }
00137 };
00138 template<typename Scalar>
00139 struct functor_traits<scalar_arg_op<Scalar> >
00140 {
00141   enum {
00142     Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
00143     PacketAccess = packet_traits<Scalar>::HasArg
00144   };
00145 };
00151 template<typename Scalar, typename NewType>
00152 struct scalar_cast_op {
00153   EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
00154   typedef NewType result_type;
00155   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
00156 };
00157 template<typename Scalar, typename NewType>
00158 struct functor_traits<scalar_cast_op<Scalar,NewType> >
00159 { enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
00160 
00166 template<typename Scalar>
00167 struct scalar_real_op {
00168   EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
00169   typedef typename NumTraits<Scalar>::Real result_type;
00170   EIGEN_DEVICE_FUNC
00171   EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }
00172 };
00173 template<typename Scalar>
00174 struct functor_traits<scalar_real_op<Scalar> >
00175 { enum { Cost = 0, PacketAccess = false }; };
00176 
00182 template<typename Scalar>
00183 struct scalar_imag_op {
00184   EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
00185   typedef typename NumTraits<Scalar>::Real result_type;
00186   EIGEN_DEVICE_FUNC
00187   EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }
00188 };
00189 template<typename Scalar>
00190 struct functor_traits<scalar_imag_op<Scalar> >
00191 { enum { Cost = 0, PacketAccess = false }; };
00192 
00198 template<typename Scalar>
00199 struct scalar_real_ref_op {
00200   EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
00201   typedef typename NumTraits<Scalar>::Real result_type;
00202   EIGEN_DEVICE_FUNC
00203   EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }
00204 };
00205 template<typename Scalar>
00206 struct functor_traits<scalar_real_ref_op<Scalar> >
00207 { enum { Cost = 0, PacketAccess = false }; };
00208 
00214 template<typename Scalar>
00215 struct scalar_imag_ref_op {
00216   EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
00217   typedef typename NumTraits<Scalar>::Real result_type;
00218   EIGEN_DEVICE_FUNC
00219   EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }
00220 };
00221 template<typename Scalar>
00222 struct functor_traits<scalar_imag_ref_op<Scalar> >
00223 { enum { Cost = 0, PacketAccess = false }; };
00224 
00231 template<typename Scalar> struct scalar_exp_op {
00232   EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
00233   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); }
00234   template <typename Packet>
00235   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
00236 };
00237 template<typename Scalar>
00238 struct functor_traits<scalar_exp_op<Scalar> >
00239 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };
00240 
00247 template<typename Scalar> struct scalar_log_op {
00248   EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
00249   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); }
00250   template <typename Packet>
00251   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
00252 };
00253 template<typename Scalar>
00254 struct functor_traits<scalar_log_op<Scalar> >
00255 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
00256 
00263 template<typename Scalar> struct scalar_log10_op {
00264   EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
00265   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::log10; return log10(a); }
00266   template <typename Packet>
00267   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); }
00268 };
00269 template<typename Scalar>
00270 struct functor_traits<scalar_log10_op<Scalar> >
00271 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
00272 
00277 template<typename Scalar> struct scalar_sqrt_op {
00278   EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
00279   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); }
00280   template <typename Packet>
00281   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
00282 };
00283 template<typename Scalar>
00284 struct functor_traits<scalar_sqrt_op<Scalar> >
00285 { enum {
00286     Cost = 5 * NumTraits<Scalar>::MulCost,
00287     PacketAccess = packet_traits<Scalar>::HasSqrt
00288   };
00289 };
00290 
00295 template<typename Scalar> struct scalar_rsqrt_op {
00296   EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
00297   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return Scalar(1)/sqrt(a); }
00298   template <typename Packet>
00299   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); }
00300 };
00301 
00302 template<typename Scalar>
00303 struct functor_traits<scalar_rsqrt_op<Scalar> >
00304 { enum {
00305     Cost = 5 * NumTraits<Scalar>::MulCost,
00306     PacketAccess = packet_traits<Scalar>::HasRsqrt
00307   };
00308 };
00309 
00314 template<typename Scalar> struct scalar_cos_op {
00315   EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
00316   EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); }
00317   template <typename Packet>
00318   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
00319 };
00320 template<typename Scalar>
00321 struct functor_traits<scalar_cos_op<Scalar> >
00322 {
00323   enum {
00324     Cost = 5 * NumTraits<Scalar>::MulCost,
00325     PacketAccess = packet_traits<Scalar>::HasCos
00326   };
00327 };
00328 
00333 template<typename Scalar> struct scalar_sin_op {
00334   EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
00335   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); }
00336   template <typename Packet>
00337   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
00338 };
00339 template<typename Scalar>
00340 struct functor_traits<scalar_sin_op<Scalar> >
00341 {
00342   enum {
00343     Cost = 5 * NumTraits<Scalar>::MulCost,
00344     PacketAccess = packet_traits<Scalar>::HasSin
00345   };
00346 };
00347 
00348 
00353 template<typename Scalar> struct scalar_tan_op {
00354   EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
00355   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); }
00356   template <typename Packet>
00357   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
00358 };
00359 template<typename Scalar>
00360 struct functor_traits<scalar_tan_op<Scalar> >
00361 {
00362   enum {
00363     Cost = 5 * NumTraits<Scalar>::MulCost,
00364     PacketAccess = packet_traits<Scalar>::HasTan
00365   };
00366 };
00367 
00372 template<typename Scalar> struct scalar_acos_op {
00373   EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
00374   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); }
00375   template <typename Packet>
00376   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
00377 };
00378 template<typename Scalar>
00379 struct functor_traits<scalar_acos_op<Scalar> >
00380 {
00381   enum {
00382     Cost = 5 * NumTraits<Scalar>::MulCost,
00383     PacketAccess = packet_traits<Scalar>::HasACos
00384   };
00385 };
00386 
00391 template<typename Scalar> struct scalar_asin_op {
00392   EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
00393   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); }
00394   template <typename Packet>
00395   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
00396 };
00397 template<typename Scalar>
00398 struct functor_traits<scalar_asin_op<Scalar> >
00399 {
00400   enum {
00401     Cost = 5 * NumTraits<Scalar>::MulCost,
00402     PacketAccess = packet_traits<Scalar>::HasASin
00403   };
00404 };
00405 
00406 
00412 template<typename Scalar> struct scalar_lgamma_op {
00413   EIGEN_EMPTY_STRUCT_CTOR(scalar_lgamma_op)
00414   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00415     using numext::lgamma; return lgamma(a);
00416   }
00417   typedef typename packet_traits<Scalar>::type Packet;
00418   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plgamma(a); }
00419 };
00420 template<typename Scalar>
00421 struct functor_traits<scalar_lgamma_op<Scalar> >
00422 {
00423   enum {
00424     // Guesstimate
00425     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00426     PacketAccess = packet_traits<Scalar>::HasLGamma
00427   };
00428 };
00429 
00434 template<typename Scalar> struct scalar_digamma_op {
00435   EIGEN_EMPTY_STRUCT_CTOR(scalar_digamma_op)
00436   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00437     using numext::digamma; return digamma(a);
00438   }
00439   typedef typename packet_traits<Scalar>::type Packet;
00440   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pdigamma(a); }
00441 };
00442 template<typename Scalar>
00443 struct functor_traits<scalar_digamma_op<Scalar> >
00444 {
00445   enum {
00446     // Guesstimate
00447     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00448     PacketAccess = packet_traits<Scalar>::HasDiGamma
00449   };
00450 };
00451 
00457 template<typename Scalar> struct scalar_erf_op {
00458   EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_op)
00459   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00460     using numext::erf; return erf(a);
00461   }
00462   typedef typename packet_traits<Scalar>::type Packet;
00463   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::perf(a); }
00464 };
00465 template<typename Scalar>
00466 struct functor_traits<scalar_erf_op<Scalar> >
00467 {
00468   enum {
00469     // Guesstimate
00470     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00471     PacketAccess = packet_traits<Scalar>::HasErf
00472   };
00473 };
00474 
00480 template<typename Scalar> struct scalar_erfc_op {
00481   EIGEN_EMPTY_STRUCT_CTOR(scalar_erfc_op)
00482   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00483     using numext::erfc; return erfc(a);
00484   }
00485   typedef typename packet_traits<Scalar>::type Packet;
00486   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::perfc(a); }
00487 };
00488 template<typename Scalar>
00489 struct functor_traits<scalar_erfc_op<Scalar> >
00490 {
00491   enum {
00492     // Guesstimate
00493     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00494     PacketAccess = packet_traits<Scalar>::HasErfc
00495   };
00496 };
00497 
00498 
00503 template<typename Scalar> struct scalar_atan_op {
00504   EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
00505   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::atan; return atan(a); }
00506   template <typename Packet>
00507   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::patan(a); }
00508 };
00509 template<typename Scalar>
00510 struct functor_traits<scalar_atan_op<Scalar> >
00511 {
00512   enum {
00513     Cost = 5 * NumTraits<Scalar>::MulCost,
00514     PacketAccess = packet_traits<Scalar>::HasATan
00515   };
00516 };
00517 
00518 
00523 template<typename Scalar> struct scalar_tanh_op {
00524   EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
00525   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tanh; return tanh(a); }
00526   template <typename Packet>
00527   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptanh(a); }
00528 };
00529 template<typename Scalar>
00530 struct functor_traits<scalar_tanh_op<Scalar> >
00531 {
00532   enum {
00533     Cost = 5 * NumTraits<Scalar>::MulCost,
00534     PacketAccess = packet_traits<Scalar>::HasTanh
00535   };
00536 };
00537 
00542 template<typename Scalar> struct scalar_sinh_op {
00543   EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
00544   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sinh; return sinh(a); }
00545   template <typename Packet>
00546   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); }
00547 };
00548 template<typename Scalar>
00549 struct functor_traits<scalar_sinh_op<Scalar> >
00550 {
00551   enum {
00552     Cost = 5 * NumTraits<Scalar>::MulCost,
00553     PacketAccess = packet_traits<Scalar>::HasSinh
00554   };
00555 };
00556 
00561 template<typename Scalar> struct scalar_cosh_op {
00562   EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
00563   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::cosh; return cosh(a); }
00564   template <typename Packet>
00565   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); }
00566 };
00567 template<typename Scalar>
00568 struct functor_traits<scalar_cosh_op<Scalar> >
00569 {
00570   enum {
00571     Cost = 5 * NumTraits<Scalar>::MulCost,
00572     PacketAccess = packet_traits<Scalar>::HasCosh
00573   };
00574 };
00575 
00580 template<typename Scalar>
00581 struct scalar_inverse_op {
00582   EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
00583   EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
00584   template<typename Packet>
00585   EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
00586   { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
00587 };
00588 template<typename Scalar>
00589 struct functor_traits<scalar_inverse_op<Scalar> >
00590 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
00591 
00596 template<typename Scalar>
00597 struct scalar_square_op {
00598   EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
00599   EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; }
00600   template<typename Packet>
00601   EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
00602   { return internal::pmul(a,a); }
00603 };
00604 template<typename Scalar>
00605 struct functor_traits<scalar_square_op<Scalar> >
00606 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
00607 
00612 template<typename Scalar>
00613 struct scalar_cube_op {
00614   EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
00615   EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; }
00616   template<typename Packet>
00617   EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
00618   { return internal::pmul(a,pmul(a,a)); }
00619 };
00620 template<typename Scalar>
00621 struct functor_traits<scalar_cube_op<Scalar> >
00622 { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
00623 
00628 template<typename Scalar> struct scalar_round_op {
00629   EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
00630   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); }
00631   template <typename Packet>
00632   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); }
00633 };
00634 template<typename Scalar>
00635 struct functor_traits<scalar_round_op<Scalar> >
00636 {
00637   enum {
00638     Cost = NumTraits<Scalar>::MulCost,
00639     PacketAccess = packet_traits<Scalar>::HasRound
00640   };
00641 };
00642 
00647 template<typename Scalar> struct scalar_floor_op {
00648   EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
00649   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(a); }
00650   template <typename Packet>
00651   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); }
00652 };
00653 template<typename Scalar>
00654 struct functor_traits<scalar_floor_op<Scalar> >
00655 {
00656   enum {
00657     Cost = NumTraits<Scalar>::MulCost,
00658     PacketAccess = packet_traits<Scalar>::HasFloor
00659   };
00660 };
00661 
00666 template<typename Scalar> struct scalar_ceil_op {
00667   EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
00668   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(a); }
00669   template <typename Packet>
00670   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); }
00671 };
00672 template<typename Scalar>
00673 struct functor_traits<scalar_ceil_op<Scalar> >
00674 {
00675   enum {
00676     Cost = NumTraits<Scalar>::MulCost,
00677     PacketAccess = packet_traits<Scalar>::HasCeil
00678   };
00679 };
00680 
00685 template<typename Scalar> struct scalar_isnan_op {
00686   EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
00687   typedef bool result_type;
00688   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isnan)(a); }
00689 };
00690 template<typename Scalar>
00691 struct functor_traits<scalar_isnan_op<Scalar> >
00692 {
00693   enum {
00694     Cost = NumTraits<Scalar>::MulCost,
00695     PacketAccess = false
00696   };
00697 };
00698 
00703 template<typename Scalar> struct scalar_isinf_op {
00704   EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
00705   typedef bool result_type;
00706   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isinf)(a); }
00707 };
00708 template<typename Scalar>
00709 struct functor_traits<scalar_isinf_op<Scalar> >
00710 {
00711   enum {
00712     Cost = NumTraits<Scalar>::MulCost,
00713     PacketAccess = false
00714   };
00715 };
00716 
00721 template<typename Scalar> struct scalar_isfinite_op {
00722   EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
00723   typedef bool result_type;
00724   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isfinite)(a); }
00725 };
00726 template<typename Scalar>
00727 struct functor_traits<scalar_isfinite_op<Scalar> >
00728 {
00729   enum {
00730     Cost = NumTraits<Scalar>::MulCost,
00731     PacketAccess = false
00732   };
00733 };
00734 
00740 template<typename Scalar> struct scalar_boolean_not_op {
00741   EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
00742   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; }
00743 };
00744 template<typename Scalar>
00745 struct functor_traits<scalar_boolean_not_op<Scalar> > {
00746   enum {
00747     Cost = NumTraits<bool>::AddCost,
00748     PacketAccess = false
00749   };
00750 };
00751 
00756 template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) > struct scalar_sign_op;
00757 template<typename Scalar>
00758 struct scalar_sign_op<Scalar,false> {
00759   EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
00760   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
00761   {
00762       return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
00763   }
00764   //TODO
00765   //template <typename Packet>
00766   //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
00767 };
00768 template<typename Scalar>
00769 struct scalar_sign_op<Scalar,true> {
00770   EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
00771   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
00772   {
00773     using std::abs;
00774     typedef typename NumTraits<Scalar>::Real real_type;
00775     real_type aa = abs(a);
00776     if (aa==0)
00777       return Scalar(0);
00778     aa = 1./aa;
00779     return Scalar(real(a)*aa, imag(a)*aa );
00780   }
00781   //TODO
00782   //template <typename Packet>
00783   //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
00784 };
00785 template<typename Scalar>
00786 struct functor_traits<scalar_sign_op<Scalar> >
00787 { enum {
00788     Cost = 
00789         NumTraits<Scalar>::IsComplex
00790         ? ( 8*NumTraits<Scalar>::MulCost  ) // roughly
00791         : ( 3*NumTraits<Scalar>::AddCost),
00792     PacketAccess = packet_traits<Scalar>::HasSign
00793   };
00794 };
00795 
00796 } // end namespace internal
00797 
00798 } // end namespace Eigen
00799 
00800 #endif // EIGEN_FUNCTORS_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines