Struct mz_ore::stats::SlidingMinMax
source · pub struct SlidingMinMax<T> {
stacks: Vec<(T, T, T)>,
push_stack_len: usize,
}
Expand description
Keeps track of the minimum and maximum value over a fixed-size sliding window of samples.
Inspired by the moving_min_max
crate, see that crate’s documentation for a description of
the high-level algorithm used here.
There are two major differences to moving_min_max
:
SlidingMinMax
tracks both the minimum and the maximum value at the same time.SlidingMinMax
assumes a fixed-size window. Pushing new samples automatically pops old ones and there is no support for manually popping samples.
The memory required for a SlidingMinMax
value is size_of::<T> * 3 * window_size
, plus a
small constant overhead.
Fields§
§stacks: Vec<(T, T, T)>
The push stack and the pop stack, merged into one allocation to optimize memory usage.
The push stack is the first push_stack_len
items, the pop stack is the rest.
The push stack grows to the right, the pop stack grows to the left.
+––––––––––––––––+ | push stack –> | <– pop stack | +––––––––^—————^ push_stack_len
New samples are pushed to the push stack, together with the current minimum and maximum
values. If the pop stack is not empty, each push implicitly pops an element from the pop
stack, by increasing push_stack_len
. Once the push stack has reached the window size
(i.e. the capacity of stacks
), we “flip” the stacks by converting the push stack into a
full pop stack with an inverted order of samples and min/max values. After the flip,
push_stack_len
is zero again, and new samples can be pushed to the push stack.
push_stack_len: usize
The length of the push stack.
The top of the push stack is stacks[push_stack_len - 1]
.
The top of the pop stack is stacks[push_stack_len]
.
Implementations§
source§impl<T> SlidingMinMax<T>where
T: Clone + PartialOrd,
impl<T> SlidingMinMax<T>where
T: Clone + PartialOrd,
sourcefn top_of_push_stack(&self) -> Option<&(T, T, T)>
fn top_of_push_stack(&self) -> Option<&(T, T, T)>
Returns a reference to the item at the top of the push stack.
sourcefn top_of_pop_stack(&self) -> Option<&(T, T, T)>
fn top_of_pop_stack(&self) -> Option<&(T, T, T)>
Returns a reference to the item at the top of the pop stack.
sourcepub fn add_sample(&mut self, sample: T)
pub fn add_sample(&mut self, sample: T)
Adds the given sample.
sourcefn flip_stacks(&mut self)
fn flip_stacks(&mut self)
Drains the push stack into the pop stack.
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for SlidingMinMax<T>
impl<T> RefUnwindSafe for SlidingMinMax<T>where
T: RefUnwindSafe,
impl<T> Send for SlidingMinMax<T>where
T: Send,
impl<T> Sync for SlidingMinMax<T>where
T: Sync,
impl<T> Unpin for SlidingMinMax<T>where
T: Unpin,
impl<T> UnwindSafe for SlidingMinMax<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request