use crate::dpq::r_dt_0;
use crate::dpq::r_dt_1;
use crate::nmath::ml_warn_return_nan;
use crate::rmath::M_LN2;
use crate::toms708::bratio;
fn pbeta_raw(x: f64, a: f64, b: f64, lower_tail: bool, log_p: bool) -> f64 {
if x >= 1.0 {
return r_dt_1(lower_tail, log_p);
}
if a == 0.0 || b == 0.0 || !a.is_finite() || !b.is_finite() {
if a == 0.0 && b == 0.0 {
return if log_p { -M_LN2 } else { 0.5 };
}
if a == 0.0 || a / b == 0.0 {
return r_dt_1(lower_tail, log_p);
}
if b == 0.0 || b / a == 0.0 {
return r_dt_0(lower_tail, log_p);
}
if x < 0.5 {
return r_dt_0(lower_tail, log_p);
} else {
return r_dt_1(lower_tail, log_p);
}
}
if x <= 0.0 {
return r_dt_0(lower_tail, log_p);
}
let x1 = 0.5 - x + 0.5;
let mut w = 0.0;
let mut w1 = 0.0;
let mut ierr = 0;
bratio(a, b, x, x1, &mut w, &mut w1, &mut ierr, log_p);
if ierr != 0 && ierr != 11 && ierr != 14 {
println!(
"pbeta_raw({}, a={}, b={}, lower_tail={}, log_p={}) -> bratio() gave error code{}",
x, a, b, lower_tail, log_p, ierr
);
}
if lower_tail {
w
} else {
w1
}
}
pub fn pbeta(x: f64, a: f64, b: f64, lower_tail: bool, log_p: bool) -> f64 {
if x.is_nan() || a.is_nan() || b.is_nan() {
return x + a + b;
}
if a < 0.0 || b < 0.0 {
return ml_warn_return_nan();
}
pbeta_raw(x, a, b, lower_tail, log_p)
}