kernel_density_estimation/kernel/
cosine.rs

1//! Cosine kernel function.
2
3use crate::float::{float, primitive, KDEFloat};
4use crate::kernel::Kernel;
5
6use std::f64::consts::{FRAC_PI_2, FRAC_PI_4};
7
8/// Cosine kernel function.
9#[derive(Clone, Copy, Debug)]
10pub struct Cosine;
11
12impl<F: KDEFloat> Kernel<F> for Cosine {
13    fn pdf(&self, x: F) -> F {
14        let abs_x = x.abs();
15        if abs_x <= F::one() {
16            let res = FRAC_PI_4 * (FRAC_PI_2 * primitive!(abs_x)).cos();
17            float!(res)
18        } else {
19            F::zero()
20        }
21    }
22}
23
24#[cfg(test)]
25mod tests {
26    use super::Cosine;
27    use crate::kernel::Kernel;
28    use approx::*;
29
30    #[test]
31    fn cosine() {
32        let kernel = Cosine;
33
34        let x = 0.0;
35        let res = kernel.pdf(x);
36        assert_relative_eq!(res, 0.78539, epsilon = 1.0e-5);
37
38        let x = -1.0;
39        let res = kernel.pdf(x);
40        assert_relative_eq!(res, 0.0, epsilon = 1.0e-5);
41
42        let x = 1.0;
43        let res = kernel.pdf(x);
44        assert_relative_eq!(res, 0.0, epsilon = 1.0e-5);
45
46        let x = 0.5;
47        let res = kernel.pdf(x);
48        assert_relative_eq!(res, 0.55536, epsilon = 1.0e-5);
49    }
50}