10 #ifndef EIGEN_BINARY_FUNCTORS_H
11 #define EIGEN_BINARY_FUNCTORS_H
19 template<
typename Arg1,
typename Arg2>
22 typedef Arg1 first_argument_type;
23 typedef Arg2 second_argument_type;
31 template<
typename LhsScalar,
typename RhsScalar>
35 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
39 EIGEN_SCALAR_BINARY_OP_PLUGIN
42 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a + b; }
43 template<
typename Packet>
44 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet packetOp(
const Packet& a,
const Packet& b)
const
45 {
return internal::padd(a,b); }
46 template<
typename Packet>
47 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(
const Packet& a)
const
48 {
return internal::predux(a); }
50 template<
typename LhsScalar,
typename RhsScalar>
69 template<
typename LhsScalar,
typename RhsScalar>
73 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
77 EIGEN_SCALAR_BINARY_OP_PLUGIN
80 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a * b; }
81 template<
typename Packet>
82 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet packetOp(
const Packet& a,
const Packet& b)
const
83 {
return internal::pmul(a,b); }
84 template<
typename Packet>
85 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(
const Packet& a)
const
86 {
return internal::predux_mul(a); }
88 template<
typename LhsScalar,
typename RhsScalar>
106 template<
typename LhsScalar,
typename RhsScalar>
117 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const
120 template<
typename Packet>
121 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet packetOp(
const Packet& a,
const Packet& b)
const
124 template<
typename LhsScalar,
typename RhsScalar>
137 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
142 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
143 return internal::pmin<NaNPropagation>(a, b);
145 template<
typename Packet>
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet packetOp(
const Packet& a,
const Packet& b)
const
148 return internal::pmin<NaNPropagation>(a,b);
150 template<
typename Packet>
151 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(
const Packet& a)
const
153 return internal::predux_min<NaNPropagation>(a);
157 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
170 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
175 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
176 return internal::pmax<NaNPropagation>(a,b);
178 template<
typename Packet>
179 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet packetOp(
const Packet& a,
const Packet& b)
const
181 return internal::pmax<NaNPropagation>(a,b);
183 template<
typename Packet>
184 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(
const Packet& a)
const
186 return internal::predux_max<NaNPropagation>(a);
190 template<
typename LhsScalar,
typename RhsScalar,
int NaNPropagation>
202 template<
typename LhsScalar,
typename RhsScalar, ComparisonName cmp>
struct scalar_cmp_op;
204 template<
typename LhsScalar,
typename RhsScalar, ComparisonName cmp>
212 template<ComparisonName Cmp,
typename LhsScalar,
typename RhsScalar>
218 template<
typename LhsScalar,
typename RhsScalar>
221 typedef bool result_type;
223 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a==b;}
225 template<
typename LhsScalar,
typename RhsScalar>
228 typedef bool result_type;
230 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a<b;}
232 template<
typename LhsScalar,
typename RhsScalar>
235 typedef bool result_type;
237 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a<=b;}
239 template<
typename LhsScalar,
typename RhsScalar>
242 typedef bool result_type;
244 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a>b;}
246 template<
typename LhsScalar,
typename RhsScalar>
249 typedef bool result_type;
251 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a>=b;}
253 template<
typename LhsScalar,
typename RhsScalar>
256 typedef bool result_type;
258 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return !(a<=b || b<=a);}
260 template<
typename LhsScalar,
typename RhsScalar>
263 typedef bool result_type;
265 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a!=b;}
273 template<
typename LhsScalar,
typename RhsScalar, ComparisonName cmp>
281 template<
typename LhsScalar,
typename RhsScalar>
286 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
287 if(a==b)
return static_cast<result_type
>(1);
288 else return static_cast<result_type
>(0);
290 template<
typename Packet>
291 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
292 {
return internal::pselect(internal::pcmp_eq(a,b), internal::pset1<Packet>(
static_cast<result_type
>(1)), internal::pzero(a)); }
294 template<
typename LhsScalar,
typename RhsScalar>
299 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
300 if(a<b)
return static_cast<result_type
>(1);
301 else return static_cast<result_type
>(0);
303 template<
typename Packet>
304 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
305 {
return internal::pselect(internal::pcmp_lt(a,b), internal::pset1<Packet>(
static_cast<result_type
>(1)), internal::pzero(a)); }
307 template<
typename LhsScalar,
typename RhsScalar>
312 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
313 if(a<=b)
return static_cast<result_type
>(1);
314 else return static_cast<result_type
>(0);
316 template<
typename Packet>
317 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
318 {
return internal::pselect(internal::pcmp_le(a,b), internal::pset1<Packet>(
static_cast<result_type
>(1)), internal::pzero(a)); }
320 template<
typename LhsScalar,
typename RhsScalar>
325 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
326 if(a>b)
return static_cast<result_type
>(1);
327 else return static_cast<result_type
>(0);
329 template<
typename Packet>
330 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
331 {
return internal::pselect(internal::pcmp_le(a,b), internal::pzero(a), internal::pset1<Packet>(
static_cast<result_type
>(1))); }
333 template<
typename LhsScalar,
typename RhsScalar>
338 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
339 if(a>=b)
return static_cast<result_type
>(1);
340 else return static_cast<result_type
>(0);
342 template<
typename Packet>
343 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
344 {
return internal::pselect(internal::pcmp_lt(a,b), internal::pzero(a), internal::pset1<Packet>(
static_cast<result_type
>(1))); }
346 template<
typename LhsScalar,
typename RhsScalar>
351 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
352 if(a<=b || b<=a)
return static_cast<result_type
>(0);
353 else return static_cast<result_type
>(1);
355 template<
typename Packet>
356 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
357 {
return internal::pselect(por(internal::pcmp_le(a,b), internal::pcmp_le(b,a)), internal::pzero(a), internal::pset1<Packet>(
static_cast<result_type
>(1))); }
359 template<
typename LhsScalar,
typename RhsScalar>
364 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
365 if(a!=b)
return static_cast<result_type
>(1);
366 else return static_cast<result_type
>(0);
368 template<
typename Packet>
369 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
370 {
return internal::pselect(internal::pcmp_eq(a,b), internal::pzero(a), internal::pset1<Packet>(
static_cast<result_type
>(1))); }
378 template<
typename Scalar>
383 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar &x,
const Scalar &y)
const
390 return internal::positive_real_hypot(x,y);
393 template<
typename Scalar>
407 template<
typename Scalar,
typename Exponent>
411 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
415 typedef Scalar LhsScalar;
416 typedef Exponent RhsScalar;
417 EIGEN_SCALAR_BINARY_OP_PLUGIN
421 inline result_type operator() (
const Scalar& a,
const Exponent& b)
const {
return numext::pow(a, b); }
423 template<
typename Scalar,
typename Exponent>
437 template<
typename LhsScalar,
typename RhsScalar>
441 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
445 EIGEN_SCALAR_BINARY_OP_PLUGIN
448 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a - b; }
449 template<
typename Packet>
450 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
451 {
return internal::psub(a,b); }
453 template<
typename LhsScalar,
typename RhsScalar>
466 template<
typename LhsScalar,
typename RhsScalar>
470 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
474 EIGEN_SCALAR_BINARY_OP_PLUGIN
477 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a / b; }
478 template<
typename Packet>
479 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
480 {
return internal::pdiv(a,b); }
482 template<
typename LhsScalar,
typename RhsScalar>
484 typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
500 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a && b; }
501 template<
typename Packet>
502 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
503 {
return internal::pand(a,b); }
519 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a || b; }
520 template<
typename Packet>
521 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
522 {
return internal::por(a,b); }
538 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a ^ b; }
539 template<
typename Packet>
540 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
541 {
return internal::pxor(a,b); }
555 template<
typename LhsScalar,
typename RhsScalar>
559 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
563 EIGEN_SCALAR_BINARY_OP_PLUGIN
566 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const
567 {
return numext::absdiff(a,b); }
568 template<
typename Packet>
569 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const
570 {
return internal::pabsdiff(a,b); }
572 template<
typename LhsScalar,
typename RhsScalar>
590 typedef typename BinaryOp::first_argument_type first_argument_type;
591 typedef typename BinaryOp::second_argument_type second_argument_type;
592 typedef typename BinaryOp::result_type result_type;
594 EIGEN_DEVICE_FUNC
explicit bind1st_op(
const first_argument_type &val) : m_value(val) {}
596 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const second_argument_type& b)
const {
return BinaryOp::operator()(m_value,b); }
598 template<
typename Packet>
599 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& b)
const
600 {
return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b); }
602 first_argument_type m_value;
609 typedef typename BinaryOp::first_argument_type first_argument_type;
610 typedef typename BinaryOp::second_argument_type second_argument_type;
611 typedef typename BinaryOp::result_type result_type;
613 EIGEN_DEVICE_FUNC
explicit bind2nd_op(
const second_argument_type &val) : m_value(val) {}
615 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const first_argument_type& a)
const {
return BinaryOp::operator()(a,m_value); }
617 template<
typename Packet>
618 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const
619 {
return BinaryOp::packetOp(a,internal::pset1<Packet>(m_value)); }
621 second_argument_type m_value;
630 #endif // EIGEN_BINARY_FUNCTORS_H