irox_stats/
gaussian.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2023 IROX Contributors
3
4//!
5//! Gaussian Distribution Functions
6
7extern crate alloc;
8
9use alloc::vec;
10use alloc::vec::Vec;
11use core::f64::consts::TAU;
12#[allow(unused_imports)]
13use irox_tools::f64::FloatExt;
14
15use super::{Distribution, DistributionParams};
16
17///
18/// The Gaussian Distribution
19#[derive(Debug, Copy, Clone, PartialEq)]
20pub struct GaussianDistribution {
21    mean_mu: f64,
22    standard_deviation_sigma: f64,
23    variance: f64,
24}
25
26impl GaussianDistribution {
27    ///
28    /// Creates a new distribution with the specified mean and standard deviation
29    pub fn new(mean: f64, standard_deviation: f64) -> GaussianDistribution {
30        GaussianDistribution {
31            mean_mu: mean,
32            standard_deviation_sigma: standard_deviation,
33            variance: standard_deviation.powi(2),
34        }
35    }
36}
37///
38/// The Standard Distribution
39pub type StandardDistribution = GaussianDistribution;
40
41impl Default for GaussianDistribution {
42    fn default() -> Self {
43        GaussianDistribution {
44            mean_mu: 0.0,
45            standard_deviation_sigma: 1.0,
46            variance: 1.0,
47        }
48    }
49}
50
51impl Distribution for GaussianDistribution {
52    fn pdf(&self, x: f64) -> f64 {
53        let a = (x - self.mean_mu) / self.standard_deviation_sigma;
54        let exp = -0.5 * a.powi(2);
55        exp.exp() / (self.standard_deviation_sigma * TAU.sqrt())
56    }
57
58    fn get_params(&self) -> Vec<DistributionParams> {
59        vec![
60            DistributionParams::Mean(self.mean_mu),
61            DistributionParams::Variance(self.variance),
62            DistributionParams::StandardDeviation(self.standard_deviation_sigma),
63        ]
64    }
65}