functors/UnaryFunctors.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2016 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_UNARY_FUNCTORS_H
11 #define EIGEN_UNARY_FUNCTORS_H
12 
13 // IWYU pragma: private
14 #include "../InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
18 namespace internal {
19 
25 template <typename Scalar>
28  template <typename Packet>
30  return internal::pnegate(a);
31  }
32 };
33 template <typename Scalar>
36 };
37 
43 template <typename Scalar>
44 struct scalar_abs_op {
47  template <typename Packet>
49  return internal::pabs(a);
50  }
51 };
52 template <typename Scalar>
55 };
56 
62 template <typename Scalar>
64  typedef void Score_is_abs;
65 };
66 template <typename Scalar>
67 struct functor_traits<scalar_score_coeff_op<Scalar>> : functor_traits<scalar_abs_op<Scalar>> {};
68 
69 /* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor. */
70 template <typename Scalar, typename = void>
73  template <typename Score>
75  return numext::abs(a);
76  }
77 };
78 template <typename Scalar>
79 struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> {
81  template <typename Scal>
83  return a;
84  }
85 };
86 
92 template <typename Scalar>
96  template <typename Packet>
98  return internal::pmul(a, a);
99  }
100 };
101 template <typename Scalar>
104 };
105 
111  }
112  template <typename Packet>
114  return Packet(pmul(a.v, a.v));
115  }
116 };
117 template <typename Scalar>
118 struct squared_norm_functor<Scalar, false> : scalar_abs2_op<Scalar> {};
119 
120 template <typename Scalar>
122  using Real = typename NumTraits<Scalar>::Real;
124 };
125 
131 template <typename Scalar>
134  template <typename Packet>
136  return internal::pconj(a);
137  }
138 };
139 template <typename Scalar>
141  enum {
142  Cost = 0,
143  // Yes the cost is zero even for complexes because in most cases for which
144  // the cost is used, conjugation turns to be a no-op. Some examples:
145  // cost(a*conj(b)) == cost(a*b)
146  // cost(a+conj(b)) == cost(a+b)
147  // <etc.
148  // If we don't set it to zero, then:
149  // A.conjugate().lazyProduct(B.conjugate())
150  // will bake its operands. We definitely don't want that!
152  };
153 };
154 
160 template <typename Scalar>
163  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::arg(a); }
164  template <typename Packet>
166  return internal::parg(a);
167  }
168 };
169 template <typename Scalar>
171  enum {
174  };
175 };
176 
182 template <typename Scalar>
186  return Scalar(numext::arg(a));
187  }
188  template <typename Packet>
190  return pcarg(a);
191  }
192 };
193 template <typename Scalar>
197 };
198 
204 template <typename Scalar, typename NewType>
206  typedef NewType result_type;
208  return cast<Scalar, NewType>(a);
209  }
210 };
211 
212 template <typename Scalar, typename NewType>
215 };
216 
223 template <typename SrcType, typename DstType>
224 struct core_cast_op : scalar_cast_op<SrcType, DstType> {};
225 
226 template <typename SrcType, typename DstType>
227 struct functor_traits<core_cast_op<SrcType, DstType>> {
229  enum {
231  PacketAccess = CastingTraits::VectorizedCast && (CastingTraits::SrcCoeffRatio <= 8)
232  };
233 };
234 
240 template <typename Scalar, int N>
244  }
245  template <typename Packet>
247  return internal::parithmetic_shift_right<N>(a);
248  }
249 };
250 template <typename Scalar, int N>
253 };
254 
260 template <typename Scalar, int N>
264  }
265  template <typename Packet>
267  return internal::plogical_shift_left<N>(a);
268  }
269 };
270 template <typename Scalar, int N>
273 };
274 
280 template <typename Scalar>
284 };
285 template <typename Scalar>
287  enum { Cost = 0, PacketAccess = false };
288 };
289 
295 template <typename Scalar>
299 };
300 template <typename Scalar>
302  enum { Cost = 0, PacketAccess = false };
303 };
304 
310 template <typename Scalar>
314  return numext::real_ref(a);
315  }
317 };
318 template <typename Scalar>
320  enum { Cost = 0, PacketAccess = false };
321 };
322 
328 template <typename Scalar>
333  return numext::imag_ref(a);
334  }
335 };
336 template <typename Scalar>
338  enum { Cost = 0, PacketAccess = false };
339 };
340 
347 template <typename Scalar>
349  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp(a); }
350  template <typename Packet>
351  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
352  return internal::pexp(a);
353  }
354 };
355 template <typename Scalar>
357  enum {
359  // The following numbers are based on the AVX implementation.
360 #ifdef EIGEN_VECTORIZE_FMA
361  // Haswell can issue 2 add/mul/madd per cycle.
362  Cost = (sizeof(Scalar) == 4
363  // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
365  // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
368 #else
369  Cost = (sizeof(Scalar) == 4
370  // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
372  // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
375 #endif
376  };
377 };
378 
379 template <typename Scalar>
381  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp2(a); }
382  template <typename Packet>
383  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
384  return internal::pexp2(a);
385  }
386 };
387 template <typename Scalar>
389  enum {
391  Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of exp2
392  };
393 };
394 
401 template <typename Scalar>
403  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::expm1(a); }
404  template <typename Packet>
405  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
406  return internal::pexpm1(a);
407  }
408 };
409 template <typename Scalar>
411  enum {
413  Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of expm1
414  };
415 };
416 
423 template <typename Scalar>
425  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log(a); }
426  template <typename Packet>
427  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
428  return internal::plog(a);
429  }
430 };
431 template <typename Scalar>
433  enum {
435  Cost = (PacketAccess
436  // The following numbers are based on the AVX implementation.
437 #ifdef EIGEN_VECTORIZE_FMA
438  // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
440 #else
441  // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
443 #endif
444  // Measured cost of std::log.
445  : sizeof(Scalar) == 4 ? 40 : 85)
446  };
447 };
448 
455 template <typename Scalar>
457  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log1p(a); }
458  template <typename Packet>
459  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
460  return internal::plog1p(a);
461  }
462 };
463 template <typename Scalar>
465  enum {
467  Cost = functor_traits<scalar_log_op<Scalar>>::Cost // TODO measure cost of log1p
468  };
469 };
470 
477 template <typename Scalar>
479  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
480  template <typename Packet>
481  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
482  return internal::plog10(a);
483  }
484 };
485 template <typename Scalar>
488 };
489 
496 template <typename Scalar>
499  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const {
501  }
502  template <typename Packet>
503  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
504  return internal::plog2(a);
505  }
506 };
507 template <typename Scalar>
510 };
511 
516 template <typename Scalar>
518  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sqrt(a); }
519  template <typename Packet>
520  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
521  return internal::psqrt(a);
522  }
523 };
524 template <typename Scalar>
526  enum {
527 #if EIGEN_FAST_MATH
528  // The following numbers are based on the AVX implementation.
529  Cost = (sizeof(Scalar) == 8 ? 28
530  // 4 pmul, 1 pmadd, 3 other
532 #else
533  // The following numbers are based on min VSQRT throughput on Haswell.
534  Cost = (sizeof(Scalar) == 8 ? 28 : 14),
535 #endif
537  };
538 };
539 
540 // Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
541 template <>
543  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
544  template <typename Packet>
546  return a;
547  }
548 };
549 template <>
552 };
553 
558 template <typename Scalar>
560  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cbrt(a); }
561 };
562 
563 template <typename Scalar>
566 };
567 
572 template <typename Scalar>
574  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::rsqrt(a); }
575  template <typename Packet>
576  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
577  return internal::prsqrt(a);
578  }
579 };
580 
581 template <typename Scalar>
584 };
585 
590 template <typename Scalar>
592  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return numext::cos(a); }
593  template <typename Packet>
594  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
595  return internal::pcos(a);
596  }
597 };
598 template <typename Scalar>
601 };
602 
607 template <typename Scalar>
609  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sin(a); }
610  template <typename Packet>
611  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
612  return internal::psin(a);
613  }
614 };
615 template <typename Scalar>
618 };
619 
624 template <typename Scalar>
626  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tan(a); }
627  template <typename Packet>
628  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
629  return internal::ptan(a);
630  }
631 };
632 template <typename Scalar>
635 };
636 
641 template <typename Scalar>
643  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acos(a); }
644  template <typename Packet>
645  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
646  return internal::pacos(a);
647  }
648 };
649 template <typename Scalar>
652 };
653 
658 template <typename Scalar>
660  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asin(a); }
661  template <typename Packet>
662  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
663  return internal::pasin(a);
664  }
665 };
666 template <typename Scalar>
669 };
670 
675 template <typename Scalar>
677  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atan(a); }
678  template <typename Packet>
679  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
680  return internal::patan(a);
681  }
682 };
683 template <typename Scalar>
686 };
687 
692 template <typename Scalar>
694  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
695  template <typename Packet>
696  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
697  return ptanh(x);
698  }
699 };
700 
701 template <typename Scalar>
703  enum {
706 // The following numbers are based on the AVX implementation,
707 #ifdef EIGEN_VECTORIZE_FMA
708  // Haswell can issue 2 add/mul/madd per cycle.
709  // 9 pmadd, 2 pmul, 1 div, 2 other
712 #else
715 #endif
716  // This number assumes a naive implementation of tanh
720  };
721 };
722 
727 template <typename Scalar>
729  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
730  template <typename Packet>
731  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
732  return patanh(x);
733  }
734 };
735 
736 template <typename Scalar>
739 };
740 
745 template <typename Scalar>
747  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sinh(a); }
748  template <typename Packet>
749  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
750  return internal::psinh(a);
751  }
752 };
753 template <typename Scalar>
756 };
757 
762 template <typename Scalar>
764  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
765 };
766 
767 template <typename Scalar>
770 };
771 
776 template <typename Scalar>
778  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cosh(a); }
779  template <typename Packet>
780  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
781  return internal::pcosh(a);
782  }
783 };
784 template <typename Scalar>
787 };
788 
793 template <typename Scalar>
795  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
796 };
797 
798 template <typename Scalar>
801 };
802 
807 template <typename Scalar>
809  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return Scalar(1) / a; }
810  template <typename Packet>
811  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
812  return internal::preciprocal(a);
813  }
814 };
815 template <typename Scalar>
817  enum {
819  // If packet_traits<Scalar>::HasReciprocal then the Estimated cost is that
820  // of computing an approximation plus a single Newton-Raphson step, which
821  // consists of 1 pmul + 1 pmadd.
824  };
825 };
826 
831 template <typename Scalar>
833  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a; }
834  template <typename Packet>
835  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
836  return internal::pmul(a, a);
837  }
838 };
839 template <typename Scalar>
842 };
843 
844 // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
845 template <>
847  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
848  template <typename Packet>
850  return a;
851  }
852 };
853 template <>
856 };
857 
862 template <typename Scalar>
864  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a * a; }
865  template <typename Packet>
866  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
867  return internal::pmul(a, pmul(a, a));
868  }
869 };
870 template <typename Scalar>
873 };
874 
875 // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
876 template <>
878  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
879  template <typename Packet>
881  return a;
882  }
883 };
884 template <>
887 };
888 
893 template <typename Scalar>
896  template <typename Packet>
897  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
898  return internal::pround(a);
899  }
900 };
901 template <typename Scalar>
903  enum {
906  };
907 };
908 
913 template <typename Scalar>
916  template <typename Packet>
917  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
918  return internal::pfloor(a);
919  }
920 };
921 template <typename Scalar>
923  enum {
926  };
927 };
928 
933 template <typename Scalar>
936  template <typename Packet>
937  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
938  return internal::print(a);
939  }
940 };
941 template <typename Scalar>
943  enum {
946  };
947 };
948 
953 template <typename Scalar>
956  template <typename Packet>
957  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
958  return internal::pceil(a);
959  }
960 };
961 template <typename Scalar>
963  enum {
966  };
967 };
968 
973 template <typename Scalar>
976  template <typename Packet>
977  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
978  return internal::ptrunc(a);
979  }
980 };
981 template <typename Scalar>
983  enum {
986  };
987 };
988 
993 template <typename Scalar, bool UseTypedPredicate = false>
996 #if defined(SYCL_DEVICE_ONLY)
997  return numext::isnan(a);
998 #else
1000 #endif
1001  }
1002 };
1003 
1004 template <typename Scalar>
1005 struct scalar_isnan_op<Scalar, true> {
1007 #if defined(SYCL_DEVICE_ONLY)
1008  return (numext::isnan(a) ? ptrue(a) : pzero(a));
1009 #else
1010  return (numext::isnan EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1011 #endif
1012  }
1013  template <typename Packet>
1014  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1015  return pisnan(a);
1016  }
1017 };
1018 
1019 template <typename Scalar, bool UseTypedPredicate>
1020 struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate>> {
1022 };
1023 
1028 template <typename Scalar, bool UseTypedPredicate = false>
1031 #if defined(SYCL_DEVICE_ONLY)
1032  return numext::isinf(a);
1033 #else
1034  return (numext::isinf)(a);
1035 #endif
1036  }
1037 };
1038 
1039 template <typename Scalar>
1040 struct scalar_isinf_op<Scalar, true> {
1042 #if defined(SYCL_DEVICE_ONLY)
1043  return (numext::isinf(a) ? ptrue(a) : pzero(a));
1044 #else
1045  return (numext::isinf EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1046 #endif
1047  }
1048  template <typename Packet>
1049  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1050  return pisinf(a);
1051  }
1052 };
1053 template <typename Scalar, bool UseTypedPredicate>
1054 struct functor_traits<scalar_isinf_op<Scalar, UseTypedPredicate>> {
1056 };
1057 
1062 template <typename Scalar, bool UseTypedPredicate = false>
1065 #if defined(SYCL_DEVICE_ONLY)
1066  return numext::isfinite(a);
1067 #else
1068  return (numext::isfinite)(a);
1069 #endif
1070  }
1071 };
1072 
1073 template <typename Scalar>
1076 #if defined(SYCL_DEVICE_ONLY)
1077  return (numext::isfinite(a) ? ptrue(a) : pzero(a));
1078 #else
1079  return (numext::isfinite EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1080 #endif
1081  }
1082  template <typename Packet>
1083  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1084  constexpr Scalar inf = NumTraits<Scalar>::infinity();
1085  return pcmp_lt(pabs(a), pset1<Packet>(inf));
1086  }
1087 };
1088 template <typename Scalar, bool UseTypedPredicate>
1089 struct functor_traits<scalar_isfinite_op<Scalar, UseTypedPredicate>> {
1091 };
1092 
1098 template <typename Scalar>
1101  // `false` any value `a` that satisfies `a == Scalar(0)`
1102  // `true` is the complement of `false`
1104  return a == Scalar(0) ? Scalar(1) : Scalar(0);
1105  }
1106  template <typename Packet>
1108  const Packet cst_one = pset1<Packet>(Scalar(1));
1109  Packet not_a = pcmp_eq(a, pzero(a));
1110  return pand(not_a, cst_one);
1111  }
1112 };
1113 template <typename Scalar>
1116 };
1117 
1120  static constexpr size_t Size = sizeof(Scalar);
1123  uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
1124  uint_t result = ~a_as_uint;
1125  return numext::bit_cast<Scalar, uint_t>(result);
1126  }
1127 };
1128 
1129 template <typename Scalar>
1131  using Real = typename NumTraits<Scalar>::Real;
1135  return Scalar(real_result, imag_result);
1136  }
1137 };
1138 
1144 template <typename Scalar>
1147  BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
1148  EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
1149  using result_type = Scalar;
1152  }
1153  template <typename Packet>
1155  return pandnot(ptrue(a), a);
1156  }
1157 };
1158 template <typename Scalar>
1161 };
1162 
1167 template <typename Scalar>
1169  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sign(a); }
1170 
1171  template <typename Packet>
1172  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1173  return internal::psign(a);
1174  }
1175 };
1176 
1177 template <typename Scalar>
1179  enum {
1183  };
1184 };
1185 
1186 // Real-valued implementation.
1187 template <typename T, typename EnableIf = void>
1190 
1191  template <typename Packet>
1193  const Packet one = pset1<Packet>(T(1));
1194  const Packet inf = pset1<Packet>(NumTraits<T>::infinity());
1195  const Packet e = pexp(x);
1196  const Packet inf_mask = pcmp_eq(e, inf);
1197  return pselect(inf_mask, one, pdiv(e, padd(one, e)));
1198  }
1199 };
1200 
1201 // Complex-valud implementation.
1202 template <typename T>
1203 struct scalar_logistic_op_impl<T, std::enable_if_t<NumTraits<T>::IsComplex>> {
1205  const T e = numext::exp(x);
1206  return (numext::isinf)(numext::real(e)) ? T(1) : e / (e + T(1));
1207  }
1208 };
1209 
1214 template <typename T>
1216 
1217 // TODO(rmlarsen): Enable the following on host when integer_packet is defined
1218 // for the relevant packet types.
1219 #ifndef EIGEN_GPUCC
1220 
1236 template <>
1237 struct scalar_logistic_op<float> {
1239  // Truncate at the first point where the interpolant is exactly one.
1240  const float cst_exp_hi = 16.6355324f;
1241  const float e = numext::exp(numext::mini(x, cst_exp_hi));
1242  return e / (1.0f + e);
1243  }
1244 
1245  template <typename Packet>
1247  const Packet cst_zero = pset1<Packet>(0.0f);
1248  const Packet cst_one = pset1<Packet>(1.0f);
1249  const Packet cst_half = pset1<Packet>(0.5f);
1250  // Truncate at the first point where the interpolant is exactly one.
1251  const Packet cst_exp_hi = pset1<Packet>(16.6355324f);
1252  const Packet cst_exp_lo = pset1<Packet>(-104.f);
1253 
1254  // Clamp x to the non-trivial range where S(x). Outside this
1255  // interval the correctly rounded value of S(x) is either zero
1256  // or one.
1257  Packet zero_mask = pcmp_lt(_x, cst_exp_lo);
1258  Packet x = pmin(_x, cst_exp_hi);
1259 
1260  // 1. Multiplicative range reduction:
1261  // Reduce the range of x by a factor of 2. This avoids having
1262  // to compute exp(x) accurately where the result is a denormalized
1263  // value.
1264  x = pmul(x, cst_half);
1265 
1266  // 2. Subtractive range reduction:
1267  // Express exp(x) as exp(m*ln(2) + r) = 2^m*exp(r), start by extracting
1268  // m = floor(x/ln(2) + 0.5), such that x = m*ln(2) + r.
1269  const Packet cst_cephes_LOG2EF = pset1<Packet>(1.44269504088896341f);
1270  Packet m = pfloor(pmadd(x, cst_cephes_LOG2EF, cst_half));
1271  // Get r = x - m*ln(2). We use a trick from Cephes where the term
1272  // m*ln(2) is subtracted out in two parts, m*C1+m*C2 = m*ln(2),
1273  // to avoid accumulating truncation errors.
1274  const Packet cst_cephes_exp_C1 = pset1<Packet>(-0.693359375f);
1275  const Packet cst_cephes_exp_C2 = pset1<Packet>(2.12194440e-4f);
1276  Packet r = pmadd(m, cst_cephes_exp_C1, x);
1277  r = pmadd(m, cst_cephes_exp_C2, r);
1278 
1279  // 3. Compute an approximation to exp(r) using a degree 5 minimax polynomial.
1280  // We compute even and odd terms separately to increase instruction level
1281  // parallelism.
1282  Packet r2 = pmul(r, r);
1283  const Packet cst_p2 = pset1<Packet>(0.49999141693115234375f);
1284  const Packet cst_p3 = pset1<Packet>(0.16666877269744873046875f);
1285  const Packet cst_p4 = pset1<Packet>(4.1898667812347412109375e-2f);
1286  const Packet cst_p5 = pset1<Packet>(8.33471305668354034423828125e-3f);
1287 
1288  const Packet p_even = pmadd(r2, cst_p4, cst_p2);
1289  const Packet p_odd = pmadd(r2, cst_p5, cst_p3);
1290  const Packet p_low = padd(r, cst_one);
1291  Packet p = pmadd(r, p_odd, p_even);
1292  p = pmadd(r2, p, p_low);
1293 
1294  // 4. Undo subtractive range reduction exp(m*ln(2) + r) = 2^m * exp(r).
1295  Packet e = pldexp_fast(p, m);
1296 
1297  // 5. Undo multiplicative range reduction by using exp(r) = exp(r/2)^2.
1298  e = pmul(e, e);
1299 
1300  // Return exp(x) / (1 + exp(x))
1301  return pselect(zero_mask, cst_zero, pdiv(e, padd(cst_one, e)));
1302  }
1303 };
1304 #endif // #ifndef EIGEN_GPU_COMPILE_PHASE
1305 
1306 template <typename T>
1308  enum {
1309  // The cost estimate for float here here is for the common(?) case where
1310  // all arguments are greater than -9.
1318  };
1319 };
1320 
1321 template <typename Scalar, typename ExponentScalar, bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
1322  bool IsExponentInteger = NumTraits<ExponentScalar>::IsInteger,
1323  bool IsBaseComplex = NumTraits<Scalar>::IsComplex,
1324  bool IsExponentComplex = NumTraits<ExponentScalar>::IsComplex>
1326  typedef typename internal::promote_scalar_arg<
1327  Scalar, ExponentScalar,
1331  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
1334  return static_cast<result_type>(pow(a, m_exponent));
1335  }
1336 
1337  private:
1338  const ExponentScalar m_exponent;
1340 };
1341 
1342 template <typename T>
1343 constexpr int exponent_digits() {
1344  return CHAR_BIT * sizeof(T) - NumTraits<T>::digits() - NumTraits<T>::IsSigned;
1345 }
1346 
1347 template <typename From, typename To>
1349  // TODO(rmlarsen): Add radix to NumTraits and enable this check.
1350  // (NumTraits<To>::radix == NumTraits<From>::radix) &&
1351  static constexpr bool value =
1352  (exponent_digits<To>() >= exponent_digits<From>() && NumTraits<To>::digits() >= NumTraits<From>::digits());
1353 };
1354 
1355 // Specialization for real, non-integer types, non-complex types.
1356 template <typename Scalar, typename ExponentScalar>
1357 struct scalar_unary_pow_op<Scalar, ExponentScalar, false, false, false, false> {
1359  std::enable_if_t<IsExactlyRepresentable, void> check_is_representable() const {}
1360 
1361  // Issue a deprecation warning if we do a narrowing conversion on the exponent.
1363  EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void> check_is_representable() const {}
1364 
1366  : m_exponent(static_cast<Scalar>(exponent)) {
1367  check_is_representable();
1368  }
1369 
1372  return static_cast<Scalar>(pow(a, m_exponent));
1373  }
1374  template <typename Packet>
1377  }
1378 
1379  private:
1382 };
1383 
1384 template <typename Scalar, typename ExponentScalar, bool BaseIsInteger>
1385 struct scalar_unary_pow_op<Scalar, ExponentScalar, BaseIsInteger, true, false, false> {
1386  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
1387  // TODO: error handling logic for complex^real_integer
1390  }
1391  template <typename Packet>
1394  }
1395 
1396  private:
1397  const ExponentScalar m_exponent;
1399 };
1400 
1401 template <typename Scalar, typename ExponentScalar>
1402 struct functor_traits<scalar_unary_pow_op<Scalar, ExponentScalar>> {
1403  enum {
1407  PacketAccess = NumTraits<ExponentScalar>::IsInteger ? IntPacketAccess : (IntPacketAccess && GenPacketAccess),
1409  };
1410 };
1411 
1412 } // end namespace internal
1413 
1414 } // end namespace Eigen
1415 
1416 #endif // EIGEN_FUNCTORS_H
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
AnnoyingScalar imag(const AnnoyingScalar &)
Definition: AnnoyingScalar.h:132
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_DEPRECATED
Definition: Macros.h:931
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1090
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_FAST_MATH
Definition: Macros.h:51
#define EIGEN_NOT_A_MACRO
Definition: Macros.h:813
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_LOG2E
Definition: MathFunctions.h:17
float * p
Definition: Tutorial_Map_using.cpp:9
SCALAR Scalar
Definition: bench_gemm.cpp:45
internal::packet_traits< Scalar >::type Packet
Definition: benchmark-blocking-sizes.cpp:54
@ IsComplex
Definition: common.h:73
@ N
Definition: constructor.cpp:22
float real
Definition: datatypes.h:10
const Scalar * a
Definition: level2_cplx_impl.h:32
int * m
Definition: level2_cplx_impl.h:294
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log10(const bfloat16 &a)
Definition: BFloat16.h:620
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 expm1(const bfloat16 &a)
Definition: BFloat16.h:617
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log1p(const bfloat16 &a)
Definition: BFloat16.h:619
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexpm1(const Packet &a)
Definition: GenericPacketMath.h:1097
EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf &a)
Definition: AltiVec/Complex.h:268
EIGEN_DEVICE_FUNC Packet padd(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:318
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10(const Packet &a)
Definition: GenericPacketMath.h:1116
EIGEN_STRONG_INLINE Packet8f pzero(const Packet8f &)
Definition: AVX/PacketMath.h:774
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet ptrunc(const Packet &a)
Definition: GenericPacketMath.h:1178
EIGEN_STRONG_INLINE Packet8f pisnan(const Packet8f &a)
Definition: AVX/PacketMath.h:1034
EIGEN_DEVICE_FUNC Packet parg(const Packet &a)
Definition: GenericPacketMath.h:700
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet print(const Packet &a)
Definition: GenericPacketMath.h:1166
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2(const Packet &a)
Definition: GenericPacketMath.h:1123
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog(const Packet &a)
Definition: GenericPacketMath.h:1103
EIGEN_DEVICE_FUNC Packet pdiv(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:368
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos(const Packet &a)
Definition: GenericPacketMath.h:1022
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_fast(const Packet &a, const Packet &exponent)
Definition: GenericPacketMathFunctions.h:277
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pcarg(const Packet &a)
Definition: GenericPacketMath.h:1512
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin(const Packet &a)
Definition: GenericPacketMath.h:1015
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos(const Packet &a)
Definition: GenericPacketMath.h:1043
EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i &a, const Packet4i &b)
Definition: AltiVec/PacketMath.h:1341
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan(const Packet &a)
Definition: GenericPacketMath.h:1029
EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f &a, const Packet4f &b, const Packet4f &c)
Definition: AltiVec/PacketMath.h:1218
EIGEN_STRONG_INLINE Packet4cf pmul(const Packet4cf &a, const Packet4cf &b)
Definition: AVX/Complex.h:88
EIGEN_DEVICE_FUNC Packet preciprocal(const Packet &a)
Definition: GenericPacketMath.h:1433
EIGEN_STRONG_INLINE Packet8h ptrue(const Packet8h &a)
Definition: AVX/PacketMath.h:2263
EIGEN_DEVICE_FUNC Packet pmin(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:649
EIGEN_STRONG_INLINE Packet8h pandnot(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2323
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcosh(const Packet &a)
Definition: GenericPacketMath.h:1057
EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf &a)
Definition: AltiVec/Complex.h:264
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh(const Packet &a)
Definition: GenericPacketMath.h:1071
EIGEN_DEVICE_FUNC Packet pisinf(const Packet &a)
Definition: GenericPacketMath.h:1007
EIGEN_STRONG_INLINE Packet4f pceil(const Packet4f &a)
Definition: LSX/PacketMath.h:2546
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp2(const Packet &a)
Definition: GenericPacketMath.h:1091
EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f &a)
Definition: AltiVec/PacketMath.h:1936
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p(const Packet &a)
Definition: GenericPacketMath.h:1110
EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f &a)
Definition: LSX/PacketMath.h:2176
EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf &a, const Packet2cf &b)
Definition: AltiVec/Complex.h:353
EIGEN_STRONG_INLINE Packet8h pand(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2319
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psinh(const Packet &a)
Definition: GenericPacketMath.h:1050
EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f &mask, const Packet4f &a, const Packet4f &b)
Definition: AltiVec/PacketMath.h:1474
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin(const Packet &a)
Definition: GenericPacketMath.h:1036
EIGEN_STRONG_INLINE Packet4f pround(const Packet4f &a)
Definition: LSX/PacketMath.h:2555
EIGEN_STRONG_INLINE Packet4f pfloor(const Packet4f &a)
Definition: LSX/PacketMath.h:2537
constexpr int exponent_digits()
Definition: functors/UnaryFunctors.h:1343
EIGEN_STRONG_INLINE Packet4f prsqrt(const Packet4f &a)
Definition: LSX/PacketMath.h:2528
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh(const Packet &a)
Definition: GenericPacketMath.h:1078
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan(const Packet &a)
Definition: GenericPacketMath.h:1064
EIGEN_DEVICE_FUNC Packet psign(const Packet &a)
Definition: GenericPacketMath.h:1189
EIGEN_STRONG_INLINE Packet4f pexp(const Packet4f &_x)
Definition: LSX/PacketMath.h:2663
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar round(const Scalar &x)
Definition: MathFunctions.h:1195
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T log(const T &x)
Definition: MathFunctions.h:1332
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool() isinf(const Eigen::bfloat16 &h)
Definition: BFloat16.h:747
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acosh(const T &x)
Definition: MathFunctions.h:1631
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar() trunc(const Scalar &x)
Definition: MathFunctions.h:1210
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool() isfinite(const Eigen::bfloat16 &h)
Definition: BFloat16.h:752
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asinh(const T &x)
Definition: MathFunctions.h:1660
EIGEN_DEVICE_FUNC internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar)> imag_ref(const Scalar &x)
Definition: MathFunctions.h:1072
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cos(const T &x)
Definition: MathFunctions.h:1559
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real > abs(const T &x)
Definition: MathFunctions.h:1355
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T rsqrt(const T &x)
Definition: MathFunctions.h:1327
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool() isnan(const Eigen::bfloat16 &h)
Definition: BFloat16.h:742
EIGEN_DEVICE_FUNC internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar)> real_ref(const Scalar &x)
Definition: MathFunctions.h:1051
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asin(const T &x)
Definition: MathFunctions.h:1654
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar logical_shift_left(const Scalar &a, int n)
Definition: MathFunctions.h:1827
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar rint(const Scalar &x)
Definition: MathFunctions.h:1190
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tanh(const T &x)
Definition: MathFunctions.h:1762
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cbrt(const T &x)
Definition: MathFunctions.h:1320
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atan(const T &x)
Definition: MathFunctions.h:1683
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atanh(const T &x)
Definition: MathFunctions.h:1695
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cosh(const T &x)
Definition: MathFunctions.h:1718
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T exp(const T &x)
Definition: MathFunctions.h:1424
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar() floor(const Scalar &x)
Definition: MathFunctions.h:1200
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sin(const T &x)
Definition: MathFunctions.h:1581
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acos(const T &x)
Definition: MathFunctions.h:1625
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar arithmetic_shift_right(const Scalar &a, int n)
Definition: MathFunctions.h:1838
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sqrt(const float &x)
Definition: arch/SSE/MathFunctions.h:69
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar() ceil(const Scalar &x)
Definition: MathFunctions.h:1205
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tan(const T &x)
Definition: MathFunctions.h:1603
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sinh(const T &x)
Definition: MathFunctions.h:1740
T negate(const T &x)
Definition: packetmath_test_shared.h:26
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
T sign(T x)
Definition: cxx11_tensor_builtins_sycl.cpp:172
r
Definition: UniformPSDSelfTest.py:20
type
Definition: compute_granudrum_aor.py:141
const Mdouble inf
Definition: GeneralDefine.h:23
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition: XprHelper.h:1043
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:80
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scal &, const result_type &a) const
Definition: functors/UnaryFunctors.h:82
Definition: functors/UnaryFunctors.h:71
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:72
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar &a, const Score &) const
Definition: functors/UnaryFunctors.h:74
typename NumTraits< Scalar >::Real Real
Definition: functors/UnaryFunctors.h:1131
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar &a)
Definition: functors/UnaryFunctors.h:1132
Definition: functors/UnaryFunctors.h:1119
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar &a)
Definition: functors/UnaryFunctors.h:1122
static constexpr size_t Size
Definition: functors/UnaryFunctors.h:1120
typename numext::get_integer_by_size< Size >::unsigned_type uint_t
Definition: functors/UnaryFunctors.h:1121
Definition: functors/UnaryFunctors.h:224
typename NumTraits< Scalar >::Real RealScalar
Definition: functors/UnaryFunctors.h:195
typename NumTraits< Scalar >::Real Real
Definition: functors/UnaryFunctors.h:122
Definition: XprHelper.h:205
@ PacketAccess
Definition: XprHelper.h:206
@ Cost
Definition: XprHelper.h:206
Definition: Meta.h:419
Definition: functors/UnaryFunctors.h:1348
static constexpr bool value
Definition: functors/UnaryFunctors.h:1351
Definition: Meta.h:205
Definition: GenericPacketMath.h:108
Definition: XprHelper.h:96
Template functor to compute the squared absolute value of a scalar.
Definition: functors/UnaryFunctors.h:93
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:95
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:94
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:97
Template functor to compute the absolute value of a scalar.
Definition: functors/UnaryFunctors.h:44
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:45
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:46
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:48
Template functor to compute the arc cosine of a scalar.
Definition: functors/UnaryFunctors.h:642
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:643
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:645
Template functor to compute the acosh of a scalar.
Definition: functors/UnaryFunctors.h:794
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:795
Template functor to compute the phase angle of a complex.
Definition: functors/UnaryFunctors.h:161
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:165
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:162
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:163
Template functor to compute the arc sine of a scalar.
Definition: functors/UnaryFunctors.h:659
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:662
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:660
Template functor to compute the asinh of a scalar.
Definition: functors/UnaryFunctors.h:763
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:764
Template functor to compute the atan of a scalar.
Definition: functors/UnaryFunctors.h:676
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:677
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:679
Template functor to compute the atanh of a scalar.
Definition: functors/UnaryFunctors.h:728
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:729
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &x) const
Definition: functors/UnaryFunctors.h:731
Template functor to compute the bitwise not of a scalar.
Definition: functors/UnaryFunctors.h:1145
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1150
EIGEN_STRONG_INLINE Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1154
EIGEN_STATIC_ASSERT(!NumTraits< Scalar >::RequireInitialization, BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES) using result_type
Template functor to compute the logical not of a scalar as if it were a boolean.
Definition: functors/UnaryFunctors.h:1099
Scalar result_type
Definition: functors/UnaryFunctors.h:1100
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1103
EIGEN_STRONG_INLINE Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1107
Template functor to compute the complex argument, returned as a complex type.
Definition: functors/UnaryFunctors.h:183
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:189
Scalar result_type
Definition: functors/UnaryFunctors.h:184
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:185
Template functor to cast a scalar to another type.
Definition: functors/UnaryFunctors.h:205
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:207
NewType result_type
Definition: functors/UnaryFunctors.h:206
Template functor to compute the cube root of a scalar.
Definition: functors/UnaryFunctors.h:559
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:560
Template functor to compute the ceil of a scalar.
Definition: functors/UnaryFunctors.h:954
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:957
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:955
Template functor to compute the conjugate of a complex value.
Definition: functors/UnaryFunctors.h:132
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:135
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:133
Template functor to compute the cosine of a scalar.
Definition: functors/UnaryFunctors.h:591
EIGEN_DEVICE_FUNC Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:592
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:594
Template functor to compute the cosh of a scalar.
Definition: functors/UnaryFunctors.h:777
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:778
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:780
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC bool operator()(const bool &a) const
Definition: functors/UnaryFunctors.h:878
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:880
Template functor to compute the cube of a scalar.
Definition: functors/UnaryFunctors.h:863
EIGEN_DEVICE_FUNC Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:864
EIGEN_DEVICE_FUNC const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:866
Definition: XprHelper.h:883
Definition: functors/UnaryFunctors.h:380
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:381
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:383
Template functor to compute the exponential of a scalar.
Definition: functors/UnaryFunctors.h:348
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:351
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:349
Template functor to compute the exponential of a scalar - 1.
Definition: functors/UnaryFunctors.h:402
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:405
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:403
Template functor to compute the floor of a scalar.
Definition: functors/UnaryFunctors.h:914
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:917
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:915
Template functor to extract the imaginary part of a complex.
Definition: functors/UnaryFunctors.h:296
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:297
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:298
Template functor to extract the imaginary part of a complex as a reference.
Definition: functors/UnaryFunctors.h:329
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:330
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type & operator()(Scalar &a) const
Definition: functors/UnaryFunctors.h:331
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type & operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:332
Template functor to compute the inverse of a scalar.
Definition: functors/UnaryFunctors.h:808
EIGEN_DEVICE_FUNC const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:811
EIGEN_DEVICE_FUNC Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:809
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1075
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1083
Template functor to check whether a scalar has a finite value.
Definition: functors/UnaryFunctors.h:1063
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1064
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1049
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1041
Template functor to check whether a scalar is +/-inf.
Definition: functors/UnaryFunctors.h:1029
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1030
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1014
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1006
Template functor to compute whether a scalar is NaN.
Definition: functors/UnaryFunctors.h:994
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:995
Template functor to compute the base-10 logarithm of a scalar.
Definition: functors/UnaryFunctors.h:478
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:479
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:481
Template functor to compute the logarithm of 1 plus a scalar value.
Definition: functors/UnaryFunctors.h:456
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:457
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:459
Template functor to compute the base-2 logarithm of a scalar.
Definition: functors/UnaryFunctors.h:497
typename NumTraits< Scalar >::Real RealScalar
Definition: functors/UnaryFunctors.h:498
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:499
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:503
Template functor to compute the logarithm of a scalar.
Definition: functors/UnaryFunctors.h:424
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:425
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:427
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float &x) const
Definition: functors/UnaryFunctors.h:1238
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet &_x) const
Definition: functors/UnaryFunctors.h:1246
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T &x) const
Definition: functors/UnaryFunctors.h:1204
Definition: functors/UnaryFunctors.h:1188
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T &x) const
Definition: functors/UnaryFunctors.h:1189
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet &x) const
Definition: functors/UnaryFunctors.h:1192
Template functor to compute the logistic function of a scalar.
Definition: functors/UnaryFunctors.h:1215
Template functor to compute the opposite of a scalar.
Definition: functors/UnaryFunctors.h:26
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:29
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:27
Template functor to extract the real part of a complex.
Definition: functors/UnaryFunctors.h:281
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:283
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:282
Template functor to extract the real part of a complex as a reference.
Definition: functors/UnaryFunctors.h:311
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type & operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:313
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type & operator()(Scalar &a) const
Definition: functors/UnaryFunctors.h:316
NumTraits< Scalar >::Real result_type
Definition: functors/UnaryFunctors.h:312
Template functor to compute the rounded (with current rounding mode) value of a scalar.
Definition: functors/UnaryFunctors.h:934
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:935
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:937
Template functor to compute the rounded value of a scalar.
Definition: functors/UnaryFunctors.h:894
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:897
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:895
Template functor to compute the reciprocal square root of a scalar.
Definition: functors/UnaryFunctors.h:573
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:574
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:576
Template functor to compute the score of a scalar, to chose a pivot.
Definition: functors/UnaryFunctors.h:63
void Score_is_abs
Definition: functors/UnaryFunctors.h:64
Template functor to logically shift a scalar left by a number of bits.
Definition: functors/UnaryFunctors.h:261
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:262
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:266
Template functor to arithmetically shift a scalar right by a number of bits.
Definition: functors/UnaryFunctors.h:241
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:242
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:246
Template functor to compute the signum of a scalar.
Definition: functors/UnaryFunctors.h:1168
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1169
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1172
Template functor to compute the sine of a scalar.
Definition: functors/UnaryFunctors.h:608
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:611
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:609
Template functor to compute the sinh of a scalar.
Definition: functors/UnaryFunctors.h:746
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:747
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:749
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:545
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC bool operator()(const bool &a) const
Definition: functors/UnaryFunctors.h:543
Template functor to compute the square root of a scalar.
Definition: functors/UnaryFunctors.h:517
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:518
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:520
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:849
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC bool operator()(const bool &a) const
Definition: functors/UnaryFunctors.h:847
Template functor to compute the square of a scalar.
Definition: functors/UnaryFunctors.h:832
EIGEN_DEVICE_FUNC const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:835
EIGEN_DEVICE_FUNC Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:833
Template functor to compute the tan of a scalar.
Definition: functors/UnaryFunctors.h:625
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:628
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:626
Template functor to compute the tanh of a scalar.
Definition: functors/UnaryFunctors.h:693
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &x) const
Definition: functors/UnaryFunctors.h:696
EIGEN_DEVICE_FUNC const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:694
Template functor to compute the truncation of a scalar.
Definition: functors/UnaryFunctors.h:974
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:975
EIGEN_DEVICE_FUNC Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:977
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar &exponent)
Definition: functors/UnaryFunctors.h:1386
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1392
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1388
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:1375
EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void > check_is_representable() const
Definition: functors/UnaryFunctors.h:1363
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1370
std::enable_if_t< IsExactlyRepresentable, void > check_is_representable() const
Definition: functors/UnaryFunctors.h:1359
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar &exponent)
Definition: functors/UnaryFunctors.h:1365
Definition: functors/UnaryFunctors.h:1325
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:1332
scalar_unary_pow_op()
Definition: functors/UnaryFunctors.h:1339
ScalarBinaryOpTraits< Scalar, PromotedExponent, scalar_unary_pow_op >::ReturnType result_type
Definition: functors/UnaryFunctors.h:1330
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar &exponent)
Definition: functors/UnaryFunctors.h:1331
internal::promote_scalar_arg< Scalar, ExponentScalar, internal::has_ReturnType< ScalarBinaryOpTraits< Scalar, ExponentScalar, scalar_unary_pow_op > >::value >::type PromotedExponent
Definition: functors/UnaryFunctors.h:1329
const ExponentScalar m_exponent
Definition: functors/UnaryFunctors.h:1338
Definition: functors/UnaryFunctors.h:107
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &a) const
Definition: functors/UnaryFunctors.h:113
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &a) const
Definition: functors/UnaryFunctors.h:109
Scalar result_type
Definition: functors/UnaryFunctors.h:108
Definition: GenericPacketMath.h:201
void unsigned_type
Definition: Meta.h:48
void run(const string &dir_name, LinearSolver *linear_solver_pt, const unsigned nel_1d, bool mess_up_order)
Definition: two_d_poisson_compare_solvers.cc:317
Definition: ZVector/PacketMath.h:50