Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*
 *  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;
}