#include void grad(const int n, const int p, const int q, const double *X, const double *X_diff, const double *Y, const double *V, const double h, double *G, double *loss); SEXP grad_c(SEXP X, SEXP X_diff, SEXP Y, SEXP V, SEXP h) { SEXP G = PROTECT(allocMatrix(REALSXP, nrows(V), ncols(V))); SEXP loss = PROTECT(ScalarReal(0.0)); grad(nrows(X), ncols(X), ncols(V), REAL(X), REAL(X_diff), REAL(Y), REAL(V), *REAL(h), REAL(G), REAL(loss)); SEXP out = PROTECT(allocVector(VECSXP, 2)); SET_VECTOR_ELT(out, 0, G); SET_VECTOR_ELT(out, 1, loss); SEXP names = PROTECT(allocVector(STRSXP, 2)); SET_STRING_ELT(names, 0, mkChar("G")); SET_STRING_ELT(names, 1, mkChar("loss")); setAttrib(out, install("names"), names); UNPROTECT(4); return out; }