criterion/stats/bivariate/
resamples.rs

1use stats::float::Float;
2use stats::rand_util::{new_rng, Range, Rng};
3
4use stats::bivariate::Data;
5
6pub struct Resamples<'a, X, Y>
7where
8    X: 'a + Float,
9    Y: 'a + Float,
10{
11    range: Range,
12    rng: Rng,
13    data: (&'a [X], &'a [Y]),
14    stage: Option<(Vec<X>, Vec<Y>)>,
15}
16
17#[cfg_attr(feature = "cargo-clippy", allow(clippy::should_implement_trait))]
18impl<'a, X, Y> Resamples<'a, X, Y>
19where
20    X: 'a + Float,
21    Y: 'a + Float,
22{
23    pub fn new(data: Data<'a, X, Y>) -> Resamples<'a, X, Y> {
24        Resamples {
25            range: Range::new_exclusive(0, data.0.len()),
26            rng: new_rng(),
27            data: (data.x(), data.y()),
28            stage: None,
29        }
30    }
31
32    pub fn next(&mut self) -> Data<X, Y> {
33        let n = self.data.0.len();
34        let rng = &mut self.rng;
35
36        match self.stage {
37            None => {
38                let mut stage = (Vec::with_capacity(n), Vec::with_capacity(n));
39
40                for _ in 0..n {
41                    let i = self.range.sample(rng);
42
43                    stage.0.push(self.data.0[i]);
44                    stage.1.push(self.data.1[i]);
45                }
46
47                self.stage = Some(stage);
48            }
49            Some(ref mut stage) => {
50                for i in 0..n {
51                    let j = self.range.sample(rng);
52
53                    stage.0[i] = self.data.0[j];
54                    stage.1[i] = self.data.1[j];
55                }
56            }
57        }
58
59        if let Some((ref x, ref y)) = self.stage {
60            Data(x, y)
61        } else {
62            unreachable!();
63        }
64    }
65}