package edu.ucsb.jpregel.system; import static java.lang.System.err; import static java.lang.System.exit; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; public class VertexPageRank extends VertexImpl<Integer, Double, OutEdge, Double> { public static Combiner combiner = new CombinerMinInteger(); //TODO hides a field public VertexPageRank( Integer vertexId, Map<Integer, OutEdge> outEdgeMap ) { super( vertexId, outEdgeMap ); setVertexValue( Double.MAX_VALUE ); } public VertexPageRank() {} @Override public void compute() { double sum = 0 ; if ( getSuperStep() >= 1 ) { Iterator<Message<Integer, Double>> messageSetIterator = getMessageIterator(); while ( messageSetIterator.hasNext() ) { Message<?, Double> message = messageSetIterator.next(); sum += message.getMessageValue() ; } setVertexValue( 0.15/ getNumVertices() + 0.85 * sum ) ; } if (getSuperStep() < 30) { double messageValue = getVertexValue() / (getNumVertices() - getVertexId() - 1 ) ; for(int targetVertexId = getVertexId() + 1 ; targetVertexId <= getNumVertices() ; targetVertexId++ ) { Message<Integer, Double> message = new Message<Integer, Double>( getVertexId(), messageValue ); sendMessage( targetVertexId , message) ; } //final long n = getOutEdgeMapSize() ; //OutEdge outEdge = null ; //Object targetVertexId = outEdge.getVertexId(); //Message<Double> message = new Message<Double>( getVertexId(), messageValue ); //sendMessage( targetVertexId , message) ; } else { // voteToHalt() ; } } @Override public String output() { StringBuilder string = new StringBuilder(); string.append( getVertexId() ); string.append( " : "); // string.append( ((Message) getVertexValue() ).getVertexId() ); // string.append( " "); // string.append( ((Message) getVertexValue() ).getMessageValue() ); string.append( getVertexValue() ); return new String( string ); } @Override public VertexImpl make(String line) { StringTokenizer stringTokenizer = new StringTokenizer( line ); if ( ! stringTokenizer.hasMoreTokens() ) { err.println( "PageRankVertex.make: Empty lines are not allowed." ); exit( 1 ); } int vertexId = Integer.parseInt( stringTokenizer.nextToken() ); setVertexValue( 1.0 / getNumVertices() ) ; int endVertexValue = Integer.parseInt( stringTokenizer.nextToken() ); int numVertices = Integer.parseInt( stringTokenizer.nextToken() ); //TODO hides a field while(vertexId <= endVertexValue) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append( vertexId ).append( ' ' ); for(int vertexIdentifier = vertexId ; vertexIdentifier < numVertices ; vertexIdentifier++ ) { stringBuffer.append( vertexIdentifier).append( ' ' ); } String lines = new String( stringBuffer ); vertexId++ ; } Map<Integer, OutEdge> outEdgeMap = new HashMap<Integer, OutEdge>(); /*while( stringTokenizer.hasMoreTokens() ) { int target = Integer.parseInt( stringTokenizer.nextToken() ); int weight = Integer.parseInt( stringTokenizer.nextToken() ); outEdgeMap.put( target, new OutEdge( target, weight ) ); } */ return new VertexPageRank( vertexId, outEdgeMap ); } @Override public boolean isInitiallyActive() { return isSource(); } public boolean isSource() { return true; } }