use rand::Rng;
use super::errors::PoissonError;
pub struct PoissonProcess {
pub lambda: f64,
}
impl PoissonProcess {
pub fn new(lambda: f64) -> Result<Self, PoissonError> {
if !lambda.is_finite() || lambda <= 0.0 {
return Err(PoissonError::InvalidRate(lambda));
}
Ok(Self { lambda })
}
#[inline]
pub fn lambda(&self, _t: f64, _event_times: &[f64]) -> f64 {
self.lambda
}
pub fn generate_values(&self, current_ts: f64, n: usize) -> Vec<f64> {
let mut rng = rand::rng();
let mut events = Vec::with_capacity(n);
let mut t = current_ts;
for _ in 0..n {
let u: f64 = rng.random();
let wait = -u.ln() / self.lambda;
t += wait;
events.push(t);
}
events
}
}