00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __CRIT_HPP__
00025 #define __CRIT_HPP__
00026
00035 #include <utility>
00036 #include <limits>
00037
00038 namespace Sequence
00039 {
00043 struct upperCrit
00048 {
00049 template<typename BwdIter>
00050 inline typename std::pair< BwdIter, double >
00051 operator()(BwdIter beg, BwdIter end, double alpha = 0.95)
00058 {
00059 BwdIter i,j,crit;
00060 crit=end;
00061 double new_alpha=0.;
00062 double temp=0.;
00063
00064 i=beg;
00065 j=end;
00066 unsigned n = 0;
00067 while(i != j)
00068 {
00069 ++n;
00070 ++i;
00071 }
00072 i=end-1;
00073 j=end-1;
00074 unsigned prob = 0;
00075 while (i != beg)
00076 {
00077 BwdIter k = i;
00078 --k;
00079 while( *i==*k && i != beg && k !=beg)
00080 {
00081 --i;
00082 --k;
00083 }
00084 if(i==beg)
00085 break;
00086
00087 while( (*j>*i) && j != beg)
00088 {
00089 ++prob;
00090 --j;
00091 }
00092
00093 temp=(double)prob/(double)n;
00094
00095 if(1.-temp>=alpha+std::numeric_limits<double>::epsilon())
00096 {
00097 new_alpha=1.-temp;
00098 crit=i--;
00099 }
00100 else
00101 i = beg;
00102 }
00103 return ( std::pair< BwdIter, double >( crit, new_alpha ) );
00104 }
00105 };
00106
00110 struct lowerCrit
00115 {
00116 public:
00117 template<typename FwdIter>
00118 inline typename std::pair< FwdIter, double >
00119 operator() (FwdIter beg, FwdIter end, double alpha = 0.05)
00126 {
00127 FwdIter i,j,crit;
00128 crit=end;
00129
00130 double new_alpha=0.;
00131 double temp=0.;
00132
00133 i=beg;
00134 j=end;
00135 unsigned n = 0;
00136 while(i != j )
00137 {
00138 ++n;
00139 ++i;
00140 }
00141 i=beg;
00142 j=beg;
00143
00144 unsigned prob = 0;
00145 while (i != end)
00146 {
00147 FwdIter k = i;
00148 ++k;
00149 while( *i==*k && i != end && k != end)
00150 {
00151 ++i;
00152 ++k;
00153 }
00154 if(i==end)
00155 break;
00156
00157 while( *j<*i && j != end)
00158 {
00159 ++prob;
00160 ++j;
00161 }
00162
00163 temp=(double)prob/(double)n;
00164
00165 if(temp<=alpha-std::numeric_limits<double>::epsilon())
00166 {
00167 new_alpha=temp;
00168 crit=i++;
00169 }
00170 else
00171 i=end;
00172 }
00173 return std::pair<FwdIter,double>(crit,new_alpha);
00174 }
00175 };
00176
00177 }
00178 #endif