fix memory leaks on EMGLLF, test OK for EMGrank
[valse.git] / src / test / generate_test_data / helpers / constructionModelesLassoRank.m
1 function[phi,llh] = constructionModelesLassoRank(Pi,Rho,mini,maxi,X,Y,tau,A1,rangmin,rangmax)
2
3 PI = 4.0 * atan(1.0);
4
5 %get matrix sizes
6 [n,p] = size(X);
7 [~,m,k,~] = size(Rho);
8 L = size(A1, 2); %A1 est p x m+1 x L ou p x L ?!
9
10 %On cherche les rangs possiblement intéressants
11 deltaRank = rangmax - rangmin + 1;
12 Size = deltaRank^k;
13 Rank = zeros(Size,k,'int64');
14 for r=1:k
15 %On veut le tableau de toutes les combinaisons de rangs possibles
16 %Dans la première colonne : on répète (rangmax-rangmin)^(k-1) chaque chiffre : ca remplit la colonne
17 %Dans la deuxieme : on répète (rangmax-rangmin)^(k-2) chaque chiffre, et on fait ca (rangmax-rangmin)^2 fois
18 %...
19 %Dans la dernière, on répète chaque chiffre une fois, et on fait ca (rangmin-rangmax)^(k-1) fois.
20 Rank(:,r) = rangmin + reshape(repmat(0:(deltaRank-1), deltaRank^(k-r), deltaRank^(r-1)), Size, 1);
21 end
22
23 %output parameters
24 phi = zeros(p,m,k,L*Size);
25 llh = zeros(L*Size,2);
26 for lambdaIndex=1:L
27 %On ne garde que les colonnes actives
28 %active sera l'ensemble des variables informatives
29 active = A1(:,lambdaIndex);
30 active(active==0) = [];
31 if length(active) > 0
32 for j=1:Size
33 [phiLambda,LLF] = EMGrank(Pi(:,lambdaIndex),Rho(:,:,:,lambdaIndex),mini,maxi,X(:,active),Y,tau,Rank(j,:));
34 llh((lambdaIndex-1)*Size+j,:) = [LLF, sum(Rank(j,:) .* (length(active)-Rank(j,:)+m))];
35 phi(active,:,:,(lambdaIndex-1)*Size+j) = phiLambda;
36 end
37 end
38 end
39
40 end