From: emilie Date: Thu, 23 Mar 2017 13:51:41 +0000 (+0100) Subject: Après mon merge héroïque X-Git-Url: https://git.auder.net/?p=valse.git;a=commitdiff_plain;h=944d9d1c74f8d7f2cd0033cc3f7a2a032e356bbb;hp=c0846e18ccdfce9bccdcfd730496926b7812ef8c Après mon merge héroïque --- diff --git a/.gitignore b/.gitignore index d52ee00..b0455d8 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ #misc Rprof.out *.zip +.Rproj.user diff --git a/pkg/src/sources/EMGLLF.c b/pkg/src/sources/EMGLLF.c index 86b6060..7ce6ded 100644 --- a/pkg/src/sources/EMGLLF.c +++ b/pkg/src/sources/EMGLLF.c @@ -2,7 +2,7 @@ #include #include -// TODO: don't recompute indexes every time...... +// TODO: don't recompute indexes ai(...) and mi(...) when possible void EMGLLF_core( // IN parameters const Real* phiInit, // parametre initial de moyenne renormalisé @@ -35,34 +35,34 @@ void EMGLLF_core( zeroArray(LLF, maxi); //S is already allocated, and doesn't need to be 'zeroed' - //Other local variables + //Other local variables: same as in R Real* gam = (Real*)malloc(n*k*sizeof(Real)); copyArray(gamInit, gam, n*k); + Real* Gram2 = (Real*)malloc(p*p*k*sizeof(Real)); + Real* ps2 = (Real*)malloc(p*m*k*sizeof(Real)); Real* b = (Real*)malloc(k*sizeof(Real)); - Real* Phi = (Real*)malloc(p*m*k*sizeof(Real)); - Real* Rho = (Real*)malloc(m*m*k*sizeof(Real)); - Real* Pi = (Real*)malloc(k*sizeof(Real)); - Real* gam2 = (Real*)malloc(k*sizeof(Real)); + Real* X2 = (Real*)malloc(n*p*k*sizeof(Real)); + Real* Y2 = (Real*)malloc(n*m*k*sizeof(Real)); + Real dist = 0.; + Real dist2 = 0.; + int ite = 0; Real* pi2 = (Real*)malloc(k*sizeof(Real)); - Real* Gram2 = (Real*)malloc(p*p*k*sizeof(Real)); Real* ps = (Real*)malloc(m*k*sizeof(Real)); Real* nY2 = (Real*)malloc(m*k*sizeof(Real)); Real* ps1 = (Real*)malloc(n*m*k*sizeof(Real)); - Real* ps2 = (Real*)malloc(p*m*k*sizeof(Real)); - Real* nY21 = (Real*)malloc(n*m*k*sizeof(Real)); Real* Gam = (Real*)malloc(n*k*sizeof(Real)); - Real* X2 = (Real*)malloc(n*p*k*sizeof(Real)); - Real* Y2 = (Real*)malloc(n*m*k*sizeof(Real)); + const Real EPS = 1e-15; + // Additional (not at this place, in R file) + Real* gam2 = (Real*)malloc(k*sizeof(Real)); Real* sqNorm2 = (Real*)malloc(k*sizeof(Real)); gsl_matrix* matrix = gsl_matrix_alloc(m, m); gsl_permutation* permutation = gsl_permutation_alloc(m); Real* YiRhoR = (Real*)malloc(m*sizeof(Real)); Real* XiPhiR = (Real*)malloc(m*sizeof(Real)); - Real dist = 0.; - Real dist2 = 0.; - int ite = 0; - const Real EPS = 1e-15; const Real gaussConstM = pow(2.*M_PI,m/2.); + Real* Phi = (Real*)malloc(p*m*k*sizeof(Real)); + Real* Rho = (Real*)malloc(m*m*k*sizeof(Real)); + Real* Pi = (Real*)malloc(k*sizeof(Real)); while (ite < mini || (ite < maxi && (dist >= tau || dist2 >= sqrt(tau)))) { @@ -215,18 +215,17 @@ void EMGLLF_core( dotProduct += X2[ai(i,u,r,n,p,k)] * phi[ai(u,mm,r,p,m,k)]; //ps1[i,mm,r] = Y2[i,mm,r] * sum(X2[i,,r] * phi[,mm,r]) ps1[ai(i,mm,r,n,m,k)] = Y2[ai(i,mm,r,n,m,k)] * dotProduct; - nY21[ai(i,mm,r,n,m,k)] = Y2[ai(i,mm,r,n,m,k)] * Y2[ai(i,mm,r,n,m,k)]; } //ps[mm,r] = sum(ps1[,mm,r]) Real sumPs1 = 0.; for (int u=0; u1) sum(phi[1:(j-1),mm,r] * Gram2[j,1:(j-1),r]) else 0) + - // (if(j Dist1) Dist1 = tmpDist; } } } //Dist2 = max( (abs(rho-Rho)) / (1+abs(rho)) ) - Real Dist2 = 0.0; + Real Dist2 = 0.; for (int u=0; u Dist2) Dist2 = tmpDist; } } } //Dist3 = max( (abs(pi-Pi)) / (1+abs(Pi))) - Real Dist3 = 0.0; + Real Dist3 = 0.; for (int u=0; u Dist3) Dist3 = tmpDist; } @@ -388,6 +378,8 @@ void EMGLLF_core( ite++; } + //TODO: affec = apply(gam, 1,which.max) à traduire, et retourner affec aussi. + //free memory free(b); free(gam); @@ -398,7 +390,6 @@ void EMGLLF_core( free(ps); free(nY2); free(ps1); - free(nY21); free(Gram2); free(ps2); gsl_matrix_free(matrix); diff --git a/test/README b/test/README index 29c4b9d..b8caf8e 100644 --- a/test/README +++ b/test/README @@ -11,9 +11,9 @@ set -e #1) Generate data using R versions of EMGLLF/EMGrank (slow, but trusted) cd generate_test_data/ - echo "source('generateRunSaveTest_EMGLLF.R');\ - # I'm happy with default values - feel free to give args - generateRunSaveTest_EMGLLF() "\ + echo -e "source('generateRunSaveTest_EMGLLF.R');\n \ + # I'm happy with default values - feel free to give args\n \ + generateRunSaveTest_EMGLLF() " \ | R --slave cd .. diff --git a/test/generate_test_data/EMGLLF.R b/test/generate_test_data/EMGLLF.R index 272eb6f..de6d40e 100644 --- a/test/generate_test_data/EMGLLF.R +++ b/test/generate_test_data/EMGLLF.R @@ -17,7 +17,6 @@ EMGLLF = function(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,lambda,X,Y,tau) Gram2 = array(0, dim=c(p,p,k)) ps2 = array(0, dim=c(p,m,k)) b = rep(0, k) - pen = matrix(0, maxi, k) X2 = array(0, dim=c(n,p,k)) Y2 = array(0, dim=c(n,m,k)) dist = 0 @@ -119,7 +118,8 @@ EMGLLF = function(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,lambda,X,Y,tau) ########## #Etape E # ########## - sumLogLLF2 = 0 + + sumLogLLF2 = 0 for (i in 1:n) { #precompute sq norms to numerically adjust their values @@ -127,7 +127,7 @@ EMGLLF = function(phiInit,rhoInit,piInit,gamInit,mini,maxi,gamma,lambda,X,Y,tau) for (r in 1:k){ sqNorm2[r] = sum( (Y[i,]%*%rho[,,r]-X[i,]%*%phi[,,r])^2 )} - #compute Gam(:,:) using shift determined above + #compute Gam(:,:) sumLLF1 = 0.0; for (r in 1:k) {