pub struct PolyaGamma { /* private fields */ }Expand description
Polya-Gamma sampler.
The PolyaGamma struct enables sampling from the Polya-Gamma distribution PG(b, c)
using a either a finite sum-of-gammas approximation or exact sampling following Devroye (2009).
§Example
use polya_gamma::PolyaGamma;
let pg = PolyaGamma::new(1.0);
let sample = pg.draw(&mut StdRng::seed_from_u64(0), 1.0);Implementations§
Source§impl PolyaGamma
impl PolyaGamma
pub fn set_shape(&mut self, shape: f64)
Sourcepub fn draw<R: Rng + ?Sized>(&self, rng: &mut R, tilt: f64) -> f64
pub fn draw<R: Rng + ?Sized>(&self, rng: &mut R, tilt: f64) -> f64
Draw a single Polya-Gamma random variate PG(b, c).
This function generates samples from the Polya-Gamma distribution with shape parameter b
and tilt parameter c. It uses different sampling strategies based on the value of b:
- For b = 1 or 2: Uses Devroye’s exact sampling algorithm
- For integer b > 2: Sums b independent PG(1, c) variates
- For non-integer b: Uses a gamma-Poisson mixture representation
§Arguments
b- Shape parameter (must be > 0)c- Tilt parameter (real-valued)rng- Random number generator
§Returns
A random variate from PG(b, c)
§Panics
Panics if b is not positive.
§Example
let mut pg = PolyaGamma::new(1.0);
let mut rng = rand::thread_rng();
// Sample from PG(1, 0.5)
let sample = pg.draw(&mut rng, 0.5);
// Sample from PG(3.5, -1.2)
pg.set_shape(3.5);
let sample2 = pg.draw(&mut rng, -1.2);Sourcepub fn draw_vec<R: Rng + ?Sized>(&self, rng: &mut R, c: &[f64]) -> Vec<f64>
pub fn draw_vec<R: Rng + ?Sized>(&self, rng: &mut R, c: &[f64]) -> Vec<f64>
Draw multiple Polya-Gamma random variates PG(b, c).
§Arguments
rng- Mutable reference to a random number generatorc- Tilt parameters (real-valued)
§Returns
A vector of random variates from PG(b, c)
§Panics
Panics if b is not positive.
§Example
let mut pg = PolyaGamma::new(1.0);
let mut rng = rand::thread_rng();
// Draw 100 samples from PG(1, 0.5)
let samples = pg.draw_vec(&mut rng, &[0.5; 100]);
println!("Drew {} samples from PG(1, 0.5)", samples.len());Sourcepub fn draw_vec_par_deterministic<R: SeedableRng + Rng>(
&self,
rng: &mut R,
c: &[f64],
) -> Vec<f64>
pub fn draw_vec_par_deterministic<R: SeedableRng + Rng>( &self, rng: &mut R, c: &[f64], ) -> Vec<f64>
Draw multiple Polya-Gamma random variates PG(b, c) in parallel.
The initial seed is drawn from the provided rng. Each thread is then given a unique seed
based on the initial seed. This ensures that the samples are deterministic across runs.
Note that this function is slightly slower than draw_vec_par, which should be preferred
in production workloads.
§Arguments
rng- Mutable reference to a random number generatorc- Tilt parameters (real-valued)
§Returns
A vector of random variates from PG(b, c)
§Panics
Panics if b is not positive.
§Example
let pg = PolyaGamma::new(1.0);
let mut rng = StdRng::seed_from_u64(0);
// Draw 100 samples from PG(1, 0.5)
let samples = pg.draw_vec_par_deterministic(&mut rng, &[0.5; 100]);
println!("Drew {} samples from PG(1, 0.5)", samples.len());Sourcepub fn draw_vec_par(&self, c: &[f64]) -> Vec<f64>
pub fn draw_vec_par(&self, c: &[f64]) -> Vec<f64>
Draw multiple Polya-Gamma random variates PG(b, c) in parallel.
§Arguments
c- Tilt parameters (real-valued)
§Returns
A vector of random variates from PG(b, c)
§Example
let pg = PolyaGamma::new(1.0);
// Draw 100 samples from PG(1, 0.5)
let samples = pg.draw_vec_par(&[0.5; 100]);
println!("Drew {} samples from PG(1, 0.5)", samples.len());Trait Implementations§
Source§impl Clone for PolyaGamma
impl Clone for PolyaGamma
Source§fn clone(&self) -> PolyaGamma
fn clone(&self) -> PolyaGamma
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for PolyaGamma
impl RefUnwindSafe for PolyaGamma
impl Send for PolyaGamma
impl Sync for PolyaGamma
impl Unpin for PolyaGamma
impl UnwindSafe for PolyaGamma
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.