Ejemplo n.º 1
0
void model3::collectCountsOverAlignement(const Vector<WordIndex>& es, 
					 const Vector<WordIndex>& fs, 
					 const Vector<WordIndex>& A, 
					 LogProb score, 
					 float count)
{
  WordIndex j,i,l,m ;
  Vector<WordIndex> Fert(es.size(),0);
  l = es.size() - 1 ;
  m = fs.size() - 1 ;
  score *= LogProb(count);
  COUNT temp = COUNT(score) ;
  for (i=0 ; i <= l ; i++)
    Fert[i] = 0 ;
  for (j = 1 ; j <= m ; j++){
    Fert[A[j]]++;
    tTable.incCount(es[A[j]], fs[j], temp);
    //    tCountTable.getRef(es[A[j]], fs[j])+=score;
    if (A[j])
      dCountTable.getRef(j, A[j], l, m)+= temp ;
    aCountTable.getRef(A[j], j, l, m)+= temp ;
  }
  for(i = 0 ; i <= l ; i++)
    nCountTable.getRef(es[i], Fert[i])+= temp ;
  //  p1_count += score * (LogProb) (Fert[0]) ;
  //  p0_count += score * (LogProb) ((m - 2 * Fert[0])) ;
  p1_count += temp * (Fert[0]) ;
  p0_count += temp *  ((m - 2 * Fert[0])) ;
}
Ejemplo n.º 2
0
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
  int T, K, L, N, tmp, t, i, j, k, l;
  double *Pi, *B, *A, *data;
	double *outputToolPtr;
	const mwSize* emit_dims;

	if (nrhs != 4) {
		mexErrMsgTxt("Requires 4 arguments: tans, emit, init, data");
		return;
	}

  A = mxGetPr(prhs[0]);
  B = mxGetPr(prhs[1]);	
  Pi = mxGetPr(prhs[2]);
  data = mxGetPr(prhs[3]);

  emit_dims = mxGetDimensions(prhs[1]);
  K = emit_dims[0];
  L = emit_dims[1];
  T = mxGetM(prhs[3]);

  tmp = mxGetN(prhs[0]);
  if (tmp != K) 
    mexErrMsgTxt("The transition matrix must be of size KxK");
  tmp = mxGetM(prhs[0]);
  if (tmp != K)
    mexErrMsgTxt("The transition matrix must be of size KxK");	
  tmp = mxGetN(prhs[2]);
  if (tmp != K) 
    mexErrMsgTxt("The initial state distribution must be of size 1xK");

  VectorType init = VectorType::Zero(K);
  MatrixType trans = MatrixType::Zero(K, K);
  MatrixType softev = MatrixType::Zero(K, T);

  for (int i = 0; i < K; ++i) {
    for (int j = 0; j < K; ++j) {
      trans(i,j) = A[i + j*K];
    }
  }

  for (int i = 0; i < K; ++i) {
    init(i) = Pi[i];
  }


  // Update soft evidence
  for (t = 0; t < T; ++t) {
    for (k = 0; k < K; ++k) {
      double prod = 1.0;
      for (l = 0; l < L; ++l) {
        if (data[t + l*T] == 1) {
	  prod *= B[k + l*K + 0*K*L];// + 1E-9;	
        } else {
          prod *= B[k + l*K + 1*K*L];// + 1E-9;
        }
      }
      softev(k,t) = prod;
    }
  }
	
	double loglik;	
	loglik = LogProb(trans, init, softev);

	plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
	outputToolPtr = mxGetPr(plhs[0]);
	outputToolPtr[0] = loglik;	
}