Cluster* Community::prepareCluster(const Cluster* rootCluster) const { Cluster* cluster = new Cluster(); map<int, vector<int> > comm; vector<int> order; for (int i = 0; i < g->n; i++) { if (!comm.count(n2c[i])) { comm[n2c[i]] = vector<int>(); order.push_back(n2c[i]); } comm[n2c[i]].push_back(i); } for (int ci = 0; ci < (int)order.size(); ci++) { int cIndex = order[ci]; Cluster* subCluster = new Cluster(); for (int i = 0; i < (int)comm[cIndex].size(); i++) { int vIndex = comm[cIndex][i]; if (rootCluster->containsVertices()) subCluster->addVertex(rootCluster->getVertexes()[vIndex]); else subCluster->addSubCluster(rootCluster->getSubClusters()[vIndex]); } cluster->addSubCluster(subCluster); } return cluster; }
vector<vector<DotNode*> > runModularity(DotGraph& g, bool contiguity) { // initialize clusters Cluster* rootCluster = new Cluster(); for (int i = 0; i < (int)g.nodes.size(); i++) rootCluster->addVertex(i); // run modularity rootCluster = BuildHierarchy(CreateBinaryGraph(g, contiguity), rootCluster, contiguity); vector<vector<DotNode*> > res; if (rootCluster->containsVertices()) { vector<int> v = rootCluster->extractAllVertices(); vector<DotNode*> resn; for (int i = 0; i < (int)v.size(); i++) resn.push_back(g.nodes[v[i]]); res.push_back(resn); } else { vector<Cluster*> cl = rootCluster->getSubClusters(); for (int k = 0; k < (int)cl.size(); k++) { vector<int> v = cl[k]->extractAllVertices(); vector<DotNode*> resn; for (int i = 0; i < (int)v.size(); i++) resn.push_back(g.nodes[v[i]]); res.push_back(resn); } } delete rootCluster; return res; }