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; }
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; }