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                            // Computed the correct number of resamples
30                            x_means.len() == nresamples &&
31                            y_means.len() == nresamples &&
32                            // No uninitialized values
33                            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                            // Computed the correct number of resamples
63                            slopes.len() == nresamples &&
64                            // No uninitialized values
65                            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}