Skip to main content

dashu_float/third_party/
rand_v09.rs

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