Exemplo n.º 1
0
SumProduct::SumProduct (const RateModel& model, const Tree& tree)
  : SumProductStorage (model.components(), tree.nodes(), model.alphabetSize()),
    model (model),
    tree (tree),
    preorder (tree.preorderSort()),
    postorder (tree.postorderSort()),
    eigen (model),
    insProb (model.components(), vguard<double> (model.alphabetSize())),
    branchSubProb (model.components(), vguard<vguard<vguard<double> > > (tree.nodes(), vguard<vguard<double> > (model.alphabetSize(), vguard<double> (model.alphabetSize())))),
    branchEigenSubCount (model.components(), vguard<gsl_matrix_complex*> (tree.nodes())),
    logCptWeight (log_vector (model.cptWeight))
{
  for (int cpt = 0; cpt < components(); ++cpt)
    for (AlphTok i = 0; i < model.alphabetSize(); ++i)
      insProb[cpt][i] = gsl_vector_get (model.insProb[cpt], i);

  for (AlignRowIndex r = 0; r < tree.nodes() - 1; ++r) {
      ProbModel pm (model, tree.branchLength(r));
      for (int cpt = 0; cpt < components(); ++cpt)
	for (AlphTok i = 0; i < model.alphabetSize(); ++i)
	  for (AlphTok j = 0; j < model.alphabetSize(); ++j)
	    branchSubProb[cpt][r][i][j] = gsl_matrix_get (pm.subMat[cpt], i, j);
  }

  for (AlignRowIndex r = 0; r < tree.nodes() - 1; ++r) {
    vguard<gsl_matrix_complex*> esc = eigen.eigenSubCount (tree.branchLength(r));
    for (int cpt = 0; cpt < components(); ++cpt)
      branchEigenSubCount[cpt][r] = esc[cpt];
  }
}
Exemplo n.º 2
0
void bi::condition(const ExpGaussianPdf<V1, M1>& p1, const ExpGaussianPdf<V2,
    M2>& p2, const M3 C, const V3 x2, ExpGaussianPdf<V4, M4>& p3) {
  /* pre-condition */
  BI_ASSERT(x2.size() == p2.size());
  BI_ASSERT(p3.size() == p1.size());
  BI_ASSERT(C.size1() == p1.size() && C.size2() == p2.size());

  typename sim_temp_vector<V1>::type z2(p2.size());
  typename sim_temp_matrix<M1>::type K(p1.size(), p2.size());

  /**
   * Compute gain matrix:
   *
   * \f[\mathcal{K} = C_{\mathbf{x}_1,\mathbf{x}_2}\Sigma_2^{-1}\,.\f]
   */
  symm(1.0, p2.prec(), C, 0.0, K, 'R', 'U');

  /**
   * Then result is given by \f$\mathcal{N}(\boldsymbol{\mu}',
   * \Sigma')\f$, where:
   *
   * \f[\boldsymbol{\mu}' = \boldsymbol{\mu}_1 + \mathcal{K}(\mathbf{x}_2 -
   * \boldsymbol{\mu}_2)\,,\f]
   */
  z2 = x2;
  log_vector(z2, p2.getLogs());
  axpy(-1.0, p2.mean(), z2);
  p3.mean() = p1.mean();
  gemv(1.0, K, z2, 1.0, p3.mean());

  /**
   * and:
   *
   * \f{eqnarray*}
   * \Sigma' &=& \Sigma_1 - \mathcal{K}C_{\mathbf{x}_1,\mathbf{x}_2}^T \\
   * &=& \Sigma_1 - C_{\mathbf{x}_1,\mathbf{x}_2}\Sigma_2^{-1}
   * C_{\mathbf{x}_1,\mathbf{x}_2}^T\,.\f}
   */
  K = C;
  trsm(1.0, p2.std(), K, 'R', 'U');
  p3.cov() = p1.cov();
  syrk(-1.0, K, 1.0, p3.cov(), 'U');

  /* update log-variables and precalculations */
  p3.setLogs(p1.getLogs());
  p3.init();
}