dashu_float/third_party/
rand_v08.rs1use crate::{fbig::FBig, repr::Word, round::Round};
2use rand_v08::{
3 distributions::{
4 uniform::{SampleBorrow, SampleUniform, UniformSampler},
5 Open01, OpenClosed01, Standard,
6 },
7 prelude::Distribution,
8 Rng,
9};
10
11use super::rand::{get_inline_precision, Uniform01, UniformFBig};
12
13fn bridge<R: Rng + ?Sized>(rng: &mut R) -> impl dashu_int::rand::BitRng + '_ {
14 dashu_int::rand::bridge_v08(rng)
15}
16
17impl<R: Round, const B: Word> Distribution<FBig<R, B>> for UniformFBig<R, B> {
18 #[inline]
19 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> FBig<R, B> {
20 self.sample_fbig(&mut bridge(rng))
21 }
22}
23
24impl<R: Round, const B: Word> Distribution<FBig<R, B>> for Uniform01<B> {
25 #[inline]
26 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> FBig<R, B> {
27 self.sample01::<R, _>(&mut bridge(rng))
28 }
29}
30
31impl<R: Round, const B: Word> Distribution<FBig<R, B>> for Standard {
32 #[inline]
33 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> FBig<R, B> {
34 Uniform01::<B>::new(get_inline_precision::<B>()).sample01::<R, _>(&mut bridge(rng))
35 }
36}
37
38impl<R: Round, const B: Word> Distribution<FBig<R, B>> for Open01 {
39 #[inline]
40 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> FBig<R, B> {
41 Uniform01::<B>::new_open(get_inline_precision::<B>()).sample01::<R, _>(&mut bridge(rng))
42 }
43}
44
45impl<R: Round, const B: Word> Distribution<FBig<R, B>> for OpenClosed01 {
46 #[inline]
47 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> FBig<R, B> {
48 Uniform01::<B>::new_open_closed(get_inline_precision::<B>())
49 .sample01::<R, _>(&mut bridge(rng))
50 }
51}
52
53impl<R: Round, const B: Word> UniformSampler for UniformFBig<R, B> {
54 type X = FBig<R, B>;
55
56 #[inline]
57 fn new<B1, B2>(low: B1, high: B2) -> Self
58 where
59 B1: SampleBorrow<Self::X> + Sized,
60 B2: SampleBorrow<Self::X> + Sized,
61 {
62 let precision = low.borrow().precision().max(high.borrow().precision());
63 UniformFBig::new(low.borrow(), high.borrow(), precision)
64 }
65
66 #[inline]
67 fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self
68 where
69 B1: SampleBorrow<Self::X> + Sized,
70 B2: SampleBorrow<Self::X> + Sized,
71 {
72 let precision = low.borrow().precision().max(high.borrow().precision());
73 UniformFBig::new_inclusive(low.borrow(), high.borrow(), precision)
74 }
75
76 #[inline]
77 fn sample<RNG: Rng + ?Sized>(&self, rng: &mut RNG) -> Self::X {
78 self.sample_fbig(&mut bridge(rng))
79 }
80}
81
82impl<R: Round, const B: Word> SampleUniform for FBig<R, B> {
83 type Sampler = UniformFBig<R, B>;
84}