3 #include <gsl/gsl_linalg.h>
7 // TODO: comment on constructionModelesLassoRank purpose
8 void constructionModelesLassoRank_core(
10 const float* Pi
,// parametre initial des proportions
11 const float* Rho
, // parametre initial de variance renormalisé
12 int mini
, // nombre minimal d'itérations dans l'algorithme EM
13 int maxi
, // nombre maximal d'itérations dans l'algorithme EM
14 const float* X
,// régresseurs
15 const float* Y
,// réponse
16 float tau
, // seuil pour accepter la convergence
17 const int* A1
, // matrice des coefficients des parametres selectionnes
18 int rangmin
, //rang minimum autorisé
19 int rangmax
, //rang maximum autorisé
20 // OUT parameters (all pointers, to be modified)
21 float* phi
,// estimateur ainsi calculé par le Lasso
22 float* lvraisemblance
,// estimateur ainsi calculé par le Lasso
23 // additional size parameters
24 int n
,// taille de l'echantillon
25 int p
,// nombre de covariables
26 int m
,// taille de Y (multivarié)
27 int k
,// nombre de composantes
28 int L
)// taille de glambda
30 //On cherche les rangs possiblement intéressants
31 int deltaRank
= rangmax
-rangmin
+1;
32 int Size
= (int)pow(deltaRank
,k
);
33 int* Rank
= (int*)malloc(Size
*k
*sizeof(int));
34 for (int r
=0; r
<k
; r
++)
36 //On veut le tableau de toutes les combinaisons de rangs possibles
37 //Dans la première colonne : on répète (rangmax-rangmin)^(k-1) chaque chiffre : ca remplit la colonne
38 //Dans la deuxieme : on répète (rangmax-rangmin)^(k-2) chaque chiffre, et on fait ca (rangmax-rangmin)^2 fois
40 //Dans la dernière, on répète chaque chiffre une fois, et on fait ca (rangmin-rangmax)^(k-1) fois.
43 while (indexInRank
< Size
)
45 for (int u
=0; u
<pow(deltaRank
,k
-r
-1); u
++)
46 Rank
[mi(indexInRank
++,r
,Size
,k
)] = rangmin
+ value
;
47 value
= (value
+1) % deltaRank
;
51 //Initialize phi to zero, because unactive variables won't be assigned
52 for (int i
=0; i
<p
*m
*k
*L
*Size
; i
++)
55 //initiate parallel section
57 omp_set_num_threads(OMP_NUM_THREADS
);
58 #pragma omp parallel default(shared) private(lambdaIndex)
60 #pragma omp for schedule(dynamic,CHUNK_SIZE) nowait
61 for (lambdaIndex
=0; lambdaIndex
<L
; lambdaIndex
++)
63 //On ne garde que les colonnes actives : active sera l'ensemble des variables informatives
64 int* active
= (int*)malloc(p
*sizeof(int));
65 int longueurActive
= 0;
66 for (int j
=0; j
<p
; j
++)
68 if (A1
[mi(j
,lambdaIndex
,p
,L
)] != 0)
69 active
[longueurActive
++] = A1
[mi(j
,lambdaIndex
,p
,L
)] - 1;
72 if (longueurActive
== 0)
75 //from now on, longueurActive > 0
76 float* phiLambda
= (float*)malloc(longueurActive
*m
*k
*sizeof(float));
78 for (int j
=0; j
<Size
; j
++)
80 //[phiLambda,LLF] = EMGrank(Pi(:,lambdaIndex),Rho(:,:,:,lambdaIndex),mini,maxi,X(:,active),Y,tau,Rank(j,:));
81 int* rank
= (int*)malloc(k
*sizeof(int));
82 for (int r
=0; r
<k
; r
++)
83 rank
[r
] = Rank
[mi(j
,r
,Size
,k
)];
84 float* Xactive
= (float*)malloc(n
*longueurActive
*sizeof(float));
85 for (int i
=0; i
<n
; i
++)
87 for (int jj
=0; jj
<longueurActive
; jj
++)
88 Xactive
[mi(i
,jj
,n
,longueurActive
)] = X
[mi(i
,active
[jj
],n
,p
)];
90 float* PiLambda
= (float*)malloc(k
*sizeof(float));
91 for (int r
=0; r
<k
; r
++)
92 PiLambda
[r
] = Pi
[mi(r
,lambdaIndex
,k
,L
)];
93 float* RhoLambda
= (float*)malloc(m
*m
*k
*sizeof(float));
94 for (int u
=0; u
<m
; u
++)
96 for (int v
=0; v
<m
; v
++)
98 for (int r
=0; r
<k
; r
++)
99 RhoLambda
[ai(u
,v
,r
,m
,m
,k
)] = Rho
[ai4(u
,v
,r
,lambdaIndex
,m
,m
,k
,L
)];
102 EMGrank_core(PiLambda
,RhoLambda
,mini
,maxi
,Xactive
,Y
,tau
,rank
,
104 n
,longueurActive
,m
,k
);
109 //lvraisemblance((lambdaIndex-1)*Size+j,:) = [LLF, dot(Rank(j,:), length(active)-Rank(j,:)+m)];
110 lvraisemblance
[mi(lambdaIndex
*Size
+j
,0,L
*Size
,2)] = LLF
;
111 //dot(Rank(j,:), length(active)-Rank(j,:)+m)
112 float dotProduct
= 0.0;
113 for (int r
=0; r
<k
; r
++)
114 dotProduct
+= Rank
[mi(j
,r
,Size
,k
)] * (longueurActive
-Rank
[mi(j
,r
,Size
,k
)]+m
);
115 lvraisemblance
[mi(lambdaIndex
*Size
+j
,1,Size
*L
,2)] = dotProduct
;
116 //phi(active,:,:,(lambdaIndex-1)*Size+j) = phiLambda;
117 for (int jj
=0; jj
<longueurActive
; jj
++)
119 for (int mm
=0; mm
<m
; mm
++)
121 for (int r
=0; r
<k
; r
++)
122 phi
[ai5(active
[jj
],mm
,r
,lambdaIndex
,j
,p
,m
,k
,L
,Size
)] = phiLambda
[jj
*m
*k
+mm
*k
+r
];