static void makeGraph(const char* input) { std::vector<GNode> nodes; //Create local computation graph. typedef Galois::Graph::LC_CSR_Graph<Node, EdgeDataType> InGraph; typedef InGraph::GraphNode InGNode; InGraph in_graph; //Read graph from file. Galois::Graph::readGraph(in_graph, input); std::cout << "Read " << in_graph.size() << " nodes\n"; //A node and a int is an element. typedef std::pair<InGNode, EdgeDataType> Element; //A vector of element is 'Elements' typedef std::vector<Element> Elements; //A vector of 'Elements' is a 'Map' typedef std::vector<Elements> Map; //'in_edges' is a vector of vector of pairs of nodes and int. Map edges(in_graph.size()); // int numEdges = 0; for (InGraph::iterator src = in_graph.begin(), esrc = in_graph.end(); src != esrc; ++src) { for (InGraph::edge_iterator dst = in_graph.edge_begin(*src, Galois::MethodFlag::NONE), edst = in_graph.edge_end(*src, Galois::MethodFlag::NONE); dst != edst; ++dst) { if (*src == *dst) { #if BORUVKA_DEBUG std::cout<<"ERR:: Self loop at "<<*src<<std::endl; #endif continue; } EdgeDataType w = in_graph.getEdgeData(dst); Element e(*src, w); edges[in_graph.getEdgeDst(dst)].push_back(e); numEdges++; } } #if BORUVKA_DEBUG std::cout<<"Number of edges "<<numEdges<<std::endl; #endif nodes.resize(in_graph.size()); for (Map::iterator i = edges.begin(), ei = edges.end(); i != ei; ++i) { Node n(nodeID); GNode node = graph.createNode(n); graph.addNode(node); nodes[nodeID] = node; nodeID++; } int id = 0; numEdges = 0; EdgeDataType edge_sum = 0; int numDups = 0; for (Map::iterator i = edges.begin(), ei = edges.end(); i != ei; ++i) { GNode src = nodes[id]; for (Elements::iterator j = i->begin(), ej = i->end(); j != ej; ++j) { Graph::edge_iterator it = graph.findEdge(src, nodes[j->first], Galois::MethodFlag::NONE); if (it != graph.edge_end(src, Galois::MethodFlag::NONE)) { numDups++; EdgeDataType w = (graph.getEdgeData(it)); if (j->second < w) { graph.getEdgeData(it) = j->second; edge_sum += (j->second-w); } } else { graph.getEdgeData(graph.addEdge(src, nodes[j->first], Galois::MethodFlag::NONE)) = j->second; edge_sum += j->second; } numEdges++; assert(edge_sum < std::numeric_limits<EdgeDataType>::max()); } id++; } #if BORUVKA_DEBUG std::cout << "Final num edges " << numEdges << " Dups " << numDups << " sum :" << edge_sum << std::endl; #endif }
static void makeGraph(GraphType &graph, const char* input) { std::vector<SGNode> nodes; //Create local computation graph. typedef Galois::Graph::LC_CSR_Graph<Node, edgedata> InGraph; typedef InGraph::GraphNode InGNode; InGraph in_graph; //Read graph from file. Galois::Graph::readGraph(in_graph, input); std::cout << "Read " << in_graph.size() << " nodes\n"; //A node and a int is an element. typedef std::pair<InGNode, edgedata> Element; //A vector of element is 'Elements' typedef std::vector<Element> Elements; //A vector of 'Elements' is a 'Map' typedef std::vector<Elements> Map; //'in_edges' is a vector of vector of pairs of nodes and int. Map edges(in_graph.size()); // int numEdges = 0; // Extract edges from input graph for (InGraph::iterator src = in_graph.begin(), esrc = in_graph.end(); src != esrc; ++src) { for (InGraph::edge_iterator dst = in_graph.edge_begin(*src, Galois::MethodFlag::NONE), edst = in_graph.edge_end(*src, Galois::MethodFlag::NONE); dst != edst; ++dst) { edgedata w = in_graph.getEdgeData(dst); Element e(*src, w); edges[in_graph.getEdgeDst(dst)].push_back(e); numEdges++; } } //#if BORUVKA_DEBUG std::cout<<"Number of edges "<<numEdges<<std::endl; //#endif // Create nodes in output graph nodes.resize(in_graph.size()); int nodeID = 0; for (Map::iterator i = edges.begin(), ei = edges.end(); i != ei; ++i) { Node n; n.id = nodeID; assert(!n.seen); SGNode node = graph.createNode(n); graph.addNode(node); nodes[nodeID] = node; nodeID++; } int id = 0; numEdges = 0; for (Map::iterator i = edges.begin(), ei = edges.end(); i != ei; ++i) { SGNode src = nodes[id]; for (Elements::iterator j = i->begin(), ej = i->end(); j != ej; ++j) { typename GraphType::edge_iterator it = graph.findEdge(src, nodes[j->first], Galois::MethodFlag::NONE); if ( it != graph.edge_end(src, Galois::MethodFlag::NONE) ) { assert(graph.getEdgeData(it) == j->second); continue; } it = graph.addEdge(src, nodes[j->first], Galois::MethodFlag::NONE); graph.getEdgeData(it) = j->second; numEdges++; } id++; } //#if BORUVKA_DEBUG std::cout << "Final num edges " << numEdges << std::endl; //#endif }