random.cpp

00001 //#include "stdafx.h"
00002 #include "random.h"
00003 #include "math.h"
00004 
00005 bool ExtRandom::deviate_available = false;
00006 
00007 double ExtRandom::second_deviate = 0;
00008 
00009 double ExtRandom::uniformRandom()
00010 {
00011         double u;
00012         u = (double)rand() / (double)RAND_MAX;
00013         return u;
00014 }
00015 
00016 double ExtRandom::gaussRandom(double mu, double sd) 
00017 {
00018         // Ref. Numerical Recipes in C - Chapter 7.2: Gaussian Deviates.
00019         if (deviate_available) {
00020                 deviate_available = false;
00021                 return mu + second_deviate * sd;
00022         } else {
00023                 double v1, v2, rsq;
00024                 do {
00025                         v1 = 2.0 * uniformRandom() - 1.0;
00026                         v2 = 2.0 * uniformRandom() - 1.0;
00027                         rsq = v1*v1 + v2*v2;
00028                 } while (rsq >= 1.0 || rsq == 0.0);
00029                 double fac = sqrt(-2.0*log(rsq)/rsq);
00030                 second_deviate = v1 * fac;
00031                 deviate_available = true;
00032                 return mu + v2 * fac * sd;
00033         }
00034 }
00035 
00036 double ExtRandom::expRandom(double lambda) 
00037 {
00038         // Ref. Numerical Recipes in C - Chapter 7.2: Exponential Deviates.
00039         double num;
00040         do
00041         num = uniformRandom();
00042         while (num == 0.0);
00043         return -log(num) / lambda;
00044 }
00045 
00046 double ExtRandom::ComputeGauss(double mu, double sigma, double x)
00047 {
00048         double re;
00049         re = x - mu;
00050         re *= re;
00051         re = -re/(2*sigma*sigma);
00052         re = exp(re);
00053 
00054         re = re/(sigma * sqrt(2*PI));
00055 
00056         return re;
00057 }
00058 
00059 
00060 double ExtRandom::ComputeLnGauss(double mu, double sigma, double v1, double v2, double x)
00061 {
00062         double re;
00063         //double factor;
00064 
00065         if ( x < v1 || x > v2 ) // out of range
00066         {
00067                 return -BigValue;
00068         }
00069 
00070         // factor = GaussianIntegral(mu, sigma,v1,v2);  // normalization factor
00071         //      re =  ComputeGauss(mu,sigma,x);
00072         //      re = re / factor;
00073         re = x - mu;
00074         re *=re;
00075         re = re / (2 * sigma * sigma);
00076 
00077         re = -re;
00078 
00079         //re = - log ( sigma * sqrt(2 * PI)) - re;
00080 
00081         return re;      
00082 }
00083 
00084 double ExtRandom::GaussianIntegral(double mu, double sigma, double v1, double v2)
00085 {
00086         double re = 0;
00087         double x;
00088         double delta;
00089         delta = (v2-v1)/INTEGRALSTEP;
00090         int i;
00091         for ( i = 0; i < INTEGRALSTEP; i++ )
00092         {
00093                 x = v1 + (double)i * delta;
00094                 re = re + ComputeGauss(mu, sigma,x) * delta;
00095         }
00096         return re;
00097 }
00098 
00099 void ExtRandom::GaussianParaLearning(double &mu, double &sigma, double &v1, double &v2, vector<double> Tdata)
00100 {
00101         int NumOfTData = Tdata.size();
00102         int i;
00103         vector<double>::iterator fiter = Tdata.begin();
00104         v1 = Tdata[0];
00105         v2 = Tdata[0];
00106 
00107         mu = 0;
00108         for ( i = 0; i < NumOfTData; i++ )
00109         {
00110                 mu += *(fiter+i);
00111                 if ( v1 > Tdata[i] )
00112                 {
00113                         v1 = Tdata[i];
00114                 }
00115 
00116                 if ( v2 < Tdata[i] )
00117                 {
00118                         v2 = Tdata[i];
00119                 }
00120         }
00121         mu /= NumOfTData;
00122 
00123         sigma = 0;
00124         for ( i = 0; i < NumOfTData; i++ )
00125         {
00126                 sigma += pow(*(fiter+i)-mu, 2);
00127         }
00128         sigma /= (double)(NumOfTData-1);
00129         sigma = sqrt(sigma);
00130 }

Generated on Sun Jun 7 11:55:21 2009 for Alchemy by  doxygen 1.5.1