#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; }