void FMMMLayout::call(ClusterGraphAttributes &GA) { const Graph &G = GA.constGraph(); //compute depth of cluster tree, also sets cluster depth values const ClusterGraph &CG = GA.constClusterGraph(); int cdepth = CG.treeDepth(); EdgeArray<double> edgeLength(G); //compute lca of end vertices for each edge edge e; forall_edges(e, G) { edgeLength[e] = cdepth - CG.clusterDepth(CG.commonCluster(e->source(),e->target())) + 1; OGDF_ASSERT(edgeLength[e] > 0) }
bool GraphIO::writeDOT(const ClusterGraphAttributes &CA, std::ostream &out) { const Graph &G = CA.constGraph(); const ClusterGraph &C = CA.constClusterGraph(); int id = 1; // Assign a list of edges for each cluster. Perhaps usage of std::vector // here needs reconsideration - vector is fast but usage of STL iterators // is ugly without C++11 for-each loop. ClusterArray< std::vector<edge> > edgeMap(C); for(edge e : G.edges) { const node s = e->source(), t = e->target(); edgeMap[C.commonCluster(s, t)].push_back(e); } return dot::writeCluster(out, 0, edgeMap, C, &CA, C.rootCluster(), id); }