double gauss() { static int iset = 0; static double gset; double fac, rsq, v1, v2; seedrand(); if(iset == 0) { do { v1 = 2. * drand48() - 1.; v2 = 2. * drand48() - 1.; rsq = v1 * v1 + v2 * v2; } while (rsq >= 1. || rsq == .0); fac = sqrt(-2. * log(rsq) / rsq); gset = v1 * fac; iset = 1; return v2 * fac; } else { iset = 0; return gset; } }
int nrand(int n) { if(randn == 0) seedrand(); randn = randn*1103515245 + 12345 + sys->ticks; return (randn>>16) % n; }
int nrand(int n) { if(randn == 0) seedrand(); randn = randn*1103515245 + 12345 + osusectime(); return (randn>>16) % n; }
int main(int argc, char **argv) { seedrand(); #ifdef __UL_UTIL__GAUSS if(argc < 3) { fprintf(stderr, "Usage: gauss <a> <sigma> [n] \n"); exit(-1); } double a = atof(argv[1]), sigma = atof(argv[2]); int n = 1, i; if(argc > 3) { n = atoi(argv[3]); } for(i = 0; i < n; i++) { printf("%3.8f\n", a + sigma * gauss()); } #elif defined(__UL_UTIL__IMF) if(argc < 4 || argc % 2) { fprintf(stderr, "Usage: imf m_min m_max alpha0 [m_i alpha_i]* \n"); exit(-1); } int i, j, n = argc / 2 - 1; double *m = (double *)malloc((n+1) * sizeof(double)); double *alpha = (double *)malloc(n * sizeof(double)); double *r = (double *)malloc(n * sizeof(double)); double *f = (double *)malloc((n+1) * sizeof(double)); m[0] = atof(argv[1]); m[n] = atof(argv[2]); alpha[0] = -atof(argv[3]); for(i = 1; i < n; i++) { m[i] = atof(argv[2*i+2]); alpha[i] = -atof(argv[2*i+3]); } setup_imf(m, alpha, n, r, f); int d[] = {0, 0, 0, 0, 0, 0}; /* for(i = 0; i < n; i++) printf("f_%d(m) = %1.8f * m ^ %1.1f, F(%1.3f) = %1.8f, F(%1.3f) = %1.8f\n", i, r[i], alpha[i], m[i], f[i], m[i+1], f[i+1]); */ seedrand(); for(j = 0; j < 1000000; j++) { double m_ = get_imf_mass(m, alpha, n, r, f); printf("%e\n", m_); } #endif exit(0); }
void rjMcMC1DSampler::sample() { mBirthDeathFromPrior = false; starttime = timestamp(); double t1 = gettime(); mChainInfo.resize(nchains); for (size_t ci = 0; ci < nchains; ci++){ unsigned int seed = (unsigned int)(ci + mRank + (unsigned int)time(NULL)); seedrand(seed); mChainInfo[ci].reset(); //mChainInfo[ci].modelchain.resize(nsamples); rjMcMC1DModel mcur; for (size_t si = 0; si < nsamples; si++){ //Initialis chain if (si == 0){ mcur = choosefromprior(); set_misfit(mcur); } //Initialise "best" models if (ci == 0 && si==0){ mHighestLikelihood = mcur; mLowestMisfit = mcur; } rjMcMC1DModel mpro = mcur; size_t nopt = 4; if (mcur.nnuisances() > 0)nopt = 5; size_t option = irand((size_t)0, nopt - 1); bool accept = false; if (option == 0){ accept = propose_valuechange(mcur, mpro); } else if (option == 1){ accept = propose_move(mcur, mpro); } else if (option == 2){ accept = propose_birth(mcur, mpro); } else if (option == 3){ accept = propose_death(mcur, mpro); } else if (option == 4){ accept=propose_nuisancechange(mcur,mpro); } else if (option == 5){ accept = propose_independent(mcur, mpro); } else{ exit(1); break; } if (accept) mcur = mpro; if (includeinmap(si)){ pmap.addmodel(mcur); nmap.addmodel(mcur); mChainInfo[ci].modelchain.push_back(mcur); } if (mcur.logppd() > mHighestLikelihood.logppd()){ mHighestLikelihood = mcur; } if (mcur.misfit() < mLowestMisfit.misfit()){ mLowestMisfit = mcur; } if (saveconvergencerecord(si)){ mChainInfo[ci].sample.push_back((uint32_t)si); mChainInfo[ci].nlayers.push_back((uint32_t)mcur.nlayers()); mChainInfo[ci].misfit.push_back((float)mcur.misfit()); mChainInfo[ci].logppd.push_back((float)mcur.logppd()); mChainInfo[ci].ar_valuechange.push_back((float)ar_valuechange()); mChainInfo[ci].ar_move.push_back((float)ar_move()); mChainInfo[ci].ar_birth.push_back((float)ar_birth()); mChainInfo[ci].ar_death.push_back((float)ar_death()); mChainInfo[ci].ar_nuisancechange.push_back((float)ar_nuisancechange()); } #ifdef _WIN32 if (reportstats){ if (mRank == 0 && isreportable(si)){ //printstats(ci, si, mcur.nlayers(), mcur.misfit() / (double)ndata); } } #endif } } double t2 = gettime(); endtime = timestamp(); samplingtime = t2 - t1; }