use num_traits::Float;
use strafe_type::{FloatConstraint, Probability64, Real64};
use crate::{distribution::binom::dbinom_raw, traits::DPQ};
pub fn dgeom<R: Into<Real64>, P: Into<Probability64>>(x: R, p: P, log: bool) -> Real64 {
let mut x = x.into().unwrap();
let p = p.into().unwrap();
let mut prob = 0.0;
if p <= 0.0 {
return f64::nan().into();
}
if x.is_non_integer() {
warn!("non-integer x = {}", x);
return f64::d_0(log).into();
}
if x < 0.0 || !x.is_finite() || p == 0.0 {
return f64::d_0(log).into();
}
x = x.round();
prob = dbinom_raw(0.0, x, p, 1.0 - p, log);
if log { (p.ln()) + prob } else { (p) * prob }.into()
}