use crate::sexprec::{SEXP, SEXPTYPE};
use ::libc;
extern "C" {
#[no_mangle]
fn sqrt(_: libc::c_double) -> libc::c_double;
#[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 SET_VECTOR_ELT(x: SEXP, i: R_xlen_t, v: SEXP) -> SEXP;
#[no_mangle]
fn asInteger(x: SEXP) -> libc::c_int;
#[no_mangle]
fn asReal(x: SEXP) -> libc::c_double;
#[no_mangle]
fn error(_: *const libc::c_char, _: ...) -> !;
#[no_mangle]
fn R_finite(_: libc::c_double) -> libc::c_int;
#[no_mangle]
static mut R_NegInf: libc::c_double;
#[no_mangle]
static mut R_PosInf: libc::c_double;
#[no_mangle]
fn allocVector(_: SEXPTYPE, _: R_xlen_t) -> SEXP;
#[no_mangle]
fn ScalarReal(_: libc::c_double) -> SEXP;
#[no_mangle]
fn protect(_: SEXP) -> SEXP;
#[no_mangle]
fn unprotect(_: libc::c_int);
#[no_mangle]
fn dcgettext(
__domainname: *const libc::c_char,
__msgid: *const libc::c_char,
__category: libc::c_int,
) -> *mut libc::c_char;
}
pub type ptrdiff_t = libc::c_long;
pub type R_xlen_t = ptrdiff_t;
#[no_mangle]
pub unsafe extern "C" fn bw_ucv(mut sn: SEXP, mut sd: SEXP, mut cnt: SEXP, mut sh: SEXP) -> SEXP {
let mut h: libc::c_double = asReal(sh);
let mut d: libc::c_double = asReal(sd);
let mut sum: libc::c_double = 0.0f64;
let mut term: libc::c_double = 0.;
let mut u: libc::c_double = 0.;
let mut n: libc::c_int = asInteger(sn);
let mut nbin: libc::c_int = LENGTH(cnt);
let mut x: *mut libc::c_double = REAL(cnt);
let mut i: libc::c_int = 0 as libc::c_int;
while i < nbin {
let mut delta: libc::c_double = i as libc::c_double * d / h;
delta *= delta;
if delta >= 1000 as libc::c_int as libc::c_double {
break;
}
term = (-delta / 4.0f64).exp() - sqrt(8.0f64) * (-delta / 2.0f64).exp();
sum += term * *x.offset(i as isize);
i += 1
}
u = (0.5f64 + sum / n as libc::c_double)
/ (n as libc::c_double * h * 1.772453850905516027298167483341f64);
return ScalarReal(u);
}
#[no_mangle]
pub unsafe extern "C" fn bw_bcv(mut sn: SEXP, mut sd: SEXP, mut cnt: SEXP, mut sh: SEXP) -> SEXP {
let mut h: libc::c_double = asReal(sh);
let mut d: libc::c_double = asReal(sd);
let mut sum: libc::c_double = 0.0f64;
let mut term: libc::c_double = 0.;
let mut u: libc::c_double = 0.;
let mut n: libc::c_int = asInteger(sn);
let mut nbin: libc::c_int = LENGTH(cnt);
let mut x: *mut libc::c_double = REAL(cnt);
sum = 0.0f64;
let mut i: libc::c_int = 0 as libc::c_int;
while i < nbin {
let mut delta: libc::c_double = i as libc::c_double * d / h;
delta *= delta;
if delta >= 1000 as libc::c_int as libc::c_double {
break;
}
term = (-delta / 4 as libc::c_int as libc::c_double).exp()
* (delta * delta - 12 as libc::c_int as libc::c_double * delta
+ 12 as libc::c_int as libc::c_double);
sum += term * *x.offset(i as isize);
i += 1
}
u = (1 as libc::c_int as libc::c_double + sum / (32.0f64 * n as libc::c_double))
/ (2.0f64 * n as libc::c_double * h * 1.772453850905516027298167483341f64);
return ScalarReal(u);
}
#[no_mangle]
pub unsafe extern "C" fn bw_phi4(mut sn: SEXP, mut sd: SEXP, mut cnt: SEXP, mut sh: SEXP) -> SEXP {
let mut h: libc::c_double = asReal(sh);
let mut d: libc::c_double = asReal(sd);
let mut sum: libc::c_double = 0.0f64;
let mut term: libc::c_double = 0.;
let mut u: libc::c_double = 0.;
let mut n: libc::c_int = asInteger(sn);
let mut nbin: libc::c_int = LENGTH(cnt);
let mut x: *mut libc::c_double = REAL(cnt);
let mut i: libc::c_int = 0 as libc::c_int;
while i < nbin {
let mut delta: libc::c_double = i as libc::c_double * d / h;
delta *= delta;
if delta >= 1000 as libc::c_int as libc::c_double {
break;
}
term = (-delta / 2.0f64).exp() * (delta * delta - 6.0f64 * delta + 3.0f64);
sum += term * *x.offset(i as isize);
i += 1
}
sum = 2.0f64 * sum + n as libc::c_double * 3.0f64;
u = sum / (n as libc::c_double * (n - 1 as libc::c_int) as libc::c_double * h.powf(5.0f64))
* 0.398942280401432677939946059934f64;
return ScalarReal(u);
}
#[no_mangle]
pub unsafe extern "C" fn bw_phi6(mut sn: SEXP, mut sd: SEXP, mut cnt: SEXP, mut sh: SEXP) -> SEXP {
let mut h: libc::c_double = asReal(sh);
let mut d: libc::c_double = asReal(sd);
let mut sum: libc::c_double = 0.0f64;
let mut term: libc::c_double = 0.;
let mut u: libc::c_double = 0.;
let mut n: libc::c_int = asInteger(sn);
let mut nbin: libc::c_int = LENGTH(cnt);
let mut x: *mut libc::c_double = REAL(cnt);
let mut i: libc::c_int = 0 as libc::c_int;
while i < nbin {
let mut delta: libc::c_double = i as libc::c_double * d / h;
delta *= delta;
if delta >= 1000 as libc::c_int as libc::c_double {
break;
}
term = (-delta / 2 as libc::c_int as libc::c_double).exp()
* (delta * delta * delta - 15 as libc::c_int as libc::c_double * delta * delta
+ 45 as libc::c_int as libc::c_double * delta
- 15 as libc::c_int as libc::c_double);
sum += term * *x.offset(i as isize);
i += 1
}
sum = 2.0f64 * sum - 15.0f64 * n as libc::c_double;
u = sum / (n as libc::c_double * (n - 1 as libc::c_int) as libc::c_double * h.powf(7.0f64))
* 0.398942280401432677939946059934f64;
return ScalarReal(u);
}
#[no_mangle]
pub unsafe extern "C" fn bw_den(mut nbin: SEXP, mut sx: SEXP) -> SEXP {
let mut nb: libc::c_int = asInteger(nbin);
let mut n: libc::c_int = LENGTH(sx);
let mut xmin: libc::c_double = 0.;
let mut xmax: libc::c_double = 0.;
let mut rang: libc::c_double = 0.;
let mut dd: libc::c_double = 0.;
let mut x: *mut libc::c_double = REAL(sx);
xmin = R_PosInf;
xmax = R_NegInf;
let mut i: libc::c_int = 0 as libc::c_int;
while i < n {
if R_finite(*x.offset(i as isize)) == 0 {
error(
dcgettext(
b"stats\x00" as *const u8 as *const libc::c_char,
b"non-finite x[%d] in bandwidth calculation\x00" as *const u8
as *const libc::c_char,
5 as libc::c_int,
),
i + 1 as libc::c_int,
);
}
if *x.offset(i as isize) < xmin {
xmin = *x.offset(i as isize)
}
if *x.offset(i as isize) > xmax {
xmax = *x.offset(i as isize)
}
i += 1
}
rang = (xmax - xmin) * 1.01f64;
dd = rang / nb as libc::c_double;
let mut ans: SEXP = protect(allocVector(
19 as libc::c_int as SEXPTYPE,
2 as libc::c_int as R_xlen_t,
));
let mut sc: SEXP = SET_VECTOR_ELT(
ans,
1 as libc::c_int as R_xlen_t,
allocVector(14 as libc::c_int as SEXPTYPE, nb as R_xlen_t),
);
SET_VECTOR_ELT(ans, 0 as libc::c_int as R_xlen_t, ScalarReal(dd));
let mut cnt: *mut libc::c_double = REAL(sc);
let mut i_0: libc::c_int = 0 as libc::c_int;
while i_0 < nb {
*cnt.offset(i_0 as isize) = 0.0f64;
i_0 += 1
}
let mut i_1: libc::c_int = 1 as libc::c_int;
while i_1 < n {
let mut ii: libc::c_int = (*x.offset(i_1 as isize) / dd) as libc::c_int;
let mut j: libc::c_int = 0 as libc::c_int;
while j < i_1 {
let mut jj: libc::c_int = (*x.offset(j as isize) / dd) as libc::c_int;
*cnt.offset((ii - jj).abs() as isize) += 1.0f64;
j += 1
}
i_1 += 1
}
unprotect(1 as libc::c_int);
return ans;
}
#[no_mangle]
pub unsafe extern "C" fn bw_den_binned(mut sx: SEXP) -> SEXP {
let mut nb: libc::c_int = LENGTH(sx); let mut x: *mut libc::c_int = INTEGER(sx); let mut ans: SEXP = protect(allocVector(14 as libc::c_int as SEXPTYPE, nb as R_xlen_t));
let mut cnt: *mut libc::c_double = REAL(ans);
let mut ib: libc::c_int = 0 as libc::c_int;
while ib < nb {
*cnt.offset(ib as isize) = 0.0f64;
ib += 1
}
let mut ii: libc::c_int = 0 as libc::c_int;
while ii < nb {
let mut w: libc::c_int = *x.offset(ii as isize);
*cnt.offset(0 as libc::c_int as isize) +=
w as libc::c_double * (w as libc::c_double - 1.0f64);
let mut jj: libc::c_int = 0 as libc::c_int;
while jj < ii {
*cnt.offset((ii - jj) as isize) += (w * *x.offset(jj as isize)) as libc::c_double;
jj += 1
}
ii += 1
}
*cnt.offset(0 as libc::c_int as isize) *= 0.5f64;
unprotect(1 as libc::c_int);
return ans;
}