/* covariance matrix is linearized */ double ighmm_rand_binormal_density(const double *x, double *mean, double *cov) { # define CUR_PROC "ighmm_rand_binormal_density" double rho; #ifndef DO_WITH_GSL double numerator,part1,part2,part3; #endif if (cov[0] <= 0.0 || cov[2 + 1] <= 0.0) { GHMM_LOG(LCONVERTED, "variance <= 0.0 not allowed\n"); goto STOP; } rho = cov[1] / ( sqrt (cov[0]) * sqrt (cov[2 + 1]) ); /* The denominator is possibly < EPS??? Check that ? */ #ifdef DO_WITH_GSL /* double gsl_ran_bivariate_gaussian_pdf (double x, double y, double sigma_x, double sigma_y, double rho) */ return gsl_ran_bivariate_gaussian_pdf (x[0], x[1], sqrt (cov[0]), sqrt (cov[2 + 1]), rho); #else part1 = (x[0] - mean[0]) / sqrt (cov[0]); part2 = (x[1] - mean[1]) / sqrt (cov[2 + 1]); part3 = m_sqr (part1) - 2 * part1 * part2 + m_sqr (part2); numerator = exp ( -1 * (part3) / ( 2 * (1 - m_sqr(rho)) ) ); return (numerator / ( 2 * PI * sqrt(1 - m_sqr(rho)) )); #endif STOP: return (-1.0); # undef CUR_PROC } /* double ighmm_rand_binormal_density */
/*============================================================================*/ double ighmm_rand_normal_density (double x, double mean, double u) { # define CUR_PROC "ighmm_rand_normal_density" #ifndef DO_WITH_GSL double expo; #endif if (u <= 0.0) { GHMM_LOG(LCONVERTED, "u <= 0.0 not allowed\n"); goto STOP; } /* The denominator is possibly < EPS??? Check that ? */ #ifdef DO_WITH_GSL /* double gsl_ran_gaussian_pdf (double x, double sigma) */ return gsl_ran_gaussian_pdf (x - mean, sqrt (u)); #else expo = exp (-1 * m_sqr (mean - x) / (2 * u)); return (1 / (sqrt (2 * PI * u)) * expo); #endif STOP: return (-1.0); # undef CUR_PROC } /* double ighmm_rand_normal_density */
double mag(vec v) { return sqrt(m_sqr(v.x) + m_sqr(v.y) + m_sqr(v.z) + m_sqr(v.w)); }