void processGraph(const PermVec& permsIn, int maxGap, PermVec& permsOut, BlockGroups& groupsOut) { BreakpointGraph bg(permsIn); DEBUG_PRINT("Started graph simplification"); int totalPaths = 0; int totalBulges = 0; int prevPaths = 0; int prevBulges = 0; while (true) { prevPaths = compressGraph(bg, maxGap); DEBUG_PRINT(prevPaths << " paths compressed"); totalPaths += prevPaths; if (prevPaths + prevBulges == 0) break; prevBulges = removeBulges(bg, maxGap); DEBUG_PRINT(prevBulges << " bulges removed"); totalBulges += prevBulges; if (prevPaths + prevBulges == 0) break; } DEBUG_PRINT("Done: " << totalPaths << " paths compressed, " << totalBulges << " bulges removed\n"); bg.getPermutations(permsOut, groupsOut); }
Graph(const vec1<vec1<VertexType> >& _points_in, int domain) { vec1<vec1<VertexType> > _points = compressGraph(_points_in); if(_points.size() > domain) throw GAPException("Graph too large"); edges = _points; edges.resize(domain); for(int i : range1(_points.size())) { int i_size = _points[i].size(); for(int j = 1; j <= i_size; ++j) { if(_points[i][j].target() <= 0 || _points[i][j].target() > domain) { throw GAPException("Graph contains out-of-bounds vertex: " + toString(_points[i][j].target())); } if(_points[i][j].colour() < 0 ) { throw GAPException(" Graph contains invalid edge colour: " + toString(_points[i][j].colour())); } VertexType edge(i, _points[i][j].colour()); if(directed) { edge = edge.flipped(); } edges[_points[i][j].target()].push_back(edge); } } for(int i : range1(edges.size())) { std::set<VertexType> pntset(edges[i].begin(), edges[i].end()); edges[i] = vec1<VertexType>(pntset.begin(), pntset.end()); } }
void compressPaths(const PermVec& permsIn, int maxGap, PermVec& permsOut, BlockGroups& groupsOut) { std::cerr << "\tStarted initial compression\n"; BreakpointGraph bg(permsIn); int paths = compressGraph(bg, maxGap); (void)paths; //disable warning DEBUG_PRINT("Initial compression: " << paths << " paths"); bg.getPermutations(permsOut, groupsOut); }