Skip to content

Commit 869a29b

Browse files
committed
Support run-time polymorphism of Rng in Distribution::sample
1 parent 5dcf7f9 commit 869a29b

File tree

9 files changed

+54
-55
lines changed

9 files changed

+54
-55
lines changed

src/distributions/exponential.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ pub struct Exp1;
4242
// This could be done via `-rng.gen::<f64>().ln()` but that is slower.
4343
impl Distribution<f64> for Exp1 {
4444
#[inline]
45-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
45+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
4646
#[inline]
4747
fn pdf(x: f64) -> f64 {
4848
(-x).exp()
4949
}
5050
#[inline]
51-
fn zero_case<R:Rng>(rng: &mut R, _u: f64) -> f64 {
51+
fn zero_case<R: Rng + ?Sized>(rng: &mut R, _u: f64) -> f64 {
5252
ziggurat_tables::ZIG_EXP_R - rng.gen::<f64>().ln()
5353
}
5454

@@ -90,7 +90,7 @@ impl Exp {
9090
}
9191

9292
impl Distribution<f64> for Exp {
93-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
93+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
9494
let n: f64 = rng.sample(Exp1);
9595
n * self.lambda_inverse
9696
}

src/distributions/float.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ macro_rules! float_impls {
6868
/// See `Closed01` for the closed interval `[0,1]`,
6969
/// and `Open01` for the open interval `(0,1)`.
7070
#[inline]
71-
fn sample<R: Rng>(&self, rng: &mut R) -> $ty {
71+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $ty {
7272
rng.$method_name()
7373
}
7474
}
7575
impl Distribution<$ty> for Open01 {
7676
#[inline]
77-
fn sample<R: Rng>(&self, rng: &mut R) -> $ty {
77+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $ty {
7878
// add 0.5 * epsilon, so that smallest number is
7979
// greater than 0, and largest number is still
8080
// less than 1, specifically 1 - 0.5 * epsilon.
@@ -83,7 +83,7 @@ macro_rules! float_impls {
8383
}
8484
impl Distribution<$ty> for Closed01 {
8585
#[inline]
86-
fn sample<R: Rng>(&self, rng: &mut R) -> $ty {
86+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> $ty {
8787
// rescale so that 1.0 - epsilon becomes 1.0
8888
// precisely.
8989
rng.$method_name() * SCALE / (SCALE - 1.0)

src/distributions/gamma.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ impl GammaLargeShape {
134134
}
135135

136136
impl Distribution<f64> for Gamma {
137-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
137+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
138138
match self.repr {
139139
Small(ref g) => g.sample(rng),
140140
One(ref g) => g.sample(rng),
@@ -143,14 +143,14 @@ impl Distribution<f64> for Gamma {
143143
}
144144
}
145145
impl Distribution<f64> for GammaSmallShape {
146-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
146+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
147147
let u: f64 = rng.sample(Open01);
148148

149149
self.large_shape.sample(rng) * u.powf(self.inv_shape)
150150
}
151151
}
152152
impl Distribution<f64> for GammaLargeShape {
153-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
153+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
154154
loop {
155155
let x = rng.sample(StandardNormal);
156156
let v_cbrt = 1.0 + self.c * x;
@@ -215,7 +215,7 @@ impl ChiSquared {
215215
}
216216
}
217217
impl Distribution<f64> for ChiSquared {
218-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
218+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
219219
match self.repr {
220220
DoFExactlyOne => {
221221
// k == 1 => N(0,1)^2
@@ -266,7 +266,7 @@ impl FisherF {
266266
}
267267
}
268268
impl Distribution<f64> for FisherF {
269-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
269+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
270270
self.numer.sample(rng) / self.denom.sample(rng) * self.dof_ratio
271271
}
272272
}
@@ -301,7 +301,7 @@ impl StudentT {
301301
}
302302
}
303303
impl Distribution<f64> for StudentT {
304-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
304+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
305305
let norm = rng.sample(StandardNormal);
306306
norm * (self.dof / self.chi.sample(rng)).sqrt()
307307
}

src/distributions/integer.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use distributions::{Distribution, Uniform};
1717

1818
impl Distribution<isize> for Uniform {
1919
#[inline]
20-
fn sample<R: Rng>(&self, rng: &mut R) -> isize {
20+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> isize {
2121
if mem::size_of::<isize>() == 4 {
2222
rng.gen::<i32>() as isize
2323
} else {
@@ -28,43 +28,43 @@ impl Distribution<isize> for Uniform {
2828

2929
impl Distribution<i8> for Uniform {
3030
#[inline]
31-
fn sample<R: Rng>(&self, rng: &mut R) -> i8 {
31+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> i8 {
3232
rng.next_u32() as i8
3333
}
3434
}
3535

3636
impl Distribution<i16> for Uniform {
3737
#[inline]
38-
fn sample<R: Rng>(&self, rng: &mut R) -> i16 {
38+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> i16 {
3939
rng.next_u32() as i16
4040
}
4141
}
4242

4343
impl Distribution<i32> for Uniform {
4444
#[inline]
45-
fn sample<R: Rng>(&self, rng: &mut R) -> i32 {
45+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> i32 {
4646
rng.next_u32() as i32
4747
}
4848
}
4949

5050
impl Distribution<i64> for Uniform {
5151
#[inline]
52-
fn sample<R: Rng>(&self, rng: &mut R) -> i64 {
52+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> i64 {
5353
rng.next_u64() as i64
5454
}
5555
}
5656

5757
#[cfg(feature = "i128_support")]
5858
impl Distribution<i128> for Uniform {
5959
#[inline]
60-
fn sample<R: Rng>(&self, rng: &mut R) -> i128 {
60+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> i128 {
6161
rng.gen::<u128>() as i128
6262
}
6363
}
6464

6565
impl Distribution<usize> for Uniform {
6666
#[inline]
67-
fn sample<R: Rng>(&self, rng: &mut R) -> usize {
67+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> usize {
6868
if mem::size_of::<usize>() == 4 {
6969
rng.gen::<u32>() as usize
7070
} else {
@@ -75,36 +75,36 @@ impl Distribution<usize> for Uniform {
7575

7676
impl Distribution<u8> for Uniform {
7777
#[inline]
78-
fn sample<R: Rng>(&self, rng: &mut R) -> u8 {
78+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u8 {
7979
rng.next_u32() as u8
8080
}
8181
}
8282

8383
impl Distribution<u16> for Uniform {
8484
#[inline]
85-
fn sample<R: Rng>(&self, rng: &mut R) -> u16 {
85+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u16 {
8686
rng.next_u32() as u16
8787
}
8888
}
8989

9090
impl Distribution<u32> for Uniform {
9191
#[inline]
92-
fn sample<R: Rng>(&self, rng: &mut R) -> u32 {
92+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u32 {
9393
rng.next_u32()
9494
}
9595
}
9696

9797
impl Distribution<u64> for Uniform {
9898
#[inline]
99-
fn sample<R: Rng>(&self, rng: &mut R) -> u64 {
99+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u64 {
100100
rng.next_u64()
101101
}
102102
}
103103

104104
#[cfg(feature = "i128_support")]
105105
impl Distribution<u128> for Uniform {
106106
#[inline]
107-
fn sample<R: Rng>(&self, rng: &mut R) -> u128 {
107+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> u128 {
108108
((rng.next_u64() as u128) << 64) | (rng.next_u64() as u128)
109109
}
110110
}

src/distributions/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,11 @@ mod impls {
123123
pub trait Distribution<T> {
124124
/// Generate a random value of `T`, using `rng` as the
125125
/// source of randomness.
126-
fn sample<R: Rng>(&self, rng: &mut R) -> T;
126+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> T;
127127
}
128128

129129
impl<'a, T, D: Distribution<T>> Distribution<T> for &'a D {
130-
fn sample<R: Rng>(&self, rng: &mut R) -> T {
130+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> T {
131131
(*self).sample(rng)
132132
}
133133
}
@@ -265,7 +265,7 @@ impl<'a, T: Clone> WeightedChoice<'a, T> {
265265
}
266266

267267
impl<'a, T: Clone> Distribution<T> for WeightedChoice<'a, T> {
268-
fn sample<R: Rng>(&self, rng: &mut R) -> T {
268+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> T {
269269
// we want to find the first element that has cumulative
270270
// weight > sample_weight, which we do by binary since the
271271
// cumulative weights of self.items are sorted.
@@ -324,7 +324,7 @@ impl<'a, T: Clone> Distribution<T> for WeightedChoice<'a, T> {
324324
// size from force-inlining.
325325
#[cfg(feature="std")]
326326
#[inline(always)]
327-
fn ziggurat<R: Rng, P, Z>(
327+
fn ziggurat<R: Rng + ?Sized, P, Z>(
328328
rng: &mut R,
329329
symmetric: bool,
330330
x_tab: ziggurat_tables::ZigTable,

src/distributions/normal.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ use distributions::{ziggurat, ziggurat_tables, Distribution, Open01};
3838
pub struct StandardNormal;
3939

4040
impl Distribution<f64> for StandardNormal {
41-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
41+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
4242
#[inline]
4343
fn pdf(x: f64) -> f64 {
4444
(-x*x/2.0).exp()
4545
}
4646
#[inline]
47-
fn zero_case<R:Rng>(rng: &mut R, u: f64) -> f64 {
47+
fn zero_case<R: Rng + ?Sized>(rng: &mut R, u: f64) -> f64 {
4848
// compute a random number in the tail by hand
4949

5050
// strange initial conditions, because the loop is not
@@ -110,7 +110,7 @@ impl Normal {
110110
}
111111
}
112112
impl Distribution<f64> for Normal {
113-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
113+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
114114
let n = rng.sample(StandardNormal);
115115
self.mean + self.std_dev * n
116116
}
@@ -151,7 +151,7 @@ impl LogNormal {
151151
}
152152
}
153153
impl Distribution<f64> for LogNormal {
154-
fn sample<R: Rng>(&self, rng: &mut R) -> f64 {
154+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 {
155155
self.norm.sample(rng).exp()
156156
}
157157
}

src/distributions/other.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use distributions::{Distribution, Uniform};
1717

1818
impl Distribution<char> for Uniform {
1919
#[inline]
20-
fn sample<R: Rng>(&self, rng: &mut R) -> char {
20+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> char {
2121
// a char is 21 bits
2222
const CHAR_MASK: u32 = 0x001f_ffff;
2323
loop {
@@ -34,7 +34,7 @@ impl Distribution<char> for Uniform {
3434

3535
impl Distribution<bool> for Uniform {
3636
#[inline]
37-
fn sample<R: Rng>(&self, rng: &mut R) -> bool {
37+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> bool {
3838
rng.gen::<u8>() & 1 == 1
3939
}
4040
}
@@ -49,7 +49,7 @@ macro_rules! tuple_impl {
4949
where $( Uniform: Distribution<$tyvar> ),*
5050
{
5151
#[inline]
52-
fn sample<R: Rng>(&self, _rng: &mut R) -> ( $( $tyvar ),* , ) {
52+
fn sample<R: Rng + ?Sized>(&self, _rng: &mut R) -> ( $( $tyvar ),* , ) {
5353
(
5454
// use the $tyvar's to get the appropriate number of
5555
// repeats (they're not actually needed)
@@ -65,7 +65,7 @@ macro_rules! tuple_impl {
6565

6666
impl Distribution<()> for Uniform {
6767
#[inline]
68-
fn sample<R: Rng>(&self, _: &mut R) -> () { () }
68+
fn sample<R: Rng + ?Sized>(&self, _: &mut R) -> () { () }
6969
}
7070
tuple_impl!{A}
7171
tuple_impl!{A, B}
@@ -87,15 +87,15 @@ macro_rules! array_impl {
8787

8888
impl<T> Distribution<[T; $n]> for Uniform where Uniform: Distribution<T> {
8989
#[inline]
90-
fn sample<R: Rng>(&self, _rng: &mut R) -> [T; $n] {
90+
fn sample<R: Rng + ?Sized>(&self, _rng: &mut R) -> [T; $n] {
9191
[_rng.gen::<$t>(), $(_rng.gen::<$ts>()),*]
9292
}
9393
}
9494
};
9595
// empty case:
9696
{$n:expr,} => {
9797
impl<T> Distribution<[T; $n]> for Uniform {
98-
fn sample<R: Rng>(&self, _rng: &mut R) -> [T; $n] { [] }
98+
fn sample<R: Rng + ?Sized>(&self, _rng: &mut R) -> [T; $n] { [] }
9999
}
100100
};
101101
}
@@ -104,7 +104,7 @@ array_impl!{32, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
104104

105105
impl<T> Distribution<Option<T>> for Uniform where Uniform: Distribution<T> {
106106
#[inline]
107-
fn sample<R: Rng>(&self, rng: &mut R) -> Option<T> {
107+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Option<T> {
108108
// UFCS is needed here: https://github.com/rust-lang/rust/issues/24066
109109
if rng.gen::<bool>() {
110110
Some(rng.gen())

src/distributions/range.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl<X: SampleRange + PartialOrd> Range<X> {
6363
}
6464

6565
impl<Sup: SampleRange> Distribution<Sup> for Range<Sup> {
66-
fn sample<R: Rng>(&self, rng: &mut R) -> Sup {
66+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Sup {
6767
SampleRange::sample_range(self, rng)
6868
}
6969
}
@@ -80,7 +80,7 @@ pub trait SampleRange : Sized {
8080

8181
/// Sample a value from the given `Range` with the given `Rng` as
8282
/// a source of randomness.
83-
fn sample_range<R: Rng>(r: &Range<Self>, rng: &mut R) -> Self;
83+
fn sample_range<R: Rng + ?Sized>(r: &Range<Self>, rng: &mut R) -> Self;
8484
}
8585

8686
macro_rules! integer_impl {
@@ -111,7 +111,7 @@ macro_rules! integer_impl {
111111
}
112112

113113
#[inline]
114-
fn sample_range<R: Rng>(r: &Range<$ty>, rng: &mut R) -> $ty {
114+
fn sample_range<R: Rng + ?Sized>(r: &Range<$ty>, rng: &mut R) -> $ty {
115115
loop {
116116
// rejection sample
117117
let v = rng.gen::<$unsigned>();
@@ -153,7 +153,7 @@ macro_rules! float_impl {
153153
accept_zone: 0.0 // unused
154154
}
155155
}
156-
fn sample_range<R: Rng>(r: &Range<$ty>, rng: &mut R) -> $ty {
156+
fn sample_range<R: Rng + ?Sized>(r: &Range<$ty>, rng: &mut R) -> $ty {
157157
r.low + r.range * rng.gen::<$ty>()
158158
}
159159
}

0 commit comments

Comments
 (0)