// public static double level=0; @Override public void compute( Vertex<LongWritable, DoubleWritable, FloatWritable> v, Iterable<DoubleWritable> msg) throws IOException { if (getSuperstep() == 0) { if (isSource(v) == true) { v.setValue(new DoubleWritable(0)); // level++; sendMessageToAllEdges(v, new DoubleWritable(v.getId().get())); } else v.setValue(new DoubleWritable(-1)); } else { for (DoubleWritable messages : msg) { if (v.getValue().get() == -1) { v.setValue(messages); for (Edge<LongWritable, FloatWritable> edge : v.getEdges()) { if (edge.getTargetVertexId().get() != v.getValue().get()) { sendMessage(edge.getTargetVertexId(), new DoubleWritable(v.getId().get())); } } } else { if (v.getValue().get() != messages.get()) { removeEdgesRequest(v.getId(), new LongWritable((long) messages.get())); removeEdgesRequest(new LongWritable((long) messages.get()), v.getId()); } } /* if(v.getValue().get() > messages.get()) { v.setValue(new DoubleWritable(getSuperstep())); // changed=true; }*/ } if (v.getValue().get() == -1) { for (Edge<LongWritable, FloatWritable> edge : v.getEdges()) { if (edge.getTargetVertexId().get() != v.getValue().get()) sendMessage(edge.getTargetVertexId(), new DoubleWritable(v.getId().get())); } } /* if(changed) { level++; sendMessageToAllEdges(v,new DoubleWritable(level)); changed=false; }*/ } v.voteToHalt(); }
@Override public void compute( Vertex<IntWritable, IntWritable, NullWritable> vertex, Iterable<IntWritable> messages) throws IOException { if (0 == getSuperstep()) { vertex.setValue(new IntWritable(Integer.MAX_VALUE)); } Integer minDist = isSource(vertex) ? 0 : Integer.MAX_VALUE; for (IntWritable msg : messages) { if (msg.get() < minDist) { minDist = msg.get(); } } if (minDist < vertex.getValue().get()) { vertex.setValue(new IntWritable(minDist)); for (Edge<IntWritable, NullWritable> edge : vertex.getEdges()) { final IntWritable neighbor = edge.getTargetVertexId(); final Integer distance = minDist + 1; sendMessage(neighbor, new IntWritable(distance)); } } vertex.voteToHalt(); }
/** * Propagates the smallest vertex id to all neighbors. Will always choose to halt and only * reactivate if a smaller id has been sent to it. * * @param messages Iterator of messages from the previous superstep. * @throws java.io.IOException */ @Override public void compute( Vertex<LongWritable, LongWritable, NullWritable> vertex, Iterable<LongWritable> messages) throws IOException { long currentComponent = vertex.getValue().get(); // First superstep is special, because we can simply look at the neighbors if (getSuperstep() == 0) { for (Edge<LongWritable, NullWritable> edge : vertex.getEdges()) { long neighbor = edge.getTargetVertexId().get(); if (neighbor < currentComponent) { currentComponent = neighbor; } } // Only need to send value if it is not the own id if (currentComponent != vertex.getValue().get()) { vertex.setValue(new LongWritable(currentComponent)); for (Edge<LongWritable, NullWritable> edge : vertex.getEdges()) { LongWritable neighbor = edge.getTargetVertexId(); if (neighbor.get() > currentComponent) { sendMessage(neighbor, vertex.getValue()); } } } vertex.voteToHalt(); return; } boolean changed = false; // did we get a smaller id ? for (LongWritable message : messages) { long candidateComponent = message.get(); if (candidateComponent < currentComponent) { currentComponent = candidateComponent; changed = true; } } // propagate new component id to the neighbors if (changed) { vertex.setValue(new LongWritable(currentComponent)); sendMessageToAllEdges(vertex, vertex.getValue()); } vertex.voteToHalt(); }
@Override public void compute( Vertex<IntWritable, IntWritable, NullWritable> vertex, Iterable<IntWritable> messages) throws IOException { if (getSuperstep() == 0) { // send list of this vertex's neighbors to all neighbors for (Edge<IntWritable, NullWritable> edge : vertex.getEdges()) { sendMessageToAllEdges(vertex, edge.getTargetVertexId()); } } else { for (IntWritable message : messages) { // INTENTIONAL BUG: the original algorithm has these two lines, which // avoids the // NullPointerException, which the current code throws. // final int current = (closeMap.get(message) == null) ? // 0 : closeMap.get(message) + 1; final int current = closeMap.get(message); closeMap.put(message, current); } // make sure the result values are sorted and // packaged in an IntArrayListWritable for output Set<Pair> sortedResults = Sets.<Pair>newTreeSet(); for (Map.Entry<IntWritable, Integer> entry : closeMap.entrySet()) { sortedResults.add(new Pair(entry.getKey(), entry.getValue())); } IntArrayListWritable outputList = new IntArrayListWritable(); for (Pair pair : sortedResults) { if (pair.value > 0) { outputList.add(pair.key); } else { break; } } if (outputList.isEmpty()) { vertex.setValue(new IntWritable(-1)); } else { vertex.setValue(outputList.get(0)); } } vertex.voteToHalt(); }
public IncidentAndAdjacentIterator(Vertex<IntWritable, DoubleWritable, Directions> vertex) { this(vertex.getEdges().iterator()); }