58 lines
1.6 KiB
C
58 lines
1.6 KiB
C
#include "cve.h"
|
|
|
|
// SEXP rStiefl_c(SEXP pin, SEXP qin) {
|
|
// int p = asInteger(pin);
|
|
// int q = asInteger(qin);
|
|
|
|
// SEXP Vout = PROTECT(allocMatrix(REALSXP, p, q));
|
|
|
|
// int workLen = 2 * (p + 1) * q;
|
|
// double *workMem = (double*)R_alloc(workLen, sizeof(double));
|
|
|
|
// rStiefl(p, q, REAL(Vout), workMem, workLen);
|
|
|
|
// UNPROTECT(1);
|
|
// return Vout;
|
|
// }
|
|
|
|
SEXP cve_simple(SEXP X, SEXP Y, SEXP k, SEXP h,
|
|
SEXP tau, SEXP tol,
|
|
SEXP epochs, SEXP attempts,
|
|
SEXP logger, SEXP loggerEnv) {
|
|
/* Handle logger parameter, set to NULL pointer if not a function. */
|
|
if (!(isFunction(logger) && isEnvironment(loggerEnv))) {
|
|
logger = (SEXP)0;
|
|
}
|
|
|
|
/* Get dimensions. */
|
|
int n = nrows(X);
|
|
int p = ncols(X);
|
|
int q = p - asInteger(k);
|
|
|
|
/* Convert types if needed. */
|
|
// TODO:
|
|
|
|
/* Create output list. */
|
|
SEXP Vout = PROTECT(allocMatrix(REALSXP, p, q));
|
|
SEXP Lout = PROTECT(allocVector(REALSXP, n));
|
|
|
|
/* Call CVE simple subroutine. */
|
|
cve_simple_sub(n, p, q,
|
|
REAL(X), REAL(Y), asReal(h),
|
|
asReal(tau), asReal(tol),
|
|
asInteger(epochs), asInteger(attempts),
|
|
REAL(Vout), REAL(Lout),
|
|
logger, loggerEnv);
|
|
|
|
SEXP out = PROTECT(allocVector(VECSXP, 2));
|
|
SET_VECTOR_ELT(out, 0, Vout);
|
|
SET_VECTOR_ELT(out, 1, Lout);
|
|
SEXP names = PROTECT(allocVector(STRSXP, 2));
|
|
SET_STRING_ELT(names, 0, mkChar("V"));
|
|
SET_STRING_ELT(names, 1, mkChar("L"));
|
|
setAttrib(out, R_NamesSymbol, names);
|
|
|
|
UNPROTECT(4);
|
|
return out;
|
|
}
|