Skip to content

Commit 26c9d5e

Browse files
committed
adding stats functions
1 parent c2f0e8f commit 26c9d5e

File tree

1 file changed

+48
-51
lines changed

1 file changed

+48
-51
lines changed

amadeus-core/src/par_sink/stats.rs

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@ use educe::Educe;
55
use serde::{Deserialize, Serialize};
66
use std::marker::PhantomData;
77

8-
use super::{
9-
folder_par_sink, FolderSync, FolderSyncReducer, ParallelPipe, ParallelSink
10-
};
8+
use super::{folder_par_sink, FolderSync, FolderSyncReducer, ParallelPipe, ParallelSink};
119

1210
#[derive(new)]
1311
#[must_use]
1412
pub struct Mean<P> {
15-
pipe: P,
13+
pipe: P,
1614
}
1715

1816
impl_par_dist! {
19-
impl<P: ParallelPipe<Item, Output = f64>, Item> ParallelSink<Item> for Mean<P> {
17+
impl<P: ParallelPipe<Item, Output = f64>, Item> ParallelSink<Item> for Mean<P> {
2018
folder_par_sink!(
2119
MeanFolder<StepA>,
2220
MeanFolder<StepB>,
@@ -32,69 +30,68 @@ impl_par_dist! {
3230
#[serde(bound = "")]
3331

3432
pub struct MeanFolder<Step> {
35-
marker: PhantomData<fn() -> Step>,
33+
marker: PhantomData<fn() -> Step>,
3634
}
3735

3836
pub struct StepA;
3937
pub struct StepB;
4038

4139
#[derive(Serialize, Deserialize, new)]
4240
pub struct State {
43-
#[new(default)]
44-
mean: f64,
45-
#[new(default)]
46-
correction: f64,
47-
#[new(default)]
48-
count: u64,
41+
#[new(default)]
42+
mean: f64,
43+
#[new(default)]
44+
correction: f64,
45+
#[new(default)]
46+
count: u64,
4947
}
5048

5149
impl FolderSync<f64> for MeanFolder<StepA> {
52-
type State = State;
53-
type Done = f64;
54-
55-
#[inline(always)]
56-
fn zero(&mut self) -> Self::State {
57-
State::new()
58-
}
59-
60-
#[inline(always)]
61-
fn push(&mut self, state: &mut Self::State, item: f64) {
62-
state.count += 1;
63-
let f = (item - state.mean) / (state.count as f64);
64-
let y = f - state.correction;
65-
let t = state.mean + y;
66-
state.correction = (t - state.mean) - y;
67-
state.mean = t;
68-
}
69-
70-
#[inline(always)]
71-
fn done(&mut self, state: Self::State) -> Self::Done {
72-
state.mean
73-
}
74-
}
50+
type State = State;
51+
type Done = f64;
7552

53+
#[inline(always)]
54+
fn zero(&mut self) -> Self::State {
55+
State::new()
56+
}
7657

58+
#[inline(always)]
59+
fn push(&mut self, state: &mut Self::State, item: f64) {
60+
state.count += 1;
61+
let f = (item - state.mean) / (state.count as f64);
62+
let y = f - state.correction;
63+
let t = state.mean + y;
64+
state.correction = (t - state.mean) - y;
65+
state.mean = t;
66+
}
7767

68+
#[inline(always)]
69+
fn done(&mut self, state: Self::State) -> Self::Done {
70+
state.mean
71+
}
72+
}
7873

7974
impl FolderSync<State> for MeanFolder<StepB> {
80-
type State = State;
81-
type Done = f64;
75+
type State = State;
76+
type Done = f64;
8277

83-
#[inline(always)]
84-
fn zero(&mut self) -> Self::State {
85-
State::new()
86-
}
78+
#[inline(always)]
79+
fn zero(&mut self) -> Self::State {
80+
State::new()
81+
}
8782

88-
#[inline(always)]
83+
#[inline(always)]
8984
fn push(&mut self, state: &mut Self::State, item: State) {
90-
state.correction = todo!();
91-
state.mean = ((state.mean * state.count as f64) + (item.mean * item.count as f64)) / ((state.count + item.count) as f64);
92-
state.count += item.count;
93-
}
94-
95-
#[inline(always)]
96-
fn done(&mut self, state: Self::State) -> Self::Done {
97-
state.mean
98-
}
85+
state.correction = ((state.correction * state.count as f64)
86+
+ (item.correction * item.count as f64))
87+
/ ((state.count + item.count) as f64);
88+
state.mean = ((state.mean * state.count as f64) + (item.mean * item.count as f64))
89+
/ ((state.count + item.count) as f64);
90+
state.count += item.count;
91+
}
9992

93+
#[inline(always)]
94+
fn done(&mut self, state: Self::State) -> Self::Done {
95+
state.mean
96+
}
10097
}

0 commit comments

Comments
 (0)