anchor.diff:      }
   
       @Override
  -    public Set<VertexComputeKey> getVertexComputeKeys() {   <6>
  +    public Set<VertexComputeKey> getVertexComputeKeys() { <6>
           return this.vertexComputeKeys;
       }
   
       @Override
       public Optional<MessageCombiner<Double>> getMessageCombiner() {
           return (Optional) PageRankMessageCombiner.instance();
  +    }
  +
  +    @Override
  +    public Set<MemoryComputeKey> getMemoryComputeKeys() {
  +        return this.memoryComputeKeys;
       }
   
       @Override
  
positive.code: 
  [source,java]
  ----
  public class PageRankVertexProgram implements VertexProgram<Double> {  <1>
  
      public static final String PAGE_RANK = "gremlin.pageRankVertexProgram.pageRank";
      private static final String EDGE_COUNT = "gremlin.pageRankVertexProgram.edgeCount";
      private static final String PROPERTY = "gremlin.pageRankVertexProgram.property";
      private static final String VERTEX_COUNT = "gremlin.pageRankVertexProgram.vertexCount";
      private static final String ALPHA = "gremlin.pageRankVertexProgram.alpha";
      private static final String TOTAL_ITERATIONS = "gremlin.pageRankVertexProgram.totalIterations";
      private static final String EDGE_TRAVERSAL = "gremlin.pageRankVertexProgram.edgeTraversal";
      private static final String INITIAL_RANK_TRAVERSAL = "gremlin.pageRankVertexProgram.initialRankTraversal";
  
      private MessageScope.Local<Double> incidentMessageScope = MessageScope.Local.of(__::outE); <2>
      private MessageScope.Local<Double> countMessageScope = MessageScope.Local.of(new MessageScope.Local.ReverseTraversalSupplier(this.incidentMessageScope));
      private PureTraversal<Vertex, Edge> edgeTraversal = null;
      private PureTraversal<Vertex, ? extends Number> initialRankTraversal = null;
      private double vertexCountAsDouble = 1.0d;
      private double alpha = 0.85d;
      private int totalIterations = 30;
      private String property = PAGE_RANK; <3>
      private Set<VertexComputeKey> vertexComputeKeys;
  
      private PageRankVertexProgram() {
  
  
negative.code:             this.incidentMessageScope = MessageScope.Local.of(() -> this.edgeTraversal.get().clone());
              this.countMessageScope = MessageScope.Local.of(new MessageScope.Local.ReverseTraversalSupplier(this.incidentMessageScope));
          }
          this.alpha = configuration.getDouble(ALPHA, this.alpha);
          this.epsilon = configuration.getDouble(EPSILON, this.epsilon);
          this.maxIterations = configuration.getInt(MAX_ITERATIONS, 20);
          this.property = configuration.getString(PROPERTY, PAGE_RANK);
          this.vertexComputeKeys = new HashSet<>(Arrays.asList(
                  VertexComputeKey.of(this.property, false),
                  VertexComputeKey.of(EDGE_COUNT, true))); <5>
          this.memoryComputeKeys = new HashSet<>(Arrays.asList(
                  MemoryComputeKey.of(TELEPORTATION_ENERGY, Operator.sum, true, true),
                  MemoryComputeKey.of(VERTEX_COUNT, Operator.sum, true, true),
                  MemoryComputeKey.of(CONVERGENCE_ERROR, Operator.sum, false, true)));
      }
  
      @Override
      public void storeState(final Configuration configuration) {
          VertexProgram.super.storeState(configuration);
          configuration.setProperty(ALPHA, this.alpha);
          configuration.setProperty(EPSILON, this.epsilon);
          configuration.setProperty(PROPERTY, this.property);
          configuration.setProperty(MAX_ITERATIONS, this.maxIterations);
          if (null != this.edgeTraversal)
              this.edgeTraversal.storeState(configuration, EDGE_TRAVERSAL);
          if (null != this.initialRankTraversal)
  