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 {
return numext::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 {
return numext::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 {
return numext::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> > {
240 PacketAccess = packet_traits<Scalar>::HasExp,
242 #ifdef EIGEN_VECTORIZE_FMA 247 ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
249 : (14 * NumTraits<Scalar>::AddCost +
250 6 * NumTraits<Scalar>::MulCost +
251 NumTraits<Scalar>::template Div<packet_traits<Scalar>::HasDiv>::Cost))
256 ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
258 : (23 * NumTraits<Scalar>::AddCost +
259 12 * NumTraits<Scalar>::MulCost +
260 NumTraits<Scalar>::template Div<packet_traits<Scalar>::HasDiv>::Cost))
271 template<
typename Scalar>
struct scalar_log_op {
272 EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
273 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::log(a); }
274 template <
typename Packet>
275 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::plog(a); }
277 template <
typename Scalar>
278 struct functor_traits<scalar_log_op<Scalar> > {
280 PacketAccess = packet_traits<Scalar>::HasLog,
284 #ifdef EIGEN_VECTORIZE_FMA 286 ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
289 ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
292 :
sizeof(Scalar)==4 ? 40 : 85)
302 template<
typename Scalar>
struct scalar_log1p_op {
303 EIGEN_EMPTY_STRUCT_CTOR(scalar_log1p_op)
304 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::log1p(a); }
305 template <
typename Packet>
306 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::plog1p(a); }
308 template <
typename Scalar>
309 struct functor_traits<scalar_log1p_op<Scalar> > {
311 PacketAccess = packet_traits<Scalar>::HasLog1p,
312 Cost = functor_traits<scalar_log_op<Scalar> >::Cost
322 template<
typename Scalar>
struct scalar_log10_op {
323 EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
324 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
using std::log10;
return log10(a); }
325 template <
typename Packet>
326 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::plog10(a); }
328 template<
typename Scalar>
329 struct functor_traits<scalar_log10_op<Scalar> >
330 {
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
336 template<
typename Scalar>
struct scalar_sqrt_op {
337 EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
338 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::sqrt(a); }
339 template <
typename Packet>
340 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psqrt(a); }
342 template <
typename Scalar>
343 struct functor_traits<scalar_sqrt_op<Scalar> > {
347 Cost = (
sizeof(Scalar) == 8 ? 28
349 : (3 * NumTraits<Scalar>::AddCost +
350 5 * NumTraits<Scalar>::MulCost)),
353 Cost = (
sizeof(Scalar) == 8 ? 28 : 14),
355 PacketAccess = packet_traits<Scalar>::HasSqrt
363 template<
typename Scalar>
struct scalar_rsqrt_op {
364 EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
365 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return Scalar(1)/numext::sqrt(a); }
366 template <
typename Packet>
367 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::prsqrt(a); }
370 template<
typename Scalar>
371 struct functor_traits<scalar_rsqrt_op<Scalar> >
373 Cost = 5 * NumTraits<Scalar>::MulCost,
374 PacketAccess = packet_traits<Scalar>::HasRsqrt
382 template<
typename Scalar>
struct scalar_cos_op {
383 EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
384 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return numext::cos(a); }
385 template <
typename Packet>
386 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pcos(a); }
388 template<
typename Scalar>
389 struct functor_traits<scalar_cos_op<Scalar> >
392 Cost = 5 * NumTraits<Scalar>::MulCost,
393 PacketAccess = packet_traits<Scalar>::HasCos
401 template<
typename Scalar>
struct scalar_sin_op {
402 EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
403 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::sin(a); }
404 template <
typename Packet>
405 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psin(a); }
407 template<
typename Scalar>
408 struct functor_traits<scalar_sin_op<Scalar> >
411 Cost = 5 * NumTraits<Scalar>::MulCost,
412 PacketAccess = packet_traits<Scalar>::HasSin
421 template<
typename Scalar>
struct scalar_tan_op {
422 EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
423 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::tan(a); }
424 template <
typename Packet>
425 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::ptan(a); }
427 template<
typename Scalar>
428 struct functor_traits<scalar_tan_op<Scalar> >
431 Cost = 5 * NumTraits<Scalar>::MulCost,
432 PacketAccess = packet_traits<Scalar>::HasTan
440 template<
typename Scalar>
struct scalar_acos_op {
441 EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
442 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::acos(a); }
443 template <
typename Packet>
444 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pacos(a); }
446 template<
typename Scalar>
447 struct functor_traits<scalar_acos_op<Scalar> >
450 Cost = 5 * NumTraits<Scalar>::MulCost,
451 PacketAccess = packet_traits<Scalar>::HasACos
459 template<
typename Scalar>
struct scalar_asin_op {
460 EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
461 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::asin(a); }
462 template <
typename Packet>
463 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pasin(a); }
465 template<
typename Scalar>
466 struct functor_traits<scalar_asin_op<Scalar> >
469 Cost = 5 * NumTraits<Scalar>::MulCost,
470 PacketAccess = packet_traits<Scalar>::HasASin
479 template<
typename Scalar>
struct scalar_atan_op {
480 EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
481 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::atan(a); }
482 template <
typename Packet>
483 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::patan(a); }
485 template<
typename Scalar>
486 struct functor_traits<scalar_atan_op<Scalar> >
489 Cost = 5 * NumTraits<Scalar>::MulCost,
490 PacketAccess = packet_traits<Scalar>::HasATan
499 template<
typename Scalar>
struct scalar_tanh_op {
500 EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
501 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::tanh(a); }
502 template <
typename Packet>
503 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& _x)
const {
511 const Packet plus_9 = pset1<Packet>(9.0);
512 const Packet minus_9 = pset1<Packet>(-9.0);
513 const Packet x = pmax(minus_9, pmin(plus_9, _x));
516 const Packet alpha_1 = pset1<Packet>(4.89352455891786e-03);
517 const Packet alpha_3 = pset1<Packet>(6.37261928875436e-04);
518 const Packet alpha_5 = pset1<Packet>(1.48572235717979e-05);
519 const Packet alpha_7 = pset1<Packet>(5.12229709037114e-08);
520 const Packet alpha_9 = pset1<Packet>(-8.60467152213735e-11);
521 const Packet alpha_11 = pset1<Packet>(2.00018790482477e-13);
522 const Packet alpha_13 = pset1<Packet>(-2.76076847742355e-16);
525 const Packet beta_0 = pset1<Packet>(4.89352518554385e-03);
526 const Packet beta_2 = pset1<Packet>(2.26843463243900e-03);
527 const Packet beta_4 = pset1<Packet>(1.18534705686654e-04);
528 const Packet beta_6 = pset1<Packet>(1.19825839466702e-06);
531 const Packet x2 = pmul(x, x);
534 Packet p = pmadd(x2, alpha_13, alpha_11);
535 p = pmadd(x2, p, alpha_9);
536 p = pmadd(x2, p, alpha_7);
537 p = pmadd(x2, p, alpha_5);
538 p = pmadd(x2, p, alpha_3);
539 p = pmadd(x2, p, alpha_1);
543 Packet q = pmadd(x2, beta_6, beta_4);
544 q = pmadd(x2, q, beta_2);
545 q = pmadd(x2, q, beta_0);
551 template<
typename Scalar>
552 struct functor_traits<scalar_tanh_op<Scalar> >
555 PacketAccess = packet_traits<Scalar>::HasTanh,
559 #ifdef EIGEN_VECTORIZE_FMA 562 ? (2 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
563 NumTraits<Scalar>::template Div<packet_traits<Scalar>::HasDiv>::Cost)
565 ? (11 * NumTraits<Scalar>::AddCost +
566 11 * NumTraits<Scalar>::MulCost +
567 NumTraits<Scalar>::template Div<packet_traits<Scalar>::HasDiv>::Cost)
570 : (6 * NumTraits<Scalar>::AddCost + 3 * NumTraits<Scalar>::MulCost +
571 2 * NumTraits<Scalar>::template Div<packet_traits<Scalar>::HasDiv>::Cost +
572 functor_traits<scalar_exp_op<Scalar> >::Cost))
580 template<
typename Scalar>
struct scalar_sinh_op {
581 EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
582 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::sinh(a); }
583 template <
typename Packet>
584 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::psinh(a); }
586 template<
typename Scalar>
587 struct functor_traits<scalar_sinh_op<Scalar> >
590 Cost = 5 * NumTraits<Scalar>::MulCost,
591 PacketAccess = packet_traits<Scalar>::HasSinh
599 template<
typename Scalar>
struct scalar_cosh_op {
600 EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
601 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const {
return numext::cosh(a); }
602 template <
typename Packet>
603 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pcosh(a); }
605 template<
typename Scalar>
606 struct functor_traits<scalar_cosh_op<Scalar> >
609 Cost = 5 * NumTraits<Scalar>::MulCost,
610 PacketAccess = packet_traits<Scalar>::HasCosh
618 template<
typename Scalar>
619 struct scalar_inverse_op {
620 EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
621 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return Scalar(1)/a; }
622 template<
typename Packet>
623 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 624 {
return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
626 template<
typename Scalar>
627 struct functor_traits<scalar_inverse_op<Scalar> >
628 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
634 template<
typename Scalar>
635 struct scalar_square_op {
636 EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
637 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return a*a; }
638 template<
typename Packet>
639 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 640 {
return internal::pmul(a,a); }
642 template<
typename Scalar>
643 struct functor_traits<scalar_square_op<Scalar> >
644 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
650 template<
typename Scalar>
651 struct scalar_cube_op {
652 EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
653 EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a)
const {
return a*a*a; }
654 template<
typename Packet>
655 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 656 {
return internal::pmul(a,pmul(a,a)); }
658 template<
typename Scalar>
659 struct functor_traits<scalar_cube_op<Scalar> >
660 {
enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
666 template<
typename Scalar>
struct scalar_round_op {
667 EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
668 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::round(a); }
669 template <
typename Packet>
670 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pround(a); }
672 template<
typename Scalar>
673 struct functor_traits<scalar_round_op<Scalar> >
676 Cost = NumTraits<Scalar>::MulCost,
677 PacketAccess = packet_traits<Scalar>::HasRound
685 template<
typename Scalar>
struct scalar_floor_op {
686 EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
687 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::floor(a); }
688 template <
typename Packet>
689 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pfloor(a); }
691 template<
typename Scalar>
692 struct functor_traits<scalar_floor_op<Scalar> >
695 Cost = NumTraits<Scalar>::MulCost,
696 PacketAccess = packet_traits<Scalar>::HasFloor
704 template<
typename Scalar>
struct scalar_ceil_op {
705 EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
706 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a)
const {
return numext::ceil(a); }
707 template <
typename Packet>
708 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
return internal::pceil(a); }
710 template<
typename Scalar>
711 struct functor_traits<scalar_ceil_op<Scalar> >
714 Cost = NumTraits<Scalar>::MulCost,
715 PacketAccess = packet_traits<Scalar>::HasCeil
723 template<
typename Scalar>
struct scalar_isnan_op {
724 EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
725 typedef
bool result_type;
726 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isnan)(a); }
728 template<
typename Scalar>
729 struct functor_traits<scalar_isnan_op<Scalar> >
732 Cost = NumTraits<Scalar>::MulCost,
741 template<
typename Scalar>
struct scalar_isinf_op {
742 EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
743 typedef
bool result_type;
744 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isinf)(a); }
746 template<
typename Scalar>
747 struct functor_traits<scalar_isinf_op<Scalar> >
750 Cost = NumTraits<Scalar>::MulCost,
759 template<
typename Scalar>
struct scalar_isfinite_op {
760 EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
761 typedef
bool result_type;
762 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a)
const {
return (numext::isfinite)(a); }
764 template<
typename Scalar>
765 struct functor_traits<scalar_isfinite_op<Scalar> >
768 Cost = NumTraits<Scalar>::MulCost,
778 template<
typename Scalar>
struct scalar_boolean_not_op {
779 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
780 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (const
bool& a)
const {
return !a; }
782 template<
typename Scalar>
783 struct functor_traits<scalar_boolean_not_op<Scalar> > {
785 Cost = NumTraits<bool>::AddCost,
794 template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) >
struct scalar_sign_op;
795 template<
typename Scalar>
796 struct scalar_sign_op<Scalar,false> {
797 EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
798 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const 800 return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
806 template<
typename Scalar>
807 struct scalar_sign_op<Scalar,true> {
808 EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
809 EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a)
const 811 typedef typename NumTraits<Scalar>::Real real_type;
812 real_type aa = numext::abs(a);
813 if (aa==real_type(0))
815 aa = real_type(1)/aa;
816 return Scalar(
real(a)*aa,
imag(a)*aa );
822 template<
typename Scalar>
823 struct functor_traits<scalar_sign_op<Scalar> >
826 NumTraits<Scalar>::IsComplex
827 ? ( 8*NumTraits<Scalar>::MulCost )
828 : ( 3*NumTraits<Scalar>::AddCost),
829 PacketAccess = packet_traits<Scalar>::HasSign
837 #endif // EIGEN_FUNCTORS_H const Eigen::CwiseUnaryOp< Eigen::internal::scalar_conjugate_op< typename Derived::Scalar >, const Derived > conj(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)
Namespace containing all symbols from the Eigen library.
Definition: Core:271
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_imag_op< typename Derived::Scalar >, const Derived > imag(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
Definition: Eigen_Colamd.h:50
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log10_op< typename Derived::Scalar >, const Derived > log10(const Eigen::ArrayBase< Derived > &x)