remove utils.c, prepare testing 'R-only'
[valse.git] / src / test / generate_test_data / helpers / constructionModelesLassoRank.m
diff --git a/src/test/generate_test_data/helpers/constructionModelesLassoRank.m b/src/test/generate_test_data/helpers/constructionModelesLassoRank.m
new file mode 100644 (file)
index 0000000..415ab12
--- /dev/null
@@ -0,0 +1,40 @@
+function[phi,lvraisemblance] = constructionModelesLassoRank(Pi,Rho,mini,maxi,X,Y,tau,A1,rangmin,rangmax)
+
+       PI = 4.0 * atan(1.0);
+
+       %get matrix sizes
+       [n,p] = size(X);
+       [~,m,k,~] = size(Rho);
+       L = size(A1, 2); %A1 est p x m+1 x L ou p x L ?!
+
+       %On cherche les rangs possiblement intéressants
+       deltaRank = rangmax - rangmin + 1;
+       Size = deltaRank^k;
+       Rank = zeros(Size,k,'int64');
+       for r=1:k
+               %On veut le tableau de toutes les combinaisons de rangs possibles
+               %Dans la première colonne : on répète (rangmax-rangmin)^(k-1) chaque chiffre : ca remplit la colonne
+               %Dans la deuxieme : on répète (rangmax-rangmin)^(k-2) chaque chiffre, et on fait ca (rangmax-rangmin)^2 fois
+               %...
+               %Dans la dernière, on répète chaque chiffre une fois, et on fait ca (rangmin-rangmax)^(k-1) fois.
+               Rank(:,r) = rangmin + reshape(repmat(0:(deltaRank-1), deltaRank^(k-r), deltaRank^(r-1)), Size, 1);
+       end
+
+       %output parameters
+       phi = zeros(p,m,k,L*Size);
+       lvraisemblance = zeros(L*Size,2);
+       for lambdaIndex=1:L
+               %On ne garde que les colonnes actives
+               %active sera l'ensemble des variables informatives
+               active = A1(:,lambdaIndex);
+               active(active==0) = [];
+               if length(active) > 0
+                       for j=1:Size
+                               [phiLambda,LLF] = EMGrank(Pi(:,lambdaIndex),Rho(:,:,:,lambdaIndex),mini,maxi,X(:,active),Y,tau,Rank(j,:));
+                               lvraisemblance((lambdaIndex-1)*Size+j,:) = [LLF, sum(Rank(j,:) .* (length(active)-Rank(j,:)+m))];
+                               phi(active,:,:,(lambdaIndex-1)*Size+j) = phiLambda;
+                       end
+               end
+       end
+
+end