11#ifndef EIGEN_GENERIC_PACKET_MATH_H
12#define EIGEN_GENERIC_PACKET_MATH_H
15#include "./InternalHeaderCheck.h"
29#ifndef EIGEN_DEBUG_ALIGNED_LOAD
30#define EIGEN_DEBUG_ALIGNED_LOAD
33#ifndef EIGEN_DEBUG_UNALIGNED_LOAD
34#define EIGEN_DEBUG_UNALIGNED_LOAD
37#ifndef EIGEN_DEBUG_ALIGNED_STORE
38#define EIGEN_DEBUG_ALIGNED_STORE
41#ifndef EIGEN_DEBUG_UNALIGNED_STORE
42#define EIGEN_DEBUG_UNALIGNED_STORE
45struct default_packet_traits {
101 HasGammaSampleDerAlpha = 0,
108struct packet_traits : default_packet_traits {
131struct packet_traits<const T> : packet_traits<T> {};
134struct unpacket_traits {
137 typedef typename numext::get_integer_by_size<
sizeof(T)>::signed_type integer_packet;
140 alignment =
alignof(T),
141 vectorizable =
false,
142 masked_load_available =
false,
143 masked_store_available =
false
148struct unpacket_traits<const T> : unpacket_traits<T> {};
153template <
typename Packet>
155 using Scalar =
typename unpacket_traits<Packet>::type;
156 enum { value = internal::is_same<Packet, Scalar>::value };
163template <
typename SrcPacket,
typename TgtPacket,
164 bool Scalar = is_scalar<SrcPacket>::value && is_scalar<TgtPacket>::value>
165struct is_degenerate_helper : is_same<SrcPacket, TgtPacket> {};
167struct is_degenerate_helper<int8_t, uint8_t, true> : std::true_type {};
169struct is_degenerate_helper<int16_t, uint16_t, true> : std::true_type {};
171struct is_degenerate_helper<int32_t, uint32_t, true> : std::true_type {};
173struct is_degenerate_helper<int64_t, uint64_t, true> : std::true_type {};
175template <
typename SrcPacket,
typename TgtPacket>
176struct is_degenerate_helper<SrcPacket, TgtPacket, false> {
177 using SrcScalar =
typename unpacket_traits<SrcPacket>::type;
178 static constexpr int SrcSize = unpacket_traits<SrcPacket>::size;
179 using TgtScalar =
typename unpacket_traits<TgtPacket>::type;
180 static constexpr int TgtSize = unpacket_traits<TgtPacket>::size;
181 static constexpr bool value = is_degenerate_helper<SrcScalar, TgtScalar, true>::value && (SrcSize == TgtSize);
185template <
typename SrcPacket,
typename TgtPacket>
186struct is_degenerate {
187 static constexpr bool value =
188 is_degenerate_helper<SrcPacket, TgtPacket>::value || is_degenerate_helper<TgtPacket, SrcPacket>::value;
191template <
typename Packet>
193 using Scalar =
typename unpacket_traits<Packet>::type;
194 static constexpr int Size = unpacket_traits<Packet>::size;
195 using DefaultPacket =
typename packet_traits<Scalar>::type;
196 static constexpr int DefaultSize = unpacket_traits<DefaultPacket>::size;
197 static constexpr bool value = Size < DefaultSize;
200template <
typename Src,
typename Tgt>
201struct type_casting_traits {
204 is_degenerate<Src, Tgt>::value && packet_traits<Src>::Vectorizable && packet_traits<Tgt>::Vectorizable,
211template <
typename Src,
typename Tgt>
212struct vectorized_type_casting_traits {
214 DefaultSrcPacketSize = packet_traits<Src>::size,
215 DefaultTgtPacketSize = packet_traits<Tgt>::size,
217 SrcCoeffRatio = plain_enum_max(DefaultTgtPacketSize / DefaultSrcPacketSize, 1),
218 TgtCoeffRatio = plain_enum_max(DefaultSrcPacketSize / DefaultTgtPacketSize, 1)
224template <
typename T,
int unique_
id = 0>
225struct eigen_packet_wrapper {
226 EIGEN_ALWAYS_INLINE
operator T&() {
return m_val; }
227 EIGEN_ALWAYS_INLINE
operator const T&()
const {
return m_val; }
228 EIGEN_ALWAYS_INLINE eigen_packet_wrapper() =
default;
229 EIGEN_ALWAYS_INLINE eigen_packet_wrapper(
const T& v) : m_val(v) {}
230 EIGEN_ALWAYS_INLINE eigen_packet_wrapper& operator=(
const T& v) {
238template <typename Target, typename Packet, bool IsSame = is_same<Target, Packet>::value>
239struct preinterpret_generic;
241template <
typename Target,
typename Packet>
242struct preinterpret_generic<Target, Packet, false> {
244 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Target run(
const Packet& a) {
245 return numext::bit_cast<Target, Packet>(a);
249template <
typename Packet>
250struct preinterpret_generic<Packet, Packet, true> {
252 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(
const Packet& a) {
return a; }
256template <
typename Target,
typename Packet>
257EIGEN_DEVICE_FUNC
inline Target preinterpret(
const Packet& a) {
258 return preinterpret_generic<Target, Packet>::run(a);
261template <typename SrcPacket, typename TgtPacket, bool Degenerate = is_degenerate<SrcPacket, TgtPacket>::value,
262 bool TgtIsHalf = is_half<TgtPacket>::value>
265template <
typename SrcPacket,
typename TgtPacket>
266struct pcast_generic<SrcPacket, TgtPacket, false, false> {
268 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket run(
const SrcPacket& a) {
269 return cast_impl<SrcPacket, TgtPacket>::run(a);
273template <
typename Packet>
274struct pcast_generic<Packet, Packet, true, false> {
276 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(
const Packet& a) {
return a; }
279template <
typename SrcPacket,
typename TgtPacket,
bool TgtIsHalf>
280struct pcast_generic<SrcPacket, TgtPacket, true, TgtIsHalf> {
282 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket run(
const SrcPacket& a) {
return preinterpret<TgtPacket>(a); }
286template <
typename SrcPacket,
typename TgtPacket>
287EIGEN_DEVICE_FUNC
inline TgtPacket pcast(
const SrcPacket& a) {
288 return pcast_generic<SrcPacket, TgtPacket>::run(a);
290template <
typename SrcPacket,
typename TgtPacket>
291EIGEN_DEVICE_FUNC
inline TgtPacket pcast(
const SrcPacket& a,
const SrcPacket& b) {
292 return pcast_generic<SrcPacket, TgtPacket>::run(a, b);
294template <
typename SrcPacket,
typename TgtPacket>
295EIGEN_DEVICE_FUNC
inline TgtPacket pcast(
const SrcPacket& a,
const SrcPacket& b,
const SrcPacket& c,
296 const SrcPacket& d) {
297 return pcast_generic<SrcPacket, TgtPacket>::run(a, b, c, d);
299template <
typename SrcPacket,
typename TgtPacket>
300EIGEN_DEVICE_FUNC
inline TgtPacket pcast(
const SrcPacket& a,
const SrcPacket& b,
const SrcPacket& c,
const SrcPacket& d,
301 const SrcPacket& e,
const SrcPacket& f,
const SrcPacket& g,
302 const SrcPacket& h) {
303 return pcast_generic<SrcPacket, TgtPacket>::run(a, b, c, d, e, f, g, h);
306template <
typename SrcPacket,
typename TgtPacket>
307struct pcast_generic<SrcPacket, TgtPacket, false, true> {
310 using DefaultTgtPacket =
typename is_half<TgtPacket>::DefaultPacket;
311 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket run(
const SrcPacket& a) {
312 return preinterpret<TgtPacket>(pcast<SrcPacket, DefaultTgtPacket>(a));
317template <
typename Packet>
318EIGEN_DEVICE_FUNC
inline Packet padd(
const Packet& a,
const Packet& b) {
323EIGEN_DEVICE_FUNC
inline bool padd(
const bool& a,
const bool& b) {
331template <
typename Packet>
332EIGEN_DEVICE_FUNC
inline std::enable_if_t<unpacket_traits<Packet>::masked_fpops_available, Packet> padd(
333 const Packet& a,
const Packet& b,
typename unpacket_traits<Packet>::mask_t umask);
336template <
typename Packet>
337EIGEN_DEVICE_FUNC
inline Packet psub(
const Packet& a,
const Packet& b) {
342template <
typename Packet>
343EIGEN_DEVICE_FUNC
inline Packet pnegate(
const Packet& a) {
344 EIGEN_STATIC_ASSERT((!is_same<
typename unpacket_traits<Packet>::type,
bool>::value),
345 NEGATE IS NOT DEFINED FOR BOOLEAN TYPES)
346 return numext::negate(a);
350template <
typename Packet>
351EIGEN_DEVICE_FUNC
inline Packet pconj(
const Packet& a) {
352 return numext::conj(a);
356template <
typename Packet>
357EIGEN_DEVICE_FUNC
inline Packet pmul(
const Packet& a,
const Packet& b) {
362EIGEN_DEVICE_FUNC
inline bool pmul(
const bool& a,
const bool& b) {
367template <
typename Packet>
368EIGEN_DEVICE_FUNC
inline Packet pdiv(
const Packet& a,
const Packet& b) {
373template <
typename Packet,
typename EnableIf =
void>
375 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& ) {
377 memset(
static_cast<void*
>(&b), 0xff,
sizeof(Packet));
384struct ptrue_impl<bool, void> {
385 static EIGEN_DEVICE_FUNC
inline bool run(
const bool& ) {
return true; }
393struct ptrue_impl<T, std::enable_if_t<is_scalar<T>::value && NumTraits<T>::RequireInitialization>> {
394 static EIGEN_DEVICE_FUNC
inline T run(
const T& ) {
return T(1); }
398template <
typename Packet>
399EIGEN_DEVICE_FUNC
inline Packet ptrue(
const Packet& a) {
400 return ptrue_impl<Packet>::run(a);
404template <
typename Packet,
typename EnableIf =
void>
406 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& ) {
408 memset(
static_cast<void*
>(&b), 0x00,
sizeof(Packet));
416struct pzero_impl<T, std::enable_if_t<is_scalar<T>::value>> {
417 static EIGEN_DEVICE_FUNC
inline T run(
const T& ) {
return T(0); }
421template <
typename Packet>
422EIGEN_DEVICE_FUNC
inline Packet pzero(
const Packet& a) {
423 return pzero_impl<Packet>::run(a);
427template <
typename Packet>
428EIGEN_DEVICE_FUNC
inline Packet pcmp_le(
const Packet& a,
const Packet& b) {
429 return a <= b ? ptrue(a) : pzero(a);
433template <
typename Packet>
434EIGEN_DEVICE_FUNC
inline Packet pcmp_lt(
const Packet& a,
const Packet& b) {
435 return a < b ? ptrue(a) : pzero(a);
439template <
typename Packet>
440EIGEN_DEVICE_FUNC
inline Packet pcmp_eq(
const Packet& a,
const Packet& b) {
441 return a == b ? ptrue(a) : pzero(a);
445template <
typename Packet>
446EIGEN_DEVICE_FUNC
inline Packet pcmp_lt_or_nan(
const Packet& a,
const Packet& b) {
447 return a >= b ? pzero(a) : ptrue(a);
452 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(
const T& a,
const T& b)
const {
return a & b; }
457 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(
const T& a,
const T& b)
const {
return a | b; }
462 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(
const T& a,
const T& b)
const {
return a ^ b; }
467 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(
const T& a)
const {
return ~a; }
471struct bit_and<bool> {
472 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE
bool operator()(
const bool& a,
const bool& b)
const {
479 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE
bool operator()(
const bool& a,
const bool& b)
const {
485struct bit_xor<bool> {
486 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE
bool operator()(
const bool& a,
const bool& b)
const {
492struct bit_not<bool> {
493 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE
bool operator()(
const bool& a)
const {
return !a; }
498struct operator_bitwise_helper {
499 EIGEN_DEVICE_FUNC
static inline T bitwise_and(
const T& a,
const T& b) {
return bit_and<T>()(a, b); }
500 EIGEN_DEVICE_FUNC
static inline T bitwise_or(
const T& a,
const T& b) {
return bit_or<T>()(a, b); }
501 EIGEN_DEVICE_FUNC
static inline T bitwise_xor(
const T& a,
const T& b) {
return bit_xor<T>()(a, b); }
502 EIGEN_DEVICE_FUNC
static inline T bitwise_not(
const T& a) {
return bit_not<T>()(a); }
507struct bytewise_bitwise_helper {
508 EIGEN_DEVICE_FUNC
static inline T bitwise_and(
const T& a,
const T& b) {
509 return binary(a, b, bit_and<unsigned char>());
511 EIGEN_DEVICE_FUNC
static inline T bitwise_or(
const T& a,
const T& b) {
return binary(a, b, bit_or<unsigned char>()); }
512 EIGEN_DEVICE_FUNC
static inline T bitwise_xor(
const T& a,
const T& b) {
513 return binary(a, b, bit_xor<unsigned char>());
515 EIGEN_DEVICE_FUNC
static inline T bitwise_not(
const T& a) {
return unary(a, bit_not<unsigned char>()); }
518 template <
typename Op>
519 EIGEN_DEVICE_FUNC
static inline T unary(
const T& a, Op op) {
520 const unsigned char* a_ptr =
reinterpret_cast<const unsigned char*
>(&a);
522 unsigned char* c_ptr =
reinterpret_cast<unsigned char*
>(&c);
523 for (
size_t i = 0; i <
sizeof(T); ++i) {
524 *c_ptr++ = op(*a_ptr++);
529 template <
typename Op>
530 EIGEN_DEVICE_FUNC
static inline T binary(
const T& a,
const T& b, Op op) {
531 const unsigned char* a_ptr =
reinterpret_cast<const unsigned char*
>(&a);
532 const unsigned char* b_ptr =
reinterpret_cast<const unsigned char*
>(&b);
534 unsigned char* c_ptr =
reinterpret_cast<unsigned char*
>(&c);
535 for (
size_t i = 0; i <
sizeof(T); ++i) {
536 *c_ptr++ = op(*a_ptr++, *b_ptr++);
543template <
typename T,
typename EnableIf =
void>
544struct bitwise_helper :
public bytewise_bitwise_helper<T> {};
548struct bitwise_helper<T, typename std::enable_if_t<is_scalar<T>::value &&
549 (NumTraits<T>::IsInteger || NumTraits<T>::RequireInitialization)>>
550 :
public operator_bitwise_helper<T> {};
553template <
typename Packet>
554EIGEN_DEVICE_FUNC
inline Packet pand(
const Packet& a,
const Packet& b) {
555 return bitwise_helper<Packet>::bitwise_and(a, b);
559template <
typename Packet>
560EIGEN_DEVICE_FUNC
inline Packet por(
const Packet& a,
const Packet& b) {
561 return bitwise_helper<Packet>::bitwise_or(a, b);
565template <
typename Packet>
566EIGEN_DEVICE_FUNC
inline Packet pxor(
const Packet& a,
const Packet& b) {
567 return bitwise_helper<Packet>::bitwise_xor(a, b);
571template <
typename Packet>
572EIGEN_DEVICE_FUNC
inline Packet pnot(
const Packet& a) {
573 return bitwise_helper<Packet>::bitwise_not(a);
577template <
typename Packet>
578EIGEN_DEVICE_FUNC
inline Packet pandnot(
const Packet& a,
const Packet& b) {
579 return pand(a, pnot(b));
583template <
typename Packet>
584EIGEN_DEVICE_FUNC
inline Packet pisnan(
const Packet& a) {
585 return pandnot(ptrue(a), pcmp_eq(a, a));
589template <
typename Packet,
typename EnableIf =
void>
591 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& mask,
const Packet& a,
const Packet& b) {
592 return por(pand(a, mask), pandnot(b, mask));
597template <
typename Packet>
598struct pselect_impl<Packet, std::enable_if_t<is_scalar<Packet>::value>> {
599 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& mask,
const Packet& a,
const Packet& b) {
600 return numext::equal_strict(mask, Packet(0)) ? b : a;
605template <
typename Packet>
606EIGEN_DEVICE_FUNC
inline Packet pselect(
const Packet& mask,
const Packet& a,
const Packet& b) {
607 return pselect_impl<Packet>::run(mask, a, b);
611EIGEN_DEVICE_FUNC
inline bool pselect<bool>(
const bool& cond,
const bool& a,
const bool& b) {
617template <
int NaNPropagation>
619 template <
typename Packet,
typename Op>
620 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& a,
const Packet& b, Op op) {
629 template <
typename Packet,
typename Op>
630 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& a,
const Packet& b, Op op) {
631 Packet not_nan_mask_a = pcmp_eq(a, a);
632 Packet not_nan_mask_b = pcmp_eq(b, b);
633 return pselect(not_nan_mask_a, pselect(not_nan_mask_b, op(a, b), b), a);
642 template <
typename Packet,
typename Op>
643 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& a,
const Packet& b, Op op) {
644 Packet not_nan_mask_a = pcmp_eq(a, a);
645 Packet not_nan_mask_b = pcmp_eq(b, b);
646 return pselect(not_nan_mask_a, pselect(not_nan_mask_b, op(a, b), a), b);
650#define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) [](const Type& a, const Type& b) { return Func(a, b); }
654template <
typename Packet>
655EIGEN_DEVICE_FUNC
inline Packet pmin(
const Packet& a,
const Packet& b) {
656 return numext::mini(a, b);
661template <
int NaNPropagation,
typename Packet>
662EIGEN_DEVICE_FUNC
inline Packet pmin(
const Packet& a,
const Packet& b) {
663 return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet, (pmin<Packet>)));
668template <
typename Packet>
669EIGEN_DEVICE_FUNC
inline Packet pmax(
const Packet& a,
const Packet& b) {
670 return numext::maxi(a, b);
675template <
int NaNPropagation,
typename Packet>
676EIGEN_DEVICE_FUNC
inline Packet pmax(
const Packet& a,
const Packet& b) {
677 return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet, (pmax<Packet>)));
681template <
typename Packet>
682EIGEN_DEVICE_FUNC
inline Packet pabs(
const Packet& a) {
683 return numext::abs(a);
686EIGEN_DEVICE_FUNC
inline unsigned int pabs(
const unsigned int& a) {
690EIGEN_DEVICE_FUNC
inline unsigned long pabs(
const unsigned long& a) {
694EIGEN_DEVICE_FUNC
inline unsigned long long pabs(
const unsigned long long& a) {
699template <
typename Packet>
700EIGEN_DEVICE_FUNC
inline Packet paddsub(
const Packet& a,
const Packet& b) {
701 return pselect(peven_mask(a), padd(a, b), psub(a, b));
705template <
typename Packet>
706EIGEN_DEVICE_FUNC
inline Packet parg(
const Packet& a) {
712template <
int N,
typename T>
713EIGEN_DEVICE_FUNC
inline T parithmetic_shift_right(
const T& a) {
714 return numext::arithmetic_shift_right(a, N);
718template <
int N,
typename T>
719EIGEN_DEVICE_FUNC
inline T plogical_shift_right(
const T& a) {
720 return numext::logical_shift_right(a, N);
724template <
int N,
typename T>
725EIGEN_DEVICE_FUNC
inline T plogical_shift_left(
const T& a) {
726 return numext::logical_shift_left(a, N);
732template <
typename Packet>
733EIGEN_DEVICE_FUNC
inline Packet pfrexp(
const Packet& a, Packet& exponent) {
735 EIGEN_USING_STD(frexp);
736 Packet result =
static_cast<Packet
>(frexp(a, &
exp));
737 exponent =
static_cast<Packet
>(
exp);
744template <
typename Packet>
745EIGEN_DEVICE_FUNC
inline Packet pldexp(
const Packet& a,
const Packet& exponent) {
746 EIGEN_USING_STD(ldexp)
747 return static_cast<Packet
>(ldexp(a,
static_cast<int>(exponent)));
751template <
typename Packet>
752EIGEN_DEVICE_FUNC
inline Packet pabsdiff(
const Packet& a,
const Packet& b) {
753 return pselect(pcmp_lt(a, b), psub(b, a), psub(a, b));
757template <
typename Packet>
758EIGEN_DEVICE_FUNC
inline Packet pload(
const typename unpacket_traits<Packet>::type* from) {
766template <
typename Packet>
767EIGEN_DEVICE_FUNC
inline Packet pload_partial(
const typename unpacket_traits<Packet>::type* from,
const Index n,
768 const Index offset = 0) {
769 const Index packet_size = unpacket_traits<Packet>::size;
770 eigen_assert(n + offset <= packet_size &&
"number of elements plus offset will read past end of packet");
771 typedef typename unpacket_traits<Packet>::type Scalar;
772 EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
773 for (Index i = offset; i < numext::mini(n + offset, packet_size); i++) {
774 elements[i] = from[i - offset];
776 return pload<Packet>(elements);
780template <
typename Packet>
781EIGEN_DEVICE_FUNC
inline Packet ploadu(
const typename unpacket_traits<Packet>::type* from) {
787template <
typename Packet>
788EIGEN_DEVICE_FUNC
inline Packet ploadu_partial(
const typename unpacket_traits<Packet>::type* from,
const Index n,
789 const Index offset = 0) {
790 const Index packet_size = unpacket_traits<Packet>::size;
791 eigen_assert(n + offset <= packet_size &&
"number of elements plus offset will read past end of packet");
792 typedef typename unpacket_traits<Packet>::type Scalar;
793 EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
794 for (Index i = offset; i < numext::mini(n + offset, packet_size); i++) {
795 elements[i] = from[i - offset];
797 return pload<Packet>(elements);
804template <
typename Packet>
805EIGEN_DEVICE_FUNC
inline std::enable_if_t<unpacket_traits<Packet>::masked_load_available, Packet> ploadu(
806 const typename unpacket_traits<Packet>::type* from,
typename unpacket_traits<Packet>::mask_t umask);
809template <
typename Packet>
810EIGEN_DEVICE_FUNC
inline Packet pset1(
const typename unpacket_traits<Packet>::type& a) {
815template <
typename Packet,
typename BitsType>
816EIGEN_DEVICE_FUNC
inline Packet pset1frombits(BitsType a);
819template <
typename Packet>
820EIGEN_DEVICE_FUNC
inline Packet pload1(
const typename unpacket_traits<Packet>::type* a) {
821 return pset1<Packet>(*a);
829template <
typename Packet>
830EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet ploaddup(
const typename unpacket_traits<Packet>::type* from) {
840template <
typename Packet>
841EIGEN_DEVICE_FUNC
inline Packet ploadquad(
const typename unpacket_traits<Packet>::type* from) {
842 return pload1<Packet>(from);
854template <
typename Packet>
855EIGEN_DEVICE_FUNC
inline void pbroadcast4(
const typename unpacket_traits<Packet>::type* a, Packet& a0, Packet& a1,
856 Packet& a2, Packet& a3) {
857 a0 = pload1<Packet>(a + 0);
858 a1 = pload1<Packet>(a + 1);
859 a2 = pload1<Packet>(a + 2);
860 a3 = pload1<Packet>(a + 3);
870template <
typename Packet>
871EIGEN_DEVICE_FUNC
inline void pbroadcast2(
const typename unpacket_traits<Packet>::type* a, Packet& a0, Packet& a1) {
872 a0 = pload1<Packet>(a + 0);
873 a1 = pload1<Packet>(a + 1);
877template <
typename Packet>
878EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet plset(
const typename unpacket_traits<Packet>::type& a) {
884template <
typename Packet>
885EIGEN_DEVICE_FUNC
inline Packet peven_mask(
const Packet& ) {
886 typedef typename unpacket_traits<Packet>::type Scalar;
887 const size_t n = unpacket_traits<Packet>::size;
888 EIGEN_ALIGN_TO_BOUNDARY(
sizeof(Packet)) Scalar elements[n];
889 for (
size_t i = 0; i < n; ++i) {
890 memset(elements + i, ((i & 1) == 0 ? 0xff : 0), sizeof(Scalar));
892 return ploadu<Packet>(elements);
896template <
typename Scalar,
typename Packet>
897EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from) {
904template <
typename Scalar,
typename Packet>
905EIGEN_DEVICE_FUNC
inline void pstore_partial(Scalar* to,
const Packet& from,
const Index n,
const Index offset = 0) {
906 const Index packet_size = unpacket_traits<Packet>::size;
907 eigen_assert(n + offset <= packet_size &&
"number of elements plus offset will write past end of packet");
908 EIGEN_ALIGN_MAX Scalar elements[packet_size];
909 pstore<Scalar>(elements, from);
910 for (Index i = 0; i < numext::mini(n, packet_size - offset); i++) {
911 to[i] = elements[i + offset];
916template <
typename Scalar,
typename Packet>
917EIGEN_DEVICE_FUNC
inline void pstoreu(Scalar* to,
const Packet& from) {
922template <
typename Scalar,
typename Packet>
923EIGEN_DEVICE_FUNC
inline void pstoreu_partial(Scalar* to,
const Packet& from,
const Index n,
const Index offset = 0) {
924 const Index packet_size = unpacket_traits<Packet>::size;
925 eigen_assert(n + offset <= packet_size &&
"number of elements plus offset will write past end of packet");
926 EIGEN_ALIGN_MAX Scalar elements[packet_size];
927 pstore<Scalar>(elements, from);
928 for (Index i = 0; i < numext::mini(n, packet_size - offset); i++) {
929 to[i] = elements[i + offset];
937template <
typename Scalar,
typename Packet>
938EIGEN_DEVICE_FUNC
inline std::enable_if_t<unpacket_traits<Packet>::masked_store_available,
void> pstoreu(
939 Scalar* to,
const Packet& from,
typename unpacket_traits<Packet>::mask_t umask);
941template <
typename Scalar,
typename Packet>
942EIGEN_DEVICE_FUNC
inline Packet pgather(
const Scalar* from, Index ) {
943 return ploadu<Packet>(from);
946template <
typename Scalar,
typename Packet>
947EIGEN_DEVICE_FUNC
inline Packet pgather_partial(
const Scalar* from, Index stride,
const Index n) {
948 const Index packet_size = unpacket_traits<Packet>::size;
949 EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
950 for (Index i = 0; i < numext::mini(n, packet_size); i++) {
951 elements[i] = from[i * stride];
953 return pload<Packet>(elements);
956template <
typename Scalar,
typename Packet>
957EIGEN_DEVICE_FUNC
inline void pscatter(Scalar* to,
const Packet& from, Index ) {
961template <
typename Scalar,
typename Packet>
962EIGEN_DEVICE_FUNC
inline void pscatter_partial(Scalar* to,
const Packet& from, Index stride,
const Index n) {
963 const Index packet_size = unpacket_traits<Packet>::size;
964 EIGEN_ALIGN_MAX Scalar elements[packet_size];
965 pstore<Scalar>(elements, from);
966 for (Index i = 0; i < numext::mini(n, packet_size); i++) {
967 to[i * stride] = elements[i];
972template <
typename Scalar>
973EIGEN_DEVICE_FUNC
inline void prefetch(
const Scalar* addr) {
974#if defined(EIGEN_HIP_DEVICE_COMPILE)
976#elif defined(EIGEN_CUDA_ARCH)
977#if defined(__LP64__) || EIGEN_OS_WIN64
979 asm(
" prefetch.L1 [ %1 ];" :
"=l"(addr) :
"l"(addr));
982 asm(
" prefetch.L1 [ %1 ];" :
"=r"(addr) :
"r"(addr));
984#elif (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC)
985 __builtin_prefetch(addr);
990template <
typename Packet>
991EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a) {
996template <
typename Packet>
997EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a) {
998 return Packet(numext::imag(a), numext::real(a));
1006template <
typename Packet>
1007EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin(
const Packet& a) {
1008 EIGEN_USING_STD(
sin);
1013template <
typename Packet>
1014EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos(
const Packet& a) {
1015 EIGEN_USING_STD(
cos);
1020template <
typename Packet>
1021EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan(
const Packet& a) {
1022 EIGEN_USING_STD(
tan);
1027template <
typename Packet>
1028EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin(
const Packet& a) {
1029 EIGEN_USING_STD(
asin);
1034template <
typename Packet>
1035EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos(
const Packet& a) {
1036 EIGEN_USING_STD(
acos);
1041template <
typename Packet>
1042EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psinh(
const Packet& a) {
1043 EIGEN_USING_STD(
sinh);
1048template <
typename Packet>
1049EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcosh(
const Packet& a) {
1050 EIGEN_USING_STD(
cosh);
1055template <
typename Packet>
1056EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan(
const Packet& a) {
1057 EIGEN_USING_STD(
atan);
1062template <
typename Packet>
1063EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh(
const Packet& a) {
1064 EIGEN_USING_STD(
tanh);
1069template <
typename Packet>
1070EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh(
const Packet& a) {
1071 EIGEN_USING_STD(
atanh);
1076template <
typename Packet>
1077EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp(
const Packet& a) {
1078 EIGEN_USING_STD(
exp);
1083template <
typename Packet>
1084EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexpm1(
const Packet& a) {
1085 return numext::expm1(a);
1089template <
typename Packet>
1090EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog(
const Packet& a) {
1091 EIGEN_USING_STD(
log);
1096template <
typename Packet>
1097EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p(
const Packet& a) {
1098 return numext::log1p(a);
1102template <
typename Packet>
1103EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10(
const Packet& a) {
1104 EIGEN_USING_STD(
log10);
1109template <
typename Packet>
1110EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2(
const Packet& a) {
1111 using Scalar =
typename internal::unpacket_traits<Packet>::type;
1112 using RealScalar =
typename NumTraits<Scalar>::Real;
1113 return pmul(pset1<Packet>(Scalar(RealScalar(EIGEN_LOG2E))), plog(a));
1117template <
typename Packet>
1118EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psqrt(
const Packet& a) {
1119 return numext::sqrt(a);
1123template <
typename Packet>
1124EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcbrt(
const Packet& a) {
1125 return numext::cbrt(a);
1128template <typename Packet, bool IsScalar = is_scalar<Packet>::value,
1129 bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
1130struct nearest_integer_packetop_impl {
1131 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run_floor(
const Packet& x) {
return numext::floor(x); }
1132 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run_ceil(
const Packet& x) {
return numext::ceil(x); }
1133 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run_rint(
const Packet& x) {
return numext::rint(x); }
1134 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run_round(
const Packet& x) {
return numext::round(x); }
1135 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run_trunc(
const Packet& x) {
return numext::trunc(x); }
1139template <
typename Packet>
1140EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pround(
const Packet& a) {
1141 return nearest_integer_packetop_impl<Packet>::run_round(a);
1145template <
typename Packet>
1146EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pfloor(
const Packet& a) {
1147 return nearest_integer_packetop_impl<Packet>::run_floor(a);
1152template <
typename Packet>
1153EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet print(
const Packet& a) {
1154 return nearest_integer_packetop_impl<Packet>::run_rint(a);
1158template <
typename Packet>
1159EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pceil(
const Packet& a) {
1160 return nearest_integer_packetop_impl<Packet>::run_ceil(a);
1164template <
typename Packet>
1165EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet ptrunc(
const Packet& a) {
1166 return nearest_integer_packetop_impl<Packet>::run_trunc(a);
1169template <
typename Packet,
typename EnableIf =
void>
1171 static EIGEN_DEVICE_FUNC
inline Packet run(
const Packet& a) {
return numext::sign(a); }
1175template <
typename Packet>
1176EIGEN_DEVICE_FUNC
inline Packet psign(
const Packet& a) {
1177 return psign_impl<Packet>::run(a);
1181EIGEN_DEVICE_FUNC
inline bool psign(
const bool& a) {
1186template <
typename Packet>
1187EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a) {
1195template <
typename Packet>
1196EIGEN_DEVICE_FUNC
inline std::conditional_t<(unpacket_traits<Packet>::size % 8) == 0,
1197 typename unpacket_traits<Packet>::half, Packet>
1198predux_half_dowto4(
const Packet& a) {
1203template <
typename Packet,
typename Op>
1204EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_helper(
const Packet& a, Op op) {
1205 typedef typename unpacket_traits<Packet>::type Scalar;
1206 const size_t n = unpacket_traits<Packet>::size;
1207 EIGEN_ALIGN_TO_BOUNDARY(
sizeof(Packet)) Scalar elements[n];
1208 pstoreu<Scalar>(elements, a);
1209 for (
size_t k = n / 2; k > 0; k /= 2) {
1210 for (
size_t i = 0; i < k; ++i) {
1211 elements[i] = op(elements[i], elements[i + k]);
1218template <
typename Packet>
1219EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux(
const Packet& a) {
1224template <
typename Packet>
1225EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a) {
1226 typedef typename unpacket_traits<Packet>::type Scalar;
1227 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmul<Scalar>)));
1231template <
typename Packet>
1232EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a) {
1233 typedef typename unpacket_traits<Packet>::type Scalar;
1234 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<PropagateFast, Scalar>)));
1237template <
int NaNPropagation,
typename Packet>
1238EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a) {
1239 typedef typename unpacket_traits<Packet>::type Scalar;
1240 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<NaNPropagation, Scalar>)));
1244template <
typename Packet>
1245EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a) {
1246 typedef typename unpacket_traits<Packet>::type Scalar;
1247 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<PropagateFast, Scalar>)));
1250template <
int NaNPropagation,
typename Packet>
1251EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a) {
1252 typedef typename unpacket_traits<Packet>::type Scalar;
1253 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<NaNPropagation, Scalar>)));
1256#undef EIGEN_BINARY_OP_NAN_PROPAGATION
1268template <
typename Packet>
1269EIGEN_DEVICE_FUNC
inline bool predux_any(
const Packet& a) {
1276 typedef typename unpacket_traits<Packet>::type Scalar;
1277 return numext::not_equal_strict(predux(a), Scalar(0));
1286template <
typename Packet>
1287EIGEN_DEVICE_FUNC
inline Packet pmadd(
const Packet& a,
const Packet& b,
const Packet& c) {
1288 return padd(pmul(a, b), c);
1292template <
typename Packet>
1293EIGEN_DEVICE_FUNC
inline Packet pmsub(
const Packet& a,
const Packet& b,
const Packet& c) {
1294 return psub(pmul(a, b), c);
1298template <
typename Packet>
1299EIGEN_DEVICE_FUNC
inline Packet pnmadd(
const Packet& a,
const Packet& b,
const Packet& c) {
1300 return psub(c, pmul(a, b));
1304template <
typename Packet>
1305EIGEN_DEVICE_FUNC
inline Packet pnmsub(
const Packet& a,
const Packet& b,
const Packet& c) {
1306 return pnegate(pmadd(a, b, c));
1313template <
typename Packet>
1314inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a) {
1315 pstore(to, pset1<Packet>(a));
1320template <
typename Packet,
int Alignment>
1321EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(
const typename unpacket_traits<Packet>::type* from) {
1322 if (Alignment >= unpacket_traits<Packet>::alignment)
1323 return pload<Packet>(from);
1325 return ploadu<Packet>(from);
1330template <
typename Packet,
int Alignment>
1331EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_partial(
const typename unpacket_traits<Packet>::type* from,
1332 const Index n,
const Index offset = 0) {
1333 if (Alignment >= unpacket_traits<Packet>::alignment)
1334 return pload_partial<Packet>(from, n, offset);
1336 return ploadu_partial<Packet>(from, n, offset);
1341template <
typename Scalar,
typename Packet,
int Alignment>
1342EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from) {
1343 if (Alignment >= unpacket_traits<Packet>::alignment)
1351template <
typename Scalar,
typename Packet,
int Alignment>
1352EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret_partial(Scalar* to,
const Packet& from,
const Index n,
1353 const Index offset = 0) {
1354 if (Alignment >= unpacket_traits<Packet>::alignment)
1355 pstore_partial(to, from, n, offset);
1357 pstoreu_partial(to, from, n, offset);
1365template <
typename Packet,
int LoadMode>
1366EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from) {
1367 return ploadt<Packet, LoadMode>(from);
1375#if !defined(EIGEN_GPUCC)
1378inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b) {
1379 return std::complex<float>(a.real() * b.real() - a.imag() * b.imag(), a.imag() * b.real() + a.real() * b.imag());
1383inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b) {
1384 return std::complex<double>(a.real() * b.real() - a.imag() * b.imag(), a.imag() * b.real() + a.real() * b.imag());
1393template <typename Packet, int N = unpacket_traits<Packet>::size>
1398template <
typename Packet>
1399EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet, 1>& ) {
1412template <
typename Packet>
1413EIGEN_DEVICE_FUNC
inline Packet pblend(
const Selector<unpacket_traits<Packet>::size>& ifPacket,
1414 const Packet& thenPacket,
const Packet& elsePacket) {
1415 return ifPacket.select[0] ? thenPacket : elsePacket;
1419template <
typename Packet>
1420EIGEN_DEVICE_FUNC
inline Packet preciprocal(
const Packet& a) {
1421 using Scalar =
typename unpacket_traits<Packet>::type;
1422 return pdiv(pset1<Packet>(Scalar(1)), a);
1426template <
typename Packet>
1427EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet prsqrt(
const Packet& a) {
1428 return preciprocal<Packet>(psqrt(a));
1431template <typename Packet, bool IsScalar = is_scalar<Packet>::value,
1432 bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
1433struct psignbit_impl;
1434template <
typename Packet,
bool IsInteger>
1435struct psignbit_impl<Packet, true, IsInteger> {
1436 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static constexpr Packet run(
const Packet& a) {
return numext::signbit(a); }
1438template <
typename Packet>
1439struct psignbit_impl<Packet, false, false> {
1442 typedef typename unpacket_traits<Packet>::type Scalar;
1443 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static Packet run(
const Packet& a) {
1444 const Packet cst_pos_one = pset1<Packet>(Scalar(1));
1445 const Packet cst_neg_one = pset1<Packet>(Scalar(-1));
1446 return pcmp_eq(por(pand(a, cst_neg_one), cst_pos_one), cst_neg_one);
1449template <
typename Packet>
1450struct psignbit_impl<Packet, false, true> {
1452 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static constexpr Packet run(
const Packet& a) {
return pcmp_lt(a, pzero(a)); }
1455template <
typename Packet>
1456EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
constexpr Packet psignbit(
const Packet& a) {
1457 return psignbit_impl<Packet>::run(a);
1461template <typename Packet, std::enable_if_t<is_scalar<Packet>::value,
int> = 0>
1462EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet patan2(
const Packet& y,
const Packet& x) {
1463 return numext::atan2(y, x);
1467template <typename Packet, std::enable_if_t<!is_scalar<Packet>::value,
int> = 0>
1468EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet patan2(
const Packet& y,
const Packet& x) {
1469 typedef typename internal::unpacket_traits<Packet>::type Scalar;
1474 const Packet kSignMask = pset1<Packet>(-Scalar(0));
1475 const Packet kZero = pzero(x);
1476 const Packet kOne = pset1<Packet>(Scalar(1));
1477 const Packet kPi = pset1<Packet>(Scalar(EIGEN_PI));
1479 const Packet x_has_signbit = psignbit(x);
1480 const Packet y_signmask = pand(y, kSignMask);
1481 const Packet x_signmask = pand(x, kSignMask);
1482 const Packet result_signmask = pxor(y_signmask, x_signmask);
1483 const Packet shift = por(pand(x_has_signbit, kPi), y_signmask);
1485 const Packet x_and_y_are_same = pcmp_eq(pabs(x), pabs(y));
1486 const Packet x_and_y_are_zero = pcmp_eq(por(x, y), kZero);
1488 Packet
arg = pdiv(y, x);
1489 arg = pselect(x_and_y_are_same, por(kOne, result_signmask),
arg);
1490 arg = pselect(x_and_y_are_zero, result_signmask,
arg);
1492 Packet result = patan(
arg);
1493 result = padd(result, shift);
1498template <typename Packet, std::enable_if_t<is_scalar<Packet>::value,
int> = 0>
1499EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pcarg(
const Packet& a) {
1500 return Packet(numext::arg(a));
1504template <typename Packet, std::enable_if_t<!is_scalar<Packet>::value,
int> = 0>
1505EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pcarg(
const Packet& a) {
1506 EIGEN_STATIC_ASSERT(NumTraits<
typename unpacket_traits<Packet>::type>::IsComplex,
1507 THIS METHOD IS FOR COMPLEX TYPES ONLY)
1508 using RealPacket =
typename unpacket_traits<Packet>::as_real;
1510 RealPacket aflip = pcplxflip(a).v;
1511 RealPacket result = patan2(aflip, a.v);
1512 return (Packet)pand(result, peven_mask(result));
@ PropagateNaN
Definition Constants.h:342
@ PropagateNumbers
Definition Constants.h:344
Namespace containing all symbols from the Eigen library.
Definition Core:137
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cosh_op< typename Derived::Scalar >, const Derived > cosh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cos_op< typename Derived::Scalar >, const Derived > cos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_atanh_op< typename Derived::Scalar >, const Derived > atanh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_exp_op< typename Derived::Scalar >, const Derived > exp(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tan_op< typename Derived::Scalar >, const Derived > tan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_atan_op< typename Derived::Scalar >, const Derived > atan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log_op< typename Derived::Scalar >, const Derived > log(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sin_op< typename Derived::Scalar >, const Derived > sin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_asin_op< typename Derived::Scalar >, const Derived > asin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tanh_op< typename Derived::Scalar >, const Derived > tanh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_acos_op< typename Derived::Scalar >, const Derived > acos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sinh_op< typename Derived::Scalar >, const Derived > sinh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log10_op< typename Derived::Scalar >, const Derived > log10(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)