Github user dkuppitz commented on a diff in the pull request:

    https://github.com/apache/tinkerpop/pull/717#discussion_r139960786
  
    --- Diff: 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
 ---
    @@ -155,61 +161,61 @@ public PageRankVertexProgram clone() {
     
         @Override
         public void setup(final Memory memory) {
    -        memory.set(TELEPORTATION_ENERGY, 0.0d);
    +        memory.set(TELEPORTATION_ENERGY, null == this.initialRankTraversal 
? 1.0d : 0.0d);
             memory.set(VERTEX_COUNT, 0.0d);
    +        memory.set(CONVERGENCE_ERROR, 1.0d);
         }
     
         @Override
         public void execute(final Vertex vertex, Messenger<Double> messenger, 
final Memory memory) {
             if (memory.isInitialIteration()) {
                 messenger.sendMessage(this.countMessageScope, 1.0d);
                 memory.add(VERTEX_COUNT, 1.0d);
    -        } else if (1 == memory.getIteration()) {
    -            final double vertexCount = memory.<Double>get(VERTEX_COUNT);
    -            double initialPageRank = null == this.initialRankTraversal ?
    -                    1.0d / vertexCount :
    -                    TraversalUtil.apply(vertex, 
this.initialRankTraversal.get()).doubleValue();
    -            vertex.property(VertexProperty.Cardinality.single, 
this.property, initialPageRank);
    -            final double edgeCount = 
IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
    -            vertex.property(VertexProperty.Cardinality.single, EDGE_COUNT, 
edgeCount);
    -            memory.add(TELEPORTATION_ENERGY, (1.0d - this.alpha) * 
initialPageRank);
    -            initialPageRank = this.alpha * initialPageRank;
    -            if (!this.terminate(memory)) { // don't send messages if this 
is the last iteration
    -                if (edgeCount > 0.0d)
    -                    messenger.sendMessage(this.incidentMessageScope, 
initialPageRank / edgeCount);
    -                else
    -                    memory.add(TELEPORTATION_ENERGY, initialPageRank);
    -            }
             } else {
                 final double vertexCount = memory.<Double>get(VERTEX_COUNT);
    -            double newPageRank = 
IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
    -            final double terminalEnergy = memory.get(TELEPORTATION_ENERGY);
    -            if (terminalEnergy > 0.0d) {
    -                final double localTerminalEnergy = terminalEnergy / 
vertexCount;
    -                newPageRank = newPageRank + localTerminalEnergy;
    -                memory.add(TELEPORTATION_ENERGY, -localTerminalEnergy);
    +            final double edgeCount;
    +            double pageRank;
    +            if (1 == memory.getIteration()) {
    +                edgeCount = 
IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
    +                vertex.property(VertexProperty.Cardinality.single, 
EDGE_COUNT, edgeCount);
    +                pageRank = null == this.initialRankTraversal ?
    +                        0.0d :
    +                        TraversalUtil.apply(vertex, 
this.initialRankTraversal.get()).doubleValue();
    +            } else {
    +                edgeCount = vertex.value(EDGE_COUNT);
    +                pageRank = 
IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
                 }
    -            vertex.property(VertexProperty.Cardinality.single, 
this.property, newPageRank);
    -            memory.add(TELEPORTATION_ENERGY, (1.0d - this.alpha) * 
newPageRank);
    -            newPageRank = this.alpha * newPageRank;
    -            final double edgeCount = vertex.<Double>value(EDGE_COUNT);
    -            if (!this.terminate(memory)) { // don't send messages if this 
is the last iteration
    -                if (edgeCount > 0.0d)
    -                    messenger.sendMessage(this.incidentMessageScope, 
newPageRank / edgeCount);
    -                else
    -                    memory.add(TELEPORTATION_ENERGY, newPageRank);
    +            //////////////////////////
    +            final double teleporationEnergy = 
memory.get(TELEPORTATION_ENERGY);
    +            if (teleporationEnergy > 0.0d) {
    +                final double localTerminalEnergy = teleporationEnergy / 
vertexCount;
    +                pageRank = pageRank + localTerminalEnergy;
    +                memory.add(TELEPORTATION_ENERGY, -localTerminalEnergy);
                 }
    +            final double previousPageRank = 
vertex.<Double>property(this.property).orElse(0.0d);
    +            memory.add(CONVERGENCE_ERROR, Math.abs(pageRank - 
previousPageRank));
    +            vertex.property(VertexProperty.Cardinality.single, 
this.property, pageRank);
    +            memory.add(TELEPORTATION_ENERGY, (1.0d - this.alpha) * 
pageRank);
    +            pageRank = this.alpha * pageRank;
    +            if (edgeCount > 0.0d)
    +                messenger.sendMessage(this.incidentMessageScope, pageRank 
/ edgeCount);
    +            else
    +                memory.add(TELEPORTATION_ENERGY, pageRank);
             }
         }
     
         @Override
         public boolean terminate(final Memory memory) {
    -        return memory.getIteration() >= this.totalIterations;
    +        // System.out.println(memory.<Double>get(CONVERGENCE_ERROR));
    +        memory.set(CONVERGENCE_ERROR, 0.0d);
    +        return -1 == this.totalIterations ?
    +                memory.<Double>get(CONVERGENCE_ERROR) < this.epsilon :
    +                memory.getIteration() >= this.totalIterations;
         }
     
         @Override
         public String toString() {
    -        return StringFactory.vertexProgramString(this, "alpha=" + 
this.alpha + ", iterations=" + this.totalIterations);
    +        return StringFactory.vertexProgramString(this, "alpha=" + 
this.alpha + ", iterations=" + this.totalIterations + ", epsilon=" + 
this.epsilon);
    --- End diff --
    
    Wouldn't it be better to only show `iterations` OR `epsilon`?


---

Reply via email to