예제 #1
0
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;
}
예제 #2
0
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;
}