use numra_core::Scalar;
pub mod beta_dist;
pub mod binomial;
pub mod chi_squared;
pub mod exponential;
pub mod f_dist;
pub mod gamma_dist;
pub mod lognormal;
pub mod normal;
pub mod poisson;
pub mod student_t;
pub mod uniform;
pub trait ContinuousDistribution<S: Scalar> {
fn pdf(&self, x: S) -> S;
fn cdf(&self, x: S) -> S;
fn quantile(&self, p: S) -> S;
fn mean(&self) -> S;
fn variance(&self) -> S;
fn std_dev(&self) -> S {
self.variance().sqrt()
}
fn sample(&self, rng: &mut dyn RngCore) -> S;
fn sample_n(&self, rng: &mut dyn RngCore, n: usize) -> Vec<S> {
(0..n).map(|_| self.sample(rng)).collect()
}
}
pub trait DiscreteDistribution<S: Scalar> {
fn pmf(&self, k: usize) -> S;
fn cdf(&self, k: usize) -> S;
fn mean(&self) -> S;
fn variance(&self) -> S;
fn sample(&self, rng: &mut dyn RngCore) -> usize;
fn sample_n(&self, rng: &mut dyn RngCore, n: usize) -> Vec<usize> {
(0..n).map(|_| self.sample(rng)).collect()
}
}
pub use rand::RngCore;
pub use beta_dist::BetaDist;
pub use binomial::Binomial;
pub use chi_squared::ChiSquared;
pub use exponential::Exponential;
pub use f_dist::FDist;
pub use gamma_dist::GammaDist;
pub use lognormal::LogNormal;
pub use normal::Normal;
pub use poisson::Poisson;
pub use student_t::StudentT;
pub use uniform::Uniform;