@@ -130,8 +130,9 @@ impl Derivative for SavitzkyGolayFilter<u64> {
130
130
itr. next ( ) . unwrap_or_else ( || unreachable ! ( ) ) ,
131
131
itr. next ( ) . unwrap_or_else ( || unreachable ! ( ) ) ,
132
132
] ;
133
- let weighted_sum =
134
- ( 8 * ( data[ 3 ] . saturating_sub ( data[ 1 ] ) ) ) . saturating_sub ( data[ 4 ] . saturating_sub ( data[ 0 ] ) ) ;
133
+ let weighted_sum = 8u64
134
+ . saturating_mul ( data[ 3 ] . saturating_sub ( data[ 1 ] ) )
135
+ . saturating_sub ( data[ 4 ] . saturating_sub ( data[ 0 ] ) ) ;
135
136
let step: f64 = self . step . as_micros ( ) as f64 / 1_000_000. ;
136
137
if weighted_sum == 0 {
137
138
const NORMALIZATION : f64 = 2. ;
@@ -159,8 +160,9 @@ impl Derivative for SavitzkyGolayFilter<PacketAndByte<u64>> {
159
160
itr. next ( ) . unwrap_or_else ( || unreachable ! ( ) ) ,
160
161
itr. next ( ) . unwrap_or_else ( || unreachable ! ( ) ) ,
161
162
] ;
162
- let weighted_sum_bytes =
163
- ( 8 * ( data[ 3 ] . bytes - data[ 1 ] . bytes ) ) . saturating_sub ( data[ 4 ] . bytes - data[ 0 ] . bytes ) ;
163
+ let weighted_sum_bytes = 8u64
164
+ . saturating_mul ( data[ 3 ] . bytes - data[ 1 ] . bytes )
165
+ . saturating_sub ( data[ 4 ] . bytes - data[ 0 ] . bytes ) ;
164
166
let step: f64 = self . step . as_micros ( ) as f64 / 1_000_000. ;
165
167
if weighted_sum_bytes == 0 {
166
168
const NORMALIZATION : f64 = 2. ;
@@ -170,7 +172,8 @@ impl Derivative for SavitzkyGolayFilter<PacketAndByte<u64>> {
170
172
bytes : data[ 3 ] . bytes . saturating_sub ( data[ 1 ] . bytes ) as f64 / ( NORMALIZATION * step) ,
171
173
} ) ;
172
174
}
173
- let weighted_sum_packets = ( 8 * ( data[ 3 ] . packets . saturating_sub ( data[ 1 ] . packets ) ) )
175
+ let weighted_sum_packets = 8u64
176
+ . saturating_mul ( data[ 3 ] . packets . saturating_sub ( data[ 1 ] . packets ) )
174
177
. saturating_sub ( data[ 4 ] . packets . saturating_sub ( data[ 0 ] . packets ) ) ;
175
178
const NORMALIZATION : f64 = 12. ;
176
179
let packets = weighted_sum_packets as f64 / ( NORMALIZATION * step) ;
@@ -491,19 +494,16 @@ mod contract {
491
494
492
495
impl TypeGenerator for SavitzkyGolayFilter < PacketAndByte < u64 > > {
493
496
fn generate < D : Driver > ( driver : & mut D ) -> Option < Self > {
494
- // we use % to mitigate overflows in this generator.
495
497
let mut step = driver. produce ( ) ?;
496
498
if step == Duration :: ZERO {
497
499
step += Duration :: from_secs ( 1 ) ;
498
500
}
499
501
let mut filter = SavitzkyGolayFilter :: new ( step) ;
500
502
let entries: u8 = driver. produce :: < u8 > ( ) ? % 15 ;
501
503
let mut state = driver. produce :: < PacketAndByte < u64 > > ( ) ?;
502
- state. packets %= u64:: MAX / 32 ;
503
- state. bytes %= u64:: MAX / 32 ;
504
504
for _ in 0 ..entries {
505
- state. packets += driver. produce :: < u64 > ( ) ? % ( u64 :: MAX / 32 ) ;
506
- state. bytes += driver. produce :: < u64 > ( ) ? % ( u64 :: MAX / 32 ) ;
505
+ state. packets = state . packets . saturating_add ( driver. produce :: < u64 > ( ) ?) ;
506
+ state. bytes = state . bytes . saturating_add ( driver. produce :: < u64 > ( ) ?) ;
507
507
filter. push ( state) ;
508
508
}
509
509
Some ( filter)
@@ -528,8 +528,8 @@ mod contract {
528
528
state. dst . insert ( k, v) ;
529
529
}
530
530
Some ( x) => {
531
- x. packets += v. packets ;
532
- x. bytes += v. bytes ;
531
+ x. packets = x . packets . saturating_add ( v. packets ) ;
532
+ x. bytes = x . bytes . saturating_add ( v. bytes ) ;
533
533
}
534
534
}
535
535
}
@@ -723,8 +723,10 @@ mod test {
723
723
. for_each (
724
724
|x : & SavitzkyGolayFilter < PacketAndByte < u64 > > | match x. derivative ( ) {
725
725
Ok ( x) => {
726
- assert ! ( x. packets >= 0.0 ) ;
727
- assert ! ( x. bytes >= 0.0 ) ;
726
+ if !x. packets . is_nan ( ) {
727
+ assert ! ( x. packets >= 0.0 ) ;
728
+ assert ! ( x. bytes >= 0.0 ) ;
729
+ }
728
730
}
729
731
Err ( DerivativeError :: NotEnoughSamples ( s) ) => {
730
732
assert_eq ! ( x. idx, s) ;
0 commit comments