1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use crate::set::traits::Finite;
use num::{Float, FromPrimitive, Num};
pub trait WeightedSum<Item, V>
where
V: Copy + Num, {
fn weighted_sum(self) -> V;
}
impl<I, P, Dtype> WeightedSum<(P, Dtype), Dtype> for I
where
I: Iterator<Item = (P, Dtype)>,
P: Finite,
Dtype: Float + FromPrimitive,
{
fn weighted_sum(self) -> Dtype {
crate::stats::kahan_sigma(self, |(interval, value)| {
Dtype::from_usize(interval.size())
.expect("failed to convert from usize to Dtype")
* value
})
}
}
#[cfg(test)]
mod tests {
use crate::{interval::I64Interval, iter::weighted_sum::WeightedSum};
#[test]
fn test_weighted_sum() {
let arr = vec![
(I64Interval::new(2, 5), 2f32),
(I64Interval::new(10, 25), 1.5),
(I64Interval::new(1, 5), 0.5),
];
assert_eq!(arr.into_iter().weighted_sum(), 34.5);
let arr = vec![
(I64Interval::new(0, 9), -2f64),
(I64Interval::new(9, 15), 1.5),
(I64Interval::new(0, 20), 0.5),
];
assert_eq!(arr.into_iter().weighted_sum(), 1.0);
}
}