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>
32 struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
34 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_sum_op>::ReturnType result_type;
35 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN 36 EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
39 EIGEN_SCALAR_BINARY_OP_PLUGIN
42 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a + b; }
43 template<
typename Packet>
44 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const 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
const result_type predux(
const Packet& a)
const 48 {
return internal::predux(a); }
50 template<
typename LhsScalar,
typename RhsScalar>
51 struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > {
53 Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
54 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
64 template<>
struct scalar_sum_op<bool,bool> : scalar_sum_op<int,int> {
75 template<
typename LhsScalar,
typename RhsScalar>
76 struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar>
78 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type;
79 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN 80 EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
83 EIGEN_SCALAR_BINARY_OP_PLUGIN
86 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a * b; }
87 template<
typename Packet>
88 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 89 {
return internal::pmul(a,b); }
90 template<
typename Packet>
91 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type predux(
const Packet& a)
const 92 {
return internal::predux_mul(a); }
94 template<
typename LhsScalar,
typename RhsScalar>
95 struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
97 Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2,
98 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
108 template<
typename LhsScalar,
typename RhsScalar>
109 struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar>
113 Conj = NumTraits<LhsScalar>::IsComplex
116 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
118 EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
119 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const 120 {
return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
122 template<
typename Packet>
123 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 124 {
return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
126 template<
typename LhsScalar,
typename RhsScalar>
127 struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
129 Cost = NumTraits<LhsScalar>::MulCost,
130 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
139 template<
typename LhsScalar,
typename RhsScalar>
140 struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
142 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
143 EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
144 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return numext::mini(a, b); }
145 template<
typename Packet>
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 147 {
return internal::pmin(a,b); }
148 template<
typename Packet>
149 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type predux(
const Packet& a)
const 150 {
return internal::predux_min(a); }
152 template<
typename LhsScalar,
typename RhsScalar>
153 struct functor_traits<scalar_min_op<LhsScalar,RhsScalar> > {
155 Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
156 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
165 template<
typename LhsScalar,
typename RhsScalar>
166 struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
168 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
169 EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
170 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return numext::maxi(a, b); }
171 template<
typename Packet>
172 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 173 {
return internal::pmax(a,b); }
174 template<
typename Packet>
175 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type predux(
const Packet& a)
const 176 {
return internal::predux_max(a); }
178 template<
typename LhsScalar,
typename RhsScalar>
179 struct functor_traits<scalar_max_op<LhsScalar,RhsScalar> > {
181 Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
182 PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
190 template<
typename LhsScalar,
typename RhsScalar, ComparisonName cmp>
struct scalar_cmp_op;
192 template<
typename LhsScalar,
typename RhsScalar, ComparisonName cmp>
193 struct functor_traits<scalar_cmp_op<LhsScalar,RhsScalar, cmp> > {
195 Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
200 template<ComparisonName Cmp,
typename LhsScalar,
typename RhsScalar>
201 struct result_of<scalar_cmp_op<LhsScalar, RhsScalar, Cmp>(LhsScalar,RhsScalar)> {
206 template<
typename LhsScalar,
typename RhsScalar>
207 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_EQ> : binary_op_base<LhsScalar,RhsScalar>
209 typedef bool result_type;
210 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
211 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a==b;}
213 template<
typename LhsScalar,
typename RhsScalar>
214 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LT> : binary_op_base<LhsScalar,RhsScalar>
216 typedef bool result_type;
217 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
218 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a<b;}
220 template<
typename LhsScalar,
typename RhsScalar>
221 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LE> : binary_op_base<LhsScalar,RhsScalar>
223 typedef bool result_type;
224 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
225 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a<=b;}
227 template<
typename LhsScalar,
typename RhsScalar>
228 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GT> : binary_op_base<LhsScalar,RhsScalar>
230 typedef bool result_type;
231 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
232 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a>b;}
234 template<
typename LhsScalar,
typename RhsScalar>
235 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GE> : binary_op_base<LhsScalar,RhsScalar>
237 typedef bool result_type;
238 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
239 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a>=b;}
241 template<
typename LhsScalar,
typename RhsScalar>
242 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_UNORD> : binary_op_base<LhsScalar,RhsScalar>
244 typedef bool result_type;
245 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
246 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return !(a<=b || b<=a);}
248 template<
typename LhsScalar,
typename RhsScalar>
249 struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_NEQ> : binary_op_base<LhsScalar,RhsScalar>
251 typedef bool result_type;
252 EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
253 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator()(
const LhsScalar& a,
const RhsScalar& b)
const {
return a!=b;}
262 template<
typename Scalar>
263 struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
265 EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
267 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& _x,
const Scalar& _y)
const 269 EIGEN_USING_STD_MATH(
sqrt)
281 return p *
sqrt(Scalar(1) + qp*qp);
284 template<
typename Scalar>
285 struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
288 Cost = 3 * NumTraits<Scalar>::AddCost +
289 2 * NumTraits<Scalar>::MulCost +
290 2 * scalar_div_cost<Scalar,false>::value,
298 template<
typename Scalar,
typename Exponent>
299 struct scalar_pow_op : binary_op_base<Scalar,Exponent>
301 typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
302 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN 303 EIGEN_EMPTY_STRUCT_CTOR(scalar_pow_op)
306 typedef Scalar LhsScalar;
307 typedef Exponent RhsScalar;
308 EIGEN_SCALAR_BINARY_OP_PLUGIN
312 inline result_type operator() (
const Scalar& a,
const Exponent& b)
const {
return numext::pow(a, b); }
314 template<
typename Scalar,
typename Exponent>
315 struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
316 enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
false };
328 template<
typename LhsScalar,
typename RhsScalar>
329 struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
331 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type;
332 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN 333 EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
335 scalar_difference_op() {
336 EIGEN_SCALAR_BINARY_OP_PLUGIN
339 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a - b; }
340 template<
typename Packet>
341 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 342 {
return internal::psub(a,b); }
344 template<
typename LhsScalar,
typename RhsScalar>
345 struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
347 Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
348 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
357 template<
typename LhsScalar,
typename RhsScalar>
358 struct scalar_quotient_op : binary_op_base<LhsScalar,RhsScalar>
360 typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type;
361 #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN 362 EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
364 scalar_quotient_op() {
365 EIGEN_SCALAR_BINARY_OP_PLUGIN
368 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const LhsScalar& a,
const RhsScalar& b)
const {
return a / b; }
369 template<
typename Packet>
370 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& b)
const 371 {
return internal::pdiv(a,b); }
373 template<
typename LhsScalar,
typename RhsScalar>
374 struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
375 typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
377 PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
378 Cost = scalar_div_cost<result_type,PacketAccess>::value
389 struct scalar_boolean_and_op {
390 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
391 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a && b; }
393 template<>
struct functor_traits<scalar_boolean_and_op> {
395 Cost = NumTraits<bool>::AddCost,
405 struct scalar_boolean_or_op {
406 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
407 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a || b; }
409 template<>
struct functor_traits<scalar_boolean_or_op> {
411 Cost = NumTraits<bool>::AddCost,
421 struct scalar_boolean_xor_op {
422 EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_xor_op)
423 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool operator() (
const bool& a,
const bool& b)
const {
return a ^ b; }
425 template<>
struct functor_traits<scalar_boolean_xor_op> {
427 Cost = NumTraits<bool>::AddCost,
440 template<
typename BinaryOp>
struct bind1st_op : BinaryOp {
442 typedef typename BinaryOp::first_argument_type first_argument_type;
443 typedef typename BinaryOp::second_argument_type second_argument_type;
444 typedef typename BinaryOp::result_type result_type;
446 bind1st_op(
const first_argument_type &val) : m_value(val) {}
448 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const second_argument_type& b)
const {
return BinaryOp::operator()(m_value,b); }
450 template<
typename Packet>
451 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& b)
const 452 {
return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b); }
454 first_argument_type m_value;
456 template<
typename BinaryOp>
struct functor_traits<bind1st_op<BinaryOp> > : functor_traits<BinaryOp> {};
459 template<
typename BinaryOp>
struct bind2nd_op : BinaryOp {
461 typedef typename BinaryOp::first_argument_type first_argument_type;
462 typedef typename BinaryOp::second_argument_type second_argument_type;
463 typedef typename BinaryOp::result_type result_type;
465 bind2nd_op(
const second_argument_type &val) : m_value(val) {}
467 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const result_type operator() (
const first_argument_type& a)
const {
return BinaryOp::operator()(a,m_value); }
469 template<
typename Packet>
470 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a)
const 471 {
return BinaryOp::packetOp(a,internal::pset1<Packet>(m_value)); }
473 second_argument_type m_value;
475 template<
typename BinaryOp>
struct functor_traits<bind2nd_op<BinaryOp> > : functor_traits<BinaryOp> {};
482 #endif // EIGEN_BINARY_FUNCTORS_H const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
Namespace containing all symbols from the Eigen library.
Definition: Core:287
Definition: Eigen_Colamd.h:50