10#ifndef EIGEN_UNARY_FUNCTORS_H
11#define EIGEN_UNARY_FUNCTORS_H
14#include "../InternalHeaderCheck.h"
25template <
typename Scalar>
26struct scalar_opposite_op {
27 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::negate(a); }
28 template <
typename Packet>
29 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
30 return internal::pnegate(a);
33template <
typename Scalar>
34struct functor_traits<scalar_opposite_op<Scalar>> {
35 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasNegate };
43template <
typename Scalar>
45 typedef typename NumTraits<Scalar>::Real result_type;
46 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator()(
const Scalar& a)
const {
return numext::abs(a); }
47 template <
typename Packet>
48 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
49 return internal::pabs(a);
52template <
typename Scalar>
53struct functor_traits<scalar_abs_op<Scalar>> {
54 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAbs };
62template <
typename Scalar>
63struct scalar_score_coeff_op : scalar_abs_op<Scalar> {
64 typedef void Score_is_abs;
66template <
typename Scalar>
67struct functor_traits<scalar_score_coeff_op<Scalar>> : functor_traits<scalar_abs_op<Scalar>> {};
70template <
typename Scalar,
typename =
void>
71struct abs_knowing_score {
72 typedef typename NumTraits<Scalar>::Real result_type;
73 template <
typename Score>
74 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator()(
const Scalar& a,
const Score&)
const {
75 return numext::abs(a);
78template <
typename Scalar>
79struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> {
80 typedef typename NumTraits<Scalar>::Real result_type;
81 template <
typename Scal>
82 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator()(
const Scal&,
const result_type& a)
const {
92template <
typename Scalar>
93struct scalar_abs2_op {
94 typedef typename NumTraits<Scalar>::Real result_type;
95 EIGEN_DEVICE_FUNC 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);
101template <
typename Scalar>
102struct functor_traits<scalar_abs2_op<Scalar>> {
104 Cost = NumTraits<Scalar>::MulCost,
105 PacketAccess = packet_traits<Scalar>::HasMul && !NumTraits<Scalar>::IsComplex
109template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
110struct squared_norm_functor {
111 typedef Scalar result_type;
112 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
113 return Scalar(numext::real(a) * numext::real(a), numext::imag(a) * numext::imag(a));
115 template <
typename Packet>
116 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
117 return Packet(pmul(a.v, a.v));
120template <
typename Scalar>
121struct squared_norm_functor<Scalar, false> : scalar_abs2_op<Scalar> {};
123template <
typename Scalar>
124struct functor_traits<squared_norm_functor<Scalar>> {
125 using Real =
typename NumTraits<Scalar>::Real;
126 enum { Cost = NumTraits<Real>::MulCost, PacketAccess = packet_traits<Real>::HasMul };
134template <
typename Scalar>
135struct scalar_conjugate_op {
136 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::conj(a); }
137 template <
typename Packet>
138 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
139 return internal::pconj(a);
142template <
typename Scalar>
143struct functor_traits<scalar_conjugate_op<Scalar>> {
154 PacketAccess = packet_traits<Scalar>::HasConj
163template <
typename Scalar>
164struct scalar_arg_op {
165 typedef typename NumTraits<Scalar>::Real result_type;
166 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator()(
const Scalar& a)
const {
return numext::arg(a); }
167 template <
typename Packet>
168 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
169 return internal::parg(a);
172template <
typename Scalar>
173struct functor_traits<scalar_arg_op<Scalar>> {
175 Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
176 PacketAccess = packet_traits<Scalar>::HasArg
185template <
typename Scalar>
186struct scalar_carg_op {
187 using result_type = Scalar;
188 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
189 return Scalar(numext::arg(a));
191 template <
typename Packet>
192 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
196template <
typename Scalar>
197struct functor_traits<scalar_carg_op<Scalar>> {
198 using RealScalar =
typename NumTraits<Scalar>::Real;
199 enum { Cost = functor_traits<scalar_atan2_op<RealScalar>>::Cost, PacketAccess = packet_traits<RealScalar>::HasATan };
207template <
typename Scalar,
typename NewType>
208struct scalar_cast_op {
209 typedef NewType result_type;
210 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const NewType operator()(
const Scalar& a)
const {
211 return cast<Scalar, NewType>(a);
215template <
typename Scalar,
typename NewType>
216struct functor_traits<scalar_cast_op<Scalar, NewType>> {
217 enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess =
false };
226template <
typename SrcType,
typename DstType>
227struct core_cast_op : scalar_cast_op<SrcType, DstType> {};
229template <
typename SrcType,
typename DstType>
230struct functor_traits<core_cast_op<SrcType, DstType>> {
231 using CastingTraits = type_casting_traits<SrcType, DstType>;
233 Cost = is_same<SrcType, DstType>::value ? 0 : NumTraits<DstType>::AddCost,
234 PacketAccess = CastingTraits::VectorizedCast && (CastingTraits::SrcCoeffRatio <= 8)
243template <
typename Scalar,
int N>
244struct scalar_shift_right_op {
245 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
246 return numext::arithmetic_shift_right(a);
248 template <
typename Packet>
249 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
250 return internal::parithmetic_shift_right<N>(a);
253template <
typename Scalar,
int N>
254struct functor_traits<scalar_shift_right_op<Scalar, N>> {
255 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
263template <
typename Scalar,
int N>
264struct scalar_shift_left_op {
265 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
266 return numext::logical_shift_left(a);
268 template <
typename Packet>
269 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const {
270 return internal::plogical_shift_left<N>(a);
273template <
typename Scalar,
int N>
274struct functor_traits<scalar_shift_left_op<Scalar, N>> {
275 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
283template <
typename Scalar>
284struct scalar_real_op {
285 typedef typename NumTraits<Scalar>::Real result_type;
286 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(
const Scalar& a)
const {
return numext::real(a); }
288template <
typename Scalar>
289struct functor_traits<scalar_real_op<Scalar>> {
290 enum { Cost = 0, PacketAccess =
false };
298template <
typename Scalar>
299struct scalar_imag_op {
300 typedef typename NumTraits<Scalar>::Real result_type;
301 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(
const Scalar& a)
const {
return numext::imag(a); }
303template <
typename Scalar>
304struct functor_traits<scalar_imag_op<Scalar>> {
305 enum { Cost = 0, PacketAccess =
false };
313template <
typename Scalar>
314struct scalar_real_ref_op {
315 typedef typename NumTraits<Scalar>::Real result_type;
316 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type& operator()(
const Scalar& a)
const {
317 return numext::real_ref(a);
319 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a)
const {
return numext::real_ref(a); }
321template <
typename Scalar>
322struct functor_traits<scalar_real_ref_op<Scalar>> {
323 enum { Cost = 0, PacketAccess =
false };
331template <
typename Scalar>
332struct scalar_imag_ref_op {
333 typedef typename NumTraits<Scalar>::Real result_type;
334 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a)
const {
return numext::imag_ref(a); }
335 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type& operator()(
const Scalar& a)
const {
336 return numext::imag_ref(a);
339template <
typename Scalar>
340struct functor_traits<scalar_imag_ref_op<Scalar>> {
341 enum { Cost = 0, PacketAccess =
false };
350template <
typename Scalar>
351struct scalar_exp_op {
352 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return internal::pexp(a); }
353 template <
typename Packet>
354 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
355 return internal::pexp(a);
358template <
typename Scalar>
359struct functor_traits<scalar_exp_op<Scalar>> {
361 PacketAccess = packet_traits<Scalar>::HasExp,
363#ifdef EIGEN_VECTORIZE_FMA
365 Cost = (
sizeof(Scalar) == 4
367 ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
369 : (14 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
370 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
372 Cost = (
sizeof(Scalar) == 4
374 ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
376 : (23 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
377 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
382template <
typename Scalar>
383struct scalar_exp2_op {
384 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return internal::pexp2(a); }
385 template <
typename Packet>
386 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
387 return internal::pexp2(a);
390template <
typename Scalar>
391struct functor_traits<scalar_exp2_op<Scalar>> {
393 PacketAccess = packet_traits<Scalar>::HasExp,
394 Cost = functor_traits<scalar_exp_op<Scalar>>::Cost
404template <
typename Scalar>
405struct scalar_expm1_op {
406 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::expm1(a); }
407 template <
typename Packet>
408 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
409 return internal::pexpm1(a);
412template <
typename Scalar>
413struct functor_traits<scalar_expm1_op<Scalar>> {
415 PacketAccess = packet_traits<Scalar>::HasExpm1,
416 Cost = functor_traits<scalar_exp_op<Scalar>>::Cost
426template <
typename Scalar>
427struct scalar_log_op {
428 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::log(a); }
429 template <
typename Packet>
430 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
431 return internal::plog(a);
434template <
typename Scalar>
435struct functor_traits<scalar_log_op<Scalar>> {
437 PacketAccess = packet_traits<Scalar>::HasLog,
440#ifdef EIGEN_VECTORIZE_FMA
442 ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
445 ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
448 :
sizeof(Scalar) == 4 ? 40 : 85)
458template <
typename Scalar>
459struct scalar_log1p_op {
460 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::log1p(a); }
461 template <
typename Packet>
462 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
463 return internal::plog1p(a);
466template <
typename Scalar>
467struct functor_traits<scalar_log1p_op<Scalar>> {
469 PacketAccess = packet_traits<Scalar>::HasLog1p,
470 Cost = functor_traits<scalar_log_op<Scalar>>::Cost
480template <
typename Scalar>
481struct scalar_log10_op {
482 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const { EIGEN_USING_STD(
log10)
return log10(a); }
483 template <
typename Packet>
484 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
485 return internal::plog10(a);
488template <
typename Scalar>
489struct functor_traits<scalar_log10_op<Scalar>> {
490 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 };
499template <
typename Scalar>
500struct scalar_log2_op {
501 using RealScalar =
typename NumTraits<Scalar>::Real;
502 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
503 return Scalar(RealScalar(EIGEN_LOG2E)) * numext::log(a);
505 template <
typename Packet>
506 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
507 return internal::plog2(a);
510template <
typename Scalar>
511struct functor_traits<scalar_log2_op<Scalar>> {
512 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog };
519template <
typename Scalar>
520struct scalar_sqrt_op {
521 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::sqrt(a); }
522 template <
typename Packet>
523 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
524 return internal::psqrt(a);
527template <
typename Scalar>
528struct functor_traits<scalar_sqrt_op<Scalar>> {
532 Cost = (
sizeof(Scalar) == 8 ? 28
534 : (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
537 Cost = (
sizeof(Scalar) == 8 ? 28 : 14),
539 PacketAccess = packet_traits<Scalar>::HasSqrt
545struct scalar_sqrt_op<bool> {
546 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline bool operator()(
const bool& a)
const {
return a; }
547 template <
typename Packet>
548 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
553struct functor_traits<scalar_sqrt_op<bool>> {
554 enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
561template <
typename Scalar>
562struct scalar_cbrt_op {
563 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::cbrt(a); }
564 template <
typename Packet>
565 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
566 return internal::pcbrt(a);
570template <
typename Scalar>
571struct functor_traits<scalar_cbrt_op<Scalar>> {
572 enum { Cost = 20 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCbrt };
579template <
typename Scalar>
580struct scalar_rsqrt_op {
581 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::rsqrt(a); }
582 template <
typename Packet>
583 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
584 return internal::prsqrt(a);
588template <
typename Scalar>
589struct functor_traits<scalar_rsqrt_op<Scalar>> {
590 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasRsqrt };
597template <
typename Scalar>
598struct scalar_cos_op {
599 EIGEN_DEVICE_FUNC
inline Scalar operator()(
const Scalar& a)
const {
return numext::cos(a); }
600 template <
typename Packet>
601 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
602 return internal::pcos(a);
605template <
typename Scalar>
606struct functor_traits<scalar_cos_op<Scalar>> {
607 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
614template <
typename Scalar>
615struct scalar_sin_op {
616 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::sin(a); }
617 template <
typename Packet>
618 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
619 return internal::psin(a);
622template <
typename Scalar>
623struct functor_traits<scalar_sin_op<Scalar>> {
624 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
631template <
typename Scalar>
632struct scalar_tan_op {
633 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::tan(a); }
634 template <
typename Packet>
635 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
636 return internal::ptan(a);
639template <
typename Scalar>
640struct functor_traits<scalar_tan_op<Scalar>> {
641 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
648template <
typename Scalar>
649struct scalar_acos_op {
650 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::acos(a); }
651 template <
typename Packet>
652 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
653 return internal::pacos(a);
656template <
typename Scalar>
657struct functor_traits<scalar_acos_op<Scalar>> {
658 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
665template <
typename Scalar>
666struct scalar_asin_op {
667 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::asin(a); }
668 template <
typename Packet>
669 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
670 return internal::pasin(a);
673template <
typename Scalar>
674struct functor_traits<scalar_asin_op<Scalar>> {
675 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasASin };
682template <
typename Scalar>
683struct scalar_atan_op {
684 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::atan(a); }
685 template <
typename Packet>
686 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
687 return internal::patan(a);
690template <
typename Scalar>
691struct functor_traits<scalar_atan_op<Scalar>> {
692 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
699template <
typename Scalar>
700struct scalar_tanh_op {
701 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::tanh(a); }
702 template <
typename Packet>
703 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& x)
const {
708template <
typename Scalar>
709struct functor_traits<scalar_tanh_op<Scalar>> {
711 PacketAccess = packet_traits<Scalar>::HasTanh,
712 Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
714#ifdef EIGEN_VECTORIZE_FMA
717 ? (2 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
718 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
720 ? (11 * NumTraits<Scalar>::AddCost + 11 * NumTraits<Scalar>::MulCost +
721 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
724 : (6 * NumTraits<Scalar>::AddCost + 3 * NumTraits<Scalar>::MulCost +
725 2 * scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value +
726 functor_traits<scalar_exp_op<Scalar>>::Cost))
734template <
typename Scalar>
735struct scalar_atanh_op {
736 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::atanh(a); }
737 template <
typename Packet>
738 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& x)
const {
743template <
typename Scalar>
744struct functor_traits<scalar_atanh_op<Scalar>> {
745 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
752template <
typename Scalar>
753struct scalar_sinh_op {
754 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::sinh(a); }
755 template <
typename Packet>
756 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
757 return internal::psinh(a);
760template <
typename Scalar>
761struct functor_traits<scalar_sinh_op<Scalar>> {
762 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
769template <
typename Scalar>
770struct scalar_asinh_op {
771 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::asinh(a); }
774template <
typename Scalar>
775struct functor_traits<scalar_asinh_op<Scalar>> {
776 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
false };
783template <
typename Scalar>
784struct scalar_cosh_op {
785 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::cosh(a); }
786 template <
typename Packet>
787 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
788 return internal::pcosh(a);
791template <
typename Scalar>
792struct functor_traits<scalar_cosh_op<Scalar>> {
793 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
800template <
typename Scalar>
801struct scalar_acosh_op {
802 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::acosh(a); }
805template <
typename Scalar>
806struct functor_traits<scalar_acosh_op<Scalar>> {
807 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
false };
814template <
typename Scalar>
815struct scalar_inverse_op {
816 EIGEN_DEVICE_FUNC
inline Scalar operator()(
const Scalar& a)
const {
return Scalar(1) / a; }
817 template <
typename Packet>
818 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const {
819 return internal::preciprocal(a);
822template <
typename Scalar>
823struct functor_traits<scalar_inverse_op<Scalar>> {
825 PacketAccess = packet_traits<Scalar>::HasDiv,
829 Cost = (packet_traits<Scalar>::HasReciprocal ? 4 * NumTraits<Scalar>::MulCost
830 : scalar_div_cost<Scalar, PacketAccess>::value)
838template <
typename Scalar>
839struct scalar_square_op {
840 EIGEN_DEVICE_FUNC
inline Scalar operator()(
const Scalar& a)
const {
return a * a; }
841 template <
typename Packet>
842 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const {
843 return internal::pmul(a, a);
846template <
typename Scalar>
847struct functor_traits<scalar_square_op<Scalar>> {
848 enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
853struct scalar_square_op<bool> {
854 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline bool operator()(
const bool& a)
const {
return a; }
855 template <
typename Packet>
856 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const {
861struct functor_traits<scalar_square_op<bool>> {
862 enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
869template <
typename Scalar>
870struct scalar_cube_op {
871 EIGEN_DEVICE_FUNC
inline Scalar operator()(
const Scalar& a)
const {
return a * a * a; }
872 template <
typename Packet>
873 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const {
874 return internal::pmul(a, pmul(a, a));
877template <
typename Scalar>
878struct functor_traits<scalar_cube_op<Scalar>> {
879 enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
884struct scalar_cube_op<bool> {
885 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline bool operator()(
const bool& a)
const {
return a; }
886 template <
typename Packet>
887 EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const {
892struct functor_traits<scalar_cube_op<bool>> {
893 enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
900template <
typename Scalar>
901struct scalar_round_op {
902 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::round(a); }
903 template <
typename Packet>
904 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
905 return internal::pround(a);
908template <
typename Scalar>
909struct functor_traits<scalar_round_op<Scalar>> {
911 Cost = NumTraits<Scalar>::MulCost,
912 PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
920template <
typename Scalar>
921struct scalar_floor_op {
922 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::floor(a); }
923 template <
typename Packet>
924 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
925 return internal::pfloor(a);
928template <
typename Scalar>
929struct functor_traits<scalar_floor_op<Scalar>> {
931 Cost = NumTraits<Scalar>::MulCost,
932 PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
940template <
typename Scalar>
941struct scalar_rint_op {
942 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::rint(a); }
943 template <
typename Packet>
944 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
945 return internal::print(a);
948template <
typename Scalar>
949struct functor_traits<scalar_rint_op<Scalar>> {
951 Cost = NumTraits<Scalar>::MulCost,
952 PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
960template <
typename Scalar>
961struct scalar_ceil_op {
962 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::ceil(a); }
963 template <
typename Packet>
964 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
965 return internal::pceil(a);
968template <
typename Scalar>
969struct functor_traits<scalar_ceil_op<Scalar>> {
971 Cost = NumTraits<Scalar>::MulCost,
972 PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
980template <
typename Scalar>
981struct scalar_trunc_op {
982 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::trunc(a); }
983 template <
typename Packet>
984 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
985 return internal::ptrunc(a);
988template <
typename Scalar>
989struct functor_traits<scalar_trunc_op<Scalar>> {
991 Cost = NumTraits<Scalar>::MulCost,
992 PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
1000template <
typename Scalar,
bool UseTypedPredicate = false>
1001struct scalar_isnan_op {
1002 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const Scalar& a)
const {
1003#if defined(SYCL_DEVICE_ONLY)
1004 return numext::isnan(a);
1006 return numext::isnan EIGEN_NOT_A_MACRO(a);
1011template <
typename Scalar>
1012struct scalar_isnan_op<Scalar, true> {
1013 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1014#if defined(SYCL_DEVICE_ONLY)
1015 return (numext::isnan(a) ? ptrue(a) : pzero(a));
1017 return (numext::isnan EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1020 template <
typename Packet>
1021 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
1026template <
typename Scalar,
bool UseTypedPredicate>
1027struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate>> {
1028 enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
1035template <
typename Scalar,
bool UseTypedPredicate = false>
1036struct scalar_isinf_op {
1037 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const Scalar& a)
const {
1038#if defined(SYCL_DEVICE_ONLY)
1039 return numext::isinf(a);
1041 return (numext::isinf)(a);
1046template <
typename Scalar>
1047struct scalar_isinf_op<Scalar, true> {
1048 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1049#if defined(SYCL_DEVICE_ONLY)
1050 return (numext::isinf(a) ? ptrue(a) : pzero(a));
1052 return (numext::isinf EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1055 template <
typename Packet>
1056 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
1060template <
typename Scalar,
bool UseTypedPredicate>
1061struct functor_traits<scalar_isinf_op<Scalar, UseTypedPredicate>> {
1062 enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
1069template <
typename Scalar,
bool UseTypedPredicate = false>
1070struct scalar_isfinite_op {
1071 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const Scalar& a)
const {
1072#if defined(SYCL_DEVICE_ONLY)
1073 return numext::isfinite(a);
1075 return (numext::isfinite)(a);
1080template <
typename Scalar>
1081struct scalar_isfinite_op<Scalar, true> {
1082 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1083#if defined(SYCL_DEVICE_ONLY)
1084 return (numext::isfinite(a) ? ptrue(a) : pzero(a));
1086 return (numext::isfinite EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1089 template <
typename Packet>
1090 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
1091 constexpr Scalar inf = NumTraits<Scalar>::infinity();
1092 return pcmp_lt(pabs(a), pset1<Packet>(inf));
1095template <
typename Scalar,
bool UseTypedPredicate>
1096struct functor_traits<scalar_isfinite_op<Scalar, UseTypedPredicate>> {
1097 enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
1105template <
typename Scalar>
1106struct scalar_boolean_not_op {
1107 using result_type = Scalar;
1110 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1111 return a == Scalar(0) ? Scalar(1) : Scalar(0);
1113 template <
typename Packet>
1114 EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
1115 const Packet cst_one = pset1<Packet>(Scalar(1));
1116 Packet not_a = pcmp_eq(a, pzero(a));
1117 return pand(not_a, cst_one);
1120template <
typename Scalar>
1121struct functor_traits<scalar_boolean_not_op<Scalar>> {
1122 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
1125template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
1126struct bitwise_unary_impl {
1127 static constexpr size_t Size =
sizeof(Scalar);
1128 using uint_t =
typename numext::get_integer_by_size<Size>::unsigned_type;
1129 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(
const Scalar& a) {
1130 uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
1131 uint_t result = ~a_as_uint;
1132 return numext::bit_cast<Scalar, uint_t>(result);
1136template <
typename Scalar>
1137struct bitwise_unary_impl<Scalar, true> {
1138 using Real =
typename NumTraits<Scalar>::Real;
1139 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(
const Scalar& a) {
1140 Real real_result = bitwise_unary_impl<Real>::run_not(numext::real(a));
1141 Real imag_result = bitwise_unary_impl<Real>::run_not(numext::imag(a));
1142 return Scalar(real_result, imag_result);
1151template <
typename Scalar>
1152struct scalar_bitwise_not_op {
1153 EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
1154 BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
1155 EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
1156 using result_type = Scalar;
1157 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1158 return bitwise_unary_impl<Scalar>::run_not(a);
1160 template <
typename Packet>
1161 EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
1162 return pandnot(ptrue(a), a);
1165template <
typename Scalar>
1166struct functor_traits<scalar_bitwise_not_op<Scalar>> {
1167 enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess =
true };
1174template <
typename Scalar>
1175struct scalar_sign_op {
1176 EIGEN_DEVICE_FUNC
inline const Scalar operator()(
const Scalar& a)
const {
return numext::sign(a); }
1178 template <
typename Packet>
1179 EIGEN_DEVICE_FUNC
inline Packet packetOp(
const Packet& a)
const {
1180 return internal::psign(a);
1184template <
typename Scalar>
1185struct functor_traits<scalar_sign_op<Scalar>> {
1187 Cost = NumTraits<Scalar>::IsComplex ? (8 * NumTraits<Scalar>::MulCost)
1188 : (3 * NumTraits<Scalar>::AddCost),
1189 PacketAccess = packet_traits<Scalar>::HasSign && packet_traits<Scalar>::Vectorizable
1194template <
typename T,
typename EnableIf =
void>
1195struct scalar_logistic_op_impl {
1196 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(
const T& x)
const {
return packetOp(x); }
1198 template <
typename Packet>
1199 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& x)
const {
1200 const Packet one = pset1<Packet>(T(1));
1201 const Packet inf = pset1<Packet>(NumTraits<T>::infinity());
1202 const Packet e = pexp(x);
1203 const Packet inf_mask = pcmp_eq(e, inf);
1204 return pselect(inf_mask, one, pdiv(e, padd(one, e)));
1209template <
typename T>
1210struct scalar_logistic_op_impl<T, std::enable_if_t<NumTraits<T>::IsComplex>> {
1211 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(
const T& x)
const {
1212 const T e = numext::exp(x);
1213 return (numext::isinf)(numext::real(e)) ? T(1) : e / (e + T(1));
1221template <
typename T>
1222struct scalar_logistic_op : scalar_logistic_op_impl<T> {};
1244struct scalar_logistic_op<float> {
1245 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
float operator()(
const float& x)
const {
1247 const float cst_exp_hi = 16.6355324f;
1248 const float e = numext::exp(numext::mini(x, cst_exp_hi));
1249 return e / (1.0f + e);
1252 template <
typename Packet>
1253 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& _x)
const {
1254 const Packet cst_zero = pset1<Packet>(0.0f);
1255 const Packet cst_one = pset1<Packet>(1.0f);
1256 const Packet cst_half = pset1<Packet>(0.5f);
1258 const Packet cst_exp_hi = pset1<Packet>(16.6355324f);
1259 const Packet cst_exp_lo = pset1<Packet>(-104.f);
1264 Packet zero_mask = pcmp_lt(_x, cst_exp_lo);
1265 Packet x = pmin(_x, cst_exp_hi);
1271 x = pmul(x, cst_half);
1276 const Packet cst_cephes_LOG2EF = pset1<Packet>(1.44269504088896341f);
1277 Packet m = pfloor(pmadd(x, cst_cephes_LOG2EF, cst_half));
1281 const Packet cst_cephes_exp_C1 = pset1<Packet>(-0.693359375f);
1282 const Packet cst_cephes_exp_C2 = pset1<Packet>(2.12194440e-4f);
1283 Packet r = pmadd(m, cst_cephes_exp_C1, x);
1284 r = pmadd(m, cst_cephes_exp_C2, r);
1289 Packet r2 = pmul(r, r);
1290 const Packet cst_p2 = pset1<Packet>(0.49999141693115234375f);
1291 const Packet cst_p3 = pset1<Packet>(0.16666877269744873046875f);
1292 const Packet cst_p4 = pset1<Packet>(4.1898667812347412109375e-2f);
1293 const Packet cst_p5 = pset1<Packet>(8.33471305668354034423828125e-3f);
1295 const Packet p_even = pmadd(r2, cst_p4, cst_p2);
1296 const Packet p_odd = pmadd(r2, cst_p5, cst_p3);
1297 const Packet p_low = padd(r, cst_one);
1298 Packet p = pmadd(r, p_odd, p_even);
1299 p = pmadd(r2, p, p_low);
1302 Packet e = pldexp_fast(p, m);
1308 return pselect(zero_mask, cst_zero, pdiv(e, padd(cst_one, e)));
1313template <
typename T>
1314struct functor_traits<scalar_logistic_op<T>> {
1318 Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
1319 (internal::is_same<T, float>::value ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
1320 : NumTraits<T>::AddCost * 2 + functor_traits<scalar_exp_op<T>>::Cost),
1321 PacketAccess = !NumTraits<T>::IsComplex && packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
1322 (internal::is_same<T, float>::value
1323 ? packet_traits<T>::HasMul && packet_traits<T>::HasMax && packet_traits<T>::HasMin
1324 : packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
1328template <typename Scalar, typename ExponentScalar, bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
1329 bool IsExponentInteger = NumTraits<ExponentScalar>::IsInteger,
1330 bool IsBaseComplex = NumTraits<Scalar>::IsComplex,
1331 bool IsExponentComplex = NumTraits<ExponentScalar>::IsComplex>
1332struct scalar_unary_pow_op {
1333 typedef typename internal::promote_scalar_arg<
1334 Scalar, ExponentScalar,
1335 internal::has_ReturnType<ScalarBinaryOpTraits<Scalar, ExponentScalar, scalar_unary_pow_op>>::value>::type
1337 typedef typename ScalarBinaryOpTraits<Scalar, PromotedExponent, scalar_unary_pow_op>::ReturnType result_type;
1338 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(
const ExponentScalar& exponent) : m_exponent(exponent) {}
1339 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(
const Scalar& a)
const {
1340 EIGEN_USING_STD(pow);
1341 return static_cast<result_type
>(pow(a, m_exponent));
1345 const ExponentScalar m_exponent;
1346 scalar_unary_pow_op() {}
1349template <
typename T>
1350constexpr int exponent_digits() {
1351 return CHAR_BIT *
sizeof(T) - NumTraits<T>::digits() - NumTraits<T>::IsSigned;
1354template <
typename From,
typename To>
1355struct is_floating_exactly_representable {
1358 static constexpr bool value =
1359 (exponent_digits<To>() >= exponent_digits<From>() && NumTraits<To>::digits() >= NumTraits<From>::digits());
1363template <
typename Scalar,
typename ExponentScalar>
1364struct scalar_unary_pow_op<Scalar, ExponentScalar, false, false, false, false> {
1365 template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
1366 std::enable_if_t<IsExactlyRepresentable, void> check_is_representable()
const {}
1369 template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
1370 EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void> check_is_representable()
const {}
1372 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(
const ExponentScalar& exponent)
1373 : m_exponent(static_cast<Scalar>(exponent)) {
1374 check_is_representable();
1377 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1378 EIGEN_USING_STD(pow);
1379 return static_cast<Scalar
>(pow(a, m_exponent));
1381 template <
typename Packet>
1382 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
1383 return unary_pow_impl<Packet, Scalar>::run(a, m_exponent);
1387 const Scalar m_exponent;
1388 scalar_unary_pow_op() {}
1391template <
typename Scalar,
typename ExponentScalar,
bool BaseIsInteger>
1392struct scalar_unary_pow_op<Scalar, ExponentScalar, BaseIsInteger, true, false, false> {
1393 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(
const ExponentScalar& exponent) : m_exponent(exponent) {}
1395 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(
const Scalar& a)
const {
1396 return unary_pow_impl<Scalar, ExponentScalar>::run(a, m_exponent);
1398 template <
typename Packet>
1399 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
1400 return unary_pow_impl<Packet, ExponentScalar>::run(a, m_exponent);
1404 const ExponentScalar m_exponent;
1405 scalar_unary_pow_op() {}
1408template <
typename Scalar,
typename ExponentScalar>
1409struct functor_traits<scalar_unary_pow_op<Scalar, ExponentScalar>> {
1411 GenPacketAccess = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::PacketAccess,
1412 IntPacketAccess = !NumTraits<Scalar>::IsComplex && packet_traits<Scalar>::HasMul &&
1413 (packet_traits<Scalar>::HasDiv || NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasCmp,
1414 PacketAccess = NumTraits<ExponentScalar>::IsInteger ? IntPacketAccess : (IntPacketAccess && GenPacketAccess),
1415 Cost = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::Cost
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log10_op< typename Derived::Scalar >, const Derived > log10(const Eigen::ArrayBase< Derived > &x)