use rand::Rng;
use rand::distributions::{Sample, IndependentSample};
use statistics::*;
use distribution::{Univariate, Discrete, Distribution, Binomial};
use result::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) -> i64 {
1
}
}
impl Sample<f64> for Bernoulli {
fn sample<R: Rng>(&mut self, r: &mut R) -> f64 {
super::Distribution::sample(self, r)
}
}
impl IndependentSample<f64> for Bernoulli {
fn ind_sample<R: Rng>(&self, r: &mut R) -> f64 {
super::Distribution::sample(self, r)
}
}
impl Distribution<f64> for Bernoulli {
fn sample<R: Rng>(&self, r: &mut R) -> f64 {
self.b.sample(r)
}
}
impl Univariate<i64, f64> for Bernoulli {
fn cdf(&self, x: f64) -> f64 {
self.b.cdf(x)
}
}
impl Min<i64> for Bernoulli {
fn min(&self) -> i64 {
0
}
}
impl Max<i64> for Bernoulli {
fn max(&self) -> i64 {
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<i64> for Bernoulli {
fn mode(&self) -> i64 {
self.b.mode()
}
}
impl Discrete<i64, f64> for Bernoulli {
fn pmf(&self, x: i64) -> f64 {
self.b.pmf(x)
}
fn ln_pmf(&self, x: i64) -> f64 {
self.b.ln_pmf(x)
}
}