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]; } }
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(); }