public static EdgePool optimizePowerLawDegreeEdgePool()

in graphjet-core/src/main/java/com/twitter/graphjet/bipartite/optimizer/Optimizer.java [91:144]


  public static EdgePool optimizePowerLawDegreeEdgePool(AbstractPowerLawDegreeEdgePool edgePool) {
    long start = System.currentTimeMillis();
    LOG.info("PowerLawDegreeEdgePool optimization starts.");

    PowerLawDegreeEdgePool.ReaderAccessibleInfo readerAccessibleInfo =
      edgePool.getReaderAccessibleInfo();

    AbstractOptimizedEdgePool optimizedEdgePool;

    if (!edgePool.hasEdgeMetadata()) {
      optimizedEdgePool = new OptimizedEdgePool(
        readerAccessibleInfo.getNodeDegrees(),
        edgePool.getCurrentNumEdgesStored(),
        edgePool.getStatsReceiver()
      );
    } else {
      optimizedEdgePool = new WithEdgeMetadataOptimizedEdgePool(
        readerAccessibleInfo.getNodeDegrees(),
        edgePool.getCurrentNumEdgesStored(),
        edgePool.getStatsReceiver()
      );
    }

    int[] nodeDegrees = readerAccessibleInfo.getNodeDegrees();
    AbstractRegularDegreeEdgePool[] regularDegreeEdgePools = readerAccessibleInfo.getEdgePools();

    int nodeDegreeMapSize = nodeDegrees.length;

    for (int i = 0; i < nodeDegreeMapSize; i++) {
      // i is node id
      int nodeDegree = nodeDegrees[i];
      if (nodeDegree == 0) {
        continue;
      }
      int edgePoolNumber = AbstractPowerLawDegreeEdgePool.getPoolForEdgeNumber(nodeDegree - 1);

      for (int j = 0; j <= edgePoolNumber; j++) {
        int[] shard = regularDegreeEdgePools[j].getShard(i);
        long[] metadataShard = regularDegreeEdgePools[j].getMetadataShard(i);
        int shardOffset = regularDegreeEdgePools[j].getShardOffset(i);
        int nodeDegreeInPool = regularDegreeEdgePools[j].getNodeDegree(i);

        optimizedEdgePool.addEdges(
          i, j, shard, metadataShard, shardOffset, nodeDegreeInPool
        );
      }
    }

    long end = System.currentTimeMillis();

    LOG.info("PowerLawDegreeEdgePool optimization finishes in "
      + (double) (end - start) / 1000.0 + " seconds.");
    return optimizedEdgePool;
  }