use crate::{
error::MathError, integer::Z, macros::seeded::seedable_function, rational::Q,
utils::sample::binomial::BinomialSampler,
};
impl Z {
seedable_function!(
#[seeded]
#[optionally_seeded]
#[optionally_seeded]
#[unseeded]
#[seeded]
pub(crate) fn sample_binomial(
n: impl Into<Z>,
p: impl Into<Q>,
seed: Option<[u8; 32]>,
) -> Result<Self, MathError> {
let mut bin_sampler = BinomialSampler::init(n, p, seed)?;
Ok(bin_sampler.sample())
}
);
}
#[cfg(test)]
mod test_sample_binomial {
use super::{Q, Z};
use crate::utils::sample::test_seed;
#[test]
fn availability() {
for seeded in [false, true] {
let _ = Z::sample_binomial_optionally_seeded(1u16, 7u8, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1u32, 7u16, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1u64, 7u32, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1i8, 7u64, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1i16, 7i8, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1i32, 7i16, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1i64, 7i32, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(Z::ONE, 7i64, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1u8, 0.5f32, seeded.then(test_seed));
let _ = Z::sample_binomial_optionally_seeded(1u8, 0.5f64, seeded.then(test_seed));
let _ =
Z::sample_binomial_optionally_seeded(1, Q::from((1, 2)), seeded.then(test_seed));
if seeded {
let _ = Z::sample_binomial_seeded(1u16, 7u8, test_seed());
} else {
let _ = Z::sample_binomial(1u16, 7u8);
}
}
}
#[test]
fn same_seed_same_sample() {
use crate::integer::Z;
let sample_0 = Z::sample_binomial_seeded(2, 0.5, [42; 32]).unwrap();
let sample_1 = Z::sample_binomial_seeded(2, 0.5, [42; 32]).unwrap();
assert_eq!(sample_0, sample_1);
}
#[test]
fn known_answer() {
use crate::integer::Z;
let sample = Z::sample_binomial_seeded(2, 0.5, [42; 32]).unwrap();
assert_eq!("0", sample.to_string());
}
}