Skip to main content

numra_stats/distributions/
mod.rs

1//! Probability distribution traits and implementations.
2//!
3//! Author: Moussa Leblouba
4//! Date: 9 February 2026
5//! Modified: 2 May 2026
6
7use numra_core::Scalar;
8
9pub mod beta_dist;
10pub mod binomial;
11pub mod chi_squared;
12pub mod exponential;
13pub mod f_dist;
14pub mod gamma_dist;
15pub mod lognormal;
16pub mod normal;
17pub mod poisson;
18pub mod student_t;
19pub mod uniform;
20
21/// Trait for continuous probability distributions.
22pub trait ContinuousDistribution<S: Scalar> {
23    /// Probability density function.
24    fn pdf(&self, x: S) -> S;
25
26    /// Cumulative distribution function.
27    fn cdf(&self, x: S) -> S;
28
29    /// Inverse CDF (quantile function).
30    fn quantile(&self, p: S) -> S;
31
32    /// Distribution mean.
33    fn mean(&self) -> S;
34
35    /// Distribution variance.
36    fn variance(&self) -> S;
37
38    /// Standard deviation (default: sqrt(variance)).
39    fn std_dev(&self) -> S {
40        self.variance().sqrt()
41    }
42
43    /// Generate a single sample.
44    fn sample(&self, rng: &mut dyn RngCore) -> S;
45
46    /// Generate n samples.
47    fn sample_n(&self, rng: &mut dyn RngCore, n: usize) -> Vec<S> {
48        (0..n).map(|_| self.sample(rng)).collect()
49    }
50}
51
52/// Trait for discrete probability distributions.
53pub trait DiscreteDistribution<S: Scalar> {
54    /// Probability mass function.
55    fn pmf(&self, k: usize) -> S;
56
57    /// Cumulative distribution function.
58    fn cdf(&self, k: usize) -> S;
59
60    /// Distribution mean.
61    fn mean(&self) -> S;
62
63    /// Distribution variance.
64    fn variance(&self) -> S;
65
66    /// Generate a single sample.
67    fn sample(&self, rng: &mut dyn RngCore) -> usize;
68
69    /// Generate n samples.
70    fn sample_n(&self, rng: &mut dyn RngCore, n: usize) -> Vec<usize> {
71        (0..n).map(|_| self.sample(rng)).collect()
72    }
73}
74
75// Re-export rand trait for use by distributions
76pub use rand::RngCore;
77
78pub use beta_dist::BetaDist;
79pub use binomial::Binomial;
80pub use chi_squared::ChiSquared;
81pub use exponential::Exponential;
82pub use f_dist::FDist;
83pub use gamma_dist::GammaDist;
84pub use lognormal::LogNormal;
85pub use normal::Normal;
86pub use poisson::Poisson;
87pub use student_t::StudentT;
88pub use uniform::Uniform;