@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 sendMessage(final MessageScope messageScope, final M message) { this.baseMessenger.sendMessage(messageScope, message); } }
final Iterator<Triplet<Path, Edge, Number>> iterator = messenger.receiveMessages();
private void processEdges(final Vertex vertex, final Path currentPath, final Number currentDistance, final Messenger<Triplet<Path, Edge, Number>> messenger) { final Traversal.Admin<Vertex, Edge> edgeTraversal = this.edgeTraversal.getPure(); edgeTraversal.addStart(edgeTraversal.getTraverserGenerator().generate(vertex, edgeTraversal.getStartStep(), 1)); while (edgeTraversal.hasNext()) { final Edge edge = edgeTraversal.next(); final Number distance = getDistance(edge); Vertex otherV = edge.inVertex(); if (otherV.equals(vertex)) otherV = edge.outVertex(); // only send message if the adjacent vertex is not yet part of the current path if (!currentPath.objects().contains(otherV)) { messenger.sendMessage(MessageScope.Global.of(otherV), Triplet.with(currentPath, this.includeEdges ? edge : null, NumberHelper.add(currentDistance, distance))); } } }
private static int getMessageCountExcludeSelf(Messenger<String> messenger, String id) { Set<String> messageSet = newHashSet(messenger.receiveMessages()); messageSet.remove(id); return messageSet.size(); }
@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 sendMessage(final MessageScope messageScope, final M message) { this.baseMessenger.sendMessage(messageScope, message); } }
static long getMessageCount(Messenger<Long> messenger) { return IteratorUtils.reduce(messenger.receiveMessages(), 0L, (a, b) -> a + b); } }
@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)); } }
private void degreeMessagePassing(Messenger<Long> messenger) { messenger.sendMessage(messageScopeResourceIn, 1L); messenger.sendMessage(messageScopeOut, 1L); }
private List<VertexMessage> messages(Messenger<VertexMessage> messenger) { return IteratorUtils.asList(messenger.receiveMessages()); }
@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)); } }
static void sendMessage(Messenger<String> messenger, String message) { messenger.sendMessage(messageScopeIn, message); messenger.sendMessage(messageScopeOut, message); }
private static void relayClusterLabel(Messenger<String> messenger, Memory memory) { String firstMessage = messenger.receiveMessages().next(); String max = IteratorUtils.reduce(messenger.receiveMessages(), firstMessage, (a, b) -> a.compareTo(b) > 0 ? a : b); sendMessage(messenger, max); memory.add(VOTE_TO_HALT, false); }
@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 } }
private void broadcastToNeighbors(Messenger<VertexMessage> messenger, VertexMessage message) { messenger.sendMessage(inEdge, message); messenger.sendMessage(outEdge, message); }
private void degreeMessageCounting(Messenger<Long> messenger, Vertex vertex) { if (messenger.receiveMessages().hasNext() && (ofLabelIds.isEmpty() || vertexHasSelectedTypeId(vertex, ofLabelIds))) { vertex.property(DEGREE, getMessageCount(messenger)); } } }
@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 } }
@RunWith(MockitoJUnitRunner.class) public class MessengerTest { private static final String CLIENT_EMAIL = "some@email.com"; private static final String MSG_CONTENT = "Dear John! You are fired."; @Mock Template template; @Mock Client client; @Mock MailServer mailServer; @Mock TemplateEngine templateEngine; @InjectMocks Messenger sut; @Test public void shouldSendEmail() { // given when(client.getEmail()).thenReturn(CLIENT_EMAIL); when(templateEngine.prepareMessage(template, client)).thenReturn(MSG_CONTENT); // when sut.sendMessage(client, template); // then verify(mailServer).send(CLIENT_EMAIL, MSG_CONTENT); } }
static void relayOrSaveMessages(Vertex vertex, Messenger<String> messenger) { if (messenger.receiveMessages().hasNext()) { if (vertex.label().equals(Schema.BaseType.RELATIONSHIP.name())) { // relay the messages messenger.receiveMessages().forEachRemaining(msg -> sendMessage(messenger, msg)); } else if ((vertex.label().equals(Schema.BaseType.ENTITY.name()) || vertex.label().equals(Schema.BaseType.ATTRIBUTE.name())) && vertex.property(K_CORE_LABEL).isPresent()) { // messages received via implicit edge, save the count for next iteration vertex.property(IMPLICIT_MESSAGE_COUNT, (long) newHashSet(messenger.receiveMessages()).size()); } } }