|
GAMBIT
v1.5.0-2191-ga4742ac
a Global And Modular Bsm Inference Tool
|
Go to the documentation of this file. 1 #ifndef RANDOM_TOOLS_HPP 2 #define RANDOM_TOOLS_HPP 17 T ** matrix( const int xN, const int yN) 19 T **temp = new T*[xN]; 21 for ( int i = 0; i < xN; i++) 28 T *** matrix( const int xN, const int yN, const int zN) 30 T ***temp = new T**[xN]; 32 for ( int i = 0; i < xN; i++) 35 for ( int j = 0; j < yN; j++) 36 temp[i][j] = new T[zN]; 46 for ( int i = 0; i < xN; i++) 53 T ** matrix( const int xN, const int yN, T in) 55 T **temp = new T*[xN]; 57 for ( int i = 0; i < xN; i++) 60 for ( int j = 0; j < yN; j++) 68 T *** matrix( const int xN, const int yN, const int zN, T in) 70 T ***temp = new T**[xN]; 72 for ( int i = 0; i < xN; i++) 75 for ( int j = 0; j < yN; j++) 77 temp[i][j] = new T[zN]; 78 for ( int k = 0; k < zN; k++) 89 for ( int i = 0; i < xN; i++) 96 T ** matrix( const int xN, const int yN, T **in) 98 T **temp = new T*[xN]; 100 for ( int i = 0; i < xN; i++) 103 for ( int j = 0; j < yN; j++) 104 temp[i][j] = in[i][j]; 110 template < typename T> 111 T *** matrix( const int xN, const int yN, const int zN, T ***in) 113 T ***temp = new T**[xN]; 115 for ( int i = 0; i < xN; i++) 117 temp[i] = new T*[yN]; 118 for ( int j = 0; j < yN; j++) 120 temp[i][j] = new T[zN]; 121 for ( int k = 0; k < zN; k++) 122 temp[i][j][k] = in[i][j][k]; 129 template < typename T> 136 template < typename T> 137 void del(T **temp, int xN) 139 for ( int i = 0; i < xN; i++) 146 template < typename T> 147 void del(T ***temp, int xN, int yN) 149 for ( int i = 0; i < xN; i++) 151 for ( int j = 0; j < yN; j++) 161 inline const T SQ( const T a) { return a*a;} 164 inline const T SQR( const T a) { return a*a;} 178 el = matrix <double> ( num, num); 183 el = matrix <double> ( num, num); 187 for (i = 0; i < num; i++) 188 for (j = 0; j < num; j++) 191 for (i = 0; i < num; i++) 193 for (j = i; j < num; j++) 195 for(sum = el[i][j], k = i - 1; k >= 0; k--) 196 sum -= el[i][k]*el[j][k]; 201 std::cout << "Cholesky failed " << sum << std::endl; 204 el[i][i] = sqrt(sum); 207 el[j][i] = sum/el[i][i]; 210 for (i = 0; i < num; i++) 211 for (j = 0; j < i; j++) 220 for (i = 0; i < num; i++) 222 for (j = 0; j < num; j++) 233 int l = num - min + 1; 234 for (i = 0; i < l; i++) 236 for (j = k+i; j < num; j++) 237 el[i][j] = el[j][i] = 0.0; 241 for (i = 0; i < num; i++) 243 for (j = i; j < num; j++) 245 for(sum = el[i][j], k = i - 1; k >= 0; k--) 246 sum -= el[i][k]*el[j][k]; 251 el[i][i] = sqrt(sum); 254 el[j][i] = sum/el[i][i]; 257 for (i = 0; i < num; i++) 258 for (j = 0; j < i; j++) 284 for (i = 0; i < num; i++) 286 for (j = 0; j < num; j++) 292 for (i = 0; i < num; i++) 294 for (j = i; j < num; j++) 296 for(sum = el[i][j], k = i - 1; k >= 0; k--) 297 sum -= el[i][k]*el[j][k]; 302 el[i][i] = sqrt(sum); 305 el[j][i] = sum/el[i][i]; 308 for (i = 0; i < num; i++) 309 for (j = 0; j < i; j++) 315 bool EnterMat( const std::vector<std::vector<double>> &a) 320 for (i = 0; i < num; i++) 322 for (j = 0; j < num; j++) 328 for (i = 0; i < num; i++) 330 for (j = i; j < num; j++) 332 for(sum = el[i][j], k = i - 1; k >= 0; k--) 333 sum -= el[i][k]*el[j][k]; 338 el[i][i] = sqrt(sum); 341 el[j][i] = sum/el[i][i]; 344 for (i = 0; i < num; i++) 345 for (j = 0; j < i; j++) 353 del <double> ( el, num); 355 el = matrix <double> ( num, num); 362 for(i = 0; i < num; i++) 365 for (j = 0; j <= i; j++) 366 b[i] += el[i][j]*y[j]; 373 double * b = new double[ num]; 374 for(i = 0; i < num; i++) 377 for (j = 0; j <= i; j++) 379 b[i] += el[i][j]*y[j]; 382 for (i = 0; i < num; i++) 394 for (i = 0; i < num; i++) 396 for (sum = b[i], k=i-1; k >=0; k--) 397 sum -= el[i][k]*x[k]; 401 for (i = num-1; i >=0; i--) 403 for (sum = x[i], k=i+1; k< num; k++) 404 sum -= el[k][i]*x[k]; 413 double *x = new double[ num]; 415 for (i = 0; i < num; i++) 417 for (sum = (y[i]-y0[i]), j=0; j < i; j++) 418 sum -= el[i][j]*x[j]; 423 for (i = 0; i < num; i++) 431 double Square( double *y, double *y0, int *map) 435 double *x = new double[ num]; 437 for (i = 0; i < num; i++) 439 for (sum = (y[map[i]]-y0[i]), j=0; j < i; j++) 440 sum -= el[i][j]*x[j]; 445 for (i = 0; i < num; i++) 457 for ( int i = 0; i < num; i++) 458 for ( int j = 0; j <= i; j++) 460 sum = (i == j ? 1.0 : 0.0); 461 for ( int k = i-1; k >= j; k--) 462 sum -= el[i][k]*ainv[j][k]; 463 ainv[j][i] = sum/el[i][i]; 466 for ( int i = num - 1; i >= 0; i--) 467 for ( int j = 0; j <= i; j++) 469 sum = (i < j ? 0.0 : ainv[j][i]); 470 for ( int k = i + 1; k < num; k++) 471 sum -= el[k][i]*ainv[j][k]; 472 ainv[i][j] = ainv[j][i] = sum/el[i][i]; 479 for ( int i = 0; i < num; i++) 485 del <double> ( el, num); 492 unsigned long long int u, v, w; 495 Ran_old( unsigned long long int j) : v(4101842887655102017LL), w(1) 498 v = u; int64(); int64(); 499 w = v; int64(); int64(); 501 inline unsigned long long int int64() 503 u = u * 2862933555777941757LL + 7046029254386353087LL; 504 v ^= v >> 17; v ^= v << 31; v ^= v >> 8; 505 w = 4294957665U*(w & 0xffffffff) + (w >> 32); 506 unsigned long long int x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4; 509 inline double Doub(){ return 5.42101086242752217E-20 * int64();} 510 inline unsigned int int32(){ return ( unsigned int)int64();} 516 Ran( unsigned long long int){} 525 ExponDev( double din, unsigned long long ii) : Ran(ii), beta(din){} 545 NormalDev( double mmu, double ssig, unsigned long long i) : Ran(i), mu(mmu), sig(ssig){} 548 double u, v, x, y, q; 552 v = 1.7156*(Doub() - 0.5); 554 y = fabs(v) + 0.386595; 555 q = x*x + y*(0.19600*y-0.25472*x); 557 while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u)); 572 double u, v, x, y, q; 576 v = 1.7156*(Doub() - 0.5); 578 y = fabs(v) + 0.386595; 579 q = x*x + y*(0.19600*y-0.25472*x); 581 while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u)); 609 spt = matrix <double> (mm); 611 void Dev( double *pt, double *mean) 613 double u, v, x, y, q; 614 for ( int i = 0; i < mm; i++) 619 v = 1.7156*(Doub() - 0.5); 621 y = fabs(v) + 0.386595; 622 q = x*x + y*(0.19600*y-0.25472*x); 624 while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u)); 628 for ( int i = 0; i < mm; i++) 629 pt[i] = f*pt[i] + mean[i]; 631 void Dev( double **cvar, double *pt, double *mean) 633 double u, v, x, y, q; 634 for ( int i = 0; i < mm; i++) 639 v = 1.7156*(Doub() - 0.5); 641 y = fabs(v) + 0.386595; 642 q = x*x + y*(0.19600*y-0.25472*x); 644 while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u)); 649 for ( int i = 0; i < mm; i++) 650 pt[i] = f*pt[i] + mean[i]; 681 for ( int i = 0; i < 2; i++) 686 dist = sqrt(dist/2.0); 694 return -(2.0 - dim)*std::log(r/fac) - r*r/fac/fac/2.0; 702 std::vector<double> vec( num); 704 for (i = 0; i < num; i++) 707 norm += vec[i]*vec[i]; 716 for (i = 0; i < 2; i++) 721 dist = sqrt(dist/2.0); 725 for (i = 0; i < num; i++) 727 pin[i] = fac*dist*pin[i]/norm + p0[i]; 733 void MultiDev( double **cvar, double *pin, double *p0) 740 for (i = 0; i < num; i++) 743 norm += vec[i]*vec[i]; 752 for (i = 0; i < 2; i++) 757 dist = sqrt(dist/2.0); 762 for (i = 0; i < num; i++) 764 pin[i] = fac*dist*pin[i]/norm + p0[i]; 777 for (i = 0; i < num; i++) 780 norm += vec[i]*vec[i]; 784 dist = pow(Doub(), 1.0/num); 787 for (i = 0; i < num; i++) 789 pin[i] = fin*dist*pin[i] + p0[i]; 802 for (i = 0; i < num; i++) 805 norm += vec[i]*vec[i]; 809 dist = pow(Doub(), 1.0/num); 813 for (i = 0; i < num; i++) 815 pin[i] = fin*dist*pin[i] + p0[i]; 832 double sqrtAlim, powAlim, ratioAlim, ratioAlimt; 835 RandomPlane( const int projin, const int nin, const double din, const double alim, const double alimt, unsigned long long iin) : AdvanceDevs(nin, din, iin), proj(projin), alimt(alimt) 837 rotVec = matrix <double> (nin, nin); 839 if (proj > num) proj = num; 841 endVec = currentVec + num - extra; 842 endEndVec = currentVec + num; 843 sEndVec = currentVec + num - proj; 844 sqrtAlim = sqrt(alim); 845 powAlim = pow(alim, 0.5 - proj); 846 double vol1 = 2.0*(sqrt(alim) - 1.0); 847 double vol2 = (1.0 - pow(alim, 0.5 - proj))/(proj - 0.5); 848 ratioAlim = vol1/(vol1 + vol2); 849 ratioAlimt = (alimt - 1.0)/(2.0*alimt + proj - 2.0); 854 if (Doub() <= ratioAlim) 855 return SQ(1.0 + Doub()*(sqrtAlim - 1.0)); 857 return pow(powAlim + Doub()*(1.0 - powAlim), 1.0/(proj - 0.5)); 862 if (Doub() < ratioAlimt) 864 return - pow(Doub(), 1.0/(alimt + proj - 1.0)); 868 return - pow(Doub(), 1.0/(1.0 - alimt)); 876 if (Doub() <= ratioAlim) 878 return SQ(1.0 + Doub()*(sqrtAlim - 1.0)); 882 return pow(powAlim + Doub()*(1.0 - powAlim), 1.0/(proj - 0.5)); 887 if (Doub() < ratioAlimt) 889 return - pow(Doub(), 1.0/(alimt + proj - 1.0)); 893 return - pow(Doub(), 1.0/(1.0 - alimt)); 902 Z = SQ(1.0/sqrtAlim + Doub()*(sqrtAlim - 1.0/sqrtAlim)); 904 return pow(Z, proj - 1) > Doub(); 908 if (Doub() < (alimt - 1.0)/(2.0*alimt)) 910 Z = - pow(Doub(), 1.0/(alimt + 1.0)); 914 Z = - pow(Doub(), 1.0/(1.0 - alimt)); 917 return pow(Z, proj - 2) > Doub(); 921 double WalkDev( double *ptrOut, double *ptr, double *ptr0) 925 Z = SQ(1.0/sqrtAlim + Doub()*(sqrtAlim - 1.0/sqrtAlim)); 927 Mult(ptrOut, ptr, ptr0, Z); 929 return (proj - 1.0)*log(Z); 932 double TransDev( double *ptrOut, double *ptr, double *ptr0) 936 if (Doub() < (alimt - 1.0)/(2.0*alimt)) 938 Z = - pow(Doub(), 1.0/(alimt + 1.0)); 942 Z = - pow(Doub(), 1.0/(1.0 - alimt)); 945 Mult(ptrOut, ptr, ptr0, Z); 947 return (proj - 2.0)*log(-Z); 950 void Mult2( double *ptrOut, double *ptr, double *ptr0, const double Z) 952 std::vector<double> z(proj); 953 for ( int i = 0; i < proj; i++) 956 for ( int j = 0; j < num; j++) 958 z[i] += (Z-1.0)*(ptr[j] - ptr0[j])*currentVec[i][j]; 962 for ( int j = 0; j < num; j++) 965 for ( int i = 0; i < proj; i++) 967 ptrOut[j] += z[i]*currentVec[i][j]; 972 if (currentVec == sEndVec) 974 for ( double ** vec = currentVec, **vec2 = rotVec; vec != endEndVec; vec++, vec2++) 976 double *temp = *vec2; 984 void Mult( double *ptrOut, double *ptr, double *ptr0, const double Z) 988 std::vector<double> z(proj); 989 for ( int i = 0; i < proj; i++) 992 for ( int j = 0; j < num; j++) 994 z[i] += (Z-1.0)*(ptr[j] - ptr0[j])*currentVec[i][j]; 998 for ( int j = 0; j < num; j++) 1001 for ( int i = 0; i < proj; i++) 1003 ptrOut[j] += z[i]*currentVec[i][j]; 1008 void HopBlow( double *ptrOut, double *ptrIn, double *ptr, double *ptr0) 1014 std::vector<double> z(proj); 1015 for ( int i = 0; i < proj; i++) 1018 for ( int j = 0; j < num; j++) 1020 z[i] += (ptr[j] - ptr0[j])*currentVec[i][j]; 1024 for ( auto &&elem : z) 1026 double pt = std::abs(elem); 1031 double r = MultiDevDist(); 1033 for ( int j = 0; j < num; j++) 1035 ptrOut[j] = ptrIn[j]; 1036 for ( int i = 0; i < proj; i++) 1038 ptrOut[j] += r*max*currentVec[i][j]/3.0; 1046 std::vector<double> vec( num); 1049 for (i = start; i < num; i++) 1051 for (j = 0; j < num; j++) 1053 for (j = 0; j < i; j++) 1056 for (k = 0; k < num; k++) 1057 temp += vec[k]*rotVec[j][k]; 1058 for (k = 0; k < num; k++) 1059 vec[k] -= temp*rotVec[j][k]; 1062 for (j = 0; j < num; j++) 1063 temp += vec[j]*vec[j]; 1065 for (j = 0; j < num; j++) 1066 rotVec[i][j] = vec[j]/temp; 1069 currentVec = rotVec; 1075 std::vector<double> vec( num); 1078 for (i = start; i < end; i++) 1080 for (j = 0; j < num; j++) 1082 for (j = 0; j < i; j++) 1085 for (k = 0; k < num; k++) 1086 temp += vec[k]*rotVec[j][k]; 1087 for (k = 0; k < num; k++) 1088 vec[k] -= temp*rotVec[j][k]; 1091 for (j = 0; j < num; j++) 1092 temp += vec[j]*vec[j]; 1094 for (j = 0; j < num; j++) 1095 rotVec[i][j] = vec[j]/temp; 1098 currentVec = rotVec; 1101 int Dim() const { return proj;} 1105 del <double> (rotVec, num); 1116 double **currentVec; 1122 rotVec = matrix <double> (nin, nin); 1124 endVec = currentVec + num; 1129 del <double> (rotVec, num); 1131 rotVec = matrix <double> (nin, nin); 1133 endVec = currentVec + num; 1142 for (i = 0; i < num; i++) 1144 for (j = 0; j < num; j++) 1146 for (j = 0; j < i; j++) 1149 for (k = 0; k < num; k++) 1150 temp += vec[k]*rotVec[j][k]; 1151 for (k = 0; k < num; k++) 1152 vec[k] -= temp*rotVec[j][k]; 1155 for (j = 0; j < num; j++) 1156 temp += vec[j]*vec[j]; 1158 for (j = 0; j < num; j++) 1159 rotVec[i][j] = vec[j]/temp; 1162 currentVec = rotVec; 1170 for (i = 0; i < num; i++) 1172 for (j = 0; j < num; j++) 1174 temp += (*currentVec)[i]*cin[i][j]*(*currentVec)[j]; 1183 double *ptr = *currentVec; 1185 for (i = 0; i < num; i++) 1187 *out++ = in*(*ptr++); 1193 void RanMult( double *in, const double w, double *out) 1196 double *ptr = *currentVec; 1198 for (i = 0; i < num; i++) 1200 *out++ = *in++ + w*(*ptr++); 1205 double Mag( double *a, double *a0) 1209 double *ptr = *currentVec; 1211 for (i = 0; i < num; i++) 1212 temp += (*a++-*a0++)*(*ptr++); 1217 void Adjust( double *a, const double lim, const int iin) 1219 double temp = (lim - a[iin])/(*currentVec)[iin]; 1220 double *ptr = *currentVec; 1222 for ( int i = 0; i < num; i++) 1223 a[i] += temp*(*ptr++); 1227 virtual void operator ++ ( int) 1229 if (++currentVec == endVec) 1237 del <double> (rotVec, num); 1249 double **ptr = currentVec; 1250 for ( int i = 0; i < num; i++) 1256 void operator ++ ( int) 1258 if (++currentVec == endVec) 1261 double **ptr = currentVec; 1262 for ( int i = 0; i < num; i++) 1295 for (i = 0; i < 2; i++) 1300 dist = sqrt(dist/2.0); 1303 ElMult(*currentVec, pin); 1304 for (i = 0; i < num; i++) 1306 pin[i] = fac*dist*pin[i] + p0[i]; 1323 for (i = 0; i < 2; i++) 1328 dist = sqrt(dist/2.0); 1332 ElMult(*currentVec, pin); 1333 for (i = 0; i < num; i++) 1335 pin[i] = fac*dist*pin[i] + p0[i]; 1348 for (i = 0; i < 2; i++) 1353 dist = sqrt(dist/2.0); 1357 ElMult(*currentVec, pin); 1358 for (i = 0; i < num; i++) 1360 pin[i] = fac*dist*pin[i] + p0[i]; 1372 dist = pow(Doub(), 1.0/num); 1374 ElMult(*currentVec, pin); 1375 for (i = 0; i < num; i++) 1377 pin[i] = fin*dist*pin[i] + p0[i]; 1389 dist = pow(Doub(), 1.0/num); 1392 ElMult(*currentVec, pin); 1393 for (i = 0; i < num; i++) 1395 pin[i] = fin*dist*pin[i] + p0[i];
unsigned long long int int64()
Ran(unsigned long long int)
Ran_old(unsigned long long int j)
void EllipseDev(double *pin, double *p0, double fin)
void Adjust(double *a, const double lim, const int iin)
double MultiDevPDF(double r, int dim)
double TransDev(double *ptrOut, double *ptr, double *ptr0)
RandomBasis(int nin, unsigned long long iin)
NormalDev(double mmu, double ssig, unsigned long long i)
void Dev(double **cvar, double *pt, double *mean)
double RanMult(double **cin)
void EllipseDev(double **cvar, double *pin, double *p0, double fin)
bool EnterMat(double **a)
MultiNormDev(int nin, double din, unsigned long long iin)
void Mult2(double *ptrOut, double *ptr, double *ptr0, const double Z)
BasicDevs(unsigned long long i)
AdvanceDevs(int nin, double din, unsigned long long iin)
RandomPlane(const int projin, const int nin, const double din, const double alim, const double alimt, unsigned long long iin)
double WalkDev(double *ptrOut, double *ptr, double *ptr0)
MultiNormalDev(double **vvar, double fin, unsigned long long int j, int nin)
void Inverse(double **ainv)
void Dev(double *pt, double *mean)
bool EnterMat(const std::vector< std::vector< double >> &a)
void RandRot(const int start, const int end)
void MultiDev(double *pin, double *p0)
ExponDev(double din, unsigned long long ii)
Cholesky(double **a, const int nin)
static double draw() Draw a single uniform random deviate from the interval (0,1) using the chosen RNG engine...
void ChangeDim(const int nin)
double Square(double *y, double *y0, int *map)
void MultiDevGauss(double **cvar, double *pin, double *p0)
void MultiDev(double **cvar, double *pin, double *p0)
void MultiDev(double *pin, double *p0)
void HopBlow(double *ptrOut, double *ptrIn, double *ptr, double *ptr0)
A threadsafe interface to the STL random number generators.
void Solve(double *b, double *x)
void Mult(double *ptrOut, double *ptr, double *ptr0, const double Z)
void EllipseDev(double *pin, double *p0, double fin)
MultiNormDev(double **vvar, const int nin, double din, unsigned long long iin)
AdvanceDevs(double **vvar, const int nin, double din, unsigned long long iin)
void ElMult(double *y, double *b)
void RandRot(const int start=0)
void EllipseDev(double **cvar, double *pin, double *p0, double fin)
double pow(const double &a) Outputs a^i.
double Mag(double *a, double *a0)
double Square(double *y, double *y0)
void EnterMat(double **a, int nin)
void RanMult(double *in, const double w, double *out)
std::vector< T > vec(std::vector< T > vector)
bool EnterMatM(double **a, const int min)
void MultiDev(double **cvar, double *pin, double *p0)
void RanMult(const double in, double *out)
|