Skip to main content

dashu_float/third_party/
rand_v08.rs

1use 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}