+++ /dev/null
-#include <R.h>
-#include <Rdefines.h>
-#include "EMGLLF.h"
-
-// See comments in src/sources/EMGLLF.c and R/EMGLLF.R (wrapper)
-SEXP EMGLLF(
- SEXP phiInit_,
- SEXP rhoInit_,
- SEXP piInit_,
- SEXP gamInit_,
- SEXP mini_,
- SEXP maxi_,
- SEXP gamma_,
- SEXP lambda_,
- SEXP X_,
- SEXP Y_,
- SEXP tau_
-) {
- // Get matrices dimensions
- int n = INTEGER(getAttrib(X_, R_DimSymbol))[0];
- SEXP dim = getAttrib(phiInit_, R_DimSymbol);
- int p = INTEGER(dim)[0];
- int m = INTEGER(dim)[1];
- int k = INTEGER(dim)[2];
-
- ////////////
- // INPUTS //
- ////////////
-
- // get scalar parameters
- int mini = INTEGER_VALUE(mini_);
- int maxi = INTEGER_VALUE(maxi_);
- double gamma = NUMERIC_VALUE(gamma_);
- double lambda = NUMERIC_VALUE(lambda_);
- double tau = NUMERIC_VALUE(tau_);
-
- // Get pointers from SEXP arrays ; WARNING: by columns !
- double* phiInit = REAL(phiInit_);
- double* rhoInit = REAL(rhoInit_);
- double* piInit = REAL(piInit_);
- double* gamInit = REAL(gamInit_);
- double* X = REAL(X_);
- double* Y = REAL(Y_);
-
- /////////////
- // OUTPUTS //
- /////////////
-
- SEXP phi, rho, pi, LLF, S, affec, dimPhiS, dimRho;
- PROTECT(dimPhiS = allocVector(INTSXP, 3));
- int* pDimPhiS = INTEGER(dimPhiS);
- pDimPhiS[0] = p; pDimPhiS[1] = m; pDimPhiS[2] = k;
- PROTECT(dimRho = allocVector(INTSXP, 3));
- int* pDimRho = INTEGER(dimRho);
- pDimRho[0] = m; pDimRho[1] = m; pDimRho[2] = k;
- PROTECT(phi = allocArray(REALSXP, dimPhiS));
- PROTECT(rho = allocArray(REALSXP, dimRho));
- PROTECT(pi = allocVector(REALSXP, k));
- PROTECT(LLF = allocVector(REALSXP, maxi-mini+1));
- PROTECT(S = allocArray(REALSXP, dimPhiS));
- PROTECT(affec = allocVector(INTSXP, n));
- double *pPhi=REAL(phi), *pRho=REAL(rho), *pPi=REAL(pi), *pLLF=REAL(LLF), *pS=REAL(S);
- int *pAffec=INTEGER(affec);
-
- ////////////////////
- // Call to EMGLLF //
- ////////////////////
-
- EMGLLF_core(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,lambda,X,Y,tau,
- pPhi,pRho,pPi,pLLF,pS,pAffec,
- n,p,m,k);
-
- // Build list from OUT params and return it
- SEXP listParams, listNames;
- int nouts = 6;
- PROTECT(listParams = allocVector(VECSXP, nouts));
- char* lnames[6] = {"phi", "rho", "pi", "LLF", "S", "affec"}; //lists labels
- PROTECT(listNames = allocVector(STRSXP,nouts));
- for (int i=0; i<nouts; i++)
- SET_STRING_ELT(listNames,i,mkChar(lnames[i]));
- setAttrib(listParams, R_NamesSymbol, listNames);
- SET_VECTOR_ELT(listParams, 0, phi);
- SET_VECTOR_ELT(listParams, 1, rho);
- SET_VECTOR_ELT(listParams, 2, pi);
- SET_VECTOR_ELT(listParams, 3, LLF);
- SET_VECTOR_ELT(listParams, 4, S);
- SET_VECTOR_ELT(listParams, 5, affec);
-
- UNPROTECT(10);
- return listParams;
-}