7 // Main job on raw inputs (after transformation from mxArray)
8 void selectiontotale_core(
10 const Real
* phiInit
, // parametre initial de moyenne renormalisé
11 const Real
* rhoInit
, // parametre initial de variance renormalisé
12 const Real
* piInit
,// parametre initial des proportions
13 const Real
* gamInit
, // paramètre initial des probabilités a posteriori de chaque échantillon
14 int mini
, // nombre minimal d'itérations dans lambdaIndex'algorithme EM
15 int maxi
, // nombre maximal d'itérations dans lambdaIndex'algorithme EM
16 Real gamma
, // valeur de gamma : puissance des proportions dans la pénalisation pour un Lasso adaptatif
17 const Real
* glambda
, // valeur des paramètres de régularisation du Lasso
18 const Real
* X
,// régresseurs
19 const Real
* Y
,// réponse
20 Real seuil
, // seuil pour prendre en compte une variable
21 Real tau
, // seuil pour accepter la convergence
22 // OUT parameters (all pointers, to be modified)
23 int* A1
, // matrice des coefficients des parametres selectionnes
24 int* A2
, // matrice des coefficients des parametres non selectionnes
25 Real
* Rho
,// estimateur ainsi calculé par le Lasso
26 Real
* Pi
,// estimateur ainsi calculé par le Lasso
27 // additional size parameters
28 int n
,// taille de lambdaIndex'echantillon
29 int p
,// nombre de covariables
30 int m
,// taille de Y (multivarié)
31 int k
,// nombre de composantes
32 int L
) // taille de glambda
34 // Fill outputs with zeros: they might not be assigned
35 for (int u
=0; u
<p
*(m
+1)*L
; u
++)
40 for (int u
=0; u
<m
*m
*k
*L
; u
++)
42 for (int u
=0; u
<k
*L
; u
++)
45 //initiate parallel section
47 omp_set_num_threads(OMP_NUM_THREADS
);
48 #pragma omp parallel default(shared) private(lambdaIndex)
50 #pragma omp for schedule(dynamic,CHUNK_SIZE) nowait
51 for (lambdaIndex
=0; lambdaIndex
<L
; lambdaIndex
++)
53 //allocate output variables
54 Real
* phi
= (Real
*)malloc(p
*m
*k
*sizeof(Real
));
55 Real
* rho
= (Real
*)malloc(m
*m
*k
*sizeof(Real
));
56 Real
* pi
= (Real
*)malloc(k
*sizeof(Real
));
57 Real
* LLF
= (Real
*)malloc(maxi
*sizeof(Real
));
58 Real
* S
= (Real
*)malloc(p
*m
*k
*sizeof(Real
));
59 EMGLLF_core(phiInit
,rhoInit
,piInit
,gamInit
,mini
,maxi
,gamma
,glambda
[lambdaIndex
],X
,Y
,tau
,
65 //Si un des coefficients est supérieur au seuil, on garde cette variable
66 int* selectedVariables
= (int*)calloc(p
*m
,sizeof(int));
67 int* discardedVariables
= (int*)calloc(p
*m
,sizeof(int));
68 int atLeastOneSelectedVariable
= 0;
69 for (int j
=0; j
<p
; j
++)
73 for (int jj
=0; jj
<m
; jj
++)
76 for (int r
=0; r
<k
; r
++)
78 if (fabs(phi
[ai(j
,jj
,r
,p
,m
,k
)]) > maxPhi
)
79 maxPhi
= fabs(phi
[ai(j
,jj
,r
,p
,m
,k
)]);
83 selectedVariables
[mi(j
,cpt
,p
,m
)] = jj
+1;
84 atLeastOneSelectedVariable
= 1;
89 discardedVariables
[mi(j
,cpt2
,p
,m
)] = jj
+1;
96 if (atLeastOneSelectedVariable
)
98 int* vec
= (int*)malloc(p
*sizeof(int));
100 for (int j
=0; j
<p
; j
++)
102 if (selectedVariables
[mi(j
,0,p
,m
)] != 0)
107 for (int j
=0; j
<p
; j
++)
108 A1
[ai(j
,0,lambdaIndex
,p
,m
+1,L
)] = (j
< vecSize
? vec
[j
]+1 : 0);
109 for (int j
=0; j
<vecSize
; j
++)
111 for (int jj
=1; jj
<=m
; jj
++)
112 A1
[ai(j
,jj
,lambdaIndex
,p
,m
+1,L
)] = selectedVariables
[mi(vec
[j
],jj
-1,p
,m
)];
115 for (int j
=0; j
<p
; j
++)
116 A2
[ai(j
,0,lambdaIndex
,p
,m
+1,L
)] = j
+1;
117 for (int j
=0; j
<p
; j
++)
119 for (int jj
=1; jj
<=m
; jj
++)
120 A2
[ai(j
,jj
,lambdaIndex
,p
,m
+1,L
)] = discardedVariables
[mi(j
,jj
-1,p
,m
)];
123 for (int j
=0; j
<m
; j
++)
125 for (int jj
=0; jj
<m
; jj
++)
127 for (int r
=0; r
<k
; r
++)
128 Rho
[ai4(j
,jj
,r
,lambdaIndex
,m
,m
,k
,L
)] = rho
[ai(j
,jj
,r
,m
,m
,k
)];
132 for (int r
=0; r
<k
; r
++)
133 Pi
[mi(r
,lambdaIndex
,k
,L
)] = pi
[r
];
137 free(selectedVariables
);
138 free(discardedVariables
);