criterion/stats/bivariate/
bootstrap.rs
1#[cfg(test)]
2macro_rules! test {
3 ($ty:ident) => {
4 mod $ty {
5 use quickcheck::TestResult;
6
7 use stats::bivariate::regression::Slope;
8 use stats::bivariate::Data;
9
10 quickcheck! {
11 fn means(size: usize, start: usize,
12 offset: usize, nresamples: usize) -> TestResult {
13 if let Some(x) = ::stats::test::vec::<$ty>(size, start) {
14 let y = ::stats::test::vec::<$ty>(size + offset, start + offset).unwrap();
15 let data = Data::new(&x[start..], &y[start+offset..]);
16
17 let (x_means, y_means) = if nresamples > 0 {
18 data.bootstrap(nresamples, |d| (d.x().mean(), d.y().mean()))
19 } else {
20 return TestResult::discard();
21 };
22
23 let x_min = data.x().min();
24 let x_max = data.x().max();
25 let y_min = data.y().min();
26 let y_max = data.y().max();
27
28 TestResult::from_bool(
29 x_means.len() == nresamples &&
31 y_means.len() == nresamples &&
32 x_means.iter().all(|&x| {
34 (x > x_min || relative_eq!(x, x_min)) &&
35 (x < x_max || relative_eq!(x, x_max))
36 }) &&
37 y_means.iter().all(|&y| {
38 (y > y_min || relative_eq!(y, y_min)) &&
39 (y < y_max || relative_eq!(y, y_max))
40 })
41 )
42 } else {
43 TestResult::discard()
44 }
45 }
46 }
47
48 quickcheck! {
49 fn slope(size: usize, start: usize,
50 offset: usize, nresamples: usize) -> TestResult {
51 if let Some(x) = ::stats::test::vec::<$ty>(size, start) {
52 let y = ::stats::test::vec::<$ty>(size + offset, start + offset).unwrap();
53 let data = Data::new(&x[start..], &y[start+offset..]);
54
55 let slopes = if nresamples > 0 {
56 data.bootstrap(nresamples, |d| (Slope::fit(&d),)).0
57 } else {
58 return TestResult::discard();
59 };
60
61 TestResult::from_bool(
62 slopes.len() == nresamples &&
64 slopes.iter().all(|s| s.0 > 0.)
66 )
67 } else {
68 TestResult::discard()
69 }
70 }
71 }
72
73 }
74 };
75}
76
77#[cfg(test)]
78mod test {
79 test!(f32);
80 test!(f64);
81}