static double awterms(double myaw, void *mydata) { int i, t; double val = 0; double law = log(myaw); #ifdef A_DEBUG float save_a = ddC.SY->a; double like; #endif S_remake(ddC.SY, myaw); for (t=0; t<ddN.T; t++) { uint32_t Tw_ = 0; for (i=0; i<ddN.W; i++) { Tw_ += ddS.Twt[i][t]; if ( ddS.Nwt[i][t]>1 ) { val += S_S(ddC.SY,ddS.Nwt[i][t],ddS.Twt[i][t]); } } val += Tw_*law + lgamma(ddP_bwpar(t)/myaw+Tw_) - lgamma(ddP_bwpar(t)/myaw); } myarms_evals++; #ifdef A_DEBUG yap_message("Eval awterms(%lf) = %lf (S had %f)", myaw, val, save_a); ddP.awpar = myaw; cache_update("aw"); like = likelihood(); if ( last_val != 0 ) { yap_message(", lp=%lf diffs=%lf vs %lf\n", like, val-last_val, like-last_like); } last_like = like; last_val = val; #endif return val; }
/* * compute likelihood ratio difference based on *M */ static double merge_like_Twt(int k1, int k2, merge_beta_t *M) { int i, w; double likelihood = 0; #ifndef BWPAR0 double lbw = log(ddP.bwpar); #endif double law = log(ddP.awpar); double TW_diff = 0; #ifdef BWPAR0 yap_quit("BWPAR0 unimpleented in merge\n"); #endif for (i=0; i<ddN.W; i++) { likelihood -= S_S(ddC.SY,ddS.Nwt[i][k1],ddS.Twt[i][k2]); likelihood -= S_S(ddC.SY,ddS.Nwt[i][k1],ddS.Twt[i][k2]); likelihood += S_S(ddC.SY,M->Nwt[i],M->Twt[i]); } if ( ddP.awpar==0 ) { #ifdef BWPAR0 likelihood += M->TWt-ddS.TWt[k1]*log(ddP_bwpar(k1)) -ddS.TWt[k2]*log(ddP_bwpar(k2)); #else likelihood += (M->TWt-ddS.TWt[k1]-ddS.TWt[k2])*lbw; #endif } else { likelihood += (M->TWt-ddS.TWt[k1]-ddS.TWt[k2])*law + gammadiff((int)M->TWt, ddP.bwpar/ddP.awpar, 0.0) - gammadiff((int)ddS.TWt[k1], ddP_bwpar(k1)/ddP.awpar, 0.0) - gammadiff((int)ddS.TWt[k2], ddP_bwpar(k2)/ddP.awpar, 0.0); } likelihood += gammadiff((int)ddS.NWt[k1], ddP_bwpar(k1), 0.0); likelihood += gammadiff((int)ddS.NWt[k2], ddP_bwpar(k2), 0.0); likelihood -= gammadiff((int)M->NWt, ddP.bwpar, 0.0); yap_infinite(likelihood); if ( ddP.PYbeta==H_PDP ) { for (w=0; w<ddN.W; w++) { if ( ddS.TwT[w]>0 ) { // ??????????????? likelihood += ddS.TwT[w]*log(ddP.betapr[w]); } } } else if ( ddP.PYbeta==H_HDP ) { yap_quit("merge with PYbeta unimplemented\n"); likelihood += lgamma(M->TWTm+M->TWt-TW_diff+ddP.bw0) - lgamma(M->TWTm+M->TWt+ddP.bw0); for (w=0; w<ddN.W; w++) { // ??????????? likelihood -= gammadiff(ddS.TWt[k1], ddP.bw0*ddP.betapr[k1], 0.0); likelihood -= gammadiff(ddS.TWt[k2], ddP.bw0*ddP.betapr[k2], 0.0); likelihood += gammadiff(M->TWt, ddP.bw0*ddP.betapr[k1], 0.0); } } else { double lgaw0 = lgamma(1-ddP.aw0); likelihood += lgamma(M->TWTm+M->TWt-TW_diff+ddP.bw0) - lgamma(M->TWTm+M->TWt+ddP.bw0); /* because k2 gone to zero, so one less topic */ likelihood -= log(ddP.bw0+ddP.aw0*(ddS.TWTnz-1)); if ( ddS.TWt[k2]>1 ) likelihood -= lgamma(ddS.TWt[k2]-ddP.aw0) - lgaw0; if ( ddS.TWt[k1]>1 ) likelihood -= lgamma(ddS.TWt[k1]-ddP.aw0) - lgaw0; likelihood += lgamma(M->TWt-ddP.aw0) - lgaw0; } yap_infinite(likelihood); return likelihood; }