Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/rolling/min_max.rs
8449 views
1
use arrow::bitmap::Bitmap;
2
use arrow::types::NativeType;
3
use polars_utils::IdxSize;
4
use polars_utils::min_max::MinMaxPolicy;
5
6
use super::RollingFnParams;
7
use super::arg_min_max::ArgMinMaxWindow;
8
use super::no_nulls::RollingAggWindowNoNulls;
9
use super::nulls::RollingAggWindowNulls;
10
11
/// Min/max window implemented on top of ArgMinMaxWindow (arg-based).
12
pub struct MinMaxWindow<'a, T, P> {
13
inner: ArgMinMaxWindow<'a, T, P>,
14
}
15
16
impl<'a, T: NativeType, P: MinMaxPolicy> RollingAggWindowNulls<T> for MinMaxWindow<'a, T, P> {
17
type This<'b> = MinMaxWindow<'b, T, P>;
18
19
fn new<'b>(
20
slice: &'b [T],
21
validity: &'b Bitmap,
22
start: usize,
23
end: usize,
24
params: Option<RollingFnParams>,
25
window_size: Option<usize>,
26
) -> Self::This<'b> {
27
assert!(params.is_none());
28
assert!(start <= slice.len() && end <= slice.len() && start <= end);
29
30
let inner = <ArgMinMaxWindow<'b, T, P> as RollingAggWindowNulls<T, IdxSize>>::new(
31
slice,
32
validity,
33
start,
34
end,
35
None,
36
window_size,
37
);
38
39
MinMaxWindow { inner }
40
}
41
42
unsafe fn update(&mut self, new_start: usize, new_end: usize) {
43
unsafe { RollingAggWindowNulls::<T, IdxSize>::update(&mut self.inner, new_start, new_end) };
44
}
45
46
fn get_agg(&self, idx: usize) -> Option<T> {
47
let rel = RollingAggWindowNulls::<T, IdxSize>::get_agg(&self.inner, idx)?;
48
let abs = self.inner.start + rel as usize;
49
unsafe { Some(*self.inner.values.get_unchecked(abs)) }
50
}
51
52
fn is_valid(&self, min_periods: usize) -> bool {
53
RollingAggWindowNulls::<T, IdxSize>::is_valid(&self.inner, min_periods)
54
}
55
56
fn slice_len(&self) -> usize {
57
RollingAggWindowNulls::<T, IdxSize>::slice_len(&self.inner)
58
}
59
}
60
61
impl<'a, T: NativeType, P: MinMaxPolicy> RollingAggWindowNoNulls<T> for MinMaxWindow<'a, T, P> {
62
type This<'b> = MinMaxWindow<'b, T, P>;
63
64
fn new<'b>(
65
slice: &'b [T],
66
start: usize,
67
end: usize,
68
params: Option<RollingFnParams>,
69
window_size: Option<usize>,
70
) -> Self::This<'b> {
71
assert!(params.is_none());
72
assert!(start <= slice.len() && end <= slice.len() && start <= end);
73
74
let inner = <ArgMinMaxWindow<'b, T, P> as RollingAggWindowNoNulls<T, IdxSize>>::new(
75
slice,
76
start,
77
end,
78
None,
79
window_size,
80
);
81
82
MinMaxWindow { inner }
83
}
84
85
unsafe fn update(&mut self, new_start: usize, new_end: usize) {
86
unsafe {
87
RollingAggWindowNoNulls::<T, IdxSize>::update(&mut self.inner, new_start, new_end);
88
};
89
}
90
91
fn get_agg(&self, idx: usize) -> Option<T> {
92
let rel = RollingAggWindowNoNulls::<T, IdxSize>::get_agg(&self.inner, idx)?;
93
let abs = self.inner.start + rel as usize;
94
unsafe { Some(*self.inner.values.get_unchecked(abs)) }
95
}
96
97
fn slice_len(&self) -> usize {
98
RollingAggWindowNoNulls::<T, IdxSize>::slice_len(&self.inner)
99
}
100
}
101
102