package edu.cmu.graphchi.apps.util;
import edu.cmu.graphchi.*;
import edu.cmu.graphchi.datablocks.FloatConverter;
import edu.cmu.graphchi.engine.GraphChiEngine;
import edu.cmu.graphchi.engine.VertexInterval;
import edu.cmu.graphchi.preprocessing.EdgeProcessor;
import edu.cmu.graphchi.preprocessing.FastSharder;
import edu.cmu.graphchi.preprocessing.VertexProcessor;
import java.io.*;
import java.util.logging.Logger;
/**
* Creates a cassovary adjacency
* @author Aapo Kyrola
*/
public class CreateCassovary implements GraphChiProgram<Integer, Integer> {
private static Logger logger = ChiLogger.getLogger("cassovaryconv");
private BufferedOutputStream bos;
@Override
public void update(ChiVertex<Integer, Integer> vertex, GraphChiContext context) {
try {
if (vertex.numOutEdges() > 0) {
synchronized(this) {
bos.write((context.getVertexIdTranslate().backward(vertex.getId()) + " " + vertex.numOutEdges() + "\n").getBytes());
for(int i=0; i < vertex.numOutEdges(); i++) {
bos.write((context.getVertexIdTranslate().backward(vertex.outEdge(i).getVertexId()) + "\n").getBytes());
}
}
}
} catch (IOException ioe) {}
}
@Override
public void beginIteration(GraphChiContext ctx) {
}
@Override
public void endIteration(GraphChiContext ctx) {
}
@Override
public void beginInterval(GraphChiContext ctx, VertexInterval interval) {
}
@Override
public void endInterval(GraphChiContext ctx, VertexInterval interval) {
}
@Override
public void beginSubInterval(GraphChiContext ctx, VertexInterval interval) {
}
@Override
public void endSubInterval(GraphChiContext ctx, VertexInterval interval) {
}
protected static FastSharder createSharder(String graphName, int numShards) throws IOException {
return new FastSharder<Integer, Integer>(graphName, numShards, null, null, null, null);
}
public static void main(String[] args) throws Exception {
String baseFilename = args[0];
int nShards = Integer.parseInt(args[1]);
String fileType = (args.length >= 3 ? args[2] : null);
/* Create shards */
FastSharder sharder = createSharder(baseFilename, nShards);
if (baseFilename.equals("pipein")) { // Allow piping graph in
sharder.shard(System.in, fileType);
} else {
if (!new File(ChiFilenames.getFilenameIntervals(baseFilename, nShards)).exists()) {
sharder.shard(new FileInputStream(new File(baseFilename)), fileType);
} else {
logger.info("Found shards -- no need to preprocess");
}
}
/* Run GraphChi */
GraphChiEngine<Integer, Integer> engine = new GraphChiEngine<Integer, Integer>(baseFilename, nShards);
engine.setEdataConverter(null);
engine.setVertexDataConverter(null);
engine.setModifiesInedges(false); // Important optimization
engine.setDisableInedges(true);
engine.setModifiesOutedges(false);
engine.setOnlyAdjacency(true);
CreateCassovary cassovaryConv = new CreateCassovary();
cassovaryConv.bos = new BufferedOutputStream(new FileOutputStream(baseFilename + ".cassovary"));
engine.run(cassovaryConv, 1);
cassovaryConv.bos.flush();
cassovaryConv.bos.close();
logger.info("Ready.");
}
}