use super::inversecumulativerng::{FallibleInverseCumulativeRsg, InverseCumulativeRng};
use super::{MersenneTwisterUniformRng, RandomSequenceGenerator};
use crate::errors::QlResult;
use crate::math::distributions::poisson::InverseCumulativePoisson;
use crate::types::Real;
pub type PoissonRng = InverseCumulativeRng<MersenneTwisterUniformRng, InverseCumulativePoisson>;
pub type PoissonRsg = FallibleInverseCumulativeRsg<
RandomSequenceGenerator<MersenneTwisterUniformRng>,
InverseCumulativePoisson,
>;
pub struct PoissonPseudoRandom;
impl PoissonPseudoRandom {
pub fn make_sequence_generator(dimension: usize, seed: u32) -> QlResult<PoissonRsg> {
Self::with_lambda(dimension, seed, 1.0)
}
pub fn with_lambda(dimension: usize, seed: u32, lambda: Real) -> QlResult<PoissonRsg> {
Ok(FallibleInverseCumulativeRsg::new(
RandomSequenceGenerator::with_seed(dimension, seed)?,
InverseCumulativePoisson::new(lambda)?,
))
}
pub fn make_scalar_generator(seed: u32, lambda: Real) -> QlResult<PoissonRng> {
Ok(InverseCumulativeRng::new(
MersenneTwisterUniformRng::new(seed),
InverseCumulativePoisson::new(lambda)?,
))
}
}