/** * Sums up a sequence of double values * @param values double values * @return sum of double values */ public static double sum(Iterable<DoubleWritable> values) { return sum(values.iterator()); }
@Override protected double recompute( Vertex<LongWritable, DoubleWritable, NullWritable> vertex, Iterable<DoubleWritable> partialRanks, double teleportationProbability) { // Rank contribution from incident neighbors double rankFromNeighbors = MathUtils.sum(partialRanks); // Rank contribution from dangling vertices double danglingContribution = getDanglingProbability() / getTotalNumVertices(); // Recompute rank return (1d - teleportationProbability) * (rankFromNeighbors + danglingContribution) + teleportationProbability / getTotalNumVertices(); } }
@Override protected double recompute( Vertex<LongWritable, DoubleWritable, DoubleWritable> vertex, Iterable<DoubleWritable> transitionProbabilities, double teleportationProbability) { int numSourceVertices = numSourceVertices(); Preconditions.checkState(numSourceVertices > 0, "No source vertex found"); double stateProbability = MathUtils.sum(transitionProbabilities); // Add the contribution of dangling nodes (weakly preferential // implementation: dangling nodes redistribute uniformly) stateProbability += getDanglingProbability() / getTotalNumVertices(); // The random walk might teleport back to one of the source vertexes stateProbability *= 1 - teleportationProbability; if (isSourceVertex(vertex)) { stateProbability += teleportationProbability / numSourceVertices; } return stateProbability; } }