X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=pkg%2Fsrc%2Fsources%2FEMGLLF.c;h=b77f24a7ff218d115f2981bf77f2e646f1856ade;hb=f32535f2bc8d50470aa87204bbd7971805dbc9ef;hp=d2f5a8e54c6e84fcfdb58a630b8f011d6ea79b84;hpb=228ee602a972fcac6177db0d539bf9d0c5fa477f;p=valse.git diff --git a/pkg/src/sources/EMGLLF.c b/pkg/src/sources/EMGLLF.c index d2f5a8e..b77f24a 100644 --- a/pkg/src/sources/EMGLLF.c +++ b/pkg/src/sources/EMGLLF.c @@ -16,7 +16,7 @@ void EMGLLF_core( Real lambda, // valeur du paramètre de régularisation du Lasso const Real* X, // régresseurs const Real* Y, // réponse - Real tau, // seuil pour accepter la convergence + Real eps, // seuil pour accepter la convergence // OUT parameters (all pointers, to be modified) Real* phi, // parametre de moyenne renormalisé, calculé par l'EM Real* rho, // parametre de variance renormalisé, calculé par l'EM @@ -39,6 +39,7 @@ void EMGLLF_core( //Other local variables: same as in R Real* gam = (Real*)malloc(n*k*sizeof(Real)); + Real* logGam = (Real*)malloc(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)); @@ -47,7 +48,6 @@ void EMGLLF_core( Real* Y2 = (Real*)malloc(n*m*k*sizeof(Real)); *llh = -INFINITY; Real* pi2 = (Real*)malloc(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)); @@ -300,19 +300,26 @@ void EMGLLF_core( sqNorm2[r] += (YiRhoR[u]-XiPhiR[u]) * (YiRhoR[u]-XiPhiR[u]); } - Real sumGamI = 0.; + // Update gam[,]; use log to avoid numerical problems + Real maxLogGam = -INFINITY; for (int r=0; r EPS) //else: gam[i,] is already ~=0 + Real norm_fact = 0.; + for (int r=0; r dist2) dist2 = Dist3; - if (ite >= mini && (dist >= tau || dist2 >= sqrt(tau))) + if (ite >= mini && (dist >= eps || dist2 >= sqrt(eps))) break; } @@ -394,6 +401,7 @@ void EMGLLF_core( //free memory free(b); free(gam); + free(logGam); free(Phi); free(Rho); free(Pi);