MathFunctions.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Util/MathFunctions.H"
00039 #include "Util/log.H"
00040 #include <cmath>
00041 #include <sys/types.h>
00042 #include <unistd.h>
00043
00044
00045 bool isFinite(const byte& arg) { return true; }
00046 bool isFinite(const int16& arg) { return true; }
00047 bool isFinite(const int32& arg) { return true; }
00048
00049 #if !defined(MISSING_ISINF)
00050 bool isFinite(const float& arg) { return !isinf(arg); }
00051 bool isFinite(const double& arg) { return !isinf(arg); }
00052 #elif defined(HAVE_STD_ISFINITE)
00053 bool isFinite(const float& arg) { return std::isfinite(arg); }
00054 bool isFinite(const double& arg) { return std::isfinite(arg); }
00055 #elif defined(HAVE_ISFINITE)
00056 bool isFinite(const float& arg) { return isfinite(arg); }
00057 bool isFinite(const double& arg) { return isfinite(arg); }
00058 #elif defined(HAVE___ISFINITEF)
00059
00060 bool isFinite(const float& arg) { return __isfinitef(arg); }
00061 bool isFinite(const double& arg) { return __isfinited(arg); }
00062 #else
00063 bool isFinite(const float& arg) { return true; }
00064 bool isFinite(const double& arg) { return true; }
00065 #endif
00066
00067
00068 void initRandomNumbers()
00069 {
00070 #ifdef HAVE_SRAND48
00071 srand48(time(0) + getpid() * 123);
00072 #endif
00073 srand(time(0) + getpid() * 345);
00074 }
00075
00076
00077 void initRandomNumbersZero()
00078 {
00079 #ifdef HAVE_SRAND48
00080 srand48(0);
00081 #endif
00082 srand(0);
00083 }
00084
00085
00086 double randomDouble()
00087 {
00088 #ifdef HAVE_SRAND48
00089 return drand48();
00090 #else
00091 return double(rand()) / (double(RAND_MAX) + 1.0);
00092 #endif
00093 }
00094
00095
00096 double randomDoubleFromNormal(const double s)
00097 {
00098 double sum = 0;
00099 for(int i=0; i<12; i++){
00100 sum += randomDouble()*2*s - s;
00101 }
00102 return sum/2;
00103 }
00104
00105
00106 int randomUpToIncluding(const int n)
00107 {
00108 return randomUpToNotIncluding(n + 1);
00109 }
00110
00111
00112 int randomUpToNotIncluding(const int n)
00113 {
00114
00115
00116
00117 const int result = int(randomDouble() * n);
00118
00119
00120
00121
00122
00123 if (result == n)
00124 return n-1;
00125
00126 return result;
00127 }
00128
00129
00130 double ran2 (int& idum)
00131 {
00132 const int IM1 = 2147483563, IM2 = 2147483399;
00133 const double AM = (1.0/IM1);
00134 const int IMM1 = IM1-1;
00135 const int IA1 = 40014, IA2 = 40692, IQ1 = 53668, IQ2 = 52774;
00136 const int IR1 = 12211, IR2 = 3791, NTAB = 32;
00137 const int NDIV = 1+IMM1/NTAB;
00138 const double EPS = 3.0e-16, RNMX = 1.0-EPS;
00139
00140 int j, k;
00141 static int idum2 = 123456789, iy = 0;
00142 static int iv[NTAB];
00143 double temp;
00144
00145 if (idum <= 0) {
00146 idum = (idum == 0 ? 1 : -idum);
00147 idum2=idum;
00148 for (j=NTAB+7;j>=0;j--) {
00149 k=idum/IQ1;
00150 idum=IA1*(idum-k*IQ1)-k*IR1;
00151 if (idum < 0) idum += IM1;
00152 if (j < NTAB) iv[j] = idum;
00153 }
00154 iy=iv[0];
00155 }
00156 k=idum/IQ1;
00157 idum=IA1*(idum-k*IQ1)-k*IR1;
00158
00159 if (idum < 0) idum += IM1;
00160 k=idum2/IQ2;
00161 idum2=IA2*(idum2-k*IQ2)-k*IR2;
00162 if (idum2 < 0) idum2 += IM2;
00163 j=iy/NDIV;
00164 iy=iv[j]-idum2;
00165 iv[j] = idum;
00166 if (iy < 1) iy += IMM1;
00167 if ((temp=AM*iy) > RNMX) return RNMX;
00168 else return temp;
00169 }
00170
00171
00172 int getIdum(const bool useRandom)
00173 {
00174 if (useRandom)
00175 return -(time(NULL) + 17 * getpid());
00176 else
00177 return -123456;
00178 }
00179
00180
00181 double gasdev (int& idum) {
00182 static int iset = 0;
00183 static double gset;
00184
00185 double fac, rsq, v1, v2;
00186 if (idum < 0) iset = 0;
00187 if (iset == 0) {
00188 do {
00189 v1 = 2.0*ran2(idum)-1.0;
00190 v2 = 2.0*ran2(idum)-1.0;
00191 rsq = v1*v1 + v2*v2;
00192 } while (rsq >= 1.0 || rsq == 0.0);
00193
00194 fac = std::sqrt(-2.0*std::log(rsq)/rsq);
00195 gset = v1*fac; iset = 1;
00196 return v2*fac;
00197 } else {
00198 iset = 0;
00199 return gset;
00200 }
00201 }
00202
00203
00204 double expdev(int& idum)
00205 {
00206 double dum;
00207 do dum = ran2(idum); while (dum == 0.0);
00208 return -log(dum);
00209 }
00210
00211
00212
00213
00214
00215 double lngamma(double x)
00216 {
00217
00218 #ifdef HAVE_LGAMMA
00219 return lgamma(x);
00220 #else
00221
00222
00223
00224 static const double lanczos_7_c[9] = {
00225 0.99999999999980993227684700473478,
00226 676.520368121885098567009190444019,
00227 -1259.13921672240287047156078755283,
00228 771.3234287776530788486528258894,
00229 -176.61502916214059906584551354,
00230 12.507343278686904814458936853,
00231 -0.13857109526572011689554707,
00232 9.984369578019570859563e-6,
00233 1.50563273514931155834e-7
00234 };
00235
00236 x -= 1.0;
00237
00238 double Ag = lanczos_7_c[0];
00239 for (int k = 1; k <= 8; k++) { Ag += lanczos_7_c[k] / (x+k); }
00240
00241
00242 const double term1 = (x + 0.5) * log((x + 7.5) / M_E);
00243 const double term2 = D_LOG_SQRT_2_PI + log(Ag);
00244 return term1 + (term2 - 7.0);
00245 #endif
00246 }
00247
00248
00249
00250 double poisson(const unsigned int k, const double mu)
00251 {
00252 double lf = lngamma(k+1);
00253 return exp(log(mu) * k - lf - mu);
00254 }
00255
00256
00257
00258
00259 double AUC(const float* model, const float* rand,
00260 size_t sm, size_t sr,
00261 const double step)
00262 {
00263
00264
00265
00266
00267 double auc = 0.0;
00268 double last_tp = 1.0;
00269 double last_fp = 1.0;
00270
00271 for (double thresh = 0.0; thresh <= 1.0+step; thresh+=step)
00272 {
00273 uint tp = 0;
00274 uint fp = 0;
00275 for (size_t jj = 0; jj < sm; ++jj)
00276 if (model[jj] >= thresh)
00277 tp++;
00278
00279 for (size_t jj = 0; jj < sr; ++jj)
00280 if (rand[jj] >= thresh)
00281 fp++;
00282
00283 double fpr = (double)fp/(double)sr;
00284 double tpr = (double)tp/(double)sm;
00285
00286 auc+= ( (last_fp - fpr) * (tpr) ) +
00287 ( 0.5 * (last_fp - fpr) * (last_tp - tpr) );
00288
00289 last_tp = tpr;
00290 last_fp = fpr;
00291 }
00292 return auc;
00293 }
00294
00295 Point2D<float> getEllipseFromCov(const Image<double>& cov)
00296 {
00297 ASSERT(cov.getWidth() == 2 && cov.getHeight() == 2);
00298
00299
00300
00301
00302
00303 double k = 4.605170185988091;
00304
00305
00306 double trace = (cov.getVal(0,0) + cov.getVal(1,1))/2;
00307
00308 double a = cov.getVal(0,0) - trace;
00309 double b = cov.getVal(0,1);
00310
00311 double ab2 = sqrt((a*a) + (b*b));
00312
00313 double l1 = ab2 + trace;
00314 double l2 = -ab2 + trace;
00315
00316 return Point2D<float>(k*sqrt(l1), k*sqrt(l2));
00317
00318 }
00319
00320
00321
00322
00323
00324
00325