diff options
Diffstat (limited to 'misc.c')
| -rw-r--r-- | misc.c | 42 | 
1 files changed, 42 insertions, 0 deletions
@@ -0,0 +1,42 @@ +#include "misc.h" +#include <math.h> +#include <stdlib.h> /* 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; +}  | 
