00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef INDRI_NORMALDISTRIBUTION_HPP
00020 #define INDRI_NORMALDISTRIBUTION_HPP
00021
00022
00023
00024
00025
00026 namespace indri
00027 {
00028 namespace query
00029 {
00030
00031 class NormalDistribution {
00032 private:
00033 double _mu;
00034 double _sigma;
00035
00036 double _cdf( double x ) {
00037 const double a_1 = 0.4361836;
00038 const double a_2 = -0.1201676;
00039 const double a_3 = 0.9372980;
00040 const double p = 0.33267;
00041 const double pi = 3.1415926535;
00042
00043 double t = 1./(1.+p*x);
00044 double zx = ( 1. / sqrt(2*pi*_sigma) ) * exp( pow( -((x-_mu)/_sigma), 2 ) );
00045
00046 double cdf = 1 - zx * ( a_1*t + a_2*pow(t,2) + a_3*pow(t,3) );
00047 return cdf;
00048 }
00049
00050 public:
00051 NormalDistribution( double mu, double sigma ) {
00052 _mu = mu;
00053 _sigma = sigma;
00054 }
00055
00056
00057
00058
00059 double operator () ( INT64 value ) {
00060
00061 double low = _cdf( value-0.5 );
00062 double high = _cdf( value+0.5 );
00063 return high - low;
00064 }
00065 };
00066 }
00067 }
00068
00069 #endif // INDRI_NORMALDISTRIBUTION_HPP
00070