(C++) GetSimplerNewicks
February 24, 2017 · View on GitHub
(C++) GetSimplerNewicks
GetSimplerNewicks is a Newick code snippet to obtains simpler Newicks from a Newick, is if one less observation had taken place.
///GetSimplerNewicks creates simpler, derived Newicks from a binary Newick. ///From http://www.richelbilderbeek.nl/CppGetSimplerNewicks.htm const std::vector<std::vector<int> > GetSimplerNewicks(const std::vector<int>& n) { assert(IsNewick(n)); assert(IsBinaryNewick(n)); //If newick is simple (by counting the number of opening brackets), //there are no simpler Newicks if (std::count( n.begin(),n.end(), static_cast<int>(BinaryNewickVector::bracket_open))==1) { //Simple newicks do not need to be simplified return std::vector<std::vector<int> >(); } //newick is complex //Generate other Newicks and their coefficients std::vector<std::vector<int> > newicks; const int sz = n.size(); for (int i=0; i!=sz; ++i) { const int x = n[i]; if (x < 0) //x is not a digit { continue; } if (x == 1) { //If x is not next to a digit, there is no simplification if (n[i-1]<0 && n[i+1]<1) continue; //If next to the x in a digit, merge these and remove their brackets if (n[i-1]==BinaryNewickVector::bracket_open) { assert(n[i+1] > 0); const int new_value = n[i+1] + 1; std::vector<int> next(n.begin(),n.begin() + i - 1); next.push_back(new_value); assert(n[i+2] < 0); std::copy(n.begin() + i + 3,n.end(),std::back_inserter(next)); newicks.push_back(next); } else { assert(n[i-1] > 0); const int new_value = n[i-1] + 1; std::vector<int> next(n.begin(),n.begin()+i-3); next.push_back(new_value); assert(n[i+1] < 0); std::copy(n.begin() + i + 2,n.end(),std::back_inserter(next)); newicks.push_back(next); } } else { std::vector<int> next = n; --next[i]; newicks.push_back(next); } } return newicks; }