Primitive Probability Distributions

Hakaru comes with a small set of primitive probability distributions.

normal(mean. real, standard_deviation. prob): measure(real)

univariate Normal (Gaussian) distribution -

uniform(low. real, high. real): measure(real)

Uniform distribution is a continuous univariate distribution defined from low to high -

gamma(shape. prob, scale. prob): measure(prob)

Gamma distribution with shape and scale parameterization -

beta(a. prob, b. prob): measure(prob)

Beta distribution -

poisson(l. prob): measure(nat)

Poisson distribution -

categorical(v. array(prob)): measure(nat)

Categorical distribution -

dirac(x. a): measure(a)

Dirac distribution -

The Dirac distribution appears often enough, that we have given an additional keyword in our language for it: return. The following programs are equivalent.

dirac(3)
return 3

lebesgue(low. real, high.real): measure(real)

the distribution constant between low and high and zero elsewhere. high must be at least low. -

weight(x. prob, m. measure(a)): measure(a)

a m distribution, reweighted by x -

reject: measure(a)

The distribution over the empty set -

Finally, we have a binary choice operator <|>, which takes two distributions, and returns an unnormalized distribution which returns one or the other. For example, to get a distribution which where with probability 0.5 draws from a uniform(0,1), and probability 0.5 draws from uniform(5,6).

weight(0.5, uniform(0,1)) <|>
weight(0.5, uniform(5,6))