@Override public void execute(Vertex vertex, Messenger<Integer> messenger, Memory memory) { if (memory.isInitialIteration()) { messenger.sendMessage(DEG_MSG, 1); } else { int degree = IteratorUtils.stream(messenger.receiveMessages()).reduce(0, (a, b) -> a + b); vertex.property(VertexProperty.Cardinality.single, DEGREE, degree); if (memory.getIteration()<length) messenger.sendMessage(DEG_MSG, degree); } }
@Override public void execute(final Vertex vertex, Messenger<Long> messenger, final Memory memory) { if (memory.isInitialIteration()) { if (vertex.id().equals(Long.valueOf(seed).longValue())) { // The seed sends a single message to start the computation log.debug("Sent initial message from {}", vertex.id()); // The seed's distance to itself is zero vertex.property(VertexProperty.Cardinality.single, DISTANCE, 0L); messenger.sendMessage(incidentMessageScope, 0L); } } else { Iterator<Long> distances = messenger.receiveMessages(); // Find minimum distance among all incoming messages, or null if no messages came in Long shortestDistanceSeenOnThisIteration = IteratorUtils.stream(distances).reduce((a, b) -> Math.min(a, b)).orElse(null); if (null == shortestDistanceSeenOnThisIteration) return; // no messages to process or forward on this superstep VertexProperty<Long> currentShortestVP = vertex.property(DISTANCE); if (!currentShortestVP.isPresent() || currentShortestVP.value() > shortestDistanceSeenOnThisIteration) { // First/shortest distance seen by this vertex: store it and forward to neighbors vertex.property(VertexProperty.Cardinality.single, DISTANCE, shortestDistanceSeenOnThisIteration); messenger.sendMessage(incidentMessageScope, shortestDistanceSeenOnThisIteration); } // else: no new winner, ergo no reason to send message to neighbors } }
@Override public void execute(Vertex vertex, Messenger<Integer> messenger, Memory memory) { if (memory.isInitialIteration()) { messenger.sendMessage(DEG_MSG, 1); } else { int degree = IteratorUtils.stream(messenger.receiveMessages()).reduce(0, (a, b) -> a + b); vertex.property(VertexProperty.Cardinality.single, DEGREE, degree); if (memory.getIteration()<length) messenger.sendMessage(DEG_MSG, degree); } }
@Override public void execute(final Vertex vertex, Messenger<Long> messenger, final Memory memory) { if (memory.isInitialIteration()) { if (vertex.id().equals(seed)) { // The seed sends a single message to start the computation log.debug("Sent initial message from {}", vertex.id()); // The seed's distance to itself is zero vertex.property(VertexProperty.Cardinality.single, DISTANCE, 0L); messenger.sendMessage(incidentMessageScope, 0L); } } else { Iterator<Long> distances = messenger.receiveMessages(); // Find minimum distance among all incoming messages, or null if no messages came in Long shortestDistanceSeenOnThisIteration = IteratorUtils.stream(distances).reduce(Math::min).orElse(null); if (null == shortestDistanceSeenOnThisIteration) return; // no messages to process or forward on this superstep VertexProperty<Long> currentShortestVP = vertex.property(DISTANCE); if (!currentShortestVP.isPresent() || currentShortestVP.value() > shortestDistanceSeenOnThisIteration) { // First/shortest distance seen by this vertex: store it and forward to neighbors vertex.property(VertexProperty.Cardinality.single, DISTANCE, shortestDistanceSeenOnThisIteration); messenger.sendMessage(incidentMessageScope, shortestDistanceSeenOnThisIteration); } // else: no new winner, ergo no reason to send message to neighbors } }
@Override public void execute(Vertex vertex, Messenger<Double> messenger, Memory memory) { if (memory.isInitialIteration()) { messenger.sendMessage(inE, 1D); } else if (1 == memory.getIteration()) { double initialPageRank = 1D / vertexCount; double edgeCount = IteratorUtils.stream(messenger.receiveMessages()).reduce(0D, (a, b) -> a + b); vertex.property(VertexProperty.Cardinality.single, PAGE_RANK, initialPageRank); vertex.property(VertexProperty.Cardinality.single, OUTGOING_EDGE_COUNT, edgeCount); messenger.sendMessage(outE, initialPageRank / edgeCount); } else { double newPageRank = IteratorUtils.stream(messenger.receiveMessages()).reduce(0D, (a, b) -> a + b); newPageRank = (dampingFactor * newPageRank) + ((1D - dampingFactor) / vertexCount); vertex.property(VertexProperty.Cardinality.single, PAGE_RANK, newPageRank); messenger.sendMessage(outE, newPageRank / vertex.<Double>value(OUTGOING_EDGE_COUNT)); } }
@Override public void execute(Vertex vertex, Messenger<Double> messenger, Memory memory) { if (memory.isInitialIteration()) { messenger.sendMessage(inE, 1D); } else if (1 == memory.getIteration()) { double initialPageRank = 1D / vertexCount; double edgeCount = IteratorUtils.stream(messenger.receiveMessages()).reduce(0D, (a, b) -> a + b); vertex.property(VertexProperty.Cardinality.single, PAGE_RANK, initialPageRank); vertex.property(VertexProperty.Cardinality.single, OUTGOING_EDGE_COUNT, edgeCount); messenger.sendMessage(outE, initialPageRank / edgeCount); } else { double newPageRank = IteratorUtils.stream(messenger.receiveMessages()).reduce(0D, (a, b) -> a + b); newPageRank = (dampingFactor * newPageRank) + ((1D - dampingFactor) / vertexCount); vertex.property(VertexProperty.Cardinality.single, PAGE_RANK, newPageRank); messenger.sendMessage(outE, newPageRank / vertex.<Double>value(OUTGOING_EDGE_COUNT)); } }
@Override public boolean terminate(final Memory memory) { return !memory.isInitialIteration(); }
@Override public boolean terminate(final Memory memory) { return !memory.isInitialIteration(); }
@Override public Set<MessageScope> getMessageScopes(final Memory memory) { final Set<MessageScope> set = new HashSet<>(); set.add(memory.isInitialIteration() ? this.countMessageScope : this.incidentMessageScope); return set; }
@Override public Set<MessageScope> getMessageScopes(final Memory memory) { final Set<MessageScope> VOTE_SCOPE = new HashSet<>(Collections.singletonList(this.voteScope)); final Set<MessageScope> COUNT_SCOPE = new HashSet<>(Collections.singletonList(this.countScope)); return this.distributeVote && memory.isInitialIteration() ? COUNT_SCOPE : VOTE_SCOPE; }
@Override public void execute(Vertex vertex, Messenger messenger, Memory memory) { vertex.property(VertexProperty.Cardinality.single, "counter", memory.isInitialIteration() ? 1 : vertex.<Integer>value("counter") + 1); }
@Override public void execute(final Vertex vertex, final Messenger<String> messenger, final Memory memory) { if (memory.isInitialIteration()) { messenger.sendMessage(this.messageScope, vertex.value(PROPERTY_IN).toString()); } else { final char[] composite = IteratorUtils.reduce(messenger.receiveMessages(), "", (a, b) -> a + b).toCharArray(); Arrays.sort(composite); vertex.property(PROPERTY_OUT, new String(composite)); } }
@Override public void execute(final Vertex vertex, final Messenger messenger, final Memory memory) { assertEquals(0, memory.getIteration()); assertTrue(memory.isInitialIteration()); }
@Override public boolean terminate(final Memory memory) { assertEquals(0, memory.getIteration()); assertTrue(memory.isInitialIteration()); return true; }
@Override public void setup(final Memory memory) { assertEquals(0, memory.getIteration()); assertTrue(memory.isInitialIteration()); }
@Override public boolean terminate(final Memory memory) { if (memory.isInitialIteration() && this.haltedTraversersIndex != null) { this.haltedTraversersIndex.clear(); } final boolean voteToHalt = memory.<Boolean>get(VOTE_TO_HALT); if (voteToHalt) { return true; } else { // it is basically always assumed that the program will want to halt, but if message passing occurs, the // program will want to continue, thus reset false values to true for future iterations memory.set(VOTE_TO_HALT, true); return false; } }
@Override public void execute(final Vertex vertex, final Messenger<Object> messenger, final Memory memory) { try { vertex.property(VertexProperty.Cardinality.single, "blah", "blah"); fail("Should throw an IllegalArgumentException"); } catch (final IllegalArgumentException e) { assertEquals(GraphComputer.Exceptions.providedKeyIsNotAnElementComputeKey("blah").getMessage(), e.getMessage()); } catch (final Exception e) { fail("Should throw an IllegalArgumentException: " + e); } memory.add("a", 1); if (memory.isInitialIteration()) { vertex.property(VertexProperty.Cardinality.single, "nameLengthCounter", vertex.<String>value("name").length()); memory.add("b", vertex.<String>value("name").length()); } else { vertex.property(VertexProperty.Cardinality.single, "nameLengthCounter", vertex.<String>value("name").length() + vertex.<Integer>value("nameLengthCounter")); } }
@Override public boolean terminate(final Memory memory) { assertTrue(memory.exists("m1")); assertTrue(memory.exists("m2")); assertTrue(memory.exists("m3")); assertTrue(memory.exists("m4")); if (memory.isInitialIteration()) { assertFalse(memory.get("m1")); assertTrue(memory.get("m2")); assertEquals(6l, memory.<Long>get("m3").longValue()); assertEquals(-6, memory.<Integer>get("m4").intValue()); return false; } else { assertTrue(memory.get("m1")); assertTrue(memory.get("m2")); assertEquals(18l, memory.<Long>get("m3").longValue()); assertEquals(-18, memory.<Integer>get("m4").intValue()); return true; } }
@Override public boolean terminate(final Memory memory) { assertTrue(memory.exists("m1")); assertTrue(memory.exists("m2")); assertTrue(memory.exists("m3")); if (memory.isInitialIteration()) { assertFalse(memory.get("m1")); assertTrue(memory.get("m2")); assertEquals(12l, memory.<Long>get("m3").longValue()); return false; } else { assertTrue(memory.get("m1")); assertTrue(memory.get("m2")); assertEquals(24l, memory.<Long>get("m3").longValue()); return true; } }
@Override public boolean terminate(final Memory memory) { final TraverserGenerator generator = this.traversal.get().getTraverserGenerator(); MemoryTraversalSideEffects.setMemorySideEffects(this.traversal.get(), memory, ProgramPhase.TERMINATE); checkSideEffects(); if (memory.isInitialIteration()) { assertFalse(memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS)); return false; } else { /// assertTrue(memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS)); final TraverserSet<String> haltedTraversers = memory.get(TraversalVertexProgram.HALTED_TRAVERSERS); haltedTraversers.add(generator.generate("hello", this.programStep, 1l)); haltedTraversers.add(generator.generate("gremlin", this.programStep, 1l)); memory.set(TraversalVertexProgram.HALTED_TRAVERSERS, haltedTraversers); return true; } }