static void merge_init_Tdt(int k1, int k2, merge_alpha_t *M) { int d, k; /* * build local store */ M->Tdt = u16vec(ddN.DT); M->TdT = u16vec(ddN.DT); M->Ndt = u16vec(ddN.DT); if ( !M->Ndt || !M->TdT || !M->Tdt ) yap_quit("Out of memory in likemerge()\n"); /* * initialise all data entries to simple sum */ M->TDt = ddS.TDt[k1] + ddS.TDt[k2]; for (d=0; d<ddN.DT; d++) { M->Tdt[d] = ddS.Tdt[d][k1] + ddS.Tdt[d][k2]; M->Ndt[d] = ddS.Ndt[d][k1] + ddS.Ndt[d][k2]; M->TdT[d] = 0; for (k=0; k<ddN.T; k++) M->TdT[d] += ddS.Tdt[d][k]; assert(M->Tdt[d]<=M->Ndt[d]); } M->TDTm = ddS.TDT - M->TDt; #ifndef NDEBUG for (d=0; d<ddN.DT; d++) { assert(M->Tdt[d]<=M->Ndt[d]); } #endif }
static void merge_init_Twt(int k1, int k2, merge_beta_t *M) { int w; /* * build local store */ M->Twt = u16vec(ddN.W); M->TwT = u32vec(ddN.W); M->Nwt = u32vec(ddN.W); if ( !M->Nwt || !M->TwT || !M->Twt ) yap_quit("Out of memory in likemerge()\n"); /* * initialise all data entries to simple sum */ M->NWt = ddS.NWt[k1] + ddS.NWt[k2]; M->TWt = ddS.TWt[k1] + ddS.TWt[k2]; for (w=0; w<ddN.W; w++) { M->Twt[w] = ddS.Twt[w][k1] + ddS.Twt[w][k2]; M->Nwt[w] = ddS.Nwt[w][k1] + ddS.Nwt[w][k2]; M->TwT[w] = ddS.TwT[w]; } M->TWTm = ddS.TWT - M->TWt; #ifndef NDEBUG for (w=0; w<ddN.W; w++) { assert(M->Twt[w]<=M->Nwt[w]); } #endif }
/* * place all topic k2 data in topic k1 */ double likemerge(int k1, int k2) { int t, d, k; /* * storing/saving */ uint32_t TDt; uint16_t *Tdt; /* * cache */ uint16_t *TdT; uint16_t *Ndt; /* * sorting on moves */ uint16_t *Tdt_up; uint16_t *Tdt_down; float *score_up; float *score_down; float base_up; float base_down; double likelihood = 0; if ( k1<=0 || k2<=0 ) return 0.0; /* * we save all the old values relevant to topic k1, * and overwrite temporarily so we can use standard * routines/scoring functions */ Tdt = u16vec(ddN.DT); TdT = u16vec(ddN.DT); Ndt = u16vec(ddN.DT); Tdt_up = u16vec(ddN.DT); Tdt_down = u16vec(ddN.DT); score_up = u16vec(ddN.DT); score_down = u16vec(ddN.DT); if ( !score_down || !score_up || !Ndt || !TdT || !Tdt || !Tdt_up || !Tdt_down ) yap_quit("Out of memory in likemerge()\n"); /* * initialise */ TDt = 0; ??????????????? for (d=0; d<ddN.DT; d++) {