move selectiontotale to appropriate folder (untranslated)
[valse.git] / src / sources / selectiontotale.c
index f3ed95b..8c1b768 100644 (file)
@@ -1,34 +1,35 @@
-#include "selectiontotale.h"
-#include "EMGLLF.h"
+#include <stdlib.h>
 #include <omp.h>
-#include "omp_num_threads.h"
+#include <math.h>
+#include "EMGLLF.h"
+#include "utils.h"
 
 // Main job on raw inputs (after transformation from mxArray)
-void selectiontotale(
-       // IN parameters 
-       const Real* phiInit,   // parametre initial de moyenne renormalisé
-       const Real* rhoInit,   // parametre initial de variance renormalisé
-       const Real* piInit,    // parametre initial des proportions
-       const Real* gamInit,   // paramètre initial des probabilités a posteriori de chaque échantillon
-       Int mini,       // nombre minimal d'itérations dans lambdaIndex'algorithme EM  
-       Int maxi,       // nombre maximal d'itérations dans lambdaIndex'algorithme EM
-       Real gamma,   // valeur de gamma : puissance des proportions dans la pénalisation pour un Lasso adaptatif
+void selectiontotale_core(
+       // IN parameters
+       const Real* phiInit, // parametre initial de moyenne renormalisé
+       const Real* rhoInit, // parametre initial de variance renormalisé
+       const Real* piInit,// parametre initial des proportions
+       const Real* gamInit, // paramètre initial des probabilités a posteriori de chaque échantillon
+       int mini, // nombre minimal d'itérations dans lambdaIndex'algorithme EM
+       int maxi, // nombre maximal d'itérations dans lambdaIndex'algorithme EM
+       Real gamma, // valeur de gamma : puissance des proportions dans la pénalisation pour un Lasso adaptatif
        const Real* glambda, // valeur des paramètres de régularisation du Lasso
-       const Real* X,      // régresseurs
-       const Real* Y,      // réponse
-       Real seuil,   // seuil pour prendre en compte une variable
-       Real tau,     // seuil pour accepter la convergence
+       const Real* X,// régresseurs
+       const Real* Y,// réponse
+       Real seuil, // seuil pour prendre en compte une variable
+       Real tau, // seuil pour accepter la convergence
        // OUT parameters (all pointers, to be modified)
-       Int* A1,         // matrice des coefficients des parametres selectionnes
-       Int* A2,         // matrice des coefficients des parametres non selectionnes
-       Real* Rho,        // estimateur ainsi calculé par le Lasso
-       Real* Pi,          // estimateur ainsi calculé par le Lasso
+       int* A1, // matrice des coefficients des parametres selectionnes
+       int* A2, // matrice des coefficients des parametres non selectionnes
+       Real* Rho,// estimateur ainsi calculé par le Lasso
+       Real* Pi,// estimateur ainsi calculé par le Lasso
        // additional size parameters
-       mwSize n,              // taille de lambdaIndex'echantillon                
-       mwSize p,              // nombre de covariables
-       mwSize m,              // taille de Y (multivarié)
-       mwSize k,              // nombre de composantes
-       mwSize L)             // taille de glambda
+       int n,// taille de lambdaIndex'echantillon
+       int p,// nombre de covariables
+       int m,// taille de Y (multivarié)
+       int k,// nombre de composantes
+       int L) // taille de glambda
 {
        // Fill outputs with zeros: they might not be assigned
        for (int u=0; u<p*(m+1)*L; u++)
@@ -40,9 +41,9 @@ void selectiontotale(
                Rho[u] = 0.0;
        for (int u=0; u<k*L; u++)
                Pi[u] = 0.0;
-       
+
        //initiate parallel section
-       mwSize lambdaIndex;
+       int lambdaIndex;
        omp_set_num_threads(OMP_NUM_THREADS);
        #pragma omp parallel default(shared) private(lambdaIndex)
        {
@@ -55,84 +56,84 @@ void selectiontotale(
                Real* pi = (Real*)malloc(k*sizeof(Real));
                Real* LLF = (Real*)malloc(maxi*sizeof(Real));
                Real* S = (Real*)malloc(p*m*k*sizeof(Real));
-               EMGLLF(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,glambda[lambdaIndex],X,Y,tau,
+               EMGLLF_core(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,glambda[lambdaIndex],X,Y,tau,
                        phi,rho,pi,LLF,S,
                        n,p,m,k);
                free(LLF);
                free(S);
-               
+
                //Si un des coefficients est supérieur au seuil, on garde cette variable
-               mwSize* selectedVariables = (mwSize*)calloc(p*m,sizeof(mwSize));
-               mwSize* discardedVariables = (mwSize*)calloc(p*m,sizeof(mwSize));
+               int* selectedVariables = (int*)calloc(p*m,sizeof(int));
+               int* discardedVariables = (int*)calloc(p*m,sizeof(int));
                int atLeastOneSelectedVariable = 0;
-               for (mwSize j=0; j<p; j++)
+               for (int j=0; j<p; j++)
                {
-                       mwSize cpt = 0;
-                       mwSize cpt2 = 0;
-                       for (mwSize jj=0; jj<m; jj++)
+                       int cpt = 0;
+                       int cpt2 = 0;
+                       for (int jj=0; jj<m; jj++)
                        {
                                Real maxPhi = 0.0;
-                               for (mwSize r=0; r<k; r++)
+                               for (int r=0; r<k; r++)
                                {
-                                       if (fabs(phi[j*m*k+jj*k+r]) > maxPhi)
-                                               maxPhi = fabs(phi[j*m*k+jj*k+r]);
+                                       if (fabs(phi[ai(j,jj,r,p,m,k)]) > maxPhi)
+                                               maxPhi = fabs(phi[ai(j,jj,r,p,m,k)]);
                                }
                                if (maxPhi > seuil)
                                {
-                                       selectedVariables[j*m+cpt] = jj+1;
+                                       selectedVariables[mi(j,cpt,p,m)] = jj+1;
                                        atLeastOneSelectedVariable = 1;
                                        cpt++;
                                }
                                else
                                {
-                                       discardedVariables[j*m+cpt2] = jj+1;
+                                       discardedVariables[mi(j,cpt2,p,m)] = jj+1;
                                        cpt2++;
                                }
                        }
                }
                free(phi);
-               
+
                if (atLeastOneSelectedVariable)
                {
-                       Int* vec = (Int*)malloc(p*sizeof(Int));
-                       mwSize vecSize = 0;
-                       for (mwSize j=0; j<p; j++)
+                       int* vec = (int*)malloc(p*sizeof(int));
+                       int vecSize = 0;
+                       for (int j=0; j<p; j++)
                        {
-                               if (selectedVariables[j*m+0] != 0)
+                               if (selectedVariables[mi(j,0,p,m)] != 0)
                                        vec[vecSize++] = j;
                        }
                        
                        //A1
-                       for (mwSize j=0; j<p; j++)
-                               A1[j*(m+1)*L+0*L+lambdaIndex] = (j < vecSize ? vec[j]+1 : 0);
-                       for (mwSize j=0; j<vecSize; j++)
+                       for (int j=0; j<p; j++)
+                               A1[ai(j,0,lambdaIndex,p,m+1,L)] = (j < vecSize ? vec[j]+1 : 0);
+                       for (int j=0; j<vecSize; j++)
                        {
-                               for (mwSize jj=1; jj<=m; jj++)
-                                       A1[j*(m+1)*L+jj*L+lambdaIndex] = selectedVariables[vec[j]*m+jj-1];
+                               for (int jj=1; jj<=m; jj++)
+                                       A1[ai(j,jj,lambdaIndex,p,m+1,L)] = selectedVariables[mi(vec[j],jj-1,p,m)];
                        }
                        //A2
-                       for (mwSize j=0; j<p; j++)
-                               A2[j*(m+1)*L+0*L+lambdaIndex] = j+1;
-                       for (mwSize j=0; j<p; j++)
+                       for (int j=0; j<p; j++)
+                               A2[ai(j,0,lambdaIndex,p,m+1,L)] = j+1;
+                       for (int j=0; j<p; j++)
                        {
-                               for (mwSize jj=1; jj<=m; jj++)
-                                       A2[j*(m+1)*L+jj*L+lambdaIndex] = discardedVariables[j*m+jj-1];
+                               for (int jj=1; jj<=m; jj++)
+                                       A2[ai(j,jj,lambdaIndex,p,m+1,L)] = discardedVariables[mi(j,jj-1,p,m)];
                        }
                        //Rho
-                       for (mwSize j=0; j<m; j++)
+                       for (int j=0; j<m; j++)
                        {
-                               for (mwSize jj=0; jj<m; jj++)
+                               for (int jj=0; jj<m; jj++)
                                {
-                                       for (mwSize r=0; r<k; r++)
-                                               Rho[j*m*k*L+jj*k*L+r*L+lambdaIndex] = rho[j*m*k+jj*k+r];
+                                       for (int r=0; r<k; r++)
+                                               Rho[ai4(j,jj,r,lambdaIndex,m,m,k,L)] = rho[ai(j,jj,r,m,m,k)];
                                }
                        }
                        //Pi
-                       for (mwSize r=0; r<k; r++)
-                               Pi[r*L+lambdaIndex] = pi[r];
+                       for (int r=0; r<k; r++)
+                               Pi[mi(r,lambdaIndex,k,L)] = pi[r];
                        free(vec);
                }
-               
+
                free(selectedVariables);
                free(discardedVariables);
                free(rho);