use strafe_type::{FloatConstraint, Natural64, Real64};
use crate::{distribution::signrank::csignrank, traits::DPQ};
pub fn dsignrank<R: Into<Real64>, N: Into<Natural64>>(x: R, n: N, log: bool) -> Real64 {
let mut x = x.into().unwrap();
let mut n = n.into().unwrap();
let mut d = 0.0;
n = n.round();
if (x - x.round()).abs() > 1e-7 {
return f64::d_0(log).into();
}
x = x.round();
if x < 0.0 || x > n * (n + 1.0) / 2.0 {
return f64::d_0(log).into();
}
let nn = n;
d = ((csignrank(x as i32, nn as i32).ln()) - n * std::f64::consts::LN_2).d_exp(log);
return d.into();
}