use crate::sexprec::{SEXP, SEXPTYPE};
use ::libc;
extern "C" {
#[no_mangle]
fn memset(_: *mut libc::c_void, _: libc::c_int, _: libc::c_ulong) -> *mut libc::c_void;
#[no_mangle]
fn error(_: *const libc::c_char, _: ...) -> !;
#[no_mangle]
fn R_alloc(_: size_t, _: libc::c_int) -> *mut libc::c_char;
#[no_mangle]
fn choose(_: libc::c_double, _: libc::c_double) -> libc::c_double;
#[no_mangle]
fn dcgettext(
__domainname: *const libc::c_char,
__msgid: *const libc::c_char,
__category: libc::c_int,
) -> *mut libc::c_char;
#[no_mangle]
fn LENGTH(x: SEXP) -> libc::c_int;
#[no_mangle]
fn REAL(x: SEXP) -> *mut libc::c_double;
#[no_mangle]
fn coerceVector(_: SEXP, _: SEXPTYPE) -> SEXP;
#[no_mangle]
fn asInteger(x: SEXP) -> libc::c_int;
#[no_mangle]
fn allocVector(_: SEXPTYPE, _: R_xlen_t) -> SEXP;
#[no_mangle]
fn protect(_: SEXP) -> SEXP;
#[no_mangle]
fn unprotect(_: libc::c_int);
}
pub type size_t = libc::c_ulong;
pub type ptrdiff_t = libc::c_long;
pub type R_xlen_t = ptrdiff_t;
unsafe extern "C" fn w_init(
mut m: libc::c_int,
mut n: libc::c_int,
) -> *mut *mut *mut libc::c_double {
let mut i: libc::c_int = 0;
let mut w: *mut *mut *mut libc::c_double = 0 as *mut *mut *mut libc::c_double;
w = R_alloc(
(m + 1 as libc::c_int) as size_t,
::std::mem::size_of::<*mut *mut libc::c_double>() as libc::c_ulong as libc::c_int,
) as *mut *mut *mut libc::c_double;
memset(
w as *mut libc::c_void,
'\u{0}' as i32,
((m + 1 as libc::c_int) as libc::c_ulong)
.wrapping_mul(::std::mem::size_of::<*mut *mut libc::c_double>() as libc::c_ulong),
);
i = 0 as libc::c_int;
while i <= m {
let ref mut fresh0 = *w.offset(i as isize);
*fresh0 = R_alloc(
(n + 1 as libc::c_int) as size_t,
::std::mem::size_of::<*mut libc::c_double>() as libc::c_ulong as libc::c_int,
) as *mut *mut libc::c_double;
memset(
*w.offset(i as isize) as *mut libc::c_void,
'\u{0}' as i32,
((n + 1 as libc::c_int) as libc::c_ulong)
.wrapping_mul(::std::mem::size_of::<*mut libc::c_double>() as libc::c_ulong),
);
i += 1
}
return w;
}
unsafe extern "C" fn cansari(
mut k: libc::c_int,
mut m: libc::c_int,
mut n: libc::c_int,
mut w: *mut *mut *mut libc::c_double,
) -> libc::c_double {
let mut i: libc::c_int = 0;
let mut l: libc::c_int = 0;
let mut u: libc::c_int = 0;
l = (m + 1 as libc::c_int) * (m + 1 as libc::c_int) / 4 as libc::c_int;
u = l + m * n / 2 as libc::c_int;
if k < l || k > u {
return 0 as libc::c_int as libc::c_double;
}
if (*(*w.offset(m as isize)).offset(n as isize)).is_null() {
let ref mut fresh1 = *(*w.offset(m as isize)).offset(n as isize);
*fresh1 = R_alloc(
(u + 1 as libc::c_int) as size_t,
::std::mem::size_of::<libc::c_double>() as libc::c_ulong as libc::c_int,
) as *mut libc::c_double;
memset(
*(*w.offset(m as isize)).offset(n as isize) as *mut libc::c_void,
'\u{0}' as i32,
((u + 1 as libc::c_int) as libc::c_ulong)
.wrapping_mul(::std::mem::size_of::<libc::c_double>() as libc::c_ulong),
);
i = 0 as libc::c_int;
while i <= u {
*(*(*w.offset(m as isize)).offset(n as isize)).offset(i as isize) =
-(1 as libc::c_int) as libc::c_double;
i += 1
}
}
if *(*(*w.offset(m as isize)).offset(n as isize)).offset(k as isize)
< 0 as libc::c_int as libc::c_double
{
if m == 0 as libc::c_int {
*(*(*w.offset(m as isize)).offset(n as isize)).offset(k as isize) =
(k == 0 as libc::c_int) as libc::c_int as libc::c_double
} else if n == 0 as libc::c_int {
*(*(*w.offset(m as isize)).offset(n as isize)).offset(k as isize) =
(k == l) as libc::c_int as libc::c_double
} else {
*(*(*w.offset(m as isize)).offset(n as isize)).offset(k as isize) =
cansari(k, m, n - 1 as libc::c_int, w)
+ cansari(
k - (m + n + 1 as libc::c_int) / 2 as libc::c_int,
m - 1 as libc::c_int,
n,
w,
)
}
}
return *(*(*w.offset(m as isize)).offset(n as isize)).offset(k as isize);
}
unsafe extern "C" fn pansari(
mut len: libc::c_int,
mut Q: *mut libc::c_double,
mut P: *mut libc::c_double,
mut m: libc::c_int,
mut n: libc::c_int,
) {
let mut i: libc::c_int = 0;
let mut j: libc::c_int = 0;
let mut l: libc::c_int = 0;
let mut u: libc::c_int = 0;
let mut c: libc::c_double = 0.;
let mut p: libc::c_double = 0.;
let mut q: libc::c_double = 0.;
let mut w: *mut *mut *mut libc::c_double = 0 as *mut *mut *mut libc::c_double;
w = w_init(m, n);
l = (m + 1 as libc::c_int) * (m + 1 as libc::c_int) / 4 as libc::c_int;
u = l + m * n / 2 as libc::c_int;
c = choose((m + n) as libc::c_double, m as libc::c_double);
i = 0 as libc::c_int;
while i < len {
q = (*Q.offset(i as isize) + 1e-7f64).floor();
if q < l as libc::c_double {
*P.offset(i as isize) = 0 as libc::c_int as libc::c_double
} else if q > u as libc::c_double {
*P.offset(i as isize) = 1 as libc::c_int as libc::c_double
} else {
p = 0 as libc::c_int as libc::c_double;
j = l;
while j as libc::c_double <= q {
p += cansari(j, m, n, w);
j += 1
}
*P.offset(i as isize) = p / c
}
i += 1
}
}
unsafe extern "C" fn qansari(
mut len: libc::c_int,
mut P: *mut libc::c_double,
mut Q: *mut libc::c_double,
mut m: libc::c_int,
mut n: libc::c_int,
) {
let mut i: libc::c_int = 0;
let mut l: libc::c_int = 0;
let mut u: libc::c_int = 0;
let mut c: libc::c_double = 0.;
let mut p: libc::c_double = 0.;
let mut xi: libc::c_double = 0.;
let mut w: *mut *mut *mut libc::c_double = 0 as *mut *mut *mut libc::c_double;
w = w_init(m, n);
l = (m + 1 as libc::c_int) * (m + 1 as libc::c_int) / 4 as libc::c_int;
u = l + m * n / 2 as libc::c_int;
c = choose((m + n) as libc::c_double, m as libc::c_double);
i = 0 as libc::c_int;
while i < len {
xi = *P.offset(i as isize);
if xi < 0 as libc::c_int as libc::c_double || xi > 1 as libc::c_int as libc::c_double {
error(dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"probabilities outside [0,1] in qansari()\x00" as *const u8 as *const libc::c_char,
5 as libc::c_int,
));
}
if xi == 0 as libc::c_int as libc::c_double {
*Q.offset(i as isize) = l as libc::c_double
} else if xi == 1 as libc::c_int as libc::c_double {
*Q.offset(i as isize) = u as libc::c_double
} else {
p = 0.0f64;
let mut q: libc::c_int = 0 as libc::c_int;
loop {
p += cansari(q, m, n, w) / c;
if p >= xi {
break;
}
q += 1
}
*Q.offset(i as isize) = q as libc::c_double
}
i += 1
}
}
#[no_mangle]
pub unsafe extern "C" fn pAnsari(mut q: SEXP, mut sm: SEXP, mut sn: SEXP) -> SEXP {
let mut m: libc::c_int = asInteger(sm);
let mut n: libc::c_int = asInteger(sn);
q = protect(coerceVector(q, 14 as libc::c_int as SEXPTYPE));
let mut len: libc::c_int = LENGTH(q);
let mut p: SEXP = protect(allocVector(14 as libc::c_int as SEXPTYPE, len as R_xlen_t));
pansari(len, REAL(q), REAL(p), m, n);
unprotect(2 as libc::c_int);
return p;
}
#[no_mangle]
pub unsafe extern "C" fn qAnsari(mut p: SEXP, mut sm: SEXP, mut sn: SEXP) -> SEXP {
let mut m: libc::c_int = asInteger(sm);
let mut n: libc::c_int = asInteger(sn);
p = protect(coerceVector(p, 14 as libc::c_int as SEXPTYPE));
let mut len: libc::c_int = LENGTH(p);
let mut q: SEXP = protect(allocVector(14 as libc::c_int as SEXPTYPE, len as R_xlen_t));
qansari(len, REAL(p), REAL(q), m, n);
unprotect(2 as libc::c_int);
return q;
}