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