|
Go to the documentation of this file. 1 #ifndef NPSTAT_SIMPLEFUNCTORS_HH_
2 #define NPSTAT_SIMPLEFUNCTORS_HH_
22 #include "npstat/nm/lapack_double.h"
26 template < typename Result>
29 typedef Result result_type;
32 virtual Result operator()() const = 0;
36 template < typename Result>
42 inline virtual Result operator()() const { return ref_();}
49 template < typename Result>
56 template < typename Result, typename Arg1>
59 typedef Result result_type;
60 typedef Arg1 first_argument_type;
63 virtual Result operator()( const Arg1&) const = 0;
67 template < typename Result, typename Arg1>
73 inline virtual Result operator()( const Arg1& x1) const { return ref_(x1);}
80 template < typename Result, typename Arg1>
87 template < typename Result, typename Arg1, typename Arg2>
90 typedef Result result_type;
91 typedef Arg1 first_argument_type;
92 typedef Arg2 second_argument_type;
95 virtual Result operator()( const Arg1&, const Arg2&) const = 0;
99 template < typename Result, typename Arg1, typename Arg2>
105 inline virtual Result operator()( const Arg1& x1, const Arg2& x2) const
106 { return ref_(x1, x2);}
113 template < typename Result, typename Arg1, typename Arg2>
121 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
124 typedef Result result_type;
125 typedef Arg1 first_argument_type;
126 typedef Arg2 second_argument_type;
127 typedef Arg3 third_argument_type;
130 virtual Result operator()( const Arg1&, const Arg2&, const Arg3&) const=0;
134 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
140 inline virtual Result operator()( const Arg1& x1, const Arg2& x2, const Arg3& x3) const
141 { return ref_(x1, x2, x3);}
148 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
156 template < typename Numeric>
159 typedef std::pair<Numeric,Numeric> result_type;
160 typedef Numeric first_argument_type;
163 virtual std::pair<Numeric,Numeric> operator()( const Numeric&) const=0;
167 template < typename Numeric>
173 inline virtual std::pair<Numeric,Numeric> operator()( const Numeric& c) const
181 template < typename Numeric>
189 template < typename Result>
192 inline virtual ~ Same() {}
194 inline Result operator()( const Result& a) const { return a;}
196 inline bool operator==( const Same&) const { return true;}
197 inline bool operator!=( const Same&) const { return false;}
201 template < typename Result>
205 inline Shift( const Result& v) : value_(v) {}
206 inline virtual ~ Shift() {}
208 inline Result operator()( const Result& a) const { return a + value_;}
210 inline bool operator==( const Shift& r) const
211 { return value_ == r.value_;}
212 inline bool operator!=( const Shift& r) const
213 { return !(* this == r);}
221 template < typename Result>
226 inline const Result& operator()( const Result& a) const { return a;}
228 inline bool operator==( const SameRef&) const { return true;}
229 inline bool operator!=( const SameRef&) const { return false;}
236 template < typename Result>
241 inline Result operator()() const { return Result();}
251 template < typename Result, typename Arg1>
256 inline Result operator()( const Arg1&) const { return Result();}
266 template < typename Result, typename Arg1, typename Arg2>
271 inline Result operator()( const Arg1&, const Arg2&) const
282 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
287 inline Result operator()( const Arg1&, const Arg2&, const Arg3&) const
295 template < typename Result>
302 inline Result operator()() const { return value_;}
305 { return value_ == r.value_;}
307 { return !(* this == r);}
315 template < typename Result, typename Arg1>
322 inline Result operator()( const Arg1&) const { return value_;}
325 { return value_ == r.value_;}
327 { return !(* this == r);}
335 template < typename Result, typename Arg1, typename Arg2>
342 inline Result operator()( const Arg1&, const Arg2&) const
346 { return value_ == r.value_;}
348 { return !(* this == r);}
356 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
363 inline Result operator()( const Arg1&, const Arg2&, const Arg3&) const
367 { return value_ == r.value_;}
369 { return !(* this == r);}
380 template < typename Result, typename Arg1, typename CastType>
385 inline Result operator()( const Arg1& a) const
386 { return Result( static_cast<CastType >(a));}
398 template < typename Result>
401 inline explicit FcnFunctor0(Result (*fcn)()) : fcn_(fcn) {}
404 inline Result operator()() const { return fcn_();}
407 { return fcn_ == r.fcn_;}
409 { return !(* this == r);}
420 template < typename Result, typename Arg1>
423 inline explicit FcnFunctor1(Result (*fcn)(Arg1)) : fcn_(fcn) {}
426 inline Result operator()( const Arg1& a) const { return fcn_(a);}
429 { return fcn_ == r.fcn_;}
431 { return !(* this == r);}
435 Result (*fcn_)(Arg1);
442 template < typename Result, typename Arg1, typename Arg2>
445 inline explicit FcnFunctor2(Result (*fcn)(Arg1, Arg2)) : fcn_(fcn) {}
448 inline Result operator()( const Arg1& x, const Arg2& y) const
452 { return fcn_ == r.fcn_;}
454 { return !(* this == r);}
458 Result (*fcn_)(Arg1, Arg2);
465 template < typename Result, typename Arg1, typename Arg2, typename Arg3>
468 inline explicit FcnFunctor3(Result (*fcn)(Arg1,Arg2,Arg3)):fcn_(fcn) {}
471 inline Result operator()( const Arg1&x, const Arg2&y, const Arg3&z) const
472 { return fcn_(x, y, z);}
475 { return fcn_ == r.fcn_;}
477 { return !(* this == r);}
481 Result (*fcn_)(Arg1, Arg2, Arg3);
485 typename Result1, typename Arg1,
486 typename Result2, typename Arg2,
494 : f1_(f1), f2_(f2), op_(op) {}
498 inline virtual Result1 operator()( const Arg1& x) const
500 return op_(f1_(x), static_cast<Result1 >(f2_( static_cast<Arg2 >(x))));
517 typename Result1, typename Arg1,
518 typename Result2, typename Arg2,
519 template< typename> class Operator
524 const Operator<Result1>& op)
533 template < class Container, class Result = typename Container::value_type>
536 inline explicit Element1D( const unsigned long index) : idx(index) {}
539 inline Result operator()( const Container& c) const { return c[idx];}
541 inline bool operator==( const Element1D& r) const
542 { return idx == r.idx;}
543 inline bool operator!=( const Element1D& r) const
544 { return !(* this == r);}
555 template < class Container, class Result = typename Container::value_type>
558 inline explicit Element1DAt( const unsigned long index) : idx(index) {}
561 inline Result operator()( const Container& c) const { return c.at(idx);}
564 { return idx == r.idx;}
566 { return !(* this == r);}
577 template < typename T1, typename T2>
580 inline T1& operator()(T1& left, const T2& right) const
581 { return left = right;}
588 template < typename T1, typename T2>
591 inline T2& operator()( const T1& left, T2& right) const
592 { return right = left;}
596 template < typename T1, typename T2>
599 inline T1& operator()(T1& left, const T2& right) const
600 { return left += right;}
604 template < typename T1, typename T2>
607 inline T2& operator()( const T1& left, T2& right) const
608 { return right += left;}
615 template < typename T1, typename T2>
618 inline explicit addmul_left( const double weight) : w_(weight) {}
620 inline T1& operator()(T1& left, const T2& right) const
621 { return left += w_*right;}
632 template < typename T1, typename T2>
635 inline explicit addmul_right( const double weight) : w_(weight) {}
637 inline T1& operator()(T1& left, const T2& right) const
638 { return right += w_*left;}
646 template < typename T1, typename T2>
649 inline T1& operator()(T1& left, const T2& right) const
650 { return left -= right;}
654 template < typename T1, typename T2>
657 inline T2& operator()( const T1& left, T2& right) const
658 { return right -= left;}
662 template < typename T1, typename T2>
665 inline T1& operator()(T1& left, const T2& right) const
666 { return left *= right;}
670 template < typename T1, typename T2>
673 inline T2& operator()( const T1& left, T2& right) const
674 { return right *= left;}
678 template < typename T1, typename T2>
681 inline T1& operator()(T1& left, const T2& right) const
682 { return left /= right;}
686 template < typename T1, typename T2>
689 inline T2& operator()( const T1& left, T2& right) const
690 { return right /= left;}
694 template < typename T1, typename T2>
698 C(T1()), leftZero(T1()), rightZero(T2()) {}
700 C(value), leftZero(T1()), rightZero(T2()) {}
702 inline T1& operator()(T1& left, const T2& right) const
704 if (right == rightZero)
705 if (left == leftZero)
710 return left /= right;
720 template < typename T1, typename T2>
724 C(T2()), leftZero(T1()), rightZero(T2()) {}
726 C(value), leftZero(T1()), rightZero(T2()) {}
728 inline T2& operator()( const T1& left, T2& right) const
730 if (left == leftZero)
731 if (right == rightZero)
736 return right /= left;
746 template < typename T1, typename T2, typename T3=T1>
749 inline T1& operator()(T1& left, const T2& right) const
750 { return left = static_cast<T3 >(right);}
754 template < typename T1, typename T2, typename T3=T2>
757 inline T2& operator()( const T1& left, T2& right) const
758 { return right = static_cast<T3 >(left);}
762 template < typename T1, typename T2, typename T3=T1>
765 inline T1& operator()(T1& left, const T2& right) const
766 { return left += static_cast<T3 >(right);}
770 template < typename T1, typename T2, typename T3=T2>
773 inline T2& operator()( const T1& left, T2& right) const
774 { return right += static_cast<T3 >(left);}
778 template < typename T1, typename T2, typename T3=T1>
781 inline T1& operator()(T1& left, const T2& right) const
782 { return left -= static_cast<T3 >(right);}
786 template < typename T1, typename T2, typename T3=T2>
789 inline T2& operator()( const T1& left, T2& right) const
790 { return right -= static_cast<T3 >(left);}
794 template < typename T1>
799 inline virtual T1 operator()( const T1& x) const
801 static const T1 zero = static_cast<T1 >(0);
803 if (!(x >= zero)) throw std::domain_error(
804 "In npstat::SquareRoot::operator(): "
805 "argument must be non-negative");
811 template < typename T1>
816 inline virtual T1 operator()( const T1& x) const
818 static const T1 zero = static_cast<T1 >(0);
819 static const T1 one = static_cast<T1 >(1);
821 if (!(x > zero)) throw std::domain_error(
822 "In npstat::InverseSquareRoot::operator(): "
823 "argument must be positive");
824 return one/std::sqrt(x);
829 template < class F1, class F2>
834 : f1_(f1), f2_(f2) {}
838 inline virtual double operator()( const double& x) const
840 const double delta = f1_(x) - f2_(x);
849 template < class F1, class F2>
851 DeltaSquaredFcn( const F1& f1, const F2& f2)
857 template < class Poly>
862 const double* coeffs,
863 const unsigned maxdeg)
864 : poly_(poly), coeffs_(coeffs), maxdeg_(maxdeg) {}
868 inline virtual double operator()( const double& x) const
869 { return poly_.series(coeffs_, maxdeg_, x);}
873 const double* coeffs_;
877 template < class Poly>
879 SeriesFcn( const Poly& poly, const double* coeffs, const unsigned maxdeg)
888 template < class Poly, class Functor>
894 const Poly& poly, const Functor& fcn,
895 const double* coeffs, const unsigned maxdeg)
896 : poly_(poly), fcn_(fcn), coeffs_(coeffs), maxdeg_(maxdeg) {}
900 inline virtual double operator()( const double& x) const
902 const double delta = poly_.series(coeffs_, maxdeg_, x) - fcn_(x);
909 const double* coeffs_;
918 template < class Functor>
923 : fcn_(fcn), power_(power) {}
927 inline virtual double operator()( const double& x) const
931 const double tmp = fcn_(x);
934 else if (power_ == 2.0)
936 else if (power_ == -1.0)
945 return std::pow(tmp, power_);
958 template < class Functor>
960 const Functor& fcn, const double power)
969 template < class Functor>
974 : fcn_(fcn), power_(power) {}
978 inline virtual double operator()( const double& x) const
987 template < class Functor>
989 const Functor& fcn, const double power)
995 template < typename Result, typename Arg1>
1000 const Result& factor)
1001 : fcn_(fcn), factor_(factor) {}
1005 inline virtual double operator()( const Arg1& x) const
1006 { return factor_*fcn_(x);}
1014 template < typename Result, typename Arg1, typename Numeric>
Definition: SimpleFunctors.hh:297
Definition: SimpleFunctors.hh:317
Definition: SimpleFunctors.hh:337
Definition: SimpleFunctors.hh:358
Definition: SimpleFunctors.hh:831
Definition: SimpleFunctors.hh:890
Definition: SimpleFunctors.hh:38
Definition: SimpleFunctors.hh:69
Definition: SimpleFunctors.hh:101
Definition: SimpleFunctors.hh:136
Definition: SimpleFunctors.hh:971
Definition: SimpleFunctors.hh:920
Definition: SimpleFunctors.hh:997
Definition: SimpleFunctors.hh:169
Definition: SimpleFunctors.hh:859
Definition: SimpleFunctors.hh:203
Definition: AbsArrayProjector.hh:14
MultiplyByConstHelper< Result, Arg1 > MultiplyByConst(const Functor1< Result, Arg1 > &fcn, const Numeric &factor) Definition: SimpleFunctors.hh:1015
Functor3RefHelper< Result, Arg1, Arg2, Arg3 > Functor3Ref(const Functor3< Result, Arg1, Arg2, Arg3 > &ref) Definition: SimpleFunctors.hh:149
Functor1RefHelper< Result, Arg1 > Functor1Ref(const Functor1< Result, Arg1 > &ref) Definition: SimpleFunctors.hh:81
Functor2RefHelper< Result, Arg1, Arg2 > Functor2Ref(const Functor2< Result, Arg1, Arg2 > &ref) Definition: SimpleFunctors.hh:114
PairFunctorRefHelper< Numeric > PairFunctorRef(const PairFunctor< Numeric > &ref) Definition: SimpleFunctors.hh:182
FunctorPowerFcnHelper< Functor > FunctorPowerFcn(const Functor &fcn, const double power) Definition: SimpleFunctors.hh:959
FunctorPowerFcnCpHelper< Functor > FunctorPowerFcnCp(const Functor &fcn, const double power) Definition: SimpleFunctors.hh:988
ComboFunctor1Helper< Result1, Arg1, Result2, Arg2, Operator< Result1 > > ComboFunctor1(const Functor1< Result1, Arg1 > &f1, const Functor1< Result2, Arg2 > &f2, const Operator< Result1 > &op) Definition: SimpleFunctors.hh:522
Functor0RefHelper< Result > Functor0Ref(const Functor0< Result > &ref) Definition: SimpleFunctors.hh:50
Definition: SimpleFunctors.hh:382
Definition: SimpleFunctors.hh:490
Definition: SimpleFunctors.hh:238
Definition: SimpleFunctors.hh:253
Definition: SimpleFunctors.hh:268
Definition: SimpleFunctors.hh:284
Definition: SimpleFunctors.hh:557
Definition: SimpleFunctors.hh:535
Definition: SimpleFunctors.hh:400
Definition: SimpleFunctors.hh:422
Definition: SimpleFunctors.hh:444
Definition: SimpleFunctors.hh:467
Definition: SimpleFunctors.hh:28
Definition: SimpleFunctors.hh:58
Definition: SimpleFunctors.hh:89
Definition: SimpleFunctors.hh:123
Definition: SimpleFunctors.hh:813
Definition: SimpleFunctors.hh:158
Definition: SimpleFunctors.hh:223
Definition: SimpleFunctors.hh:191
Definition: SimpleFunctors.hh:796
Definition: SimpleFunctors.hh:617
Definition: SimpleFunctors.hh:634
Definition: SimpleFunctors.hh:579
Definition: SimpleFunctors.hh:590
Definition: SimpleFunctors.hh:696
Definition: SimpleFunctors.hh:680
Definition: SimpleFunctors.hh:722
Definition: SimpleFunctors.hh:688
Definition: SimpleFunctors.hh:648
Definition: SimpleFunctors.hh:656
Definition: SimpleFunctors.hh:664
Definition: SimpleFunctors.hh:672
Definition: SimpleFunctors.hh:598
Definition: SimpleFunctors.hh:606
Definition: SimpleFunctors.hh:748
Definition: SimpleFunctors.hh:756
Definition: SimpleFunctors.hh:780
Definition: SimpleFunctors.hh:788
Definition: SimpleFunctors.hh:764
Definition: SimpleFunctors.hh:772
|