Eigen  3.2.92
UnaryFunctors.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 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 namespace Eigen {
14 
15 namespace internal {
16 
22 template<typename Scalar> struct scalar_opposite_op {
23  EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
24  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
25  template<typename Packet>
26  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
27  { return internal::pnegate(a); }
28 };
29 template<typename Scalar>
30 struct functor_traits<scalar_opposite_op<Scalar> >
31 { enum {
32  Cost = NumTraits<Scalar>::AddCost,
33  PacketAccess = packet_traits<Scalar>::HasNegate };
34 };
35 
41 template<typename Scalar> struct scalar_abs_op {
42  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
43  typedef typename NumTraits<Scalar>::Real result_type;
44  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }
45  template<typename Packet>
46  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
47  { return internal::pabs(a); }
48 };
49 template<typename Scalar>
50 struct functor_traits<scalar_abs_op<Scalar> >
51 {
52  enum {
53  Cost = NumTraits<Scalar>::AddCost,
54  PacketAccess = packet_traits<Scalar>::HasAbs
55  };
56 };
57 
63 template<typename Scalar> struct scalar_score_coeff_op : scalar_abs_op<Scalar>
64 {
65  typedef void Score_is_abs;
66 };
67 template<typename Scalar>
68 struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {};
69 
70 /* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor. */
71 template<typename Scalar, typename=void> struct abs_knowing_score
72 {
73  EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
74  typedef typename NumTraits<Scalar>::Real result_type;
75  template<typename Score>
76  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&) const { using std::abs; return abs(a); }
77 };
78 template<typename Scalar> struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs>
79 {
80  EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
81  typedef typename NumTraits<Scalar>::Real result_type;
82  template<typename Scal>
83  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a) const { return a; }
84 };
85 
91 template<typename Scalar> struct scalar_abs2_op {
92  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
93  typedef typename NumTraits<Scalar>::Real result_type;
94  EIGEN_DEVICE_FUNC
95  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }
96  template<typename Packet>
97  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
98  { return internal::pmul(a,a); }
99 };
100 template<typename Scalar>
101 struct functor_traits<scalar_abs2_op<Scalar> >
102 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
103 
109 template<typename Scalar> struct scalar_conjugate_op {
110  EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
111  EIGEN_DEVICE_FUNC
112  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); }
113  template<typename Packet>
114  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
115 };
116 template<typename Scalar>
117 struct functor_traits<scalar_conjugate_op<Scalar> >
118 {
119  enum {
120  Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
121  PacketAccess = packet_traits<Scalar>::HasConj
122  };
123 };
124 
130 template<typename Scalar> struct scalar_arg_op {
131  EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op)
132  typedef typename NumTraits<Scalar>::Real result_type;
133  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using numext::arg; return arg(a); }
134  template<typename Packet>
135  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
136  { return internal::parg(a); }
137 };
138 template<typename Scalar>
139 struct functor_traits<scalar_arg_op<Scalar> >
140 {
141  enum {
142  Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
143  PacketAccess = packet_traits<Scalar>::HasArg
144  };
145 };
151 template<typename Scalar, typename NewType>
152 struct scalar_cast_op {
153  EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
154  typedef NewType result_type;
155  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
156 };
157 template<typename Scalar, typename NewType>
158 struct functor_traits<scalar_cast_op<Scalar,NewType> >
159 { enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
160 
166 template<typename Scalar>
167 struct scalar_real_op {
168  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
169  typedef typename NumTraits<Scalar>::Real result_type;
170  EIGEN_DEVICE_FUNC
171  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }
172 };
173 template<typename Scalar>
174 struct functor_traits<scalar_real_op<Scalar> >
175 { enum { Cost = 0, PacketAccess = false }; };
176 
182 template<typename Scalar>
183 struct scalar_imag_op {
184  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
185  typedef typename NumTraits<Scalar>::Real result_type;
186  EIGEN_DEVICE_FUNC
187  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }
188 };
189 template<typename Scalar>
190 struct functor_traits<scalar_imag_op<Scalar> >
191 { enum { Cost = 0, PacketAccess = false }; };
192 
198 template<typename Scalar>
199 struct scalar_real_ref_op {
200  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
201  typedef typename NumTraits<Scalar>::Real result_type;
202  EIGEN_DEVICE_FUNC
203  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }
204 };
205 template<typename Scalar>
206 struct functor_traits<scalar_real_ref_op<Scalar> >
207 { enum { Cost = 0, PacketAccess = false }; };
208 
214 template<typename Scalar>
215 struct scalar_imag_ref_op {
216  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
217  typedef typename NumTraits<Scalar>::Real result_type;
218  EIGEN_DEVICE_FUNC
219  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }
220 };
221 template<typename Scalar>
222 struct functor_traits<scalar_imag_ref_op<Scalar> >
223 { enum { Cost = 0, PacketAccess = false }; };
224 
231 template<typename Scalar> struct scalar_exp_op {
232  EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
233  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); }
234  template <typename Packet>
235  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
236 };
237 template<typename Scalar>
238 struct functor_traits<scalar_exp_op<Scalar> >
239 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };
240 
247 template<typename Scalar> struct scalar_log_op {
248  EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
249  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); }
250  template <typename Packet>
251  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
252 };
253 template<typename Scalar>
254 struct functor_traits<scalar_log_op<Scalar> >
255 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
256 
263 template<typename Scalar> struct scalar_log10_op {
264  EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
265  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::log10; return log10(a); }
266  template <typename Packet>
267  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); }
268 };
269 template<typename Scalar>
270 struct functor_traits<scalar_log10_op<Scalar> >
271 { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
272 
277 template<typename Scalar> struct scalar_sqrt_op {
278  EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
279  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); }
280  template <typename Packet>
281  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
282 };
283 template<typename Scalar>
284 struct functor_traits<scalar_sqrt_op<Scalar> >
285 { enum {
286  Cost = 5 * NumTraits<Scalar>::MulCost,
287  PacketAccess = packet_traits<Scalar>::HasSqrt
288  };
289 };
290 
295 template<typename Scalar> struct scalar_rsqrt_op {
296  EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
297  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return Scalar(1)/sqrt(a); }
298  template <typename Packet>
299  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); }
300 };
301 
302 template<typename Scalar>
303 struct functor_traits<scalar_rsqrt_op<Scalar> >
304 { enum {
305  Cost = 5 * NumTraits<Scalar>::MulCost,
306  PacketAccess = packet_traits<Scalar>::HasRsqrt
307  };
308 };
309 
314 template<typename Scalar> struct scalar_cos_op {
315  EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
316  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); }
317  template <typename Packet>
318  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
319 };
320 template<typename Scalar>
321 struct functor_traits<scalar_cos_op<Scalar> >
322 {
323  enum {
324  Cost = 5 * NumTraits<Scalar>::MulCost,
325  PacketAccess = packet_traits<Scalar>::HasCos
326  };
327 };
328 
333 template<typename Scalar> struct scalar_sin_op {
334  EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
335  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); }
336  template <typename Packet>
337  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
338 };
339 template<typename Scalar>
340 struct functor_traits<scalar_sin_op<Scalar> >
341 {
342  enum {
343  Cost = 5 * NumTraits<Scalar>::MulCost,
344  PacketAccess = packet_traits<Scalar>::HasSin
345  };
346 };
347 
348 
353 template<typename Scalar> struct scalar_tan_op {
354  EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
355  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); }
356  template <typename Packet>
357  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
358 };
359 template<typename Scalar>
360 struct functor_traits<scalar_tan_op<Scalar> >
361 {
362  enum {
363  Cost = 5 * NumTraits<Scalar>::MulCost,
364  PacketAccess = packet_traits<Scalar>::HasTan
365  };
366 };
367 
372 template<typename Scalar> struct scalar_acos_op {
373  EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
374  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); }
375  template <typename Packet>
376  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
377 };
378 template<typename Scalar>
379 struct functor_traits<scalar_acos_op<Scalar> >
380 {
381  enum {
382  Cost = 5 * NumTraits<Scalar>::MulCost,
383  PacketAccess = packet_traits<Scalar>::HasACos
384  };
385 };
386 
391 template<typename Scalar> struct scalar_asin_op {
392  EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
393  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); }
394  template <typename Packet>
395  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
396 };
397 template<typename Scalar>
398 struct functor_traits<scalar_asin_op<Scalar> >
399 {
400  enum {
401  Cost = 5 * NumTraits<Scalar>::MulCost,
402  PacketAccess = packet_traits<Scalar>::HasASin
403  };
404 };
405 
406 
412 template<typename Scalar> struct scalar_lgamma_op {
413  EIGEN_EMPTY_STRUCT_CTOR(scalar_lgamma_op)
414  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
415  using numext::lgamma; return lgamma(a);
416  }
417  typedef typename packet_traits<Scalar>::type Packet;
418  inline Packet packetOp(const Packet& a) const { return internal::plgamma(a); }
419 };
420 template<typename Scalar>
421 struct functor_traits<scalar_lgamma_op<Scalar> >
422 {
423  enum {
424  // Guesstimate
425  Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
426  PacketAccess = packet_traits<Scalar>::HasLGamma
427  };
428 };
429 
435 template<typename Scalar> struct scalar_erf_op {
436  EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_op)
437  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
438  using numext::erf; return erf(a);
439  }
440  typedef typename packet_traits<Scalar>::type Packet;
441  inline Packet packetOp(const Packet& a) const { return internal::perf(a); }
442 };
443 template<typename Scalar>
444 struct functor_traits<scalar_erf_op<Scalar> >
445 {
446  enum {
447  // Guesstimate
448  Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
449  PacketAccess = packet_traits<Scalar>::HasErf
450  };
451 };
452 
458 template<typename Scalar> struct scalar_erfc_op {
459  EIGEN_EMPTY_STRUCT_CTOR(scalar_erfc_op)
460  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
461  using numext::erfc; return erfc(a);
462  }
463  typedef typename packet_traits<Scalar>::type Packet;
464  inline Packet packetOp(const Packet& a) const { return internal::perfc(a); }
465 };
466 template<typename Scalar>
467 struct functor_traits<scalar_erfc_op<Scalar> >
468 {
469  enum {
470  // Guesstimate
471  Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
472  PacketAccess = packet_traits<Scalar>::HasErfc
473  };
474 };
475 
476 
481 template<typename Scalar> struct scalar_atan_op {
482  EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
483  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::atan; return atan(a); }
484  template <typename Packet>
485  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::patan(a); }
486 };
487 template<typename Scalar>
488 struct functor_traits<scalar_atan_op<Scalar> >
489 {
490  enum {
491  Cost = 5 * NumTraits<Scalar>::MulCost,
492  PacketAccess = packet_traits<Scalar>::HasATan
493  };
494 };
495 
496 
501 template<typename Scalar> struct scalar_tanh_op {
502  EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
503  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tanh; return tanh(a); }
504  template <typename Packet>
505  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptanh(a); }
506 };
507 template<typename Scalar>
508 struct functor_traits<scalar_tanh_op<Scalar> >
509 {
510  enum {
511  Cost = 5 * NumTraits<Scalar>::MulCost,
512  PacketAccess = packet_traits<Scalar>::HasTanh
513  };
514 };
515 
520 template<typename Scalar> struct scalar_sinh_op {
521  EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
522  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::sinh; return sinh(a); }
523  template <typename Packet>
524  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); }
525 };
526 template<typename Scalar>
527 struct functor_traits<scalar_sinh_op<Scalar> >
528 {
529  enum {
530  Cost = 5 * NumTraits<Scalar>::MulCost,
531  PacketAccess = packet_traits<Scalar>::HasSinh
532  };
533 };
534 
539 template<typename Scalar> struct scalar_cosh_op {
540  EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
541  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::cosh; return cosh(a); }
542  template <typename Packet>
543  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); }
544 };
545 template<typename Scalar>
546 struct functor_traits<scalar_cosh_op<Scalar> >
547 {
548  enum {
549  Cost = 5 * NumTraits<Scalar>::MulCost,
550  PacketAccess = packet_traits<Scalar>::HasCosh
551  };
552 };
553 
558 template<typename Scalar>
559 struct scalar_inverse_op {
560  EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
561  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
562  template<typename Packet>
563  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
564  { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
565 };
566 template<typename Scalar>
567 struct functor_traits<scalar_inverse_op<Scalar> >
568 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
569 
574 template<typename Scalar>
575 struct scalar_square_op {
576  EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
577  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; }
578  template<typename Packet>
579  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
580  { return internal::pmul(a,a); }
581 };
582 template<typename Scalar>
583 struct functor_traits<scalar_square_op<Scalar> >
584 { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
585 
590 template<typename Scalar>
591 struct scalar_cube_op {
592  EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
593  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; }
594  template<typename Packet>
595  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
596  { return internal::pmul(a,pmul(a,a)); }
597 };
598 template<typename Scalar>
599 struct functor_traits<scalar_cube_op<Scalar> >
600 { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
601 
606 template<typename Scalar> struct scalar_round_op {
607  EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
608  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); }
609  template <typename Packet>
610  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); }
611 };
612 template<typename Scalar>
613 struct functor_traits<scalar_round_op<Scalar> >
614 {
615  enum {
616  Cost = NumTraits<Scalar>::MulCost,
617  PacketAccess = packet_traits<Scalar>::HasRound
618  };
619 };
620 
625 template<typename Scalar> struct scalar_floor_op {
626  EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
627  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(a); }
628  template <typename Packet>
629  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); }
630 };
631 template<typename Scalar>
632 struct functor_traits<scalar_floor_op<Scalar> >
633 {
634  enum {
635  Cost = NumTraits<Scalar>::MulCost,
636  PacketAccess = packet_traits<Scalar>::HasFloor
637  };
638 };
639 
644 template<typename Scalar> struct scalar_ceil_op {
645  EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
646  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(a); }
647  typedef typename packet_traits<Scalar>::type Packet;
648  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); }
649 };
650 template<typename Scalar>
651 struct functor_traits<scalar_ceil_op<Scalar> >
652 {
653  enum {
654  Cost = NumTraits<Scalar>::MulCost,
655  PacketAccess = packet_traits<Scalar>::HasCeil
656  };
657 };
658 
663 template<typename Scalar> struct scalar_isnan_op {
664  EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
665  typedef bool result_type;
666  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isnan)(a); }
667 };
668 template<typename Scalar>
669 struct functor_traits<scalar_isnan_op<Scalar> >
670 {
671  enum {
672  Cost = NumTraits<Scalar>::MulCost,
673  PacketAccess = false
674  };
675 };
676 
681 template<typename Scalar> struct scalar_isinf_op {
682  EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
683  typedef bool result_type;
684  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isinf)(a); }
685 };
686 template<typename Scalar>
687 struct functor_traits<scalar_isinf_op<Scalar> >
688 {
689  enum {
690  Cost = NumTraits<Scalar>::MulCost,
691  PacketAccess = false
692  };
693 };
694 
699 template<typename Scalar> struct scalar_isfinite_op {
700  EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
701  typedef bool result_type;
702  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isfinite)(a); }
703 };
704 template<typename Scalar>
705 struct functor_traits<scalar_isfinite_op<Scalar> >
706 {
707  enum {
708  Cost = NumTraits<Scalar>::MulCost,
709  PacketAccess = false
710  };
711 };
712 
718 template<typename Scalar> struct scalar_boolean_not_op {
719  EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
720  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; }
721 };
722 template<typename Scalar>
723 struct functor_traits<scalar_boolean_not_op<Scalar> > {
724  enum {
725  Cost = NumTraits<bool>::AddCost,
726  PacketAccess = false
727  };
728 };
729 
734 template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) > struct scalar_sign_op;
735 template<typename Scalar>
736 struct scalar_sign_op<Scalar,false> {
737  EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
738  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
739  {
740  return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
741  }
742  //TODO
743  //template <typename Packet>
744  //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
745 };
746 template<typename Scalar>
747 struct scalar_sign_op<Scalar,true> {
748  EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
749  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
750  {
751  using std::abs;
752  typedef typename NumTraits<Scalar>::Real real_type;
753  real_type aa = abs(a);
754  if (aa==0)
755  return Scalar(0);
756  aa = 1./aa;
757  return Scalar(real(a)*aa, imag(a)*aa );
758  }
759  //TODO
760  //template <typename Packet>
761  //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
762 };
763 template<typename Scalar>
764 struct functor_traits<scalar_sign_op<Scalar> >
765 { enum {
766  Cost =
767  NumTraits<Scalar>::IsComplex
768  ? ( 8*NumTraits<Scalar>::MulCost ) // roughly
769  : ( 3*NumTraits<Scalar>::AddCost),
770  PacketAccess = packet_traits<Scalar>::HasSign
771  };
772 };
773 
774 } // end namespace internal
775 
776 } // end namespace Eigen
777 
778 #endif // EIGEN_FUNCTORS_H
Definition: LDLT.h:16
Definition: Eigen_Colamd.h:54