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}