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; }
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; }
/** * 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); } } }
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; }