int choose_SPR_target(SequenceTree& T1, int b1_) { const_branchview b1 = T1.directed_branch(b1_); //----- Select the branch to move to ------// dynamic_bitset<> subtree_nodes = T1.partition(b1.reverse()); subtree_nodes[b1.target()] = true; vector<int> branches; vector<double> lengths; for(int i=0; i<T1.n_branches(); i++) { const_branchview bi = T1.branch(i); // skip branch if its contained in the subtree if (subtree_nodes[bi.target()] and subtree_nodes[bi.source()]) continue; double L = 1.0; // down-weight branch if it is one of the subtree's 2 neighbors if (subtree_nodes[bi.target()] or subtree_nodes[bi.source()]) L = 0.5; branches.push_back(i); lengths.push_back(L); } int b2 = branches[ choose(lengths) ]; return b2; }
Partition partition_from_branch(const SequenceTree& T,int b) { dynamic_bitset<> group(T.n_leaves()); const dynamic_bitset<>& with_internal = T.partition(b); for(int i=0;i<group.size();i++) group[i] = with_internal[i]; return Partition(T.get_leaf_labels(), group); }