コード例 #1
0
ファイル: Metric.cpp プロジェクト: Surtr04/UT_Internship
std::vector<unsigned> edgeCut(GGraph& g, unsigned nparts) {
  std::vector<unsigned> cuts(nparts);

 //find boundary nodes with positive gain
  for (auto nn = g.begin(), en = g.end(); nn != en; ++nn) {
    unsigned gPart = g.getData(*nn).getPart();
    for (auto ii = g.edge_begin(*nn), ee = g.edge_end(*nn); ii != ee; ++ii) {
      auto& m = g.getData(g.getEdgeDst(ii));
      if (m.getPart() != gPart) {
        cuts.at(gPart) += g.getEdgeData(ii);
      }
    }
  }

  return cuts;
}
コード例 #2
0
ファイル: GMetis.cpp プロジェクト: nikunjy/parallelStuff
void readMetisGraph(MetisGraph* metisGraph, const char* filename){
	std::ifstream file(filename);
	string line;
	std::getline(file, line);
	while(line.find('%')!=string::npos){
		std::getline(file, line);
	}

	int numNodes, numEdges;
	sscanf(line.c_str(), "%d %d", &numNodes, &numEdges);
	cout<<numNodes<<" "<<numEdges<<endl;
	GGraph* graph = metisGraph->getGraph();
	vector<GNode> nodes(numNodes);
	for (int i = 0; i < numNodes; i++) {
		GNode n = graph->createNode(MetisNode(i, 1));
		nodes[i] = n;
		graph->addNode(n);
	}
	int countEdges = 0;
	for (int i = 0; i < numNodes; i++) {
		std::getline(file, line);
		char const * items = line.c_str();
		char* remaining;
		GNode n1 = nodes[i];

		while (true) {
			int index = strtol(items, &remaining,10) - 1;
			if(index < 0) break;
			items = remaining;
			GNode n2 = nodes[index];
			if(n1==n2){
				continue;
			}
			graph->getEdgeData(graph->addEdge(n1, n2)) = 1;
			graph->getData(n1).addEdgeWeight(1);
			graph->getData(n1).incNumEdges();
			countEdges++;
		}
	}

	assert(countEdges == numEdges*2);
	metisGraph->setNumEdges(numEdges);
	metisGraph->setNumNodes(numNodes);
	cout<<"finshied reading graph " << metisGraph->getNumNodes() << " " << metisGraph->getNumEdges()<<endl;
}
コード例 #3
0
ファイル: GMetis.cpp プロジェクト: nikunjy/parallelStuff
void readGraph(MetisGraph* metisGraph, const char* filename, bool weighted = false, bool directed = true){
	InputGraph inputGraph;
	inputGraph.structureFromFile(filename);
	cout<<"start to transfer data to GGraph"<<endl;
	int id = 0;
	for (InputGraph::iterator ii = inputGraph.begin(), ee = inputGraph.end(); ii != ee; ++ii) {
		InputGNode node = *ii;
		inputGraph.getData(node)=id++;
	}

	GGraph* graph = metisGraph->getGraph();
	vector<GNode> gnodes(inputGraph.size());
	id = 0;
	for(uint64_t i=0;i<inputGraph.size();i++){
		GNode node = graph->createNode(MetisNode(id, 1));
		graph->addNode(node);
		gnodes[id++] = node;
	}

	int numEdges = 0;
	for (InputGraph::iterator ii = inputGraph.begin(), ee = inputGraph.end(); ii != ee; ++ii) {
		InputGNode inNode = *ii;

		int nodeId = inputGraph.getData(inNode);
		GNode node = gnodes[nodeId];

		MetisNode& nodeData = graph->getData(node);

		for (InputGraph::edge_iterator jj = inputGraph.edge_begin(inNode), eejj = inputGraph.edge_end(inNode); jj != eejj; ++jj) {
		  InputGNode inNeighbor = inputGraph.getEdgeDst(jj);
			if(inNode == inNeighbor) continue;
			int neighId = inputGraph.getData(inNeighbor);
			int weight = 1;
			if(weighted){
			  weight = inputGraph.getEdgeData(jj);
			}
			if(!directed){
			  graph->getEdgeData(graph->addEdge(node, gnodes[neighId])) = weight;//
				nodeData.incNumEdges();
				nodeData.addEdgeWeight(weight);//inputGraph.getEdgeData(inNode, inNeighbor));
				numEdges++;
			}else{
			  graph->getEdgeData(graph->addEdge(node, gnodes[neighId])) = weight;//
			  graph->getEdgeData(graph->addEdge(gnodes[neighId], node)) = weight;//
			}
		}

	}

	if(directed){
		for (GGraph::iterator ii = graph->begin(), ee = graph->end(); ii != ee; ++ii) {
			GNode node = *ii;
			MetisNode& nodeData = graph->getData(node);
			for (GGraph::edge_iterator jj = graph->edge_begin(node), eejj = graph->edge_end(node); jj != eejj; ++jj) {
			  GNode neighbor = graph->getEdgeDst(jj);
				nodeData.incNumEdges();
				nodeData.addEdgeWeight(graph->getEdgeData(jj));
				assert(graph->getEdgeData(jj) == graph->getEdgeData(graph->findEdge(neighbor, node)));
				numEdges++;
			}
		}
	}
	cout<<"numNodes: "<<inputGraph.size()<<"|numEdges: "<<numEdges/2<<endl;
	metisGraph->setNumEdges(numEdges/2);
	metisGraph->setNumNodes(gnodes.size());
	cout<<"end of transfer data to GGraph"<<endl;
}
コード例 #4
0
ファイル: Game.cpp プロジェクト: sundoom/sunstudio
/*
====================
GDrawGame
====================
*/
VOID GDrawGame(GGraph& graph)
{
  graph.Draw((I32)s_pt.X(), (I32)s_pt.Y(), s_image_ptr.Get());
}
コード例 #5
0
/**
 * project the partitioning information back the finer graph
 */
void projectTwoWayPartition(MetisGraph* metisGraph) {

	MetisGraph* finer = metisGraph->getFinerGraph();
	finer->setMinCut(metisGraph->getMinCut());
	finer->initPartWeight(2);
	finer->setPartWeight(0, metisGraph->getPartWeight(0));
	finer->setPartWeight(1, metisGraph->getPartWeight(1));
	finer->initBoundarySet();

	GGraph* finerGraph = finer->getGraph();

	for (GGraph::iterator ii = finerGraph->begin(), ee = finerGraph->end(); ii != ee; ++ii) {
		GNode node = *ii;
		MetisNode& nodeData = finerGraph->getData(node);
		nodeData.setPartition(metisGraph->getGraph()->getData(finer->getCoarseGraphMap(nodeData.getNodeId())).getPartition());
		assert(nodeData.getPartition()>=0);
		nodeData.setEdegree(0);
		nodeData.setIdegree(0);
		finer->unsetBoundaryNode(node);
	}

	for (GGraph::iterator ii = finerGraph->begin(), ee = finerGraph->end(); ii != ee; ++ii) {
		GNode node = *ii;

		MetisNode& nodeData = finerGraph->getData(node);
		nodeData.setIdegree(nodeData.getAdjWgtSum());
		if (finerGraph->edge_begin(node) != finerGraph->edge_end(node) && metisGraph->getGraph()->getData(finer->getCoarseGraphMap(nodeData.getNodeId())).isBoundary()) {
			for (GGraph::edge_iterator jj = finerGraph->edge_begin(node, Galois::NONE), eejj = finerGraph->edge_end(node, Galois::NONE); jj != eejj; ++jj) {
			  GNode neighbor = finerGraph->getEdgeDst(jj);
				MetisNode& neighborData = finerGraph->getData(neighbor);
				if (nodeData.getPartition() != neighborData.getPartition()) {
					nodeData.setEdegree(nodeData.getEdegree() + (int)finerGraph->getEdgeData(jj));
				}
			}
		}
		if (finerGraph->edge_begin(node) != finerGraph->edge_end(node)) {
			nodeData.setIdegree(nodeData.getIdegree() - nodeData.getEdegree());
		}
		if (finerGraph->edge_begin(node) == finerGraph->edge_end(node) || nodeData.getEdegree() > 0) {
			finer->setBoundaryNode(node);
		}
	}
}