11#ifndef EIGEN_MATHFUNCTIONS_H
12#define EIGEN_MATHFUNCTIONS_H
16#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
17#define EIGEN_LOG2E 1.442695040888963407359924681001892137426645954152985934135449406931109219L
18#define EIGEN_LN2 0.693147180559945309417232121458176568075500134360255254120680009493393621L
21#include "./InternalHeaderCheck.h"
48template <
typename T,
typename dummy =
void>
49struct global_math_functions_filtering_base {
59struct global_math_functions_filtering_base<
60 T, typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type> {
61 typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
64#define EIGEN_MATHFUNC_IMPL(func, scalar) \
65 Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
66#define EIGEN_MATHFUNC_RETVAL(func, scalar) \
67 typename Eigen::internal::func##_retval< \
68 typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
74template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
75struct real_default_impl {
76 typedef typename NumTraits<Scalar>::Real RealScalar;
77 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
return x; }
80template <
typename Scalar>
81struct real_default_impl<Scalar, true> {
82 typedef typename NumTraits<Scalar>::Real RealScalar;
83 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
89template <
typename Scalar>
90struct real_impl : real_default_impl<Scalar> {};
92#if defined(EIGEN_GPU_COMPILE_PHASE)
94struct real_impl<std::complex<T>> {
96 EIGEN_DEVICE_FUNC
static inline T run(
const std::complex<T>& x) {
return x.real(); }
100template <
typename Scalar>
102 typedef typename NumTraits<Scalar>::Real type;
109template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
110struct imag_default_impl {
111 typedef typename NumTraits<Scalar>::Real RealScalar;
112 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar&) {
return RealScalar(0); }
115template <
typename Scalar>
116struct imag_default_impl<Scalar, true> {
117 typedef typename NumTraits<Scalar>::Real RealScalar;
118 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
124template <
typename Scalar>
125struct imag_impl : imag_default_impl<Scalar> {};
127#if defined(EIGEN_GPU_COMPILE_PHASE)
129struct imag_impl<std::complex<T>> {
130 typedef T RealScalar;
131 EIGEN_DEVICE_FUNC
static inline T run(
const std::complex<T>& x) {
return x.imag(); }
135template <
typename Scalar>
137 typedef typename NumTraits<Scalar>::Real type;
144template <
typename Scalar>
145struct real_ref_impl {
146 typedef typename NumTraits<Scalar>::Real RealScalar;
147 EIGEN_DEVICE_FUNC
static inline RealScalar& run(Scalar& x) {
return reinterpret_cast<RealScalar*
>(&x)[0]; }
148 EIGEN_DEVICE_FUNC
static inline const RealScalar& run(
const Scalar& x) {
149 return reinterpret_cast<const RealScalar*
>(&x)[0];
153template <
typename Scalar>
154struct real_ref_retval {
155 typedef typename NumTraits<Scalar>::Real& type;
162template <
typename Scalar,
bool IsComplex>
163struct imag_ref_default_impl {
164 typedef typename NumTraits<Scalar>::Real RealScalar;
165 EIGEN_DEVICE_FUNC
static inline RealScalar& run(Scalar& x) {
return reinterpret_cast<RealScalar*
>(&x)[1]; }
166 EIGEN_DEVICE_FUNC
static inline const RealScalar& run(
const Scalar& x) {
167 return reinterpret_cast<const RealScalar*
>(&x)[1];
171template <
typename Scalar>
172struct imag_ref_default_impl<Scalar, false> {
173 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline Scalar run(Scalar&) {
return Scalar(0); }
174 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
static inline const Scalar run(
const Scalar&) {
return Scalar(0); }
177template <
typename Scalar>
178struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
180template <
typename Scalar>
181struct imag_ref_retval {
182 typedef typename NumTraits<Scalar>::Real& type;
189template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
190struct conj_default_impl {
191 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
return x; }
194template <
typename Scalar>
195struct conj_default_impl<Scalar, true> {
196 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
202template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
203struct conj_impl : conj_default_impl<Scalar, IsComplex> {};
205template <
typename Scalar>
214template <
typename Scalar,
bool IsComplex>
215struct abs2_impl_default {
216 typedef typename NumTraits<Scalar>::Real RealScalar;
217 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
return x * x; }
220template <
typename Scalar>
221struct abs2_impl_default<Scalar, true>
223 typedef typename NumTraits<Scalar>::Real RealScalar;
224 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
return x.real() * x.real() + x.imag() * x.imag(); }
227template <
typename Scalar>
229 typedef typename NumTraits<Scalar>::Real RealScalar;
230 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
231 return abs2_impl_default<Scalar, NumTraits<Scalar>::IsComplex>::run(x);
235template <
typename Scalar>
237 typedef typename NumTraits<Scalar>::Real type;
244template <
typename Scalar>
246 EIGEN_DEVICE_FUNC
static EIGEN_ALWAYS_INLINE Scalar run(
const Scalar& x) {
247 EIGEN_USING_STD(
sqrt);
254EIGEN_DEVICE_FUNC std::complex<T> complex_sqrt(
const std::complex<T>& a_x);
259struct sqrt_impl<std::complex<T>> {
260 EIGEN_DEVICE_FUNC
static EIGEN_ALWAYS_INLINE std::complex<T> run(
const std::complex<T>& x) {
261 return complex_sqrt<T>(x);
265template <
typename Scalar>
276EIGEN_DEVICE_FUNC std::complex<T> complex_rsqrt(
const std::complex<T>& a_x);
279struct rsqrt_impl<std::complex<T>> {
280 EIGEN_DEVICE_FUNC
static EIGEN_ALWAYS_INLINE std::complex<T> run(
const std::complex<T>& x) {
281 return complex_rsqrt<T>(x);
285template <
typename Scalar>
294template <
typename Scalar,
bool IsComplex>
295struct norm1_default_impl;
297template <
typename Scalar>
298struct norm1_default_impl<Scalar, true> {
299 typedef typename NumTraits<Scalar>::Real RealScalar;
300 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
301 EIGEN_USING_STD(
abs);
302 return abs(x.real()) +
abs(x.imag());
306template <
typename Scalar>
307struct norm1_default_impl<Scalar, false> {
308 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
309 EIGEN_USING_STD(
abs);
314template <
typename Scalar>
315struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
317template <
typename Scalar>
319 typedef typename NumTraits<Scalar>::Real type;
326template <
typename Scalar>
329template <
typename Scalar>
331 typedef typename NumTraits<Scalar>::Real type;
338template <
typename OldType,
typename NewType,
typename EnableIf =
void>
340 EIGEN_DEVICE_FUNC
static inline NewType run(
const OldType& x) {
return static_cast<NewType
>(x); }
343template <
typename OldType>
344struct cast_impl<OldType, bool> {
345 EIGEN_DEVICE_FUNC
static inline bool run(
const OldType& x) {
return x != OldType(0); }
350template <
typename OldType,
typename NewType>
351struct cast_impl<OldType, NewType,
352 typename std::enable_if_t<!NumTraits<OldType>::IsComplex && NumTraits<NewType>::IsComplex>> {
353 EIGEN_DEVICE_FUNC
static inline NewType run(
const OldType& x) {
354 typedef typename NumTraits<NewType>::Real NewReal;
355 return static_cast<NewType
>(
static_cast<NewReal
>(x));
361template <
typename OldType,
typename NewType>
362EIGEN_DEVICE_FUNC
inline NewType cast(
const OldType& x) {
363 return cast_impl<OldType, NewType>::run(x);
372#if (!EIGEN_COMP_MSVC || EIGEN_COMP_MSVC >= 1920)
374template <typename Scalar, bool HasStdImpl = NumTraits<Scalar>::IsComplex || is_integral<Scalar>::value ||
375 is_same<Scalar, float>::value || is_same<Scalar, double>::value ||
376 is_same<Scalar, long double>::value>
377struct arg_default_impl;
379template <
typename Scalar>
380struct arg_default_impl<Scalar, true> {
381 typedef typename NumTraits<Scalar>::Real RealScalar;
382 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
385 return static_cast<RealScalar
>(
arg(x));
390template <
typename Scalar>
391struct arg_default_impl<Scalar, false> {
392 typedef typename NumTraits<Scalar>::Real RealScalar;
393 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
394 return (x < Scalar(0)) ? RealScalar(EIGEN_PI) : RealScalar(0);
398template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
399struct arg_default_impl {
400 typedef typename NumTraits<Scalar>::Real RealScalar;
401 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
402 return (x < RealScalar(0)) ? RealScalar(EIGEN_PI) : RealScalar(0);
406template <
typename Scalar>
407struct arg_default_impl<Scalar, true> {
408 typedef typename NumTraits<Scalar>::Real RealScalar;
409 EIGEN_DEVICE_FUNC
static inline RealScalar run(
const Scalar& x) {
410 EIGEN_USING_STD(
arg);
415template <
typename Scalar>
416struct arg_impl : arg_default_impl<Scalar> {};
418template <
typename Scalar>
420 typedef typename NumTraits<Scalar>::Real type;
428namespace std_fallback {
432template <
typename Scalar>
433EIGEN_DEVICE_FUNC
inline Scalar expm1(
const Scalar& x) {
434 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
435 typedef typename NumTraits<Scalar>::Real RealScalar;
437 EIGEN_USING_STD(
exp);
439 if (numext::equal_strict(u, Scalar(1))) {
442 Scalar um1 = u - RealScalar(1);
443 if (numext::equal_strict(um1, Scalar(-1))) {
444 return RealScalar(-1);
447 EIGEN_USING_STD(
log);
448 Scalar logu =
log(u);
449 return numext::equal_strict(u, logu) ? u : (u - RealScalar(1)) * x / logu;
453template <
typename Scalar>
455 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
456 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
457 EIGEN_USING_STD(
expm1);
462template <
typename Scalar>
473EIGEN_DEVICE_FUNC std::complex<T> complex_log(
const std::complex<T>& z);
475template <
typename Scalar>
477 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
478 EIGEN_USING_STD(
log);
479 return static_cast<Scalar
>(
log(x));
483template <
typename Scalar>
484struct log_impl<std::complex<Scalar>> {
485 EIGEN_DEVICE_FUNC
static inline std::complex<Scalar> run(
const std::complex<Scalar>& z) {
return complex_log(z); }
492namespace std_fallback {
495template <
typename Scalar>
496EIGEN_DEVICE_FUNC
inline Scalar log1p(
const Scalar& x) {
497 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
498 typedef typename NumTraits<Scalar>::Real RealScalar;
499 EIGEN_USING_STD(
log);
500 Scalar x1p = RealScalar(1) + x;
501 Scalar log_1p = log_impl<Scalar>::run(x1p);
502 const bool is_small = numext::equal_strict(x1p, Scalar(1));
503 const bool is_inf = numext::equal_strict(x1p, log_1p);
504 return (is_small || is_inf) ? x : x * (log_1p / (x1p - RealScalar(1)));
508template <
typename Scalar>
510 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
512 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x) {
513 EIGEN_USING_STD(
log1p);
519template <
typename RealScalar>
520struct log1p_impl<std::complex<RealScalar>> {
521 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
523 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
const std::complex<RealScalar>& x) {
524 return std_fallback::log1p(x);
528template <
typename Scalar>
537template <
typename ScalarX,
typename ScalarY,
538 bool IsInteger = NumTraits<ScalarX>::IsInteger && NumTraits<ScalarY>::IsInteger>
541 typedef typename ScalarBinaryOpTraits<ScalarX, ScalarY, internal::scalar_pow_op<ScalarX, ScalarY>>::ReturnType
543 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y) {
544 EIGEN_USING_STD(pow);
549template <
typename ScalarX,
typename ScalarY>
550struct pow_impl<ScalarX, ScalarY, true> {
551 typedef ScalarX result_type;
552 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y) {
554 eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
566enum { meta_floor_log2_terminate, meta_floor_log2_move_up, meta_floor_log2_move_down, meta_floor_log2_bogus };
568template <
unsigned int n,
int lower,
int upper>
569struct meta_floor_log2_selector {
571 middle = (lower + upper) / 2,
572 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
573 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
574 : (n == 0) ? int(meta_floor_log2_bogus)
575 : int(meta_floor_log2_move_up)
579template <
unsigned int n,
int lower = 0,
int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
580 int selector = meta_floor_log2_selector<n, lower, upper>::value>
581struct meta_floor_log2 {};
583template <
unsigned int n,
int lower,
int upper>
584struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down> {
585 enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
588template <
unsigned int n,
int lower,
int upper>
589struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up> {
590 enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
593template <
unsigned int n,
int lower,
int upper>
594struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate> {
595 enum { value = (n >= ((
unsigned int)(1) << (lower + 1))) ? lower + 1 : lower };
598template <
unsigned int n,
int lower,
int upper>
599struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus> {
603template <
typename BitsType,
typename EnableIf =
void>
604struct count_bits_impl {
605 static_assert(std::is_integral<BitsType>::value && std::is_unsigned<BitsType>::value,
606 "BitsType must be an unsigned integer");
607 static EIGEN_DEVICE_FUNC
inline int clz(BitsType bits) {
608 int n = CHAR_BIT *
sizeof(BitsType);
610 while (bits > 0 && shift > 0) {
611 BitsType y = bits >> shift;
624 static EIGEN_DEVICE_FUNC
inline int ctz(BitsType bits) {
625 int n = CHAR_BIT *
sizeof(BitsType);
627 while (bits > 0 && shift > 0) {
628 BitsType y = bits << shift;
643template <
typename BitsType>
644EIGEN_DEVICE_FUNC
inline int clz(BitsType bits) {
645 return count_bits_impl<BitsType>::clz(bits);
649template <
typename BitsType>
650EIGEN_DEVICE_FUNC
inline int ctz(BitsType bits) {
651 return count_bits_impl<BitsType>::ctz(bits);
654#if EIGEN_COMP_GNUC || EIGEN_COMP_CLANG
656template <
typename BitsType>
657struct count_bits_impl<
658 BitsType, std::enable_if_t<std::is_integral<BitsType>::value && sizeof(BitsType) <= sizeof(unsigned int)>> {
659 static constexpr int kNumBits =
static_cast<int>(
sizeof(BitsType) * CHAR_BIT);
660 static EIGEN_DEVICE_FUNC
inline int clz(BitsType bits) {
661 static constexpr int kLeadingBitsOffset = (
sizeof(
unsigned int) -
sizeof(BitsType)) * CHAR_BIT;
662 return bits == 0 ? kNumBits : __builtin_clz(
static_cast<unsigned int>(bits)) - kLeadingBitsOffset;
665 static EIGEN_DEVICE_FUNC
inline int ctz(BitsType bits) {
666 return bits == 0 ? kNumBits : __builtin_ctz(
static_cast<unsigned int>(bits));
670template <
typename BitsType>
671struct count_bits_impl<BitsType,
672 std::enable_if_t<std::is_integral<BitsType>::value && sizeof(unsigned int) < sizeof(BitsType) &&
673 sizeof(BitsType) <= sizeof(unsigned long)>> {
674 static constexpr int kNumBits = static_cast<int>(sizeof(BitsType) * CHAR_BIT);
675 static EIGEN_DEVICE_FUNC inline int clz(BitsType bits) {
676 static constexpr int kLeadingBitsOffset = (sizeof(unsigned long) - sizeof(BitsType)) * CHAR_BIT;
677 return bits == 0 ? kNumBits : __builtin_clzl(static_cast<unsigned long>(bits)) - kLeadingBitsOffset;
680 static EIGEN_DEVICE_FUNC inline int ctz(BitsType bits) {
681 return bits == 0 ? kNumBits : __builtin_ctzl(static_cast<unsigned long>(bits));
685template <typename BitsType>
686struct count_bits_impl<BitsType,
687 std::enable_if_t<std::is_integral<BitsType>::value && sizeof(unsigned long) < sizeof(BitsType) &&
688 sizeof(BitsType) <= sizeof(unsigned long long)>> {
689 static constexpr int kNumBits = static_cast<int>(sizeof(BitsType) * CHAR_BIT);
690 static EIGEN_DEVICE_FUNC inline int clz(BitsType bits) {
691 static constexpr int kLeadingBitsOffset = (sizeof(unsigned long long) - sizeof(BitsType)) * CHAR_BIT;
692 return bits == 0 ? kNumBits : __builtin_clzll(static_cast<unsigned long long>(bits)) - kLeadingBitsOffset;
695 static EIGEN_DEVICE_FUNC inline int ctz(BitsType bits) {
696 return bits == 0 ? kNumBits : __builtin_ctzll(static_cast<unsigned long long>(bits));
702template <typename BitsType>
703struct count_bits_impl<
704 BitsType, std::enable_if_t<std::is_integral<BitsType>::value && sizeof(BitsType) <= sizeof(unsigned long)>> {
705 static constexpr int kNumBits = static_cast<int>(sizeof(BitsType) * CHAR_BIT);
706 static EIGEN_DEVICE_FUNC inline int clz(BitsType bits) {
708 _BitScanReverse(&out, static_cast<unsigned long>(bits));
709 return bits == 0 ? kNumBits : (kNumBits - 1) - static_cast<int>(out);
712 static EIGEN_DEVICE_FUNC inline int ctz(BitsType bits) {
714 _BitScanForward(&out, static_cast<unsigned long>(bits));
715 return bits == 0 ? kNumBits : static_cast<int>(out);
721template <typename BitsType>
722struct count_bits_impl<BitsType,
723 std::enable_if_t<std::is_integral<BitsType>::value && sizeof(unsigned long) < sizeof(BitsType) &&
724 sizeof(BitsType) <= sizeof(__int64)>> {
725 static constexpr int kNumBits = static_cast<int>(sizeof(BitsType) * CHAR_BIT);
726 static EIGEN_DEVICE_FUNC inline int clz(BitsType bits) {
728 _BitScanReverse64(&out, static_cast<unsigned __int64>(bits));
729 return bits == 0 ? kNumBits : (kNumBits - 1) - static_cast<int>(out);
732 static EIGEN_DEVICE_FUNC inline int ctz(BitsType bits) {
734 _BitScanForward64(&out, static_cast<unsigned __int64>(bits));
735 return bits == 0 ? kNumBits : static_cast<int>(out);
743template <typename BitsType>
745 static constexpr int kTotalBits = sizeof(BitsType) * CHAR_BIT;
746 static EIGEN_DEVICE_FUNC inline int run_ceil(const BitsType& x) {
747 const int n = kTotalBits - clz(x);
748 bool power_of_two = (x & (x - 1)) == 0;
749 return x == 0 ? 0 : power_of_two ? (n - 1) : n;
751 static EIGEN_DEVICE_FUNC inline int run_floor(const BitsType& x) {
752 const int n = kTotalBits - clz(x);
753 return x == 0 ? 0 : n - 1;
757template <typename BitsType>
758int log2_ceil(const BitsType& x) {
759 return log_2_impl<BitsType>::run_ceil(x);
762template <typename BitsType>
763int log2_floor(const BitsType& x) {
764 return log_2_impl<BitsType>::run_floor(x);
770EIGEN_DEVICE_FUNC std::enable_if_t<!(std::numeric_limits<T>::has_infinity || std::numeric_limits<T>::has_quiet_NaN ||
771 std::numeric_limits<T>::has_signaling_NaN),
773isfinite_impl(const T&) {
778EIGEN_DEVICE_FUNC std::enable_if_t<(std::numeric_limits<T>::has_infinity || std::numeric_limits<T>::has_quiet_NaN ||
779 std::numeric_limits<T>::has_signaling_NaN) &&
780 (!NumTraits<T>::IsComplex),
782isfinite_impl(const T& x) {
783 EIGEN_USING_STD(isfinite);
784 return isfinite EIGEN_NOT_A_MACRO(x);
788EIGEN_DEVICE_FUNC std::enable_if_t<!std::numeric_limits<T>::has_infinity, bool> isinf_impl(const T&) {
793EIGEN_DEVICE_FUNC std::enable_if_t<(std::numeric_limits<T>::has_infinity && !NumTraits<T>::IsComplex), bool> isinf_impl(
795 EIGEN_USING_STD(isinf);
796 return isinf EIGEN_NOT_A_MACRO(x);
801 std::enable_if_t<!(std::numeric_limits<T>::has_quiet_NaN || std::numeric_limits<T>::has_signaling_NaN), bool>
802 isnan_impl(const T&) {
807EIGEN_DEVICE_FUNC std::enable_if_t<
808 (std::numeric_limits<T>::has_quiet_NaN || std::numeric_limits<T>::has_signaling_NaN) && (!NumTraits<T>::IsComplex),
810isnan_impl(const T& x) {
811 EIGEN_USING_STD(isnan);
812 return isnan EIGEN_NOT_A_MACRO(x);
817EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex<T>& x);
819EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex<T>& x);
821EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex<T>& x);
823EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS T ptanh_float(const T& a_x);
828template <typename Scalar, bool IsComplex = (NumTraits<Scalar>::IsComplex != 0),
829 bool IsInteger = (NumTraits<Scalar>::IsInteger != 0)>
831 EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) { return Scalar((a > Scalar(0)) - (a < Scalar(0))); }
834template <typename Scalar>
835struct sign_impl<Scalar, false, false> {
836 EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) {
837 return (isnan_impl<Scalar>)(a) ? a : Scalar((a > Scalar(0)) - (a < Scalar(0)));
841template <typename Scalar, bool IsInteger>
842struct sign_impl<Scalar, true, IsInteger> {
843 EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) {
844 using real_type = typename NumTraits<Scalar>::Real;
845 EIGEN_USING_STD(abs);
846 real_type aa = abs(a);
847 if (aa == real_type(0)) return Scalar(0);
848 aa = real_type(1) / aa;
849 return Scalar(a.real() * aa, a.imag() * aa);
855struct sign_impl<bool, false, true> {
856 EIGEN_DEVICE_FUNC static inline bool run(const bool& a) { return a; }
859template <typename Scalar>
867template <typename Scalar, bool IsInteger = NumTraits<Scalar>::IsInteger>
869 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar run(const Scalar& a) { return -a; }
872template <typename Scalar>
873struct negate_impl<Scalar, true> {
874 EIGEN_STATIC_ASSERT((!is_same<Scalar, bool>::value), NEGATE IS NOT DEFINED FOR BOOLEAN TYPES)
875 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar run(const Scalar& a) { return Scalar(0) - a; }
878template <typename Scalar>
879struct negate_retval {
883template <typename Scalar, bool IsInteger = NumTraits<typename unpacket_traits<Scalar>::type>::IsInteger>
884struct nearest_integer_impl {
885 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_floor(const Scalar& x) {
886 EIGEN_USING_STD(floor) return floor(x);
888 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_ceil(const Scalar& x) {
889 EIGEN_USING_STD(ceil) return ceil(x);
891 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_rint(const Scalar& x) {
892 EIGEN_USING_STD(rint) return rint(x);
894 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_round(const Scalar& x) {
895 EIGEN_USING_STD(round) return round(x);
897 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_trunc(const Scalar& x) {
898 EIGEN_USING_STD(trunc) return trunc(x);
901template <typename Scalar>
902struct nearest_integer_impl<Scalar, true> {
903 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_floor(const Scalar& x) { return x; }
904 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_ceil(const Scalar& x) { return x; }
905 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_rint(const Scalar& x) { return x; }
906 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_round(const Scalar& x) { return x; }
907 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_trunc(const Scalar& x) { return x; }
918#if (!defined(EIGEN_GPUCC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
920EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) {
922 return min EIGEN_NOT_A_MACRO(x, y);
926EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) {
928 return max EIGEN_NOT_A_MACRO(x, y);
932EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) {
933 return y < x ? y : x;
936EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) {
940EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y) {
944#ifndef EIGEN_GPU_COMPILE_PHASE
946EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double mini(const long double& x, const long double& y) {
947#if defined(EIGEN_HIPCC)
949 return (x < y) ? x : y;
957EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) {
958 return x < y ? y : x;
961EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) {
965EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y) {
968#ifndef EIGEN_GPU_COMPILE_PHASE
970EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double maxi(const long double& x, const long double& y) {
971#if defined(EIGEN_HIPCC)
973 return (x > y) ? x : y;
981#if defined(SYCL_DEVICE_ONLY)
983#define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
984 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_char) \
985 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_short) \
986 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_int) \
987 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
988#define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
989 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_char) \
990 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_short) \
991 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_int) \
992 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
993#define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
994 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar) \
995 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
996 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uint) \
997 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
998#define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
999 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar) \
1000 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
1001 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uint) \
1002 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
1003#define SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(NAME, FUNC) \
1004 SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
1005 SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC)
1006#define SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(NAME, FUNC) \
1007 SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
1008 SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC)
1009#define SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(NAME, FUNC) \
1010 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
1011 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_double)
1012#define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(NAME, FUNC) \
1013 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
1014 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_double)
1015#define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(NAME, FUNC, RET_TYPE) \
1016 SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_float) \
1017 SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_double)
1019#define SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
1021 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE& x) { \
1022 return cl::sycl::FUNC(x); \
1025#define SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, TYPE) SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, TYPE, TYPE)
1027#define SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE1, ARG_TYPE2) \
1029 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE1& x, const ARG_TYPE2& y) { \
1030 return cl::sycl::FUNC(x, y); \
1033#define SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
1034 SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE, ARG_TYPE)
1036#define SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, TYPE) SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, TYPE, TYPE)
1038SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(mini, min)
1039SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(mini, fmin)
1040SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(maxi, max)
1041SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(maxi, fmax)
1045template <typename Scalar>
1046EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x) {
1047 return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
1050template <typename Scalar>
1051EIGEN_DEVICE_FUNC inline internal::add_const_on_value_type_t<EIGEN_MATHFUNC_RETVAL(real_ref, Scalar)> real_ref(
1053 return internal::real_ref_impl<Scalar>::run(x);
1056template <typename Scalar>
1057EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x) {
1058 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
1061template <typename Scalar>
1062EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x) {
1063 return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
1066template <typename Scalar>
1067EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x) {
1068 return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
1071template <typename Scalar>
1072EIGEN_DEVICE_FUNC inline internal::add_const_on_value_type_t<EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar)> imag_ref(
1074 return internal::imag_ref_impl<Scalar>::run(x);
1077template <typename Scalar>
1078EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x) {
1079 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
1082template <typename Scalar>
1083EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x) {
1084 return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
1087template <typename Scalar>
1088EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(sign, Scalar) sign(const Scalar& x) {
1089 return EIGEN_MATHFUNC_IMPL(sign, Scalar)::run(x);
1092template <typename Scalar>
1093EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(negate, Scalar) negate(const Scalar& x) {
1094 return EIGEN_MATHFUNC_IMPL(negate, Scalar)::run(x);
1097template <typename Scalar>
1098EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x) {
1099 return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
1102EIGEN_DEVICE_FUNC inline bool abs2(bool x) { return x; }
1104template <typename T>
1105EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T absdiff(const T& x, const T& y) {
1106 return x > y ? x - y : y - x;
1109EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float absdiff(const float& x, const float& y) {
1110 return fabsf(x - y);
1113EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double absdiff(const double& x, const double& y) {
1118#ifndef EIGEN_GPU_COMPILE_PHASE
1120EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double absdiff(const long double& x, const long double& y) {
1121 return fabsl(x - y);
1125template <typename Scalar>
1126EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x) {
1127 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
1130template <typename Scalar>
1131EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y) {
1132 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
1135#if defined(SYCL_DEVICE_ONLY)
1136SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(hypot, hypot)
1139template <typename Scalar>
1140EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x) {
1141 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
1144#if defined(SYCL_DEVICE_ONLY)
1145SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(log1p, log1p)
1148#if defined(EIGEN_GPUCC)
1150EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float log1p(const float& x) {
1155EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double log1p(const double& x) {
1160template <typename ScalarX, typename ScalarY>
1161EIGEN_DEVICE_FUNC inline typename internal::pow_impl<ScalarX, ScalarY>::result_type pow(const ScalarX& x,
1163 return internal::pow_impl<ScalarX, ScalarY>::run(x, y);
1166#if defined(SYCL_DEVICE_ONLY)
1167SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(pow, pow)
1170template <typename T>
1171EIGEN_DEVICE_FUNC bool(isnan)(const T& x) {
1172 return internal::isnan_impl(x);
1174template <typename T>
1175EIGEN_DEVICE_FUNC bool(isinf)(const T& x) {
1176 return internal::isinf_impl(x);
1178template <typename T>
1179EIGEN_DEVICE_FUNC bool(isfinite)(const T& x) {
1180 return internal::isfinite_impl(x);
1183#if defined(SYCL_DEVICE_ONLY)
1184SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isnan, isnan, bool)
1185SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isinf, isinf, bool)
1186SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isfinite, isfinite, bool)
1189template <typename Scalar>
1190EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar rint(const Scalar& x) {
1191 return internal::nearest_integer_impl<Scalar>::run_rint(x);
1194template <typename Scalar>
1195EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar round(const Scalar& x) {
1196 return internal::nearest_integer_impl<Scalar>::run_round(x);
1199template <typename Scalar>
1200EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar(floor)(const Scalar& x) {
1201 return internal::nearest_integer_impl<Scalar>::run_floor(x);
1204template <typename Scalar>
1205EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar(ceil)(const Scalar& x) {
1206 return internal::nearest_integer_impl<Scalar>::run_ceil(x);
1209template <typename Scalar>
1210EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar(trunc)(const Scalar& x) {
1211 return internal::nearest_integer_impl<Scalar>::run_trunc(x);
1214#if defined(SYCL_DEVICE_ONLY)
1215SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(round, round)
1216SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(floor, floor)
1217SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(ceil, ceil)
1218SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(trunc, trunc)
1221#if defined(EIGEN_GPUCC)
1223EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float floor(const float& x) {
1227EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double floor(const double& x) {
1231EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float ceil(const float& x) {
1235EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double ceil(const double& x) {
1239EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float trunc(const float& x) {
1243EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double trunc(const double& x) {
1250template <typename T>
1251EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_CONSTEXPR T div_ceil(T a, T b) {
1252 using UnsignedT = typename internal::make_unsigned<T>::type;
1253 EIGEN_STATIC_ASSERT((NumTraits<T>::IsInteger), THIS FUNCTION IS FOR INTEGER TYPES)
1254 eigen_assert(a >= 0);
1255 eigen_assert(b > 0);
1257 const UnsignedT ua = UnsignedT(a);
1258 const UnsignedT ub = UnsignedT(b);
1260 return ua == 0 ? 0 : (ua - 1) / ub + 1;
1265template <typename T, typename U>
1266EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_CONSTEXPR T round_down(T a, U b) {
1267 using UnsignedT = typename internal::make_unsigned<T>::type;
1268 using UnsignedU = typename internal::make_unsigned<U>::type;
1269 EIGEN_STATIC_ASSERT((NumTraits<T>::IsInteger), THIS FUNCTION IS FOR INTEGER TYPES)
1270 EIGEN_STATIC_ASSERT((NumTraits<U>::IsInteger), THIS FUNCTION IS FOR INTEGER TYPES)
1271 eigen_assert(a >= 0);
1272 eigen_assert(b > 0);
1274 const UnsignedT ua = UnsignedT(a);
1275 const UnsignedU ub = UnsignedU(b);
1276 return ub * (ua / ub);
1281EIGEN_CONSTEXPR inline int log2(int x) {
1282 eigen_assert(x >= 0);
1284 constexpr int table[32] = {0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
1285 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31};
1291 return table[(v * 0x07C4ACDDU) >> 27];
1303template <typename Scalar>
1304EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_MATHFUNC_RETVAL(sqrt, Scalar) sqrt(const Scalar& x) {
1305 return EIGEN_MATHFUNC_IMPL(sqrt, Scalar)::run(x);
1310EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC
bool sqrt<bool>(
const bool& x) {
1314#if defined(SYCL_DEVICE_ONLY)
1315SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt)
1319template <
typename T>
1320EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T
cbrt(
const T& x) {
1321 EIGEN_USING_STD(cbrt);
1322 return static_cast<T
>(
cbrt(x));
1326template <
typename T>
1327EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T
rsqrt(
const T& x) {
1328 return internal::rsqrt_impl<T>::run(x);
1331template <
typename T>
1332EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T log(
const T& x) {
1333 return internal::log_impl<T>::run(x);
1336#if defined(SYCL_DEVICE_ONLY)
1337SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(log, log)
1340#if defined(EIGEN_GPUCC)
1342EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float log(
const float& x) {
1347EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double log(
const double& x) {
1352template <
typename T>
1353EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1354 std::enable_if_t<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,
typename NumTraits<T>::Real>
1356 EIGEN_USING_STD(abs);
1360template <
typename T>
1361EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1362 std::enable_if_t<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),
typename NumTraits<T>::Real>
1367#if defined(SYCL_DEVICE_ONLY)
1368SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(abs, abs)
1369SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(abs, fabs)
1372#if defined(EIGEN_GPUCC)
1374EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float abs(
const float& x) {
1379EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double abs(
const double& x) {
1384EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float abs(
const std::complex<float>& x) {
1385 return ::hypotf(x.real(), x.imag());
1389EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double abs(
const std::complex<double>& x) {
1390 return ::hypot(x.real(), x.imag());
1394template <typename Scalar, bool IsInteger = NumTraits<Scalar>::IsInteger,
bool IsSigned = NumTraits<Scalar>::IsSigned>
1396template <
typename Scalar>
1397struct signbit_impl<Scalar, false, true> {
1398 static constexpr size_t Size =
sizeof(Scalar);
1399 static constexpr size_t Shift = (CHAR_BIT * Size) - 1;
1400 using intSize_t =
typename get_integer_by_size<Size>::signed_type;
1401 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static Scalar run(
const Scalar& x) {
1402 intSize_t a = bit_cast<intSize_t, Scalar>(x);
1404 Scalar result = bit_cast<Scalar, intSize_t>(a);
1408template <
typename Scalar>
1409struct signbit_impl<Scalar, true, true> {
1410 static constexpr size_t Size =
sizeof(Scalar);
1411 static constexpr size_t Shift = (CHAR_BIT * Size) - 1;
1412 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static constexpr Scalar run(
const Scalar& x) {
return x >> Shift; }
1414template <
typename Scalar>
1415struct signbit_impl<Scalar, true, false> {
1416 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static constexpr Scalar run(
const Scalar&) {
return Scalar(0); }
1418template <
typename Scalar>
1419EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static constexpr Scalar signbit(
const Scalar& x) {
1420 return signbit_impl<Scalar>::run(x);
1423template <
typename T>
1424EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T exp(
const T& x) {
1425 EIGEN_USING_STD(exp);
1430#ifdef EIGEN_COMP_MSVC
1431template <
typename RealScalar>
1432EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::complex<RealScalar> exp(
const std::complex<RealScalar>& x) {
1433 EIGEN_USING_STD(exp);
1436 if ((isfinite)(real_ref(x)) && !(isfinite)(imag_ref(x))) {
1437 return std::complex<RealScalar>(NumTraits<RealScalar>::quiet_NaN(), NumTraits<RealScalar>::quiet_NaN());
1441 if ((real_ref(x) == NumTraits<RealScalar>::infinity() && !(isfinite)(imag_ref(x)))) {
1442 return std::complex<RealScalar>(NumTraits<RealScalar>::infinity(), NumTraits<RealScalar>::quiet_NaN());
1448#if defined(SYCL_DEVICE_ONLY)
1449SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(exp, exp)
1452#if defined(EIGEN_GPUCC)
1454EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float exp(
const float& x) {
1459EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double exp(
const double& x) {
1464EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::complex<float> exp(
const std::complex<float>& x) {
1465 float com = ::expf(x.real());
1466 float res_real = com * ::cosf(x.imag());
1467 float res_imag = com * ::sinf(x.imag());
1468 return std::complex<float>(res_real, res_imag);
1472EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::complex<double> exp(
const std::complex<double>& x) {
1473 double com = ::exp(x.real());
1474 double res_real = com * ::cos(x.imag());
1475 double res_imag = com * ::sin(x.imag());
1476 return std::complex<double>(res_real, res_imag);
1480template <
typename Scalar>
1481EIGEN_DEVICE_FUNC
inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(
const Scalar& x) {
1482 return EIGEN_MATHFUNC_IMPL(expm1, Scalar)::run(x);
1485#if defined(SYCL_DEVICE_ONLY)
1486SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(expm1, expm1)
1489#if defined(EIGEN_GPUCC)
1491EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float expm1(
const float& x) {
1496EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double expm1(
const double& x) {
1501template <
typename T>
1502EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cos(
const T& x) {
1503 EIGEN_USING_STD(cos);
1507#if defined(SYCL_DEVICE_ONLY)
1508SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cos, cos)
1511#if defined(EIGEN_GPUCC)
1513EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float cos(
const float& x) {
1518EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double cos(
const double& x) {
1523template <
typename T>
1524EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sin(
const T& x) {
1525 EIGEN_USING_STD(sin);
1529#if defined(SYCL_DEVICE_ONLY)
1530SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sin, sin)
1533#if defined(EIGEN_GPUCC)
1535EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float sin(
const float& x) {
1540EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double sin(
const double& x) {
1545template <
typename T>
1546EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tan(
const T& x) {
1547 EIGEN_USING_STD(tan);
1551#if defined(SYCL_DEVICE_ONLY)
1552SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(tan, tan)
1555#if defined(EIGEN_GPUCC)
1557EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float tan(
const float& x) {
1562EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double tan(
const double& x) {
1567template <
typename T>
1568EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acos(
const T& x) {
1569 EIGEN_USING_STD(acos);
1573template <
typename T>
1574EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acosh(
const T& x) {
1575 EIGEN_USING_STD(acosh);
1576 return static_cast<T
>(acosh(x));
1579#if defined(SYCL_DEVICE_ONLY)
1580SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(acos, acos)
1581SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(acosh, acosh)
1584#if defined(EIGEN_GPUCC)
1586EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float acos(
const float& x) {
1591EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double acos(
const double& x) {
1596template <
typename T>
1597EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asin(
const T& x) {
1598 EIGEN_USING_STD(asin);
1602template <
typename T>
1603EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asinh(
const T& x) {
1604 EIGEN_USING_STD(asinh);
1605 return static_cast<T
>(asinh(x));
1608#if defined(SYCL_DEVICE_ONLY)
1609SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(asin, asin)
1610SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(asinh, asinh)
1613#if defined(EIGEN_GPUCC)
1615EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float asin(
const float& x) {
1620EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double asin(
const double& x) {
1625template <
typename T>
1626EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atan(
const T& x) {
1627 EIGEN_USING_STD(atan);
1628 return static_cast<T
>(atan(x));
1631template <typename T, std::enable_if_t<!NumTraits<T>::IsComplex,
int> = 0>
1632EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atan2(
const T& y,
const T& x) {
1633 EIGEN_USING_STD(atan2);
1634 return static_cast<T
>(atan2(y, x));
1637template <
typename T>
1638EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atanh(
const T& x) {
1639 EIGEN_USING_STD(atanh);
1640 return static_cast<T
>(atanh(x));
1643#if defined(SYCL_DEVICE_ONLY)
1644SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(atan, atan)
1645SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(atanh, atanh)
1648#if defined(EIGEN_GPUCC)
1650EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float atan(
const float& x) {
1655EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double atan(
const double& x) {
1660template <
typename T>
1661EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cosh(
const T& x) {
1662 EIGEN_USING_STD(cosh);
1663 return static_cast<T
>(cosh(x));
1666#if defined(SYCL_DEVICE_ONLY)
1667SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cosh, cosh)
1670#if defined(EIGEN_GPUCC)
1672EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float cosh(
const float& x) {
1677EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double cosh(
const double& x) {
1682template <
typename T>
1683EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sinh(
const T& x) {
1684 EIGEN_USING_STD(sinh);
1685 return static_cast<T
>(sinh(x));
1688#if defined(SYCL_DEVICE_ONLY)
1689SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sinh, sinh)
1692#if defined(EIGEN_GPUCC)
1694EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float sinh(
const float& x) {
1699EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double sinh(
const double& x) {
1704template <
typename T>
1705EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tanh(
const T& x) {
1706 EIGEN_USING_STD(tanh);
1710#if (!defined(EIGEN_GPUCC)) && EIGEN_FAST_MATH && !defined(SYCL_DEVICE_ONLY)
1711EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float tanh(
float x) {
return internal::ptanh_float(x); }
1714#if defined(SYCL_DEVICE_ONLY)
1715SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(tanh, tanh)
1718#if defined(EIGEN_GPUCC)
1720EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float tanh(
const float& x) {
1725EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double tanh(
const double& x) {
1730template <
typename T>
1731EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T fmod(
const T& a,
const T& b) {
1732 EIGEN_USING_STD(fmod);
1736#if defined(SYCL_DEVICE_ONLY)
1737SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(fmod, fmod)
1740#if defined(EIGEN_GPUCC)
1742EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float fmod(
const float& a,
const float& b) {
1743 return ::fmodf(a, b);
1747EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double fmod(
const double& a,
const double& b) {
1748 return ::fmod(a, b);
1752#if defined(SYCL_DEVICE_ONLY)
1753#undef SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY
1754#undef SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY
1755#undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY
1756#undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY
1757#undef SYCL_SPECIALIZE_INTEGER_TYPES_BINARY
1758#undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY
1759#undef SYCL_SPECIALIZE_FLOATING_TYPES_BINARY
1760#undef SYCL_SPECIALIZE_FLOATING_TYPES_UNARY
1761#undef SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE
1762#undef SYCL_SPECIALIZE_GEN_UNARY_FUNC
1763#undef SYCL_SPECIALIZE_UNARY_FUNC
1764#undef SYCL_SPECIALIZE_GEN1_BINARY_FUNC
1765#undef SYCL_SPECIALIZE_GEN2_BINARY_FUNC
1766#undef SYCL_SPECIALIZE_BINARY_FUNC
1769template <typename Scalar, typename Enable = std::enable_if_t<std::is_integral<Scalar>::value>>
1770EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar logical_shift_left(
const Scalar& a,
int n) {
1774template <typename Scalar, typename Enable = std::enable_if_t<std::is_integral<Scalar>::value>>
1775EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar logical_shift_right(
const Scalar& a,
int n) {
1776 using UnsignedScalar =
typename numext::get_integer_by_size<
sizeof(Scalar)>::unsigned_type;
1777 return bit_cast<Scalar, UnsignedScalar>(bit_cast<UnsignedScalar, Scalar>(a) >> n);
1780template <typename Scalar, typename Enable = std::enable_if_t<std::is_integral<Scalar>::value>>
1781EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar arithmetic_shift_right(
const Scalar& a,
int n) {
1782 using SignedScalar =
typename numext::get_integer_by_size<
sizeof(Scalar)>::signed_type;
1783 return bit_cast<Scalar, SignedScalar>(bit_cast<SignedScalar, Scalar>(a) >> n);
1790template <
typename T>
1791EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x) {
1792 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1795template <
typename T>
1796EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x) {
1797 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1800template <
typename T>
1801EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x) {
1802 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1809template <
typename Scalar,
bool IsComplex,
bool IsInteger>
1810struct scalar_fuzzy_default_impl {};
1812template <
typename Scalar>
1813struct scalar_fuzzy_default_impl<Scalar, false, false> {
1814 typedef typename NumTraits<Scalar>::Real RealScalar;
1815 template <
typename OtherScalar>
1816 EIGEN_DEVICE_FUNC
static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1817 const RealScalar& prec) {
1818 return numext::abs(x) <= numext::abs(y) * prec;
1820 EIGEN_DEVICE_FUNC
static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec) {
1821 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1823 EIGEN_DEVICE_FUNC
static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec) {
1824 return x <= y || isApprox(x, y, prec);
1828template <
typename Scalar>
1829struct scalar_fuzzy_default_impl<Scalar, false, true> {
1830 typedef typename NumTraits<Scalar>::Real RealScalar;
1831 template <
typename OtherScalar>
1832 EIGEN_DEVICE_FUNC
static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&) {
1833 return x == Scalar(0);
1835 EIGEN_DEVICE_FUNC
static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&) {
return x == y; }
1836 EIGEN_DEVICE_FUNC
static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&) {
1841template <
typename Scalar>
1842struct scalar_fuzzy_default_impl<Scalar, true, false> {
1843 typedef typename NumTraits<Scalar>::Real RealScalar;
1844 template <
typename OtherScalar>
1845 EIGEN_DEVICE_FUNC
static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1846 const RealScalar& prec) {
1847 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1849 EIGEN_DEVICE_FUNC
static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec) {
1850 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1854template <
typename Scalar>
1855struct scalar_fuzzy_impl
1856 : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1858template <
typename Scalar,
typename OtherScalar>
1859EIGEN_DEVICE_FUNC
inline bool isMuchSmallerThan(
1860 const Scalar& x,
const OtherScalar& y,
1861 const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
1862 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1865template <
typename Scalar>
1866EIGEN_DEVICE_FUNC
inline bool isApprox(
1867 const Scalar& x,
const Scalar& y,
1868 const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
1869 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1872template <
typename Scalar>
1873EIGEN_DEVICE_FUNC
inline bool isApproxOrLessThan(
1874 const Scalar& x,
const Scalar& y,
1875 const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
1876 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1884struct scalar_fuzzy_impl<bool> {
1885 typedef bool RealScalar;
1887 template <
typename OtherScalar>
1888 EIGEN_DEVICE_FUNC
static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&) {
1892 EIGEN_DEVICE_FUNC
static inline bool isApprox(
bool x,
bool y,
bool) {
return x == y; }
1894 EIGEN_DEVICE_FUNC
static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&) {
1905template <
typename RealScalar>
1906struct expm1_impl<std::complex<RealScalar>> {
1907 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
1909 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
const std::complex<RealScalar>& x) {
1910 RealScalar xr = x.real();
1911 RealScalar xi = x.imag();
1921 RealScalar erm1 = numext::expm1<RealScalar>(xr);
1922 RealScalar er = erm1 + RealScalar(1.);
1923 RealScalar sin2 = numext::sin(xi / RealScalar(2.));
1925 RealScalar s = numext::sin(xi);
1926 RealScalar real_part = erm1 - RealScalar(2.) * er * sin2;
1927 return std::complex<RealScalar>(real_part, er * s);
1931template <
typename T>
1933 EIGEN_DEVICE_FUNC
static EIGEN_ALWAYS_INLINE T run(
const T& x) {
return T(1) / numext::sqrt(x); }
1936#if defined(EIGEN_GPU_COMPILE_PHASE)
1937template <
typename T>
1938struct conj_impl<std::complex<T>, true> {
1939 EIGEN_DEVICE_FUNC
static inline std::complex<T> run(
const std::complex<T>& x) {
1940 return std::complex<T>(numext::real(x), -numext::imag(x));
Namespace containing all symbols from the Eigen library.
Definition Core:137
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_expm1_op< typename Derived::Scalar >, const Derived > expm1(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_conjugate_op< typename Derived::Scalar >, const Derived > conj(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_rsqrt_op< typename Derived::Scalar >, const Derived > rsqrt(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_abs_op< typename Derived::Scalar >, const Derived > abs(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log1p_op< typename Derived::Scalar >, const Derived > log1p(const Eigen::ArrayBase< Derived > &x)
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_log_op< typename Derived::Scalar >, const Derived > log(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cbrt_op< typename Derived::Scalar >, const Derived > cbrt(const Eigen::ArrayBase< Derived > &x)