use crate::sexprec::SEXP;
use ::libc;
extern "C" {
#[no_mangle]
fn sqrt(_: libc::c_double) -> libc::c_double;
#[no_mangle]
fn pnorm(
_: libc::c_double,
_: libc::c_double,
_: libc::c_double,
_: libc::c_int,
_: libc::c_int,
) -> libc::c_double;
#[no_mangle]
fn asInteger(x: SEXP) -> libc::c_int;
#[no_mangle]
fn asReal(x: SEXP) -> libc::c_double;
#[no_mangle]
fn ScalarReal(_: libc::c_double) -> SEXP;
}
pub type C2RustUnnamed = libc::c_uint;
pub const TRUE: C2RustUnnamed = 1;
pub const FALSE: C2RustUnnamed = 0;
#[no_mangle]
pub unsafe extern "C" fn prho(
mut n: libc::c_int,
mut is: libc::c_double,
mut pv: *mut libc::c_double,
mut ifault: *mut libc::c_int,
mut lower_tail: libc::c_int,
) {
let c1: libc::c_double = 0.2274f64;
let c2: libc::c_double = 0.2531f64;
let c3: libc::c_double = 0.1745f64;
let c4: libc::c_double = 0.0758f64;
let c5: libc::c_double = 0.1033f64;
let c6: libc::c_double = 0.3932f64;
let c7: libc::c_double = 0.0879f64;
let c8: libc::c_double = 0.0151f64;
let c9: libc::c_double = 0.0072f64;
let c10: libc::c_double = 0.0831f64;
let c11: libc::c_double = 0.0131f64;
let c12: libc::c_double = 4.6e-4f64;
let mut b: libc::c_double = 0.;
let mut u: libc::c_double = 0.;
let mut x: libc::c_double = 0.;
let mut y: libc::c_double = 0.;
let mut n3: libc::c_double = 0.;
let mut l: [libc::c_int; 9] = [0; 9];
let mut nfac: libc::c_int = 0;
let mut i: libc::c_int = 0;
let mut m: libc::c_int = 0;
let mut mt: libc::c_int = 0;
let mut ifr: libc::c_int = 0;
let mut ise: libc::c_int = 0;
let mut n1: libc::c_int = 0;
*pv = if lower_tail != 0 { 0.0f64 } else { 1.0f64 };
if n <= 1 as libc::c_int {
*ifault = 1 as libc::c_int;
return;
}
*ifault = 0 as libc::c_int;
if is <= 0.0f64 {
return;
}
n3 = n as libc::c_double;
n3 *= (n3 * n3 - 1.0f64) / 3.0f64;
if is > n3 {
*pv = 1 as libc::c_int as libc::c_double - *pv;
return;
}
if n <= 9 as libc::c_int {
nfac = 1.0f64 as libc::c_int;
i = 1 as libc::c_int;
while i <= n {
nfac *= i;
l[(i - 1 as libc::c_int) as usize] = i;
i += 1
}
if is == n3 {
ifr = 1 as libc::c_int
} else {
ifr = 0 as libc::c_int;
m = 0 as libc::c_int;
while m < nfac {
ise = 0 as libc::c_int;
i = 0 as libc::c_int;
while i < n {
n1 = i + 1 as libc::c_int - l[i as usize];
ise += n1 * n1;
i += 1
}
if is <= ise as libc::c_double {
ifr += 1
}
n1 = n;
loop {
mt = l[0 as libc::c_int as usize];
i = 1 as libc::c_int;
while i < n1 {
l[(i - 1 as libc::c_int) as usize] = l[i as usize];
i += 1
}
n1 -= 1;
l[n1 as usize] = mt;
if !(mt == n1 + 1 as libc::c_int && n1 > 1 as libc::c_int) {
break;
}
}
m += 1
}
}
*pv = (if lower_tail != 0 { (nfac) - ifr } else { ifr }) as libc::c_double
/ nfac as libc::c_double
} else {
y = n as libc::c_double;
b = 1 as libc::c_int as libc::c_double / y;
x = (6.0f64 * (is - 1 as libc::c_int as libc::c_double) * b
/ (y * y - 1 as libc::c_int as libc::c_double)
- 1 as libc::c_int as libc::c_double)
* sqrt(y - 1 as libc::c_int as libc::c_double);
y = x * x;
u = x
* b
* (c1
+ b * (c2 + c3 * b)
+ y * (-c4 + b * (c5 + c6 * b)
- y * b * (c7 + c8 * b - y * (c9 - c10 * b + y * b * (c11 - c12 * y)))));
y = u / (y / 2.0f64).exp();
*pv = (if lower_tail != 0 { -y } else { y })
+ pnorm(x, 0.0f64, 1.0f64, lower_tail, FALSE as libc::c_int);
if *pv < 0 as libc::c_int as libc::c_double {
*pv = 0.0f64
}
if *pv > 1 as libc::c_int as libc::c_double {
*pv = 1.0f64
}
};
}
#[no_mangle]
pub unsafe extern "C" fn pRho(mut q: SEXP, mut sn: SEXP, mut lower: SEXP) -> SEXP {
let mut s: libc::c_double = asReal(q);
let mut p: libc::c_double = 0.;
let mut n: libc::c_int = asInteger(sn);
let mut ltail: libc::c_int = asInteger(lower);
let mut ifault: libc::c_int = 0 as libc::c_int;
prho(n, s, &mut p, &mut ifault, ltail);
return ScalarReal(p);
}