kernel_density_estimation/kernel/
cosine.rs1use crate::float::{float, primitive, KDEFloat};
4use crate::kernel::Kernel;
5
6use std::f64::consts::{FRAC_PI_2, FRAC_PI_4};
7
8#[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}