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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
//! Defines common interfaces for interacting with statistical distributions and provides //! concrete implementations for a variety of distributions. use rand::Rng; use statistics::{Min, Max}; pub use self::bernoulli::Bernoulli; pub use self::beta::Beta; pub use self::binomial::Binomial; pub use self::chi::Chi; pub use self::chi_squared::ChiSquared; pub use self::discrete_uniform::DiscreteUniform; pub use self::exponential::Exponential; pub use self::fisher_snedecor::FisherSnedecor; pub use self::gamma::Gamma; pub use self::log_normal::LogNormal; pub use self::normal::Normal; pub use self::poisson::Poisson; pub use self::students_t::StudentsT; pub use self::triangular::Triangular; pub use self::uniform::Uniform; pub use self::weibull::Weibull; mod bernoulli; mod beta; mod binomial; mod chi; mod chi_squared; mod discrete_uniform; mod exponential; mod fisher_snedecor; mod gamma; mod log_normal; mod normal; mod poisson; mod students_t; mod triangular; mod uniform; mod weibull; /// The `Distribution` trait is used to specify an interface /// for sampling statistical distributions pub trait Distribution<T> { /// Draws a random sample using the supplied random number generator /// # Examples /// /// A trivial implementation that just samples from the supplied /// random number generator /// /// ``` /// # extern crate rand; /// # extern crate statrs; /// /// use rand::Rng; /// use statrs::distribution::Distribution; /// /// struct Foo; /// /// impl Distribution<f64> for Foo { /// fn sample<R: Rng>(&self, r: &mut R) -> f64 { /// r.next_f64() /// } /// } /// /// # fn main() { } /// ``` fn sample<R: Rng>(&self, r: &mut R) -> T; } /// The `Univariate` trait is used to specify an interface for univariate /// distributions e.g. distributions that have a closed form cumulative distribution /// function pub trait Univariate<T, K>: Distribution<K> + Min<T> + Max<T> { /// Returns the cumulative distribution function calculated /// at `x` for a given distribution. May panic depending /// on the implementor. /// /// # Examples /// /// ``` /// use statrs::distribution::{Univariate, Uniform}; /// /// let n = Uniform::new(0.0, 1.0).unwrap(); /// assert_eq!(0.5, n.cdf(0.5)); /// ``` fn cdf(&self, x: K) -> K; } /// The `Continuous` trait extends the `Distribution` /// trait and provides an interface for interacting with continuous /// statistical distributions /// /// # Remarks /// /// All methods provided by the `Continuous` trait are unchecked, meaning /// they can panic if in an invalid state or encountering invalid input /// depending on the implementing distribution. pub trait Continuous<T, K>: Distribution<K> { /// Returns the probability density function calculated at `x` for a given distribution. /// May panic depending on the implementor. /// /// # Examples /// /// ``` /// use statrs::distribution::{Continuous, Uniform}; /// /// let n = Uniform::new(0.0, 1.0).unwrap(); /// assert_eq!(1.0, n.pdf(0.5)); /// ``` fn pdf(&self, x: T) -> K; /// Returns the log of the probability density function calculated at `x` for a given distribution. /// May panic depending on the implementor. /// /// # Examples /// /// ``` /// use statrs::distribution::{Continuous, Uniform}; /// /// let n = Uniform::new(0.0, 1.0).unwrap(); /// assert_eq!(0.0, n.ln_pdf(0.5)); /// ``` fn ln_pdf(&self, x: T) -> K; } /// The `Discrete` trait extends the `Distribution` /// trait and provides an interface for interacting with discrete /// statistical distributions /// /// # Remarks /// /// All methods provided by the `Discrete` trait are unchecked, meaning /// they can panic if in an invalid state or encountering invalid input /// depending on the implementing distribution. pub trait Discrete<T, K>: Distribution<K> { /// Returns the probability mass function calculated at `x` for a given distribution. /// May panic depending on the implementor. /// /// # Examples /// /// ``` /// use statrs::distribution::{Discrete, Binomial}; /// use statrs::prec; /// /// let n = Binomial::new(0.5, 10).unwrap(); /// assert!(prec::almost_eq(n.pmf(5), 0.24609375, 1e-15)); /// ``` fn pmf(&self, x: T) -> K; /// Returns the log of the probability mass function calculated at `x` for a given distribution. /// May panic depending on the implementor. /// /// # Examples /// /// ``` /// use statrs::distribution::{Discrete, Binomial}; /// use statrs::prec; /// /// let n = Binomial::new(0.5, 10).unwrap(); /// assert!(prec::almost_eq(n.ln_pmf(5), (0.24609375f64).ln(), 1e-15)); /// ``` fn ln_pmf(&self, x: T) -> K; }