use crate::{
rcont::rcont2,
sexprec::{SEXP, SEXPTYPE},
};
use ::libc;
extern "C" {
#[no_mangle]
fn R_alloc(_: size_t, _: libc::c_int) -> *mut libc::c_char;
#[no_mangle]
fn GetRNGstate();
#[no_mangle]
fn PutRNGstate();
#[no_mangle]
fn LENGTH(x: SEXP) -> libc::c_int;
#[no_mangle]
fn INTEGER(x: SEXP) -> *mut 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 chisqsim(
mut nrow: *mut libc::c_int,
mut ncol: *mut libc::c_int,
mut nrowt: *mut libc::c_int,
mut ncolt: *mut libc::c_int,
mut n: *mut libc::c_int,
mut B: libc::c_int,
mut expected: *mut libc::c_double,
mut observed: *mut libc::c_int,
mut fact: *mut libc::c_double,
mut jwork: *mut libc::c_int,
mut results: *mut libc::c_double,
) {
let mut i: libc::c_int = 0;
let mut j: libc::c_int = 0;
let mut ii: libc::c_int = 0;
let mut iter: libc::c_int = 0;
let mut chisq: libc::c_double = 0.;
let mut e: libc::c_double = 0.;
let mut o: libc::c_double = 0.;
let ref mut fresh0 = *fact.offset(1 as libc::c_int as isize);
*fresh0 = 0.0f64;
*fact.offset(0 as libc::c_int as isize) = *fresh0;
i = 2 as libc::c_int;
while i <= *n {
*fact.offset(i as isize) =
*fact.offset((i - 1 as libc::c_int) as isize) + (i as libc::c_double).ln();
i += 1
}
GetRNGstate();
iter = 0 as libc::c_int;
while iter < B {
rcont2(nrow, ncol, nrowt, ncolt, n, fact, jwork, observed);
chisq = 0.0f64;
j = 0 as libc::c_int;
while j < *ncol {
i = 0 as libc::c_int;
ii = j * *nrow;
while i < *nrow {
e = *expected.offset(ii as isize);
o = *observed.offset(ii as isize) as libc::c_double;
chisq += (o - e) * (o - e) / e;
i += 1;
ii += 1
}
j += 1
}
*results.offset(iter as isize) = chisq;
iter += 1
}
PutRNGstate();
}
unsafe extern "C" fn fisher_sim(
mut nrow: *mut libc::c_int,
mut ncol: *mut libc::c_int,
mut nrowt: *mut libc::c_int,
mut ncolt: *mut libc::c_int,
mut n: *mut libc::c_int,
mut B: libc::c_int,
mut observed: *mut libc::c_int,
mut fact: *mut libc::c_double,
mut jwork: *mut libc::c_int,
mut results: *mut libc::c_double,
) {
let mut i: libc::c_int = 0;
let mut j: libc::c_int = 0;
let mut ii: libc::c_int = 0;
let mut iter: libc::c_int = 0;
let mut ans: libc::c_double = 0.;
let ref mut fresh1 = *fact.offset(1 as libc::c_int as isize);
*fresh1 = 0.0f64;
*fact.offset(0 as libc::c_int as isize) = *fresh1;
i = 2 as libc::c_int;
while i <= *n {
*fact.offset(i as isize) =
*fact.offset((i - 1 as libc::c_int) as isize) + (i as libc::c_double).ln();
i += 1
}
GetRNGstate();
iter = 0 as libc::c_int;
while iter < B {
rcont2(nrow, ncol, nrowt, ncolt, n, fact, jwork, observed);
ans = 0.0f64;
j = 0 as libc::c_int;
while j < *ncol {
i = 0 as libc::c_int;
ii = j * *nrow;
while i < *nrow {
ans -= *fact.offset(*observed.offset(ii as isize) as isize);
i += 1;
ii += 1
}
j += 1
}
*results.offset(iter as isize) = ans;
iter += 1
}
PutRNGstate();
}
#[no_mangle]
pub unsafe extern "C" fn Fisher_sim(mut sr: SEXP, mut sc: SEXP, mut sB: SEXP) -> SEXP {
sr = protect(coerceVector(sr, 13 as libc::c_int as SEXPTYPE));
sc = protect(coerceVector(sc, 13 as libc::c_int as SEXPTYPE));
let mut nr: libc::c_int = LENGTH(sr);
let mut nc: libc::c_int = LENGTH(sc);
let mut B: libc::c_int = asInteger(sB);
let mut n: libc::c_int = 0 as libc::c_int;
let mut isr: *mut libc::c_int = INTEGER(sr);
let mut i: libc::c_int = 0 as libc::c_int;
while i < nr {
n += *isr.offset(i as isize);
i += 1
}
let mut observed: *mut libc::c_int = R_alloc(
(nr * nc) as size_t,
::std::mem::size_of::<libc::c_int>() as libc::c_ulong as libc::c_int,
) as *mut libc::c_int;
let mut fact: *mut libc::c_double = R_alloc(
(n + 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;
let mut jwork: *mut libc::c_int = R_alloc(
nc as size_t,
::std::mem::size_of::<libc::c_int>() as libc::c_ulong as libc::c_int,
) as *mut libc::c_int;
let mut ans: SEXP = protect(allocVector(14 as libc::c_int as SEXPTYPE, B as R_xlen_t));
fisher_sim(
&mut nr,
&mut nc,
isr,
INTEGER(sc),
&mut n,
B,
observed,
fact,
jwork,
REAL(ans),
);
unprotect(3 as libc::c_int);
return ans;
}
#[no_mangle]
pub unsafe extern "C" fn chisq_sim(mut sr: SEXP, mut sc: SEXP, mut sB: SEXP, mut E: SEXP) -> SEXP {
sr = protect(coerceVector(sr, 13 as libc::c_int as SEXPTYPE));
sc = protect(coerceVector(sc, 13 as libc::c_int as SEXPTYPE));
E = protect(coerceVector(E, 14 as libc::c_int as SEXPTYPE));
let mut nr: libc::c_int = LENGTH(sr);
let mut nc: libc::c_int = LENGTH(sc);
let mut B: libc::c_int = asInteger(sB);
let mut n: libc::c_int = 0 as libc::c_int;
let mut isr: *mut libc::c_int = INTEGER(sr);
let mut i: libc::c_int = 0 as libc::c_int;
while i < nr {
n += *isr.offset(i as isize);
i += 1
}
let mut observed: *mut libc::c_int = R_alloc(
(nr * nc) as size_t,
::std::mem::size_of::<libc::c_int>() as libc::c_ulong as libc::c_int,
) as *mut libc::c_int;
let mut fact: *mut libc::c_double = R_alloc(
(n + 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;
let mut jwork: *mut libc::c_int = R_alloc(
nc as size_t,
::std::mem::size_of::<libc::c_int>() as libc::c_ulong as libc::c_int,
) as *mut libc::c_int;
let mut ans: SEXP = protect(allocVector(14 as libc::c_int as SEXPTYPE, B as R_xlen_t));
chisqsim(
&mut nr,
&mut nc,
isr,
INTEGER(sc),
&mut n,
B,
REAL(E),
observed,
fact,
jwork,
REAL(ans),
);
unprotect(4 as libc::c_int);
return ans;
}