@@ -42,6 +42,7 @@ fn main() {
42
42
// lists of edges, ranks, and changes.
43
43
let mut edges = Vec :: new ( ) ;
44
44
let mut ranks = Vec :: new ( ) ;
45
+ let mut diffs = Vec :: new ( ) ; // for received but un-acted upon deltas.
45
46
let mut delta = Vec :: new ( ) ;
46
47
47
48
let timer = :: std:: time:: Instant :: now ( ) ;
@@ -72,6 +73,7 @@ fn main() {
72
73
// 0. ensure enough state allocated
73
74
while edges. len ( ) <= src { edges. push ( Vec :: new ( ) ) ; }
74
75
while ranks. len ( ) <= src { ranks. push ( 1_000 ) ; }
76
+ while diffs. len ( ) <= src { diffs. push ( 0 ) ; }
75
77
76
78
// 1. subtract previous distribution.
77
79
allocate ( ranks[ src] , & edges[ src] [ ..] , & mut delta) ;
@@ -115,13 +117,18 @@ fn main() {
115
117
// 0. ensure enough state allocated
116
118
while edges. len ( ) <= src { edges. push ( Vec :: new ( ) ) ; }
117
119
while ranks. len ( ) <= src { ranks. push ( 1_000 ) ; }
120
+ while diffs. len ( ) <= src { diffs. push ( 0 ) ; }
118
121
119
122
// 1. subtract previous distribution.
120
123
allocate ( ranks[ src] , & edges[ src] [ ..] , & mut delta) ;
121
124
for x in delta. iter_mut ( ) { x. 1 *= -1 ; }
122
125
123
126
// 2. update ranks.
124
- ranks[ src] += diff;
127
+ diffs[ src] += diff;
128
+ if diffs[ src] . abs ( ) >= 6 {
129
+ ranks[ src] += diffs[ src] ;
130
+ diffs[ src] = 0 ;
131
+ }
125
132
126
133
// 3. re-distribute allocations.
127
134
allocate ( ranks[ src] , & edges[ src] [ ..] , & mut delta) ;
@@ -197,10 +204,11 @@ fn allocate(rank: i64, edges: &[(usize, i64)], send: &mut Vec<(usize, i64)>) {
197
204
assert ! ( rank >= 0 ) ;
198
205
assert ! ( edges. iter( ) . all( |x| x. 1 > 0 ) ) ;
199
206
200
- let degree: i64 = edges. iter ( ) . map ( |x| x. 1 as i64 ) . sum ( ) ;
201
- let share = ( ( rank * 5 ) / 6 ) / degree;
207
+ let distribute = ( rank * 5 ) / 6 ;
208
+ let degree = edges. len ( ) as i64 ;
209
+ let share = distribute / degree;
202
210
for i in 0 .. edges. len ( ) {
203
- if ( i as i64 ) < ( share % ( edges. len ( ) as i64 ) ) {
211
+ if ( i as i64 ) < ( distribute % ( edges. len ( ) as i64 ) ) {
204
212
send. push ( ( edges[ i] . 0 , edges[ i] . 1 * ( share + 1 ) ) ) ;
205
213
}
206
214
else {
0 commit comments