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 class VertexSsspBinaryTree extends VertexShortestPath
{
private static final Integer MAX_VALUE = new Integer( Integer.MAX_VALUE );
private static final Integer ZERO = new Integer( 0 );
private static final Integer ONE = new Integer( 1 );
public VertexSsspBinaryTree() {}
public VertexSsspBinaryTree( Integer vertexId, Message<Integer, Integer> vertexValue, Map<Integer, Integer> edgeMap )
{
super( vertexId, edgeMap , 2);
setVertexValue( new Message( vertexId, 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 )
{
Integer initialKnownDistance = vertexId.equals(ONE) ? ZERO : MAX_VALUE;
Message<Integer, Integer> vertexValue = new Message<Integer, Integer>( ONE, initialKnownDistance );
Map<Integer, Integer> edgeMap = new HashMap<Integer, Integer>( numChildren );
switch ( numChildren )
{
case 2: edgeMap.put( 2 * vertexId + 1, ONE );
case 1: edgeMap.put( 2 * vertexId, ONE );
default: break; // no children
}
return new VertexSsspBinaryTree( vertexId, vertexValue, edgeMap );
}
/*
* Assumption: numParts is a power of 2.
*/
@Override
public int getPartId( Integer vertexId, int numParts )
{
int shiftAmount = Integer.numberOfLeadingZeros( numParts ) - Integer.numberOfLeadingZeros( vertexId );
int partId = ( shiftAmount >= 0 ) ? vertexId >> shiftAmount : vertexId << -shiftAmount;
return partId - numParts;
}
@Override
public void initialValue(Integer vertexId) { setVertexValue( new Message( vertexId, MAX_VALUE ) ); }
}