polars_utils/
arg_min_max.rs1use crate::float16::pf16;
2
3pub trait ArgMinMax {
4 fn argmin(&self) -> usize;
5
6 fn argmax(&self) -> usize;
7}
8
9macro_rules! impl_argminmax {
10 ($T:ty) => {
11 impl ArgMinMax for $T {
12 fn argmin(&self) -> usize {
13 argminmax::ArgMinMax::argmin(self)
14 }
15
16 fn argmax(&self) -> usize {
17 argminmax::ArgMinMax::argmax(self)
18 }
19 }
20 };
21}
22
23impl_argminmax!(&[u8]);
24impl_argminmax!(&[u16]);
25impl_argminmax!(&[u32]);
26impl_argminmax!(&[u64]);
27impl_argminmax!(&[i8]);
28impl_argminmax!(&[i16]);
29impl_argminmax!(&[i32]);
30impl_argminmax!(&[i64]);
31impl_argminmax!(&[f32]);
32impl_argminmax!(&[f64]);
33
34impl ArgMinMax for &[i128] {
35 fn argmin(&self) -> usize {
36 let mut min_val = i128::MAX;
37 let mut min_idx = 0;
38 for (idx, val) in self.iter().enumerate() {
39 if *val < min_val {
40 min_val = *val;
41 min_idx = idx;
42 }
43 }
44 min_idx
45 }
46
47 fn argmax(&self) -> usize {
48 let mut max_val = i128::MIN;
49 let mut max_idx = 0;
50 for (idx, val) in self.iter().enumerate() {
51 if *val > max_val {
52 max_val = *val;
53 max_idx = idx;
54 }
55 }
56 max_idx
57 }
58}
59
60impl ArgMinMax for &[u128] {
61 fn argmin(&self) -> usize {
62 let mut min_val = u128::MAX;
63 let mut min_idx = 0;
64 for (idx, val) in self.iter().enumerate() {
65 if *val < min_val {
66 min_val = *val;
67 min_idx = idx;
68 }
69 }
70 min_idx
71 }
72
73 fn argmax(&self) -> usize {
74 let mut max_val = u128::MIN;
75 let mut max_idx = 0;
76 for (idx, val) in self.iter().enumerate() {
77 if *val > max_val {
78 max_val = *val;
79 max_idx = idx;
80 }
81 }
82 max_idx
83 }
84}
85
86impl ArgMinMax for &[pf16] {
87 fn argmin(&self) -> usize {
88 let transmuted: &&[half::f16] = unsafe { std::mem::transmute(self) };
89 argminmax::ArgMinMax::argmin(transmuted)
90 }
91
92 fn argmax(&self) -> usize {
93 let transmuted: &&[half::f16] = unsafe { std::mem::transmute(self) };
94 argminmax::ArgMinMax::argmax(transmuted)
95 }
96}