use crate::sorted_window::SortedWindow;
use crate::stats::Univariate;
use num::{Float, FromPrimitive};
use serde::{Deserialize, Serialize};
use std::ops::{AddAssign, SubAssign};
#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)]
pub struct Max<F: Float + FromPrimitive + AddAssign + SubAssign> {
pub max: F,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Max<F> {
pub fn new() -> Self {
Self {
max: F::min_value(),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for Max<F> {
fn update(&mut self, x: F) {
if self.max < x {
self.max = x;
}
}
fn get(&self) -> F {
self.max
}
}
#[derive(Default, Debug)]
pub struct AbsMax<F: Float + FromPrimitive + AddAssign + SubAssign> {
abs_max: F,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> AbsMax<F> {
pub fn new() -> Self {
Self {
abs_max: F::from_f64(0.0).unwrap(),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for AbsMax<F> {
fn update(&mut self, x: F) {
if self.abs_max < x.abs() {
self.abs_max = x.abs();
}
}
fn get(&self) -> F {
self.abs_max
}
}
#[derive(Serialize, Deserialize)]
pub struct RollingMax<F: Float + FromPrimitive + AddAssign + SubAssign> {
sorted_window: SortedWindow<F>,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollingMax<F> {
pub fn new(window_size: usize) -> Self {
Self {
sorted_window: SortedWindow::new(window_size),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for RollingMax<F> {
fn update(&mut self, x: F) {
self.sorted_window.push_back(x);
}
fn get(&self) -> F {
self.sorted_window.back()
}
}