From 24c8bcfe7f76b20124e2862ea050f815c0f768e7 Mon Sep 17 00:00:00 2001 From: tlatorre Date: Tue, 14 Aug 2018 10:08:27 -0500 Subject: move everything to src directory --- src/misc.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/misc.c (limited to 'src/misc.c') diff --git a/src/misc.c b/src/misc.c new file mode 100644 index 0000000..74c729e --- /dev/null +++ b/src/misc.c @@ -0,0 +1,42 @@ +#include "misc.h" +#include +#include /* for size_t */ + +double logsumexp(double *a, size_t n) +{ + /* Returns the log of the sum of the exponentials of the array `a`. + * + * This function is designed to reduce underflow when the exponentials of + * `a` are very small, for example when computing probabilities. */ + size_t i; + double amax, sum; + + amax = a[0]; + for (i = 0; i < n; i++) { + if (a[i] > amax) amax = a[i]; + } + + sum = 0.0; + + for (i = 0; i < n; i++) { + sum += exp(a[i]-amax); + } + + sum = log(sum); + + return amax + sum; +} + +double norm(double x, double mu, double sigma) +{ + /* Returns the PDF for a gaussian random variable with mean `mu` and + * standard deviation `sigma`. */ + return exp(-pow(x-mu,2)/(2*pow(sigma,2)))/(sqrt(2*M_PI)*sigma); +} + +double norm_cdf(double x, double mu, double sigma) +{ + /* Returns the CDF for a gaussian random variable with mean `mu` and + * standard deviation `sigma`. */ + return erfc(-(x-mu)/(sqrt(2)*sigma))/2.0; +} -- cgit