MOAB
4.9.3pre
|
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