10 #ifndef EIGEN_BINARY_FUNCTORS_H
11 #define EIGEN_BINARY_FUNCTORS_H
13 #include "../InternalHeaderCheck.h"
21 template<
typename Arg1,
typename Arg2>
24 typedef Arg1 first_argument_type;
25 typedef Arg2 second_argument_type;
33 template<
typename LhsScalar,
typename RhsScalar>
34 struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
36 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_sum_op>::ReturnType result_type;
37 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
39 EIGEN_SCALAR_BINARY_OP_PLUGIN
43 template<
typename Packet>
44 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const
46 template<
typename Packet>
50 template<
typename LhsScalar,
typename RhsScalar>
51 struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > {
54 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
69 template<
typename LhsScalar,
typename RhsScalar>
70 struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar>
72 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type;
73 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
75 EIGEN_SCALAR_BINARY_OP_PLUGIN
79 template<
typename Packet>
80 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const
82 template<
typename Packet>
86 template<
typename LhsScalar,
typename RhsScalar>
87 struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
90 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
104 template<
typename LhsScalar,
typename RhsScalar>
105 struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar>
112 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
115 {
return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(
a,
b); }
117 template<
typename Packet>
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const
119 {
return conj_helper<Packet,Packet,Conj,false>().pmul(
a,
b); }
121 template<
typename LhsScalar,
typename RhsScalar>
122 struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
125 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
134 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
135 struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
137 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
139 return internal::pmin<NaNPropagation>(
a,
b);
141 template<
typename Packet>
142 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const
144 return internal::pmin<NaNPropagation>(
a,
b);
146 template<
typename Packet>
149 return internal::predux_min<NaNPropagation>(
a);
153 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
154 struct functor_traits<scalar_min_op<LhsScalar,RhsScalar, NaNPropagation> > {
157 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
166 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
167 struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
169 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
171 return internal::pmax<NaNPropagation>(
a,
b);
173 template<
typename Packet>
174 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const
176 return internal::pmax<NaNPropagation>(
a,
b);
178 template<
typename Packet>
181 return internal::predux_max<NaNPropagation>(
a);
185 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
186 struct functor_traits<scalar_max_op<LhsScalar,RhsScalar, NaNPropagation> > {
189 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
197 template <
typename LhsScalar,
typename RhsScalar,
ComparisonName cmp,
198 bool UseTypedComparators =
false>
199 struct scalar_cmp_op;
201 template <
typename LhsScalar,
typename RhsScalar, ComparisonName cmp,
bool UseTypedComparators>
202 struct functor_traits<scalar_cmp_op<LhsScalar, RhsScalar, cmp, UseTypedComparators>> {
205 PacketAccess = (UseTypedComparators || is_same<LhsScalar, bool>::value) && is_same<LhsScalar, RhsScalar>::value &&
206 packet_traits<LhsScalar>::HasCmp
210 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
211 struct typed_cmp_helper {
212 static constexpr
bool SameType = is_same<LhsScalar, RhsScalar>::value;
213 static constexpr
bool IsNumeric = is_arithmetic<typename NumTraits<LhsScalar>::Real>::value;
214 static constexpr
bool UseTyped = UseTypedComparators && SameType && IsNumeric;
215 using type =
typename conditional<UseTyped, LhsScalar, bool>::type;
218 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
219 using cmp_return_t =
typename typed_cmp_helper<LhsScalar, RhsScalar, UseTypedComparators>::type;
221 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
222 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_EQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
225 return a ==
b ? result_type(1) : result_type(0);
227 template <
typename Packet>
228 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
229 const Packet cst_one = pset1<Packet>(result_type(1));
234 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
235 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_LT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
236 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
238 return a <
b ? result_type(1) : result_type(0);
240 template <
typename Packet>
241 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
242 const Packet cst_one = pset1<Packet>(result_type(1));
247 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
248 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_LE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
249 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
251 return a <=
b ? result_type(1) : result_type(0);
253 template <
typename Packet>
254 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
255 const Packet cst_one = pset1<Packet>(result_type(1));
260 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
261 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_GT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
262 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
264 return a >
b ? result_type(1) : result_type(0);
266 template <
typename Packet>
267 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
268 const Packet cst_one = pset1<Packet>(result_type(1));
273 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
274 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_GE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
275 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
277 return a >=
b ? result_type(1) : result_type(0);
279 template <
typename Packet>
280 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
281 const Packet cst_one = pset1<Packet>(result_type(1));
286 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
287 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_UNORD, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
288 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
290 return !(
a <=
b ||
b <=
a) ? result_type(1) : result_type(0);
292 template <
typename Packet>
293 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
294 const Packet cst_one = pset1<Packet>(result_type(1));
299 template <
typename LhsScalar,
typename RhsScalar,
bool UseTypedComparators>
300 struct scalar_cmp_op<LhsScalar, RhsScalar,
cmp_NEQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
301 using result_type = cmp_return_t<LhsScalar, RhsScalar, UseTypedComparators>;
303 return a !=
b ? result_type(1) : result_type(0);
305 template <
typename Packet>
306 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
307 const Packet cst_one = pset1<Packet>(result_type(1));
317 template<
typename Scalar>
318 struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
330 template<
typename Scalar>
331 struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
336 2 * scalar_div_cost<Scalar,false>::value,
345 template<
typename Scalar,
typename Exponent>
346 struct scalar_pow_op : binary_op_base<Scalar,Exponent>
348 typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
349 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
351 typedef Scalar LhsScalar;
352 typedef Exponent RhsScalar;
353 EIGEN_SCALAR_BINARY_OP_PLUGIN
360 template<
typename Packet>
361 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet&
a,
const Packet&
b)
const
367 template<
typename Scalar,
typename Exponent>
368 struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
372 packet_traits<Scalar>::HasExp && packet_traits<Scalar>::HasLog &&
373 packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
376 !is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value
388 template<
typename LhsScalar,
typename RhsScalar>
389 struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
391 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type;
392 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
393 scalar_difference_op() {
394 EIGEN_SCALAR_BINARY_OP_PLUGIN
398 template<
typename Packet>
399 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet&
a,
const Packet&
b)
const
402 template<
typename LhsScalar,
typename RhsScalar>
403 struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
406 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
410 template <typename Packet, bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
411 struct maybe_raise_div_by_zero {
417 #ifndef EIGEN_GPU_COMPILE_PHASE
418 template <
typename Packet>
419 struct maybe_raise_div_by_zero<Packet, true> {
424 volatile typename unpacket_traits<Packet>::type zero = 0;
425 volatile typename unpacket_traits<Packet>::type val = 1;
437 template<
typename LhsScalar,
typename RhsScalar>
438 struct scalar_quotient_op : binary_op_base<LhsScalar,RhsScalar>
440 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type;
441 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
442 scalar_quotient_op() {
443 EIGEN_SCALAR_BINARY_OP_PLUGIN
447 template<
typename Packet>
448 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
449 maybe_raise_div_by_zero<Packet>::run(
b);
453 template<
typename LhsScalar,
typename RhsScalar>
454 struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
455 typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
457 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
458 Cost = scalar_div_cost<result_type,PacketAccess>::value
467 template <
typename Scalar>
468 struct scalar_boolean_and_op {
469 using result_type = Scalar;
473 return (
a != Scalar(0)) && (
b != Scalar(0)) ? Scalar(1) : Scalar(0);
475 template <
typename Packet>
476 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
477 const Packet cst_one = pset1<Packet>(Scalar(1));
481 Packet a_nand_b =
por(not_a, not_b);
482 return pandnot(cst_one, a_nand_b);
485 template <
typename Scalar>
486 struct functor_traits<scalar_boolean_and_op<Scalar>> {
495 template <
typename Scalar>
496 struct scalar_boolean_or_op {
497 using result_type = Scalar;
501 return (
a != Scalar(0)) || (
b != Scalar(0)) ? Scalar(1) : Scalar(0);
503 template <
typename Packet>
504 EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
505 const Packet cst_one = pset1<Packet>(Scalar(1));
509 return pandnot(cst_one, a_nor_b);
512 template <
typename Scalar>
513 struct functor_traits<scalar_boolean_or_op<Scalar>> {
522 template <
typename Scalar>
523 struct scalar_boolean_xor_op {
524 using result_type = Scalar;
528 return (
a != Scalar(0)) != (
b != Scalar(0)) ? Scalar(1) : Scalar(0);
530 template <
typename Packet>
531 EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
532 const Packet cst_one = pset1<Packet>(Scalar(1));
536 Packet a_xor_b =
pxor(not_a, not_b);
537 return pand(cst_one, a_xor_b);
540 template <
typename Scalar>
541 struct functor_traits<scalar_boolean_xor_op<Scalar>> {
545 template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
546 struct bitwise_binary_impl {
547 static constexpr
size_t Size =
sizeof(Scalar);
549 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(
const Scalar&
a,
const Scalar&
b) {
550 uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(
a);
551 uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(
b);
552 uint_t result = a_as_uint & b_as_uint;
553 return numext::bit_cast<Scalar, uint_t>(result);
555 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(
const Scalar&
a,
const Scalar&
b) {
556 uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(
a);
557 uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(
b);
558 uint_t result = a_as_uint | b_as_uint;
559 return numext::bit_cast<Scalar, uint_t>(result);
561 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(
const Scalar&
a,
const Scalar&
b) {
562 uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(
a);
563 uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(
b);
564 uint_t result = a_as_uint ^ b_as_uint;
565 return numext::bit_cast<Scalar, uint_t>(result);
569 template <
typename Scalar>
570 struct bitwise_binary_impl<Scalar, true> {
572 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(
const Scalar&
a,
const Scalar&
b) {
575 return Scalar(real_result, imag_result);
577 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(
const Scalar&
a,
const Scalar&
b) {
580 return Scalar(real_result, imag_result);
582 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(
const Scalar&
a,
const Scalar&
b) {
585 return Scalar(real_result, imag_result);
594 template <
typename Scalar>
595 struct scalar_bitwise_and_op {
597 BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
598 EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
599 using result_type = Scalar;
601 return bitwise_binary_impl<Scalar>::run_and(
a,
b);
603 template <
typename Packet>
604 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
608 template <
typename Scalar>
609 struct functor_traits<scalar_bitwise_and_op<Scalar>> {
618 template <
typename Scalar>
619 struct scalar_bitwise_or_op {
621 BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
622 EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
623 using result_type = Scalar;
625 return bitwise_binary_impl<Scalar>::run_or(
a,
b);
627 template <
typename Packet>
628 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
632 template <
typename Scalar>
633 struct functor_traits<scalar_bitwise_or_op<Scalar>> {
642 template <
typename Scalar>
643 struct scalar_bitwise_xor_op {
645 BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
646 EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
647 using result_type = Scalar;
649 return bitwise_binary_impl<Scalar>::run_xor(
a,
b);
651 template <
typename Packet>
652 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
a,
const Packet&
b)
const {
656 template <
typename Scalar>
657 struct functor_traits<scalar_bitwise_xor_op<Scalar>> {
666 template<
typename LhsScalar,
typename RhsScalar>
667 struct scalar_absolute_difference_op : binary_op_base<LhsScalar,RhsScalar>
669 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_absolute_difference_op>::ReturnType result_type;
670 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
671 scalar_absolute_difference_op() {
672 EIGEN_SCALAR_BINARY_OP_PLUGIN
677 template<
typename Packet>
678 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet&
a,
const Packet&
b)
const
681 template<
typename LhsScalar,
typename RhsScalar>
682 struct functor_traits<scalar_absolute_difference_op<LhsScalar,RhsScalar> > {
685 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
690 template <
typename LhsScalar,
typename RhsScalar>
691 struct scalar_atan2_op {
692 using Scalar = LhsScalar;
695 EIGEN_STATIC_ASSERT(Enable,
"LhsScalar and RhsScalar must be the same non-integer, non-complex type")
697 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar&
y, const Scalar&
x)
const {
700 template <
typename Packet>
701 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet&
y,
const Packet&
x)
const {
706 template<
typename LhsScalar,
typename RhsScalar>
707 struct functor_traits<scalar_atan2_op<LhsScalar, RhsScalar>> {
708 using Scalar = LhsScalar;
711 Cost = int(scalar_div_cost<Scalar, PacketAccess>::value) + int(functor_traits<scalar_atan_op<Scalar>>::Cost)
721 template<
typename BinaryOp>
struct bind1st_op :
BinaryOp {
723 typedef typename BinaryOp::first_argument_type first_argument_type;
724 typedef typename BinaryOp::second_argument_type second_argument_type;
725 typedef typename BinaryOp::result_type result_type;
727 EIGEN_DEVICE_FUNC explicit bind1st_op(
const first_argument_type &val) : m_value(val) {}
731 template<
typename Packet>
733 {
return BinaryOp::packetOp(internal::pset1<Packet>(m_value),
b); }
735 first_argument_type m_value;
737 template<
typename BinaryOp>
struct functor_traits<bind1st_op<
BinaryOp> > : functor_traits<BinaryOp> {};
740 template<
typename BinaryOp>
struct bind2nd_op :
BinaryOp {
742 typedef typename BinaryOp::first_argument_type first_argument_type;
743 typedef typename BinaryOp::second_argument_type second_argument_type;
744 typedef typename BinaryOp::result_type result_type;
746 EIGEN_DEVICE_FUNC explicit bind2nd_op(
const second_argument_type &val) : m_value(val) {}
750 template<
typename Packet>
752 {
return BinaryOp::packetOp(
a,internal::pset1<Packet>(m_value)); }
754 second_argument_type m_value;
756 template<
typename BinaryOp>
struct functor_traits<bind2nd_op<
BinaryOp> > : functor_traits<BinaryOp> {};
const ImagReturnType imag() const
RealReturnType real() const
IndexedView_or_Block operator()(const RowIndices &rowIndices, const ColIndices &colIndices)
#define EIGEN_PREDICT_FALSE(x)
#define EIGEN_UNUSED_VARIABLE(var)
#define EIGEN_DEVICE_FUNC
#define EIGEN_STATIC_ASSERT(X, MSG)
Packet padd(const Packet &a, const Packet &b)
Packet8f pzero(const Packet8f &)
unpacket_traits< Packet >::type predux(const Packet &a)
Packet8h pandnot(const Packet8h &a, const Packet8h &b)
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_pow(const Packet &x, const Packet &y)
EIGEN_ALWAYS_INLINE Packet patan2(const Packet &y, const Packet &x)
Packet2cf pcmp_eq(const Packet2cf &a, const Packet2cf &b)
Packet pmul(const Packet &a, const Packet &b)
Packet psub(const Packet &a, const Packet &b)
unpacket_traits< Packet >::type predux_mul(const Packet &a)
Packet8h pand(const Packet8h &a, const Packet8h &b)
Packet pabsdiff(const Packet &a, const Packet &b)
Packet8h pxor(const Packet8h &a, const Packet8h &b)
Packet pdiv(const Packet &a, const Packet &b)
Packet8h por(const Packet8h &a, const Packet8h &b)
Packet4i pcmp_lt(const Packet4i &a, const Packet4i &b)
RealScalar positive_real_hypot(const RealScalar &x, const RealScalar &y)
bool predux_any(const Packet4f &x)
Packet4f pcmp_le(const Packet4f &a, const Packet4f &b)
typename typed_cmp_helper< LhsScalar, RhsScalar, UseTypedComparators >::type cmp_return_t
EIGEN_ALWAYS_INLINE T absdiff(const T &x, const T &y)
internal::pow_impl< ScalarX, ScalarY >::result_type pow(const ScalarX &x, const ScalarY &y)
EIGEN_ALWAYS_INLINE T atan2(const T &y, const T &x)