online_statistics/
maximum.rs

1use crate::sorted_window::SortedWindow;
2use crate::stats::Univariate;
3use num::{Float, FromPrimitive};
4use serde::{Deserialize, Serialize};
5use std::ops::{AddAssign, SubAssign};
6/// Running max.
7/// # Examples
8/// ```
9/// use online_statistics::maximum::Max;
10/// use online_statistics::stats::Univariate;
11/// let mut running_max: Max<f64> = Max::new();
12/// for i in 1..10{
13///     running_max.update(i as f64);
14/// }
15/// assert_eq!(running_max.get(), 9.0);
16/// ```
17///
18#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)]
19pub struct Max<F: Float + FromPrimitive + AddAssign + SubAssign> {
20    pub max: F,
21}
22impl<F: Float + FromPrimitive + AddAssign + SubAssign> Max<F> {
23    pub fn new() -> Self {
24        Self {
25            max: F::min_value(),
26        }
27    }
28}
29
30impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for Max<F> {
31    fn update(&mut self, x: F) {
32        if self.max < x {
33            self.max = x;
34        }
35    }
36    fn get(&self) -> F {
37        self.max
38    }
39}
40
41/// Running absolute max.
42/// # Examples
43/// ```
44/// use online_statistics::maximum::AbsMax;
45/// use online_statistics::stats::Univariate;
46/// let mut running_abs_max: AbsMax<f64> = AbsMax::new();
47/// for i in -17..10{
48///     running_abs_max.update(i as f64);
49/// }
50/// assert_eq!(running_abs_max.get(), 17.0);
51/// ```
52///
53#[derive(Default, Debug)]
54pub struct AbsMax<F: Float + FromPrimitive + AddAssign + SubAssign> {
55    abs_max: F,
56}
57
58impl<F: Float + FromPrimitive + AddAssign + SubAssign> AbsMax<F> {
59    pub fn new() -> Self {
60        Self {
61            abs_max: F::from_f64(0.0).unwrap(),
62        }
63    }
64}
65
66impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for AbsMax<F> {
67    fn update(&mut self, x: F) {
68        if self.abs_max < x.abs() {
69            self.abs_max = x.abs();
70        }
71    }
72    fn get(&self) -> F {
73        self.abs_max
74    }
75}
76
77/// Rolling max.
78/// # Arguments
79/// * `window_size` - Size of the rolling window.
80/// # Examples
81/// ```
82/// use online_statistics::maximum::RollingMax;
83/// use online_statistics::stats::Univariate;
84/// let mut rolling_max: RollingMax<f64> = RollingMax::new(3);
85/// for i in 1..10{
86///     rolling_max.update(i as f64);
87/// }
88/// assert_eq!(rolling_max.get(), 9.0);
89/// ```
90///
91#[derive(Serialize, Deserialize)]
92pub struct RollingMax<F: Float + FromPrimitive + AddAssign + SubAssign> {
93    sorted_window: SortedWindow<F>,
94}
95
96impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollingMax<F> {
97    pub fn new(window_size: usize) -> Self {
98        Self {
99            sorted_window: SortedWindow::new(window_size),
100        }
101    }
102}
103
104impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for RollingMax<F> {
105    fn update(&mut self, x: F) {
106        self.sorted_window.push_back(x);
107    }
108    fn get(&self) -> F {
109        self.sorted_window.back()
110    }
111}