@@ -5,18 +5,16 @@ use educe::Educe;
55use serde:: { Deserialize , Serialize } ;
66use 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]
1412pub struct Mean < P > {
15- pipe : P ,
13+ pipe : P ,
1614}
1715
1816impl_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
3432pub struct MeanFolder < Step > {
35- marker : PhantomData < fn ( ) -> Step > ,
33+ marker : PhantomData < fn ( ) -> Step > ,
3634}
3735
3836pub struct StepA ;
3937pub struct StepB ;
4038
4139#[ derive( Serialize , Deserialize , new) ]
4240pub 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
5149impl 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
7974impl 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