package edu.cmu.graphchi.walks;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import edu.cmu.graphchi.GraphChiContext;
import edu.cmu.graphchi.preprocessing.VertexIdTranslate;
/**
* Class to encapsulate the graphchi program running the show.
* Due to several optimizations, it is quite complicated!
*/
public class IntDrunkardDriver<VertexDataType, EdgeDataType>
extends DrunkardDriver<VertexDataType, EdgeDataType> implements GrabbedBucketConsumer {
IntDrunkardDriver(final DrunkardJob job,
WalkUpdateFunction<VertexDataType, EdgeDataType> callback) {
super(job, callback);
}
@Override
protected IntDumperThread createDumperThread() {
return new IntDumperThread(bucketQueue, pendingWalksToSubmit, finished, job);
}
@Override
protected DrunkardContext createDrunkardContext(int vertexId, final GraphChiContext context,
final LocalWalkBuffer localBuf_) {
final IntWalkManager manager = (IntWalkManager) job.getWalkManager();
final boolean isSource = manager.isSource(vertexId);
final int mySourceIndex = (isSource ? manager.getVertexSourceIdx(vertexId) : -1);
final IntLocalWalkBuffer localBuf = (IntLocalWalkBuffer) localBuf_;
return new IntDrunkardContext() {
@Override
public boolean isSource() {
return isSource;
}
@Override
public int sourceIndex() {
return mySourceIndex;
}
@Override
public int getIteration() {
return context.getIteration();
}
@Override
public void forwardWalkTo(int walk, int destinationVertex, boolean trackBit) {
localBuf.add(walk, destinationVertex, trackBit);
}
@Override
public void resetWalk(int walk, boolean trackBit) {
forwardWalkTo(walk, manager.getSourceVertex(walk), trackBit);
}
@Override
public boolean getTrackBit(int walk) {
return manager.trackBit(walk);
}
@Override
public boolean isWalkStartedFromVertex(int walk) {
return mySourceIndex == manager.sourceIdx(walk);
}
@Override
public VertexIdTranslate getVertexIdTranslate() {
return getVertexIdTranslate();
}
};
}
}