package vertices; import edu.ucsb.jpregel.system.Message; import edu.ucsb.jpregel.system.VertexImpl; import edu.ucsb.jpregel.system.VertexShortestPath; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; /** * * @author Pete Cappello */ public final class VertexShortestPathBinaryTree extends VertexShortestPath { private static final Integer MAX = new Integer(Integer.MAX_VALUE); public VertexShortestPathBinaryTree() {} public VertexShortestPathBinaryTree( Integer vertexId, Map<Integer, Integer> edgeMap ) { super( vertexId, edgeMap ,edgeMap.size()); setVertexValue( new Message( vertexId, Integer.MAX_VALUE ) ); } @Override public VertexImpl make( String line ) { StringTokenizer stringTokenizer = new StringTokenizer( line ); Integer vertexId = Integer.parseInt( stringTokenizer.nextToken() ); int numChildren = Integer.parseInt( stringTokenizer.nextToken() ); return make( vertexId, numChildren); } public VertexImpl make( Integer vertexId, int numChildren ) { Map<Integer, Integer> edgeMap = new HashMap<Integer, Integer>( numChildren ); if(vertexId.intValue() == 5000000) { System.out.println("debug"); } switch ( numChildren ) { case 2: edgeMap.put( 2 * vertexId + 1, 1 ); case 1: edgeMap.put( 2 * vertexId, 1 ); case 0: break; default: System.err.println("More than two children?" + vertexId + " num: "+ numChildren); break; // no children } return new VertexShortestPathBinaryTree( vertexId, edgeMap ); } @Override public int getPartId(Integer idi, int numparts) { int id = idi.intValue(); numparts--; if(id < (numparts)) { return 0; } while(((id >> 1) >= (numparts))) { id >>=1; } return id-numparts+1; } @Override public void initialValue(Integer vertexId) { setVertexValue( new Message( vertexId, MAX) ); } }