Пример #1
0
void writePfpGraph(const std::string& inputFile, const std::string& outputFile) {
  typedef Galois::Graph::FileGraph ReaderGraph;
  typedef ReaderGraph::GraphNode ReaderGNode;

  ReaderGraph reader;
  reader.structureFromFile(inputFile);

  typedef Galois::Graph::FileGraphWriter Writer;
  typedef Galois::LargeArray<EdgeTy> EdgeData;
  typedef typename EdgeData::value_type edge_value_type;

  Writer p;
  EdgeData edgeData;

  // Count edges
  size_t numEdges = 0;
  for (ReaderGraph::iterator ii = reader.begin(), ei = reader.end(); ii != ei; ++ii) {
    ReaderGNode rsrc = *ii;
    for (ReaderGraph::edge_iterator jj = reader.edge_begin(rsrc),
        ej = reader.edge_end(rsrc); jj != ej; ++jj) {
      ReaderGNode rdst = reader.getEdgeDst(jj);
      if (rsrc == rdst) continue;
      if (!reader.hasNeighbor(rdst, rsrc)) 
        ++numEdges;
      ++numEdges;
    }
  }

  p.setNumNodes(reader.size());
  p.setNumEdges(numEdges);
  p.setSizeofEdgeData(sizeof(edge_value_type));

  p.phase1();
  for (ReaderGraph::iterator ii = reader.begin(), ei = reader.end(); ii != ei; ++ii) {
    ReaderGNode rsrc = *ii;
    for (ReaderGraph::edge_iterator jj = reader.edge_begin(rsrc),
        ej = reader.edge_end(rsrc); jj != ej; ++jj) {
      ReaderGNode rdst = reader.getEdgeDst(jj);
      if (rsrc == rdst) continue;
      if (!reader.hasNeighbor(rdst, rsrc)) 
        p.incrementDegree(rdst);
      p.incrementDegree(rsrc);
    }
  }

  EdgeTy one = 1;
  static_assert(sizeof(one) == sizeof(uint32_t), "Unexpected edge data size");
  one = Galois::convert_le32(one);

  p.phase2();
  edgeData.create(numEdges);
  for (ReaderGraph::iterator ii = reader.begin(), ei = reader.end(); ii != ei; ++ii) {
    ReaderGNode rsrc = *ii;
    for (ReaderGraph::edge_iterator jj = reader.edge_begin(rsrc),
        ej = reader.edge_end(rsrc); jj != ej; ++jj) {
      ReaderGNode rdst = reader.getEdgeDst(jj);
      if (rsrc == rdst) continue;
      if (!reader.hasNeighbor(rdst, rsrc)) 
        edgeData.set(p.addNeighbor(rdst, rsrc), 0);
      EdgeTy cap = useUnitCapacity ? one : reader.getEdgeData<EdgeTy>(jj);
      edgeData.set(p.addNeighbor(rsrc, rdst), cap);
    }
  }

  edge_value_type* rawEdgeData = p.finish<edge_value_type>();
  std::copy(edgeData.begin(), edgeData.end(), rawEdgeData);

  p.structureToFile(outputFile);
}