online_statistics/
ptp.rs

1use crate::maximum::{Max, RollingMax};
2use crate::minimum::{Min, RollingMin};
3use crate::stats::Univariate;
4use num::{Float, FromPrimitive};
5use serde::{Deserialize, Serialize};
6use std::ops::{AddAssign, SubAssign};
7/// Running peak to peak (max - min).
8/// # Examples
9/// ```
10/// use online_statistics::ptp::PeakToPeak;
11/// use online_statistics::stats::Univariate;
12/// let mut running_peak_to_peak: PeakToPeak<f64> = PeakToPeak::new();
13/// for i in 1..10{
14///     running_peak_to_peak.update(i as f64);
15/// }
16/// assert_eq!(running_peak_to_peak.get(), 8.0);
17/// ```
18///
19#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize)]
20pub struct PeakToPeak<F: Float + FromPrimitive + AddAssign + SubAssign> {
21    pub min: Min<F>,
22    pub max: Max<F>,
23}
24
25impl<F: Float + FromPrimitive + AddAssign + SubAssign> PeakToPeak<F> {
26    pub fn new() -> Self {
27        Self {
28            min: Min::new(),
29            max: Max::new(),
30        }
31    }
32}
33
34impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for PeakToPeak<F> {
35    fn update(&mut self, x: F) {
36        self.min.update(x);
37        self.max.update(x);
38    }
39    fn get(&self) -> F {
40        self.max.get() - self.min.get()
41    }
42}
43
44/// Rolling peak to peak (max - min).
45/// # Arguments
46/// * `window_size` - Size of the rolling window.
47/// # Examples
48/// ```
49/// use online_statistics::ptp::RollingPeakToPeak;
50/// use online_statistics::stats::Univariate;
51/// let mut rolling_peak_to_peak: RollingPeakToPeak<f64> = RollingPeakToPeak::new(3);
52/// for i in 1..10{
53///     rolling_peak_to_peak.update(i as f64);
54/// }
55/// assert_eq!(rolling_peak_to_peak.get(), 2.0);
56/// ```
57///
58#[derive(Serialize, Deserialize)]
59pub struct RollingPeakToPeak<F: Float + FromPrimitive + AddAssign + SubAssign> {
60    pub min: RollingMin<F>,
61    pub max: RollingMax<F>,
62}
63
64impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollingPeakToPeak<F> {
65    pub fn new(window_size: usize) -> Self {
66        Self {
67            min: RollingMin::new(window_size),
68            max: RollingMax::new(window_size),
69        }
70    }
71}
72
73impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for RollingPeakToPeak<F> {
74    fn update(&mut self, x: F) {
75        self.min.update(x);
76        self.max.update(x);
77    }
78    fn get(&self) -> F {
79        self.max.get() - self.min.get()
80    }
81}