10 #ifndef EIGEN_UNARY_FUNCTORS_H
11 #define EIGEN_UNARY_FUNCTORS_H
22 template<
typename Scalar>
struct scalar_opposite_op {
23 EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
24 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return -a; }
25 template<
typename Packet>
26 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const
27 {
return internal::pnegate(a); }
29 template<
typename Scalar>
30 struct functor_traits<scalar_opposite_op<Scalar> >
32 Cost = NumTraits<Scalar>::AddCost,
33 PacketAccess = packet_traits<Scalar>::HasNegate };
41 template<
typename Scalar>
struct scalar_abs_op {
42 EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
43 typedef typename NumTraits<Scalar>::Real result_type;
44 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a)
const {
using std::abs;
return abs(a); }
45 template<
typename Packet>
46 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const
47 {
return internal::pabs(a); }
49 template<
typename Scalar>
50 struct functor_traits<scalar_abs_op<Scalar> >
53 Cost = NumTraits<Scalar>::AddCost,
54 PacketAccess = packet_traits<Scalar>::HasAbs
63 template<
typename Scalar>
struct scalar_score_coeff_op : scalar_abs_op<Scalar>
65 typedef void Score_is_abs;
67 template<
typename Scalar>
68 struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {};
71 template<
typename Scalar,
typename=
void>
struct abs_knowing_score
73 EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
74 typedef typename NumTraits<Scalar>::Real result_type;
75 template<typename Score>
76 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&)
const {
using std::abs;
return abs(a); }
78 template<
typename Scalar>
struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs>
80 EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
81 typedef typename NumTraits<Scalar>::Real result_type;
82 template<typename Scal>
83 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a)
const {
return a; }
91 template<
typename Scalar>
struct scalar_abs2_op {
92 EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
93 typedef typename NumTraits<Scalar>::Real result_type;
95 EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a)
const {
return numext::abs2(a); }
96 template<
typename Packet>
97 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const
98 {
return internal::pmul(a,a); }
100 template<
typename Scalar>
101 struct functor_traits<scalar_abs2_op<Scalar> >
102 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
109 template<
typename Scalar>
struct scalar_conjugate_op {
110 EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
112 EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
using numext::conj;
return conj(a); }
113 template<
typename Packet>
114 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
return internal::pconj(a); }
116 template<
typename Scalar>
117 struct functor_traits<scalar_conjugate_op<Scalar> >
120 Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
121 PacketAccess = packet_traits<Scalar>::HasConj
130 template<
typename Scalar>
struct scalar_arg_op {
131 EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op)
132 typedef typename NumTraits<Scalar>::Real result_type;
133 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a)
const {
using numext::arg;
return arg(a); }
134 template<
typename Packet>
135 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const
136 {
return internal::parg(a); }
138 template<
typename Scalar>
139 struct functor_traits<scalar_arg_op<Scalar> >
142 Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
143 PacketAccess = packet_traits<Scalar>::HasArg
151 template<
typename Scalar,
typename NewType>
152 struct scalar_cast_op {
153 EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
154 typedef NewType result_type;
155 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a)
const {
return cast<Scalar, NewType>(a); }
157 template<
typename Scalar,
typename NewType>
158 struct functor_traits<scalar_cast_op<Scalar,NewType> >
159 {
enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess =
false }; };
166 template<
typename Scalar>
167 struct scalar_real_op {
168 EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
169 typedef typename NumTraits<Scalar>::Real result_type;
171 EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return numext::real(a); }
173 template<
typename Scalar>
174 struct functor_traits<scalar_real_op<Scalar> >
175 {
enum { Cost = 0, PacketAccess =
false }; };
182 template<
typename Scalar>
183 struct scalar_imag_op {
184 EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
185 typedef typename NumTraits<Scalar>::Real result_type;
187 EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return numext::imag(a); }
189 template<
typename Scalar>
190 struct functor_traits<scalar_imag_op<Scalar> >
191 {
enum { Cost = 0, PacketAccess =
false }; };
198 template<
typename Scalar>
199 struct scalar_real_ref_op {
200 EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
201 typedef typename NumTraits<Scalar>::Real result_type;
203 EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a)
const {
return numext::real_ref(*const_cast<Scalar*>(&a)); }
205 template<
typename Scalar>
206 struct functor_traits<scalar_real_ref_op<Scalar> >
207 {
enum { Cost = 0, PacketAccess =
false }; };
214 template<
typename Scalar>
215 struct scalar_imag_ref_op {
216 EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
217 typedef typename NumTraits<Scalar>::Real result_type;
219 EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a)
const {
return numext::imag_ref(*const_cast<Scalar*>(&a)); }
221 template<
typename Scalar>
222 struct functor_traits<scalar_imag_ref_op<Scalar> >
223 {
enum { Cost = 0, PacketAccess =
false }; };
231 template<
typename Scalar>
struct scalar_exp_op {
232 EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
233 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::exp;
return exp(a); }
234 template <
typename Packet>
235 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pexp(a); }
237 template<
typename Scalar>
238 struct functor_traits<scalar_exp_op<Scalar> >
239 {
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };
247 template<
typename Scalar>
struct scalar_log_op {
248 EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
249 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::log;
return log(a); }
250 template <
typename Packet>
251 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::plog(a); }
253 template<
typename Scalar>
254 struct functor_traits<scalar_log_op<Scalar> >
255 {
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
263 template<
typename Scalar>
struct scalar_log10_op {
264 EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
265 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::log10;
return log10(a); }
266 template <
typename Packet>
267 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::plog10(a); }
269 template<
typename Scalar>
270 struct functor_traits<scalar_log10_op<Scalar> >
271 {
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
277 template<
typename Scalar>
struct scalar_sqrt_op {
278 EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
279 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::sqrt;
return sqrt(a); }
280 template <
typename Packet>
281 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psqrt(a); }
283 template<
typename Scalar>
284 struct functor_traits<scalar_sqrt_op<Scalar> >
286 Cost = 5 * NumTraits<Scalar>::MulCost,
287 PacketAccess = packet_traits<Scalar>::HasSqrt
295 template<
typename Scalar>
struct scalar_rsqrt_op {
296 EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
297 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::sqrt;
return Scalar(1)/sqrt(a); }
298 template <
typename Packet>
299 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::prsqrt(a); }
302 template<
typename Scalar>
303 struct functor_traits<scalar_rsqrt_op<Scalar> >
305 Cost = 5 * NumTraits<Scalar>::MulCost,
306 PacketAccess = packet_traits<Scalar>::HasRsqrt
314 template<
typename Scalar>
struct scalar_cos_op {
315 EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
316 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
using std::cos;
return cos(a); }
317 template <
typename Packet>
318 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pcos(a); }
320 template<
typename Scalar>
321 struct functor_traits<scalar_cos_op<Scalar> >
324 Cost = 5 * NumTraits<Scalar>::MulCost,
325 PacketAccess = packet_traits<Scalar>::HasCos
333 template<
typename Scalar>
struct scalar_sin_op {
334 EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
335 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::sin;
return sin(a); }
336 template <
typename Packet>
337 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psin(a); }
339 template<
typename Scalar>
340 struct functor_traits<scalar_sin_op<Scalar> >
343 Cost = 5 * NumTraits<Scalar>::MulCost,
344 PacketAccess = packet_traits<Scalar>::HasSin
353 template<
typename Scalar>
struct scalar_tan_op {
354 EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
355 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::tan;
return tan(a); }
356 template <
typename Packet>
357 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::ptan(a); }
359 template<
typename Scalar>
360 struct functor_traits<scalar_tan_op<Scalar> >
363 Cost = 5 * NumTraits<Scalar>::MulCost,
364 PacketAccess = packet_traits<Scalar>::HasTan
372 template<
typename Scalar>
struct scalar_acos_op {
373 EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
374 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::acos;
return acos(a); }
375 template <
typename Packet>
376 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pacos(a); }
378 template<
typename Scalar>
379 struct functor_traits<scalar_acos_op<Scalar> >
382 Cost = 5 * NumTraits<Scalar>::MulCost,
383 PacketAccess = packet_traits<Scalar>::HasACos
391 template<
typename Scalar>
struct scalar_asin_op {
392 EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
393 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::asin;
return asin(a); }
394 template <
typename Packet>
395 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pasin(a); }
397 template<
typename Scalar>
398 struct functor_traits<scalar_asin_op<Scalar> >
401 Cost = 5 * NumTraits<Scalar>::MulCost,
402 PacketAccess = packet_traits<Scalar>::HasASin
412 template<
typename Scalar>
struct scalar_lgamma_op {
413 EIGEN_EMPTY_STRUCT_CTOR(scalar_lgamma_op)
414 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
415 using numext::lgamma;
return lgamma(a);
417 typedef typename packet_traits<Scalar>::type Packet;
418 inline Packet packetOp(
const Packet& a)
const {
return internal::plgamma(a); }
420 template<
typename Scalar>
421 struct functor_traits<scalar_lgamma_op<Scalar> >
425 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
426 PacketAccess = packet_traits<Scalar>::HasLGamma
435 template<
typename Scalar>
struct scalar_erf_op {
436 EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_op)
437 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
438 using numext::erf;
return erf(a);
440 typedef typename packet_traits<Scalar>::type Packet;
441 inline Packet packetOp(
const Packet& a)
const {
return internal::perf(a); }
443 template<
typename Scalar>
444 struct functor_traits<scalar_erf_op<Scalar> >
448 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
449 PacketAccess = packet_traits<Scalar>::HasErf
458 template<
typename Scalar>
struct scalar_erfc_op {
459 EIGEN_EMPTY_STRUCT_CTOR(scalar_erfc_op)
460 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
461 using numext::erfc;
return erfc(a);
463 typedef typename packet_traits<Scalar>::type Packet;
464 inline Packet packetOp(
const Packet& a)
const {
return internal::perfc(a); }
466 template<
typename Scalar>
467 struct functor_traits<scalar_erfc_op<Scalar> >
471 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
472 PacketAccess = packet_traits<Scalar>::HasErfc
481 template<
typename Scalar>
struct scalar_atan_op {
482 EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
483 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::atan;
return atan(a); }
484 template <
typename Packet>
485 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::patan(a); }
487 template<
typename Scalar>
488 struct functor_traits<scalar_atan_op<Scalar> >
491 Cost = 5 * NumTraits<Scalar>::MulCost,
492 PacketAccess = packet_traits<Scalar>::HasATan
501 template<
typename Scalar>
struct scalar_tanh_op {
502 EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
503 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::tanh;
return tanh(a); }
504 template <
typename Packet>
505 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::ptanh(a); }
507 template<
typename Scalar>
508 struct functor_traits<scalar_tanh_op<Scalar> >
511 Cost = 5 * NumTraits<Scalar>::MulCost,
512 PacketAccess = packet_traits<Scalar>::HasTanh
520 template<
typename Scalar>
struct scalar_sinh_op {
521 EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
522 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::sinh;
return sinh(a); }
523 template <
typename Packet>
524 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psinh(a); }
526 template<
typename Scalar>
527 struct functor_traits<scalar_sinh_op<Scalar> >
530 Cost = 5 * NumTraits<Scalar>::MulCost,
531 PacketAccess = packet_traits<Scalar>::HasSinh
539 template<
typename Scalar>
struct scalar_cosh_op {
540 EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
541 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::cosh;
return cosh(a); }
542 template <
typename Packet>
543 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pcosh(a); }
545 template<
typename Scalar>
546 struct functor_traits<scalar_cosh_op<Scalar> >
549 Cost = 5 * NumTraits<Scalar>::MulCost,
550 PacketAccess = packet_traits<Scalar>::HasCosh
558 template<
typename Scalar>
559 struct scalar_inverse_op {
560 EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
561 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return Scalar(1)/a; }
562 template<
typename Packet>
563 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const
564 {
return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
566 template<
typename Scalar>
567 struct functor_traits<scalar_inverse_op<Scalar> >
568 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
574 template<
typename Scalar>
575 struct scalar_square_op {
576 EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
577 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return a*a; }
578 template<
typename Packet>
579 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const
580 {
return internal::pmul(a,a); }
582 template<
typename Scalar>
583 struct functor_traits<scalar_square_op<Scalar> >
584 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
590 template<
typename Scalar>
591 struct scalar_cube_op {
592 EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
593 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return a*a*a; }
594 template<
typename Packet>
595 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const
596 {
return internal::pmul(a,pmul(a,a)); }
598 template<
typename Scalar>
599 struct functor_traits<scalar_cube_op<Scalar> >
600 {
enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
606 template<
typename Scalar>
struct scalar_round_op {
607 EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
608 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::round(a); }
609 template <
typename Packet>
610 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pround(a); }
612 template<
typename Scalar>
613 struct functor_traits<scalar_round_op<Scalar> >
616 Cost = NumTraits<Scalar>::MulCost,
617 PacketAccess = packet_traits<Scalar>::HasRound
625 template<
typename Scalar>
struct scalar_floor_op {
626 EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
627 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::floor(a); }
628 template <
typename Packet>
629 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pfloor(a); }
631 template<
typename Scalar>
632 struct functor_traits<scalar_floor_op<Scalar> >
635 Cost = NumTraits<Scalar>::MulCost,
636 PacketAccess = packet_traits<Scalar>::HasFloor
644 template<
typename Scalar>
struct scalar_ceil_op {
645 EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
646 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::ceil(a); }
647 typedef typename packet_traits<Scalar>::type Packet;
648 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pceil(a); }
650 template<
typename Scalar>
651 struct functor_traits<scalar_ceil_op<Scalar> >
654 Cost = NumTraits<Scalar>::MulCost,
655 PacketAccess = packet_traits<Scalar>::HasCeil
663 template<
typename Scalar>
struct scalar_isnan_op {
664 EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
665 typedef
bool result_type;
666 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isnan)(a); }
668 template<
typename Scalar>
669 struct functor_traits<scalar_isnan_op<Scalar> >
672 Cost = NumTraits<Scalar>::MulCost,
681 template<
typename Scalar>
struct scalar_isinf_op {
682 EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
683 typedef
bool result_type;
684 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isinf)(a); }
686 template<
typename Scalar>
687 struct functor_traits<scalar_isinf_op<Scalar> >
690 Cost = NumTraits<Scalar>::MulCost,
699 template<
typename Scalar>
struct scalar_isfinite_op {
700 EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
701 typedef
bool result_type;
702 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isfinite)(a); }
704 template<
typename Scalar>
705 struct functor_traits<scalar_isfinite_op<Scalar> >
708 Cost = NumTraits<Scalar>::MulCost,
718 template<
typename Scalar>
struct scalar_boolean_not_op {
719 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
720 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (const
bool& a)
const {
return !a; }
722 template<
typename Scalar>
723 struct functor_traits<scalar_boolean_not_op<Scalar> > {
725 Cost = NumTraits<bool>::AddCost,
734 template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) >
struct scalar_sign_op;
735 template<
typename Scalar>
736 struct scalar_sign_op<Scalar,false> {
737 EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
738 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const
740 return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
746 template<
typename Scalar>
747 struct scalar_sign_op<Scalar,true> {
748 EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
749 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const
752 typedef typename NumTraits<Scalar>::Real real_type;
753 real_type aa = abs(a);
757 return Scalar(real(a)*aa, imag(a)*aa );
763 template<
typename Scalar>
764 struct functor_traits<scalar_sign_op<Scalar> >
767 NumTraits<Scalar>::IsComplex
768 ? ( 8*NumTraits<Scalar>::MulCost )
769 : ( 3*NumTraits<Scalar>::AddCost),
770 PacketAccess = packet_traits<Scalar>::HasSign
778 #endif // EIGEN_FUNCTORS_H
Definition: Eigen_Colamd.h:54