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 LongDrunkardDriver<VertexDataType, EdgeDataType>
extends DrunkardDriver<VertexDataType, EdgeDataType> implements GrabbedBucketConsumer {
public LongDrunkardDriver(final DrunkardJob job,
WalkUpdateFunction<VertexDataType, EdgeDataType> callback) {
super(job, callback);
}
@Override
protected LongDumperThread createDumperThread() {
return new LongDumperThread(bucketQueue, pendingWalksToSubmit, finished, job);
}
@Override
protected DrunkardContext createDrunkardContext(int vertexId, final GraphChiContext context,
final LocalWalkBuffer localBuf_) {
final LongWalkManager manager = (LongWalkManager) job.getWalkManager();
final boolean isSource = manager.isSource(vertexId);
final int mySourceIndex = (isSource ? manager.getVertexSourceIdx(vertexId) : -1);
final LongLocalWalkBuffer localBuf = (LongLocalWalkBuffer) localBuf_;
return new LongDrunkardContext() {
@Override
public boolean isSource() {
return isSource;
}
@Override
public int sourceIndex() {
return mySourceIndex;
}
@Override
public int getIteration() {
return context.getIteration();
}
@Override
public void forwardWalkTo(long walk, int destinationVertex, boolean trackBit) {
localBuf.add(walk, destinationVertex, trackBit);
}
@Override
public void resetWalk(long walk, boolean trackBit) {
forwardWalkTo(walk, manager.getSourceVertex(walk), trackBit);
}
@Override
public boolean getTrackBit(long walk) {
return manager.trackBit(walk);
}
@Override
public boolean isWalkStartedFromVertex(long walk) {
return mySourceIndex == manager.sourceIdx(walk);
}
@Override
public VertexIdTranslate getVertexIdTranslate() {
return getVertexIdTranslate();
}
};
}
}