X-Git-Url: https://git.auder.net/?p=valse.git;a=blobdiff_plain;f=pkg%2Fsrc%2Fsources%2FEMGLLF.c;h=d9f92c049745c1304b1852df9f509c18a841a308;hp=d2f5a8e54c6e84fcfdb58a630b8f011d6ea79b84;hb=23b9fb13bc6e82d7ca43bfb83aa85b6cd69c52c0;hpb=17b9fa5f6004bb55e915d8916f1c9a1f128a65ce diff --git a/pkg/src/sources/EMGLLF.c b/pkg/src/sources/EMGLLF.c index d2f5a8e..d9f92c0 100644 --- a/pkg/src/sources/EMGLLF.c +++ b/pkg/src/sources/EMGLLF.c @@ -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