From: Benjamin Auder Date: Tue, 29 Aug 2017 15:03:37 +0000 (+0200) Subject: update EMGLLF.c following changes in EMGLLF.R X-Git-Url: https://git.auder.net/?p=valse.git;a=commitdiff_plain;h=23b9fb13bc6e82d7ca43bfb83aa85b6cd69c52c0 update EMGLLF.c following changes in EMGLLF.R --- diff --git a/pkg/R/EMGLLF.R b/pkg/R/EMGLLF.R index 2aeea53..0d8607c 100644 --- a/pkg/R/EMGLLF.R +++ b/pkg/R/EMGLLF.R @@ -74,7 +74,6 @@ EMGLLF <- function(phiInit, rhoInit, piInit, gamInit, mini, maxi, gamma, lambda, ps2 <- array(0, dim = c(p, m, k)) X2 <- array(0, dim = c(n, p, k)) Y2 <- array(0, dim = c(n, m, k)) - EPS <- 1e-15 for (ite in 1:maxi) { 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