/// Find the probabilities of each letter at the root, given the data at the nodes in 'group' vector<Matrix> get_column_likelihoods(const data_partition& P, const vector<int>& b, const vector<int>& req,const vector<int>& seq,int delta) { const alphabet& a = P.get_alphabet(); const alignment& A = *P.A; const Tree& T = *P.T; Likelihood_Cache& LC = P.LC; #ifndef NDEBUG subA_index_check_footprint(A,T); subA_index_check_regenerate(A,T); #endif //------ Check that all branches point to a 'root' node -----------// assert(b.size()); int root = T.directed_branch(b[0]).target(); for(int i=1;i<b.size();i++) assert(T.directed_branch(b[i]).target() == root); LC.root = root; ublas::matrix<int> index = subA_index_any(b,A,T,req,seq); IF_DEBUG(int n_br =) calculate_caches(P); #ifndef NDEBUG std::clog<<"get_column_likelihoods: Peeled on "<<n_br<<" branches.\n"; #endif vector<Matrix> L; L.reserve(A.length()+2); Matrix& S = LC.scratch(0); const int n_models = S.size1(); const int n_states = S.size2(); //Add the padding matrices { for(int i=0;i<S.size1();i++) for(int j=0;j<S.size2();j++) S(i,j) = 0; for(int i=0;i<delta;i++) L.push_back(S); } const vector<unsigned>& smap = P.SModel().state_letters(); for(int i=0;i<index.size1();i++) { for(int m=0;m<n_models;m++) { for(int s=0;s<n_states;s++) S(m,s) = 1; //-------------- Propagate and collect information at 'root' -----------// for(int j=0;j<b.size();j++) { int i0 = index(i,j); if (i0 != alphabet::gap) for(int s=0;s<n_states;s++) S(m,s) *= LC(i0,b[j])(m,s); } if (root < T.n_leaves()) { int rl = A.seq(root)[i]; if (a.is_letter_class(rl)) for(int s=0;s<n_states;s++) if (not a.matches(smap[s],rl)) S(m,s) = 0; } } L.push_back(S); } return L; }