1extern 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#[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 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}
37pub 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}