Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}