bool update_lengths(const SequenceTree& Q,const SequenceTree& T, valarray<double>& branch_lengths, valarray<double>& branch_lengths_squared, valarray<double>& node_lengths) { // map branches from Q -> T vector<int> branches_map = extends_map(T,Q); if (not branches_map.size()) return false; // incorporate lengths of branches that map to Q for(int b=0;b<Q.n_branches();b++) { int b2 = branches_map[b]; double L = T.directed_branch(b2).length(); branch_lengths[b] += L; branch_lengths_squared[b] += L*L; } // map nodes from T -> Q vector<int> nodes_map = get_nodes_map(Q,T,branches_map); // incorprate lengths of branches that map to nodes in Q for(int i=T.n_leafbranches();i<T.n_branches();i++) { const_branchview b = T.branch(i); int n1 = nodes_map[b.source()]; int n2 = nodes_map[b.target()]; if (n1 == n2) node_lengths[n1] += T.branch(i).length(); } return true; }
vector<Partition> internal_partitions_from_tree(const SequenceTree& T) { vector<Partition> partitions; for(int b=T.n_leafbranches();b<T.n_branches();b++) partitions.push_back(partition_from_branch(T,b)); return partitions; }