1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//! Provides a unified interface for working with probability distributions. Also implements
//! commonly used (maximum entropy) distributions.

mod bernoulli;
mod beta;
mod chi_squared;
mod discreteuniform;
mod exponential;
mod gamma;
mod normal;
mod poisson;
mod uniform;

/// The primary trait defining a probability distribution.
pub trait Distribution: Send + Sync {
    /// Samples from the given probability distribution.
    fn sample(&self) -> f64;
    /// Generates a vector of `n` randomly sampled values from the given probability distribution.
    fn sample_iter(&self, n: usize) -> Vec<f64> {
        (0..n).map(|_| self.sample()).collect()
    }
    fn update(&mut self, params: &[f64]);
}

/// Provides a trait for computing the mean of a distribution where there is a closed-form
/// expression.
pub trait Mean: Distribution {
    /// Calculates the mean of the distribution.
    fn mean(&self) -> f64;
}

/// Provides a trait for computing the variance of a distribution where there is a closed-form
/// solution. Requires the `Mean` trait to be implemented because of the definition of variance.
pub trait Variance: Mean {
    fn var(&self) -> f64;
}

/// Provides a trait for interacting with continuous probability distributions.
pub trait Continuous: Distribution {
    /// Calculates the [probability density
    /// function](https://en.wikipedia.org/wiki/Probability_density_function) at some value `x`.
    fn pdf(&self, x: f64) -> f64;
}

/// Provides a trait for interacting with discrete probability distributions.
pub trait Discrete: Distribution {
    /// Calculates the [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function) at some value `x`.
    fn pmf(&self, x: i64) -> f64;
}

pub use self::bernoulli::Bernoulli;
pub use self::beta::Beta;
pub use self::chi_squared::ChiSquared;
pub use self::discreteuniform::DiscreteUniform;
pub use self::exponential::Exponential;
pub use self::gamma::Gamma;
pub use self::normal::Normal;
pub use self::poisson::Poisson;
pub use self::uniform::Uniform;