public static void main(String[] args) throws Exception {
final int NUM_VERTICES = 100;
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// a list of vertices
DataSet<Long> vertices = env.generateSequence(1, NUM_VERTICES);
// generate some random edges. the transition probability on each edge is 1/num-out-edges of the source vertex
DataSet<Tuple3<Long, Long, Double>> edgesWithProbability = env.generateSequence(1, NUM_VERTICES)
.flatMap(new FlatMapFunction<Long, Tuple3<Long, Long, Double>>() {
public void flatMap(Long value, Collector<Tuple3<Long, Long, Double>> out) {
int numOutEdges = (int) (Math.random() * (NUM_VERTICES / 2));
for (int i = 0; i < numOutEdges; i++) {
long target = (long) (Math.random() * NUM_VERTICES) + 1;
out.collect(new Tuple3<Long, Long, Double>(value, target, 1.0/numOutEdges));
}
}
});
// ---------- start of the algorithm ---------------
// count the number of vertices
DataSet<Long> count = vertices
.map(new MapFunction<Long, Long>() {
public Long map(Long value) {
return 1L;
}
})
.reduce(new ReduceFunction<Long>() {
public Long reduce(Long value1, Long value2) {
return value1 + value2;
}
});
// enumerate some sample edges and assign an initial uniform probability (rank)
DataSet<Tuple2<Long, Double>> intialRanks = vertices
.map(new RichMapFunction<Long, Tuple2<Long, Double>>() {
private long numVertices;
@Override
public void open(Configuration parameters) {
numVertices = getRuntimeContext().<Long>getBroadcastVariable("count").iterator().next();
}
public Tuple2<Long, Double> map(Long value) {
return new Tuple2<Long, Double>(value, 1.0/numVertices);
}
}).withBroadcastSet(count, "count");
VertexCentricIteration<Long, Double, Double, Double> iteration = VertexCentricIteration.withValuedEdges(edgesWithProbability,
new VertexRankUpdater(BETA), new RankMessenger(), 20);
iteration.addBroadcastSetForUpdateFunction("count", count);
DataSet<Tuple2<Long, Double>> result = intialRanks.runOperation(iteration);
result.print();
env.execute("Spargel PageRank");
}