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