double opt_alpha(double ss, double &alpha_sum, int D, int K) { double a, log_a, init_a = 100, old_a = 0; double f = 0, df, d2f, f_old = 0; int iter = 0; log_a = log(init_a); do { iter++; f_old = f; a = exp(log_a); alpha_sum += a - old_a; old_a = a; if (/*isnan(a)*/a>1e300 || a<1e-300) { init_a = init_a * 10; printf("warning : alpha is nan; new init = %5.5f\n", init_a); a = init_a; log_a = log(a); } f = alhood(a, alpha_sum, ss, D, K); df = d_alhood(a, alpha_sum, ss, D, K); d2f = d2_alhood(a, alpha_sum, D, K); log_a = log_a - df/(d2f * a + df); //printf("alpha maximization : %5.5f %5.5f\n", f, df); } while ((fabs(df) > NEWTON_THRESH) && (iter < MAX_ALPHA_ITER)); return(exp(log_a)); }
double opt_alpha(double ss, int D, int K) { double a, log_a, init_a = 100; double df, d2f; int iter = 0; log_a = log(init_a); do { iter++; a = exp(log_a); if (isnan(a)) { init_a = init_a * 10; Rprintf("warning : alpha is nan; new init = %5.5f\n", init_a); a = init_a; log_a = log(a); } df = d_alhood(a, ss, D, K); d2f = d2_alhood(a, D, K); log_a = log_a - df/(d2f * a + df); } while ((fabs(df) > NEWTON_THRESH) && (iter < MAX_ALPHA_ITER)); return(exp(log_a)); }