use distribution::{Binomial, Discrete, Univariate};
use rand::distributions::Distribution;
use rand::Rng;
use statistics::*;
use Result;
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Bernoulli {
b: Binomial,
}
impl Bernoulli {
pub fn new(p: f64) -> Result<Bernoulli> {
Binomial::new(p, 1).map(|b| Bernoulli { b: b })
}
pub fn p(&self) -> f64 {
self.b.p()
}
pub fn n(&self) -> u64 {
1
}
}
impl Distribution<f64> for Bernoulli {
fn sample<R: Rng + ?Sized>(&self, r: &mut R) -> f64 {
r.gen_bool(self.p()) as u8 as f64
}
}
impl Univariate<u64, f64> for Bernoulli {
fn cdf(&self, x: f64) -> f64 {
self.b.cdf(x)
}
}
impl Min<u64> for Bernoulli {
fn min(&self) -> u64 {
0
}
}
impl Max<u64> for Bernoulli {
fn max(&self) -> u64 {
1
}
}
impl Mean<f64> for Bernoulli {
fn mean(&self) -> f64 {
self.b.mean()
}
}
impl Variance<f64> for Bernoulli {
fn variance(&self) -> f64 {
self.b.variance()
}
fn std_dev(&self) -> f64 {
self.b.std_dev()
}
}
impl Entropy<f64> for Bernoulli {
fn entropy(&self) -> f64 {
self.b.entropy()
}
}
impl Skewness<f64> for Bernoulli {
fn skewness(&self) -> f64 {
self.b.skewness()
}
}
impl Median<f64> for Bernoulli {
fn median(&self) -> f64 {
self.b.median()
}
}
impl Mode<u64> for Bernoulli {
fn mode(&self) -> u64 {
self.b.mode()
}
}
impl Discrete<u64, f64> for Bernoulli {
fn pmf(&self, x: u64) -> f64 {
self.b.pmf(x)
}
fn ln_pmf(&self, x: u64) -> f64 {
self.b.ln_pmf(x)
}
}