use libm::log;
use libm::log1p;
use crate::gammafn;
use crate::lgammacor;
use crate::lgammafn;
use crate::nmath::ML_NAN;
use crate::nmath::ML_NEGINF;
use crate::nmath::ML_POSINF;
use crate::nmath::M_LN_SQRT_2PI;
pub fn lbeta(a: f64, b: f64) -> f64 {
let (mut p, mut q) = (a, a);
if b < p {
p = b;
}
if b > q {
q = b;
}
if p < 0.0 {
return ML_NAN;
} else if p == 0.0 {
return ML_POSINF;
} else if !q.is_finite() {
return ML_NEGINF;
}
if p >= 10.0 {
let corr = lgammacor(p) + lgammacor(q) - lgammacor(p + q);
log(q) * -0.5
+ M_LN_SQRT_2PI
+ corr
+ (p - 0.5) * log(p / (p + q))
+ q * log1p(-p / (p + q))
} else if q >= 10.0 {
let corr = lgammacor(q) - lgammacor(p + q);
lgammafn(p) + corr + p - p * log(p + q) + (q - 0.5) * log1p(-p / (p + q))
} else {
if p < 1e-306 {
lgammafn(p) + (lgammafn(q) - lgammafn(p + q))
} else {
log(gammafn(p) * (gammafn(q) / gammafn(p + q)))
}
}
}