online_statistics/
maximum.rs1use crate::sorted_window::SortedWindow;
2use crate::stats::Univariate;
3use num::{Float, FromPrimitive};
4use serde::{Deserialize, Serialize};
5use std::ops::{AddAssign, SubAssign};
6#[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#[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#[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}