1 | *//! Mixed bootstrap* |

2 | |

3 | **use** **crate**::stats::float::Float; |

4 | **use** **crate**::stats::tuple::{Tuple, TupledDistributionsBuilder}; |

5 | **use** **crate**::stats::univariate::Resamples; |

6 | **use** **crate**::stats::univariate::Sample; |

7 | #[cfg (feature = "rayon" )] |

8 | **use** rayon::prelude::*; |

9 | |

10 | */// Performs a *mixed* two-sample bootstrap* |

11 | **pub** **fn** bootstrap<A, T, S>( |

12 | a: &Sample<A>, |

13 | b: &Sample<A>, |

14 | nresamples: **usize**, |

15 | statistic: S, |

16 | ) -> T::Distributions |

17 | **where** |

18 | A: Float, |

19 | S: Fn(&Sample<A>, &Sample<A>) -> T + Sync, |

20 | T: Tuple + Send, |

21 | T::Distributions: Send, |

22 | T::Builder: Send, |

23 | { |

24 | **let** n_a = a.len(); |

25 | **let** n_b = b.len(); |

26 | **let** **mut** c = Vec::with_capacity(n_a + n_b); |

27 | c.extend_from_slice(a); |

28 | c.extend_from_slice(b); |

29 | **let** c = Sample::new(&c); |

30 | |

31 | #[cfg (feature = "rayon" )] |

32 | { |

33 | (`0`..nresamples) |

34 | .into_par_iter() |

35 | .map_init( |

36 | || Resamples::new(c), |

37 | |resamples, _| { |

38 | **let** resample = resamples.next(); |

39 | **let** a: &Sample<A> = Sample::new(&resample[..n_a]); |

40 | **let** b: &Sample<A> = Sample::new(&resample[n_a..]); |

41 | |

42 | statistic(a, b) |

43 | }, |

44 | ) |

45 | .fold( |

46 | || T::Builder::new(`0`), |

47 | |**mut** sub_distributions, sample| { |

48 | sub_distributions.push(sample); |

49 | sub_distributions |

50 | }, |

51 | ) |

52 | .reduce( |

53 | || T::Builder::new(`0`), |

54 | |**mut** a, **mut** b| { |

55 | a.extend(&**mut** b); |

56 | a |

57 | }, |

58 | ) |

59 | .complete() |

60 | } |

61 | #[cfg (not(feature = "rayon" ))] |

62 | { |

63 | **let** **mut** resamples = Resamples::new(c); |

64 | (`0`..nresamples) |

65 | .map(|_| { |

66 | **let** resample = resamples.next(); |

67 | **let** a: &Sample<A> = Sample::new(&resample[..n_a]); |

68 | **let** b: &Sample<A> = Sample::new(&resample[n_a..]); |

69 | |

70 | statistic(a, b) |

71 | }) |

72 | .fold(T::Builder::new(`0`), |**mut** sub_distributions, sample| { |

73 | sub_distributions.push(sample); |

74 | sub_distributions |

75 | }) |

76 | .complete() |

77 | } |

78 | } |

79 | |