use super::{ContinuousDistribution, Gamma, StatsError};
use crate::FloatScalar;
#[derive(Debug, Clone, Copy)]
pub struct ChiSquared<T> {
inner: Gamma<T>, }
impl<T: FloatScalar> ChiSquared<T> {
pub fn new(k: T) -> Result<Self, StatsError> {
if k <= T::zero() {
return Err(StatsError::InvalidParameter);
}
let two = T::one() + T::one();
let inner = Gamma::new(k / two, T::one() / two)?;
Ok(Self { inner })
}
pub fn sample(&self, rng: &mut super::Rng) -> T {
self.inner.sample(rng)
}
impl_sample_array!(T, T::zero());
}
impl<T: FloatScalar> ContinuousDistribution<T> for ChiSquared<T> {
fn pdf(&self, x: T) -> T {
self.inner.pdf(x)
}
fn ln_pdf(&self, x: T) -> T {
self.inner.ln_pdf(x)
}
fn cdf(&self, x: T) -> T {
self.inner.cdf(x)
}
fn quantile(&self, p: T) -> T {
self.inner.quantile(p)
}
fn mean(&self) -> T {
self.inner.mean()
}
fn variance(&self) -> T {
self.inner.variance()
}
}