Folder reorganization
[valse.git] / pkg / src / adapters / a.EMGLLF.c
diff --git a/pkg/src/adapters/a.EMGLLF.c b/pkg/src/adapters/a.EMGLLF.c
new file mode 100644 (file)
index 0000000..0df00bd
--- /dev/null
@@ -0,0 +1,86 @@
+#include <R.h>
+#include <Rdefines.h>
+#include "EMGLLF.h"
+
+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, 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));
+       double *pPhi=REAL(phi), *pRho=REAL(rho), *pPi=REAL(pi), *pLLF=REAL(LLF), *pS=REAL(S);
+
+       ////////////////////
+       // Call to EMGLLF //
+       ////////////////////
+
+       EMGLLF_core(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,lambda,X,Y,tau,
+               pPhi,pRho,pPi,pLLF,pS,
+               n,p,m,k);
+
+       // Build list from OUT params and return it
+       SEXP listParams, listNames;
+       PROTECT(listParams = allocVector(VECSXP, 5));
+       char* lnames[5] = {"phi", "rho", "pi", "LLF", "S"}; //lists labels
+       PROTECT(listNames = allocVector(STRSXP,5));
+       for (int i=0; i<5; 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);
+
+       UNPROTECT(9);
+       return listParams;
+}