/// Check that any two present nodes are connected by a path of present nodes bool all_characters_connected(const Tree& T,dynamic_bitset<> present,const vector<int>& _ignore) { assert(present.size() == T.n_nodes()); //--------- set the ignored nodes to 'not present' -----------// dynamic_bitset<> ignore(present.size()); for(int i=0;i<_ignore.size();i++) { int n = _ignore[i]; present[n] = false; ignore[n] = true; } //---------- for each internal node... -------------// for(int n1=T.n_leaves(); n1<T.n_nodes(); n1++) { if (present[n1] or ignore[n1]) continue; //------- if it is '-' and not ignored ... -------// vector<const_nodeview> neighbors; append(T[n1].neighbors(),neighbors); assert(neighbors.size() == 3); //---- check the three attatched subtrees ... ----// int total=0; for(int i=0;i<neighbors.size();i++) { dynamic_bitset<> group = T.partition(n1,neighbors[i]); if (present.intersects(group)) total++; } //----- nodes should be present in only one. -----// if (total > 1) return false; } return true; }
void connect_all_characters(const Tree& T,dynamic_bitset<>& present) { assert(present.size() == T.n_nodes()); //---------- for each internal node... -------------// for(int n1=T.n_leaves(); n1<T.n_nodes(); n1++) { if (present[n1]) continue; //------- if it is '-' and not ignored ... -------// vector<const_nodeview> neighbors; append(T[n1].neighbors(),neighbors); assert(neighbors.size() == 3); //---- check the three attatched subtrees ... ----// int total=0; for(int i=0;i<neighbors.size();i++) { dynamic_bitset<> group = T.partition(n1,neighbors[i]); if (present.intersects(group)) total++; } if (total > 1) present[n1] = true; } assert(all_characters_connected(T,present,vector<int>())); }