10 #ifndef EIGEN_BINARY_FUNCTORS_H 11 #define EIGEN_BINARY_FUNCTORS_H 24 template<
typename Scalar>
struct scalar_sum_op {
26 EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
27 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b)
const {
return a + b; }
28 template<
typename Packet>
29 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 30 {
return internal::padd(a,b); }
31 template<
typename Packet>
32 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar predux(
const Packet& a)
const 33 {
return internal::predux(a); }
35 template<
typename Scalar>
36 struct functor_traits<scalar_sum_op<Scalar> > {
38 Cost = NumTraits<Scalar>::AddCost,
39 PacketAccess = packet_traits<Scalar>::HasAdd
48 template<>
struct scalar_sum_op<bool> : scalar_sum_op<int> {
59 template<
typename LhsScalar,
typename RhsScalar>
struct scalar_product_op {
62 Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
64 typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
65 EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
66 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b)
const {
return a * b; }
67 template<
typename Packet>
68 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 69 {
return internal::pmul(a,b); }
70 template<
typename Packet>
71 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type predux(
const Packet& a)
const 72 {
return internal::predux_mul(a); }
74 template<
typename LhsScalar,
typename RhsScalar>
75 struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
77 Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2,
78 PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable
87 template<
typename LhsScalar,
typename RhsScalar>
struct scalar_conj_product_op {
90 Conj = NumTraits<LhsScalar>::IsComplex
93 typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
95 EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
96 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b)
const 97 {
return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
99 template<
typename Packet>
100 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 101 {
return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
103 template<
typename LhsScalar,
typename RhsScalar>
104 struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
106 Cost = NumTraits<LhsScalar>::MulCost,
107 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
116 template<
typename Scalar>
struct scalar_min_op {
117 EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b)
const {
return numext::mini(a, b); }
119 template<
typename Packet>
120 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 121 {
return internal::pmin(a,b); }
122 template<
typename Packet>
123 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar predux(
const Packet& a)
const 124 {
return internal::predux_min(a); }
126 template<
typename Scalar>
127 struct functor_traits<scalar_min_op<Scalar> > {
129 Cost = NumTraits<Scalar>::AddCost,
130 PacketAccess = packet_traits<Scalar>::HasMin
139 template<
typename Scalar>
struct scalar_max_op {
140 EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
141 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b)
const {
return numext::maxi(a, b); }
142 template<
typename Packet>
143 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 144 {
return internal::pmax(a,b); }
145 template<
typename Packet>
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar predux(
const Packet& a)
const 147 {
return internal::predux_max(a); }
149 template<
typename Scalar>
150 struct functor_traits<scalar_max_op<Scalar> > {
152 Cost = NumTraits<Scalar>::AddCost,
153 PacketAccess = packet_traits<Scalar>::HasMax
161 template<
typename Scalar, ComparisonName cmp>
struct scalar_cmp_op;
163 template<
typename Scalar, ComparisonName cmp>
164 struct functor_traits<scalar_cmp_op<Scalar, cmp> > {
166 Cost = NumTraits<Scalar>::AddCost,
171 template<ComparisonName Cmp,
typename Scalar>
172 struct result_of<scalar_cmp_op<Scalar, Cmp>(Scalar,Scalar)> {
177 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_EQ> {
178 typedef bool result_type;
179 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
180 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a==b;}
182 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_LT> {
183 typedef bool result_type;
184 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
185 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a<b;}
187 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_LE> {
188 typedef bool result_type;
189 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
190 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a<=b;}
192 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_GT> {
193 typedef bool result_type;
194 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
195 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a>b;}
197 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_GE> {
198 typedef bool result_type;
199 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
200 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a>=b;}
202 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_UNORD> {
203 typedef bool result_type;
204 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
205 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return !(a<=b || b<=a);}
207 template<
typename Scalar>
struct scalar_cmp_op<Scalar, cmp_NEQ> {
208 typedef bool result_type;
209 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
210 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(const Scalar& a, const Scalar& b)
const {
return a!=b;}
219 template<
typename Scalar>
struct scalar_hypot_op {
220 EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
222 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y)
const 236 return p * sqrt(Scalar(1) + qp*qp);
239 template<
typename Scalar>
240 struct functor_traits<scalar_hypot_op<Scalar> > {
241 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 };
247 template<
typename Scalar,
typename OtherScalar>
struct scalar_binary_pow_op {
248 EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)
250 inline Scalar operator() (const Scalar& a, const OtherScalar& b)
const {
return numext::pow(a, b); }
252 template<
typename Scalar,
typename OtherScalar>
253 struct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {
254 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
false };
266 template<
typename Scalar>
struct scalar_difference_op {
267 EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
268 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b)
const {
return a - b; }
269 template<
typename Packet>
270 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 271 {
return internal::psub(a,b); }
273 template<
typename Scalar>
274 struct functor_traits<scalar_difference_op<Scalar> > {
276 Cost = NumTraits<Scalar>::AddCost,
277 PacketAccess = packet_traits<Scalar>::HasSub
286 template<
typename LhsScalar,
typename RhsScalar>
struct scalar_quotient_op {
289 Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv
291 typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
292 EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
293 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b)
const {
return a / b; }
294 template<
typename Packet>
295 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 296 {
return internal::pdiv(a,b); }
298 template<
typename LhsScalar,
typename RhsScalar>
299 struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
301 Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost),
302 PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
313 struct scalar_boolean_and_op {
314 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
315 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (const
bool& a, const
bool& b)
const {
return a && b; }
317 template<>
struct functor_traits<scalar_boolean_and_op> {
319 Cost = NumTraits<bool>::AddCost,
329 struct scalar_boolean_or_op {
330 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
331 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (const
bool& a, const
bool& b)
const {
return a || b; }
333 template<>
struct functor_traits<scalar_boolean_or_op> {
335 Cost = NumTraits<bool>::AddCost,
357 template<
typename Scalar>
358 struct scalar_multiple_op {
361 EIGEN_STRONG_INLINE scalar_multiple_op(
const scalar_multiple_op& other) : m_other(other.m_other) { }
363 EIGEN_STRONG_INLINE scalar_multiple_op(
const Scalar& other) : m_other(other) { }
365 EIGEN_STRONG_INLINE Scalar operator() (
const Scalar& a)
const {
return a * m_other; }
366 template <
typename Packet>
367 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const 368 {
return internal::pmul(a, pset1<Packet>(m_other)); }
369 typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
371 template<
typename Scalar>
372 struct functor_traits<scalar_multiple_op<Scalar> >
373 {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
375 template<
typename Scalar1,
typename Scalar2>
376 struct scalar_multiple2_op {
377 typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type;
378 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_multiple2_op(
const scalar_multiple2_op& other) : m_other(other.m_other) { }
379 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_multiple2_op(
const Scalar2& other) : m_other(other) { }
380 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const Scalar1& a)
const {
return a * m_other; }
381 typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other;
383 template<
typename Scalar1,
typename Scalar2>
384 struct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> >
385 {
enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess =
false }; };
395 template<
typename Scalar>
396 struct scalar_quotient1_op {
398 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_quotient1_op(
const scalar_quotient1_op& other) : m_other(other.m_other) { }
399 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_quotient1_op(
const Scalar& other) : m_other(other) {}
400 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (
const Scalar& a)
const {
return a / m_other; }
401 template <
typename Packet>
402 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const 403 {
return internal::pdiv(a, pset1<Packet>(m_other)); }
404 typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
406 template<
typename Scalar>
407 struct functor_traits<scalar_quotient1_op<Scalar> >
408 {
enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
410 template<
typename Scalar1,
typename Scalar2>
411 struct scalar_quotient2_op {
412 typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type;
413 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_quotient2_op(
const scalar_quotient2_op& other) : m_other(other.m_other) { }
414 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_quotient2_op(
const Scalar2& other) : m_other(other) { }
415 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const Scalar1& a)
const {
return a / m_other; }
416 typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other;
418 template<
typename Scalar1,
typename Scalar2>
419 struct functor_traits<scalar_quotient2_op<Scalar1,Scalar2> >
420 {
enum { Cost = 2 * NumTraits<Scalar1>::MulCost, PacketAccess =
false }; };
426 template<
typename Functor>
struct functor_is_product_like {
enum { ret = 0 }; };
427 template<
typename LhsScalar,
typename RhsScalar>
struct functor_is_product_like<scalar_product_op<LhsScalar,RhsScalar> > {
enum { ret = 1 }; };
428 template<
typename LhsScalar,
typename RhsScalar>
struct functor_is_product_like<scalar_conj_product_op<LhsScalar,RhsScalar> > {
enum { ret = 1 }; };
429 template<
typename LhsScalar,
typename RhsScalar>
struct functor_is_product_like<scalar_quotient_op<LhsScalar,RhsScalar> > {
enum { ret = 1 }; };
437 template<
typename Scalar>
438 struct scalar_add_op {
440 EIGEN_DEVICE_FUNC
inline scalar_add_op(
const scalar_add_op& other) : m_other(other.m_other) { }
441 EIGEN_DEVICE_FUNC
inline scalar_add_op(
const Scalar& other) : m_other(other) { }
442 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a)
const {
return a + m_other; }
443 template <
typename Packet>
444 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const 445 {
return internal::padd(a, pset1<Packet>(m_other)); }
446 const Scalar m_other;
448 template<
typename Scalar>
449 struct functor_traits<scalar_add_op<Scalar> >
450 {
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };
456 template<
typename Scalar>
457 struct scalar_sub_op {
458 EIGEN_DEVICE_FUNC
inline scalar_sub_op(
const scalar_sub_op& other) : m_other(other.m_other) { }
459 EIGEN_DEVICE_FUNC
inline scalar_sub_op(
const Scalar& other) : m_other(other) { }
460 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a)
const {
return a - m_other; }
461 template <
typename Packet>
462 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 463 {
return internal::psub(a, pset1<Packet>(m_other)); }
464 const Scalar m_other;
466 template<
typename Scalar>
467 struct functor_traits<scalar_sub_op<Scalar> >
468 {
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };
474 template<
typename Scalar>
475 struct scalar_rsub_op {
476 EIGEN_DEVICE_FUNC
inline scalar_rsub_op(
const scalar_rsub_op& other) : m_other(other.m_other) { }
477 EIGEN_DEVICE_FUNC
inline scalar_rsub_op(
const Scalar& other) : m_other(other) { }
478 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a)
const {
return m_other - a; }
479 template <
typename Packet>
480 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 481 {
return internal::psub(pset1<Packet>(m_other), a); }
482 const Scalar m_other;
484 template<
typename Scalar>
485 struct functor_traits<scalar_rsub_op<Scalar> >
486 {
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };
492 template<
typename Scalar>
493 struct scalar_pow_op {
495 EIGEN_DEVICE_FUNC
inline scalar_pow_op(
const scalar_pow_op& other) : m_exponent(other.m_exponent) { }
496 EIGEN_DEVICE_FUNC
inline scalar_pow_op(
const Scalar& exponent) : m_exponent(exponent) {}
498 inline Scalar operator() (
const Scalar& a)
const {
return numext::pow(a, m_exponent); }
499 const Scalar m_exponent;
501 template<
typename Scalar>
502 struct functor_traits<scalar_pow_op<Scalar> >
503 {
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
false }; };
509 template<
typename Scalar>
510 struct scalar_inverse_mult_op {
511 EIGEN_DEVICE_FUNC scalar_inverse_mult_op(
const Scalar& other) : m_other(other) {}
512 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a)
const {
return m_other / a; }
513 template<
typename Packet>
514 EIGEN_DEVICE_FUNC
inline const Packet packetOp(
const Packet& a)
const 515 {
return internal::pdiv(pset1<Packet>(m_other),a); }
523 #endif // EIGEN_BINARY_FUNCTORS_H
Definition: Eigen_Colamd.h:54