void VelocityLayer::vary(double randVar) { if (m_isVaried) { // Randomize the velocity switch (m_type) { case Normal: setVaried(m_avg + gsl_cdf_gaussian_Pinv(randVar, m_stdev)); break; case LogNormal: setVaried(m_avg * exp(gsl_cdf_gaussian_Pinv(randVar, m_stdev))); break; case Uniform: m_varied = gsl_cdf_flat_Pinv(randVar, m_min, m_max); break; } } else { m_varied = m_avg; } }
//scales by prior and returns ranPar double scale(double *ranPar, double x, double y, int prior) { if( prior == 0 ) //log prior *ranPar = pow( 10, *ranPar * ( log10(y) - log10(x) ) + log10(x) ); else if( prior == 1 ) //linear prior *ranPar = *ranPar * (y - x) + x; else if( prior == 2 ) //gaussian prior *ranPar = x + gsl_cdf_gaussian_Pinv(*ranPar, y); else if( prior == 3 ) //no prior return x; return *ranPar; }
double neighbour_rot(double temp, double temp_end, double temp_init, double bm_sigma) { const double BM_start = 2 * M_PI; double BM = BM_start * (bm_sigma * (temp - temp_end) / (temp_init - temp_end)) * gsl_cdf_gaussian_Pinv(gsl_rng_uniform(_bm_rng), 1); if (isinf(BM)) BM = MAXFLOAT; rotation = fmod(fabs(rotation + BM), 2 * M_PI); return BM; }