From 53b44d1a13be5bdb0208be0a4c9cd12180bc69c6 Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Fri, 5 May 2017 16:40:23 +0200 Subject: [PATCH] Add test comparing to streaming-stats --- benches/average.rs | 1 + src/lib.rs | 8 +++++--- tests/average.rs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 tests/average.rs diff --git a/benches/average.rs b/benches/average.rs index 59401a8..0d77de9 100644 --- a/benches/average.rs +++ b/benches/average.rs @@ -6,6 +6,7 @@ extern crate stats; use bencher::Bencher; +/// Create a random vector by sampling from a normal distribution. fn initialize_vec() -> Vec { use rand::distributions::{Normal, IndependentSample}; use rand::{XorShiftRng, SeedableRng}; diff --git a/src/lib.rs b/src/lib.rs index 72dba89..918f171 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -140,13 +140,15 @@ impl core::iter::FromIterator for Average { /// /// On panic, this macro will print the values of the expressions with their /// debug representations. +#[macro_export] macro_rules! assert_almost_eq { ($a:expr, $b:expr, $prec:expr) => ( - if ($a - $b).abs() > $prec { + let diff = ($a - $b).abs(); + if diff > $prec { panic!(format!( - "assertion failed: `abs(left - right) < {:e}`, \ + "assertion failed: `abs(left - right) = {:.1e} < {:e}`, \ (left: `{}`, right: `{}`)", - $prec, $a, $b)); + diff, $prec, $a, $b)); } ); } diff --git a/tests/average.rs b/tests/average.rs new file mode 100644 index 0000000..e6892f4 --- /dev/null +++ b/tests/average.rs @@ -0,0 +1,35 @@ +#[macro_use] extern crate average; + +extern crate rand; +extern crate stats; + +/// Create a random vector by sampling from a normal distribution. +fn initialize_vec(size: usize) -> Vec { + use rand::distributions::{Normal, IndependentSample}; + use rand::{XorShiftRng, SeedableRng}; + let normal = Normal::new(2.0, 3.0); + let mut values = Vec::with_capacity(size); + let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); + for _ in 0..size { + values.push(normal.ind_sample(&mut rng)); + } + values +} + +#[test] +fn average_vs_streaming_stats_small() { + let values = initialize_vec(100); + let a: average::Average = values.iter().map(|x| *x).collect(); + let b: stats::OnlineStats = values.iter().map(|x| *x).collect(); + assert_almost_eq!(a.mean(), b.mean(), 1e-16); + assert_almost_eq!(a.population_variance(), b.variance(), 1e-16); +} + +#[test] +fn average_vs_streaming_stats_large() { + let values = initialize_vec(1_000_000); + let a: average::Average = values.iter().map(|x| *x).collect(); + let b: stats::OnlineStats = values.iter().map(|x| *x).collect(); + assert_almost_eq!(a.mean(), b.mean(), 1e-16); + assert_almost_eq!(a.population_variance(), b.variance(), 1e-13); +}