diff --git a/pom.xml b/pom.xml
index 9dc8db8..8300a25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
ldbc.snb
- bteronh
+ bteronhplus
0.0.3
jar
@@ -78,7 +78,12 @@
com.beust
jcommander
1.48
-
+
+
+ org.jgrapht
+ jgrapht-core
+ 1.1.0
+
diff --git a/src/main/java/ldbc/snb/bteronh/BTERMain.java b/src/main/java/ldbc/snb/bteronh/BTERMain.java
deleted file mode 100644
index bf7fcef..0000000
--- a/src/main/java/ldbc/snb/bteronh/BTERMain.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package ldbc.snb.bteronh;
-
-import com.beust.jcommander.JCommander;
-import ldbc.snb.bteronh.hadoop.HadoopBTERGenerator;
-import ldbc.snb.bteronh.structures.Arguments;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Properties;
-
-public class BTERMain {
- public static void main(String [] args) {
-
- System.out.println("Generating edges");
- Configuration conf = new Configuration();
- conf.setInt("ldbc.snb.bteronh.generator.numThreads",1);
- conf.setLong("ldbc.snb.bteronh.generator.numNodes",10000);
- conf.setInt("ldbc.snb.bteronh.generator.seed",12323540);
- conf.set("ldbc.snb.bteronh.serializer.workspace","./");
- conf.set("ldbc.snb.bteronh.generator.degreeSequence","src/main/resources/degreeSequences/dblp");
- conf.set("ldbc.snb.bteronh.generator.ccPerDegree","src/main/resources/CCs/dblp");
-
-
- Arguments arguments = new Arguments();
- new JCommander(arguments,args);
- for(Arguments.Property p : arguments.getProperties()) {
- conf.set(p.getProperty(),p.getValue());
- }
-
- for(String propertyFile : arguments.getPropertyFiles()) {
- Properties properties = new Properties();
- try {
- properties.load(new FileReader(propertyFile));
- } catch(IOException e) {
- e.printStackTrace();
- System.exit(1);
- }
- for( String s : properties.stringPropertyNames()) {
- conf.set(s,properties.getProperty(s));
- }
- }
-
-
- System.out.println("ldbc.snb.bteronh.generator.numThreads "+conf.get("ldbc.snb.bteronh.generator.numThreads"));
- System.out.println("ldbc.snb.bteronh.generator.numNodes "+conf.get("ldbc.snb.bteronh.generator.numNodes"));
- System.out.println("ldbc.snb.bteronh.generator.seed "+conf.get("ldbc.snb.bteronh.generator.seed"));
- System.out.println("ldbc.snb.bteronh.serializer.workspace "+conf.get("ldbc.snb.bteronh.serializer.workspace"));
- System.out.println("ldbc.snb.bteronh.generator.degreeSequence "+conf.get("ldbc.snb.bteronh.generator" +
- ".degreeSequence"));
- System.out.println("ldbc.snb.bteronh.generator.ccPerDegree "+conf.get("ldbc.snb.bteronh.generator" +
- ".ccPerDegree"));
-
- try {
- System.out.println("Starting execution");
- long start = System.currentTimeMillis();
- HadoopBTERGenerator bterGenerator = new HadoopBTERGenerator(conf);
- bterGenerator.run();
- long end = System.currentTimeMillis();
- System.out.println("Execution time: "+(end-start)/1000.0+" second");
- } catch(Exception e) {
- e.printStackTrace();
- System.exit(1);
- }
-
- }
-}
diff --git a/src/main/java/ldbc/snb/bteronh/algorithms/Algorithms.java b/src/main/java/ldbc/snb/bteronh/algorithms/Algorithms.java
deleted file mode 100644
index 2085c9a..0000000
--- a/src/main/java/ldbc/snb/bteronh/algorithms/Algorithms.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package ldbc.snb.bteronh.algorithms;
-
-import javafx.util.Pair;
-import ldbc.snb.bteronh.structures.BTERStats;
-import ldbc.snb.bteronh.structures.Edge;
-import umontreal.iro.lecuyer.probdist.EmpiricalDist;
-import umontreal.iro.lecuyer.randvar.RandomVariateGen;
-import umontreal.iro.lecuyer.rng.LFSR113;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.*;
-
-/**
- * Created by aprat on 14/07/16.
- */
-public class Algorithms {
- public static int BinarySearch(ArrayList> array, Long degree) {
-
- /*int min = 0;
- int max = array.size();
- while(min <= max) {
- int midPoint = (max - min) / 2 + min;
- if(midPoint >= array.size()) return array.size()-1;
- if(midPoint < 0) return 0;
- if(array.get(midPoint).getKey() > degree ) {
- max = midPoint - 1;
- } else if(array.get(midPoint).getKey() < degree) {
- min = midPoint + 1;
- } else {
- return midPoint;
- }
- }
- return max;
- */
- int pos = Collections.binarySearch(array, new Pair(degree, 0.0), new Comparator> ( ){
-
- @Override
- public int compare(Pair o1, Pair o2) {
- if(o1.getKey() < o2.getKey()) return -1;
- return 1;
- }
- });
-
- if(pos < 0) {
- return -(pos+1);
- }
- return pos;
- }
-
- public static RandomVariateGen GetDegreeSequenceSampler(List observedSequence, long numNodes, int seed ) {
-
- System.out.println("Creating sampler for degree sequence generation");
- observedSequence.sort( new Comparator() {
- @Override
- public int compare(Integer o1, Integer o2) {
- return o1 - o2;
- }
- });
- double [] sequence = new double[observedSequence.size()];
- for(int i = 0; i < observedSequence.size(); ++i){
- sequence[i] = observedSequence.get(i);
- }
- EmpiricalDist degreeDistribution = new EmpiricalDist(sequence);
-
-
- LFSR113 random = new LFSR113();
- int [] seeds = new int[4];
- seeds[0] = 128+seed;
- seeds[1] = 128+seed;
- seeds[2] = 128+seed;
- seeds[3] = 128+seed;
- //LFSR113.setPackageSeed(seeds);
- random.setSeed(seeds);
- RandomVariateGen randomVariateGen = new RandomVariateGen(random,degreeDistribution);
- return randomVariateGen;
- }
-
- public static double [] GenerateCCperDegree( ArrayList> ccDistribution, int maxDegree) {
-
- System.out.println("Loading CC distribution");
- double [] cc = new double[maxDegree+1];
- cc[0] = 0.0;
- cc[1] = 0.0;
- for(int i = 2; i < maxDegree+1; ++i) {
- int degree = i;
- int pos = Algorithms.BinarySearch(ccDistribution,(long)degree);
- if(ccDistribution.get(pos).getKey() == degree || pos == (ccDistribution.size() - 1)) {
- cc[degree] = ccDistribution.get(pos).getValue();
- } else if( pos < ccDistribution.size() - 1 ){
- long min = ccDistribution.get(pos).getKey();
- long max = ccDistribution.get(pos+1).getKey();
- double ratio = (degree - min) / (double)(max - min);
- double minCC = ccDistribution.get(pos).getValue();
- double maxCC = ccDistribution.get(pos+1).getValue();
- double cc_current = ratio * (maxCC - minCC ) + minCC;
- cc[degree] = cc_current;
- }
- }
- return cc;
- }
-
-
-
- public static int SampleCumulative(double [] cumulative, Random random) {
- double randomDis = random.nextDouble();
- int res = Arrays.binarySearch(cumulative, randomDis);
- if(res < 0) {
- return -(res+1);
- }
- return res;
- }
-
- public static Edge BTERSample(BTERStats stats, Random random) throws IOException {
-
- long totalWeight = stats.getWeightPhase1()+stats.getWeightPhase2();
- double prob = random.nextDouble();
- if(prob < stats.getWeightPhase1()/(double)(totalWeight)) {
- return BTERSamplePhase1(stats,random);
- }
- return BTERSamplePhase2(stats,random);
- }
-
-
- public static Edge BTERSamplePhase1(BTERStats stats, Random random) throws IOException{
- int group = SampleCumulative(stats.getCumulativeGroups(),random);
- double r1 = random.nextDouble();
- long offset = (stats.getGroupIndex(group) + (long)Math.floor(r1*stats.getGroupNumBuckets(group))*stats.getGroupBucketSize(group));
- double r2 = random.nextDouble();
- long firstNode = (long)Math.floor(r2*stats.getGroupBucketSize(group)) + offset;
- double r3 = random.nextDouble();
- long secondNode = (long)Math.floor(r3*(stats.getGroupBucketSize(group)-1)) + offset;
- if( secondNode >= firstNode ) {
- secondNode+=1;
- }
- return new Edge(firstNode,secondNode);
- }
-
- public static Edge BTERSamplePhase2(BTERStats stats, Random random) throws IOException {
- long firstNode = BTERSampleNodePhase2(stats, random);
- long secondNode = BTERSampleNodePhase2(stats, random);
- return new Edge(firstNode, secondNode);
- }
-
- public static long BTERSampleNodePhase2(BTERStats stats, Random random) {
- int degree = SampleCumulative(stats.getCumulativeDegrees(),random);
- double r1 = random.nextDouble();
- double r2 = random.nextDouble();
- if(r1 < stats.getDegreeWeightRatio(degree)) {
- return (long)Math.floor(r2*stats.getDegreeNFill(degree)) + stats.getDegreeIndex(degree);
- } else {
- return (long)Math.floor(r2*(stats.getDegreeN(degree) - stats.getDegreeNFill(degree))) + stats.getDegreeIndex(degree) + stats.getDegreeNFill(degree);
- }
- }
-}
diff --git a/src/main/java/ldbc/snb/bteronh/hadoop/HadoopBTERGenerator.java b/src/main/java/ldbc/snb/bteronh/hadoop/HadoopBTERGenerator.java
deleted file mode 100644
index 70e429e..0000000
--- a/src/main/java/ldbc/snb/bteronh/hadoop/HadoopBTERGenerator.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package ldbc.snb.bteronh.hadoop;
-
-import javafx.util.Pair;
-import ldbc.snb.bteronh.algorithms.Algorithms;
-import ldbc.snb.bteronh.structures.BTERStats;
-import ldbc.snb.bteronh.structures.Edge;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.io.LongWritable;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.mapreduce.Job;
-import org.apache.hadoop.mapreduce.Mapper;
-import org.apache.hadoop.mapreduce.Reducer;
-import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
-import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;
-import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
-import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
-import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * Created by aprat on 16/08/16.
- */
-public class HadoopBTERGenerator {
-
- protected static String isHDFSPath(String fileName) {
- if (fileName.startsWith("hdfs://")) {
- return fileName.substring(7);
- }
- return null;
- }
-
- protected static String isLocalPath(String fileName) {
- if (fileName.startsWith("file://")) {
- return fileName.substring(7);
- }
- return null;
- }
-
- public static class HadoopBTERGeneratorMapper extends Mapper {
-
- private BufferedReader getFile(String fileName, Configuration conf) throws IOException {
- String realFileName;
- if ((realFileName = isHDFSPath(fileName)) != null) {
- FileSystem fs = FileSystem.get(conf);
- return new BufferedReader( new InputStreamReader(fs.open( new Path(realFileName))));
- } else if((realFileName = isLocalPath(fileName)) != null) {
- return new BufferedReader(new FileReader(realFileName));
- } else {
- throw new IOException("Invalid file URI "+fileName+". It must start with hdfs:// or file://");
- }
- }
-
- @Override
- public void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
-
- Configuration conf = context.getConfiguration();
- int threadId = Integer.parseInt(value.toString());
- int seed = conf.getInt("ldbc.snb.bteronh.generator.seed",0);
- int numThreads = conf.getInt("ldbc.snb.bteronh.generator.numThreads",1);
- long numNodes = conf.getLong("ldbc.snb.bteronh.generator.numNodes",10000);
- String degreeSequenceFile = conf.get("ldbc.snb.bteronh.generator.degreeSequence");
- String ccPerDegreeFile = conf.get("ldbc.snb.bteronh.generator.ccPerDegree");
-
- BufferedReader reader = getFile(degreeSequenceFile,conf);
- ArrayList observedDegreeSequence = new ArrayList();
- String line;
- line = reader.readLine();
- while(line!=null) {
- observedDegreeSequence.add(Integer.parseInt(line));
- line = reader.readLine();
- }
-
- reader = getFile(ccPerDegreeFile,conf);
- ArrayList> ccPerDegree = new ArrayList>();
- line = reader.readLine();
- while(line!=null) {
- String [] splitLine = line.split(" ");
- ccPerDegree.add( new Pair(Long.parseLong(splitLine[0]), Double.parseDouble(splitLine[1])));
- line = reader.readLine();
- }
-
- System.out.println("Initializing BTER stats");
- BTERStats stats = new BTERStats();
- stats.initialize(numNodes, observedDegreeSequence, ccPerDegree, seed, (i) -> context.setStatus("Generated "+i+" degrees at mapper "+threadId));
-
- long totalWeight = stats.getWeightPhase1()+stats.getWeightPhase2();
- long blockSize = totalWeight / numThreads;
- if(threadId == 0) {
- long residual = totalWeight % numThreads;
- blockSize += residual;
- }
-
- System.out.println("Mapper "+threadId+": Generating "+blockSize+" edges out of "+totalWeight);
- Random random = new Random();
- random.setSeed(seed+threadId);
- for(long i = 0; i < blockSize; ++i) {
- Edge edge = Algorithms.BTERSample(stats,random);
- context.write(new LongWritable(edge.getTail()), new LongWritable(edge.getHead()));
- if( i % 100000 == 0 ) {
- context.setStatus("Generated "+i+" edges out of "+blockSize+" in mapper "+threadId);
- }
- }
- }
- }
-
-
- public static class HadoopBTERGeneratorReducer extends Reducer {
-
- @Override
- public void reduce(LongWritable tail, Iterable valueSet,
- Context context) throws IOException, InterruptedException {
- Set neighbors = new HashSet();
- for ( LongWritable head : valueSet ) {
- neighbors.add(head.get());
- }
-
- for( Long head : neighbors) {
- String str = new String(tail + " " + head + "\n");
- context.write(tail,new LongWritable(head));
- }
- }
- }
-
- private Configuration conf = null;
-
- public HadoopBTERGenerator(Configuration conf ) {
- this.conf = new Configuration(conf);
- }
-
- private static void writeToOutputFile(String filename, int numMaps, Configuration conf) {
- try {
- FileSystem dfs = FileSystem.get(conf);
- OutputStream output = dfs.create(new Path(filename));
- for (int i = 0; i < numMaps; i++)
- output.write((new String(i + "\n").getBytes()));
- output.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void run() throws Exception {
-
- String workSpace = isHDFSPath(conf.get("ldbc.snb.bteronh.serializer.workspace"));
- if(workSpace == null) {
- throw new IOException("Ill-formed workspace URI. Workspace must start with hdfs://");
- }
- conf.set("ldbc.snb.bteronh.serializer.dataDir",workSpace+"/data");
- conf.set("ldbc.snb.bteronh.serializer.hadoopDir",workSpace+"/hadoop");
- String hadoopDir = new String( conf.get("ldbc.snb.bteronh.serializer.hadoopDir"));
- String dataDir = new String( conf.get("ldbc.snb.bteronh.serializer.dataDir"));
- String tempFile = hadoopDir+"/mrInputFile";
-
- String outputFileName = conf.get("ldbc.snb.bteronh.serializer.outputFileName");
- if(outputFileName != null){
- outputFileName = isHDFSPath(outputFileName);
- if(outputFileName == null) {
- throw new IOException("Ill-formed outputFileName URI"+outputFileName+". OutputFileName must start " +
- "with hdfs://");
- }
- } else {
- throw new IOException("You need to specify. ldbc.snb.bteronh.serializer.outputFileName");
- }
-
- System.out.println(dataDir);
- System.out.println(hadoopDir);
- System.out.println(outputFileName);
-
- FileSystem dfs = FileSystem.get(conf);
- dfs.delete(new Path(hadoopDir), true);
- dfs.delete(new Path(dataDir), true);
- dfs.delete(new Path(tempFile), true);
- writeToOutputFile(tempFile, Integer.parseInt(conf.get("ldbc.snb.bteronh.generator.numThreads")), conf);
-
- int numThreads = Integer.parseInt(conf.get("ldbc.snb.bteronh.generator.numThreads"));
- conf.setInt("mapreduce.input.lineinputformat.linespermap", 1);
- Job job = Job.getInstance(conf, "Generating Graph");
- job.setMapOutputKeyClass(LongWritable.class);
- job.setMapOutputValueClass(LongWritable.class);
- job.setOutputKeyClass(LongWritable.class);
- job.setOutputValueClass(LongWritable.class);
- job.setJarByClass(HadoopBTERGeneratorMapper.class);
- job.setMapperClass(HadoopBTERGeneratorMapper.class);
- job.setReducerClass(HadoopBTERGeneratorReducer.class);
- job.setNumReduceTasks(numThreads);
- job.setInputFormatClass(NLineInputFormat.class);
- job.setOutputFormatClass(SequenceFileOutputFormat.class);
- job.setPartitionerClass(HadoopEdgePartitioner.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- FileInputFormat.setInputPaths(job, new Path(tempFile));
- FileOutputFormat.setOutputPath(job, new Path(outputFileName));
- if(!job.waitForCompletion(true)) {
- throw new Exception(job.toString());
- }
- }
-}
diff --git a/src/main/java/ldbc/snb/bteronh/structures/BTERStats.java b/src/main/java/ldbc/snb/bteronh/structures/BTERStats.java
deleted file mode 100644
index 7022b60..0000000
--- a/src/main/java/ldbc/snb/bteronh/structures/BTERStats.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package ldbc.snb.bteronh.structures;
-
-import javafx.util.Pair;
-import ldbc.snb.bteronh.algorithms.Algorithms;
-import umontreal.iro.lecuyer.randvar.RandomVariateGen;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Consumer;
-
-/**
- * Created by aprat on 14/07/16.
- */
-public class BTERStats {
-
- int maxDegree = Integer.MIN_VALUE;
-
- //Phase 1 data
- long [] i_g = null; //index of group in degree sequence
- long[] n_g = null; //number of buckets in group
- long[] b_g = null; //size of bucket in group
- double [] w_g = null; //weight of buckets in group
-
- //Phase 2 data
- long [] nfill_d = null;
- long [] nbulk_d = null;
- double [] wfill_d = null;
- double [] wbulk_d = null;
- double [] w_d = null;
- double [] r_d = null;
- long [] i_d = null;
- long [] n_d = null;
-
-
- double [] cumulativeGroups = null;
- double [] cumulativeDegrees = null;
- long weightPhase1;
- long weightPhase2;
-
- public void initialize(long numNodes, ArrayList observedDegreeSequence, ArrayList> observedCCPerDegree, int seed, Consumer continuation) {
-
- maxDegree = Integer.MIN_VALUE;
- RandomVariateGen randomVariateGen = Algorithms.GetDegreeSequenceSampler(observedDegreeSequence, numNodes, seed);
-
- System.out.println("Generating Degree Sequence");
- HashMap degrees = new HashMap();
- for(long i = 0; i < numNodes; ++i) {
- int degree = (int)randomVariateGen.nextDouble();
- degrees.compute(degree,(k,v)-> v == null ? 1 : v + 1 );
- maxDegree = degree > maxDegree ? degree : maxDegree;
- if(i % 1000000 == 0) {
- continuation.accept(i);
- }
- }
-
- double [] ccPerDegree = Algorithms.GenerateCCperDegree(observedCCPerDegree,maxDegree);
- initialize(numNodes, degrees,ccPerDegree);
- }
-
- public void initialize(long numNodes, HashMap degrees, double [] ccPerDegree) {
-
- if(maxDegree == Integer.MIN_VALUE) {
- maxDegree = Integer.MIN_VALUE;
- for (Integer key : degrees.keySet()) {
- maxDegree = key > maxDegree ? key : maxDegree;
- }
- }
-
- i_g = new long[maxDegree+1];
- b_g = new long[maxDegree+1];
- n_g = new long[maxDegree+1];
- w_g = new double[maxDegree+1];
- nfill_d = new long[maxDegree+1];
- nbulk_d = new long[maxDegree+1];
- wfill_d = new double[maxDegree+1];
- wbulk_d = new double[maxDegree+1];
- w_d = new double[maxDegree+1];
- r_d = new double[maxDegree+1];
- n_d = new long[maxDegree+1];
- i_d = new long[maxDegree+1];
- for(int i = 0; i < maxDegree+1; ++i) {
- i_g[i] = 0;
- b_g[i] = 0;
- n_g[i] = i+1;
- w_g[i] = 0;
-
- nfill_d[i] = 0;
- nbulk_d[i] = 0;
- wfill_d[i] = 0;
- wbulk_d[i] = 0;
-
- w_d[i] = 0;
- r_d[i] = 0;
- i_d[i] = 0;
- n_d[i] = 0;
- }
-
- // initializing n_d
- for(Map.Entry pair : degrees.entrySet()) {
- n_d[pair.getKey()] = (long)pair.getValue();
- }
-
-
- // initializing i_d
- i_d[2] = 0;
- for(int i = 3; i <= maxDegree; ++i) {
- i_d[i] = i_d[i-1] + n_d[i-1];
- }
- i_d[1] = i_d[maxDegree] + n_d[maxDegree];
- i_g[1] = i_d[maxDegree] + n_d[maxDegree];
-
- long [] n_dPrima = new long[maxDegree+1];
- int accum = 0;
- for(int i = 0; i <= maxDegree; ++i) {
- accum+=n_d[i];
- n_dPrima[i]=numNodes-accum;
- }
-
- //handling degree 1 nodes
- nfill_d[1] = 10*n_d[1];
- wfill_d[1] = 0.5*n_d[1];
- wbulk_d[1] = 0;
- w_d[1] = wbulk_d[1] + wfill_d[1];
- r_d[1] = 1;
-
- // Initializing group arrays.
- long nFillPrevious = 0;
- long g = -1;
- double dInternalPrevious = 0;
- for(int i = 2; i <= maxDegree; ++i) {
- if(nFillPrevious > 0) {
- nfill_d[i] = Math.min(nFillPrevious, n_d[i]);
- nFillPrevious-=nfill_d[i];
- wfill_d[i] = 0.5*nfill_d[i]*(i-dInternalPrevious);
- } else {
- nfill_d[i] = 0;
- wfill_d[i] = 0;
- }
- nbulk_d[i] = n_d[i] - nfill_d[i];
- if(nbulk_d[i] > 0) {
- g+=1;
- i_g[(int)g] = i_d[i] + nfill_d[i];
- b_g[(int)g] = (int)Math.ceil(nbulk_d[i]/(double)(i+1));
- n_g[(int)g] = i+1;
- if(b_g[(int)g]*(i+1) > (n_dPrima[i]+nbulk_d[i])) {
- n_g[(int)g] = (n_dPrima[i]+nbulk_d[i]);
- }
- double p = Math.pow(ccPerDegree[i],1/3.0);
- dInternalPrevious = (n_g[(int)g]-1)*p;
- wbulk_d[i] = 0.5*nbulk_d[i]*(i-dInternalPrevious);
- w_g[(int)g] = b_g[(int)g]*0.5*n_g[(int)g]*(n_g[(int)g]-1)*Math.log(1/(1.0-p));
- nFillPrevious = (b_g[(int)g]*n_g[(int)g]) - nbulk_d[i];
- } else {
- wbulk_d[i] = 0;
- }
- w_d[i] = wfill_d[i] + wbulk_d[i];
- r_d[i] = wfill_d[i] / w_d[i];
- }
-
- long [] newi_g = new long[(int)g+1];
- long [] newn_g = new long[(int)g+1]; //number of buckets in group
- long [] newb_g = new long[(int)g+1]; //size of bucket in group
- double [] neww_g = new double[(int)g+1]; //weight of buckets in group
- for(int i = 0; i < g+1; ++i) {
- newi_g[i] = i_g[i];
- newn_g[i] = n_g[i];
- newb_g[i] = b_g[i];
- neww_g[i] = w_g[i];
- }
-
- i_g = newi_g;
- n_g = newn_g;
- b_g = newb_g;
- w_g = neww_g;
-
- weightPhase1 = 0L;
- weightPhase2 = 0L;
- for(int i = 0; i < getNumGroups(); ++i) {
- weightPhase1+= getGroupWeight(i);
- }
-
- for(int i = 0; i < (getMaxDegree()+1); ++i) {
- weightPhase2+=getDegreeWeight(i);
- }
-
- cumulativeGroups = new double[getNumGroups()];
- cumulativeGroups[0] = getGroupWeight(0) / (double)weightPhase1;
- for(int i = 1; i < getNumGroups(); ++i) {
- cumulativeGroups[i] = Math.min(cumulativeGroups[i-1] + getGroupWeight(i) / (double)weightPhase1, 1.0);
- }
-
- cumulativeDegrees = new double[getMaxDegree()+1];
- cumulativeDegrees[0] = getDegreeWeight(0) / (double)weightPhase2;
- for(int i = 1; i < (getMaxDegree()+1); ++i) {
- cumulativeDegrees[i] = Math.min(cumulativeDegrees[i-1] + getDegreeWeight(i) / (double)weightPhase2,1.0);
- }
- }
-
- public long getGroupIndex(int group) {return i_g[group];}
-
- public long getGroupBucketSize(int group) {return n_g[group];}
-
- public long getGroupNumBuckets(int group) {return b_g[group];}
-
- public double getGroupWeight(int group) {return w_g[group];}
-
- public double [] getGroupWeights() { return w_g;}
-
- public long getDegreeIndex(int degree) { return i_d[degree];}
-
- public long getDegreeNFill(int degree) { return nfill_d[degree];}
-
- public long getDegreeNBulk(int degree) { return nbulk_d[degree];}
-
- public double getDegreeWFill(int degree) { return wfill_d[degree];}
-
- public double getDegreeWBulk(int degree) { return wbulk_d[degree];}
-
- public double getDegreeWeight(int degree) { return w_d[degree];}
-
- public double [] getDegreeWeights() { return w_d;}
-
- public double getDegreeWeightRatio( int degree ) { return r_d[degree];}
-
- public double [] getDegreeWeightRatios() { return r_d;}
-
- public double getDegreeN(int degree) { return n_d[degree];}
-
- public int getNumGroups() {
- return n_g.length;
- }
-
- public int getMaxDegree() { return maxDegree;}
-
- public double[] getCumulativeGroups() {
- return cumulativeGroups;
- }
-
- public double[] getCumulativeDegrees() {
- return cumulativeDegrees;
- }
-
- public long getWeightPhase1() {
- return weightPhase1;
- }
-
- public long getWeightPhase2() {
- return weightPhase2;
- }
-
-}
diff --git a/src/main/java/ldbc/snb/bteronhplus/Main.java b/src/main/java/ldbc/snb/bteronhplus/Main.java
new file mode 100644
index 0000000..9b55efa
--- /dev/null
+++ b/src/main/java/ldbc/snb/bteronhplus/Main.java
@@ -0,0 +1,240 @@
+package ldbc.snb.bteronhplus;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import ldbc.snb.bteronhplus.algorithms.Partitioning;
+import ldbc.snb.bteronhplus.structures.*;
+import org.jgrapht.Graph;
+import org.jgrapht.alg.ConnectivityInspector;
+import org.jgrapht.graph.DefaultEdge;
+import org.jgrapht.graph.SimpleGraph;
+import org.jgrapht.graph.builder.GraphBuilder;
+
+import java.io.FileWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+
+
+public class Main {
+
+ public static class Arguments {
+
+ @Parameter(names = {"-d", "--degrees"}, description = "The file with the degrees", required = true)
+ public String degreesFile;
+
+ @Parameter(names = {"-cc", "--clustering"}, description = "The file with the clustering coefficient " +
+ "distributions per degree", required = true)
+ public String ccsFile;
+
+ @Parameter(names = {"-c", "--communities"}, description = "The file with the community sizes", required = true)
+ public String communitiesfile;
+
+ @Parameter(names = {"-o", "--output"}, description = "The output file", required = true)
+ public String outputFileName;
+
+ @Parameter(names = {"-p", "--density"}, description = "The community densities file", required = true)
+ public String densityFileName;
+
+ @Parameter(names = {"-s", "--size"}, description = "The size of the graph", required = true)
+ public int graphSize;
+
+ @Parameter(names = {"-cs", "--csprefix"}, description = "The community structure file name prefix", required =
+ true)
+ public String communityStructureFileNamePrefix;
+
+ @Parameter(names = {"-l", "--levels"}, description = "The number of community structure levels " )
+ public int levels = 2;
+
+ @Parameter(names = {"-m", "--modules"}, description = "The modules file prefix", required = true)
+ public String modulesPrefix;
+
+
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ Arguments arguments = new Arguments();
+ new JCommander(arguments, args);
+
+ System.out.println("Degree file: "+arguments.degreesFile);
+ System.out.println("CCS file: "+arguments.ccsFile);
+ System.out.println("Communities file: "+arguments.communitiesfile);
+ System.out.println("Density file: "+arguments.densityFileName);
+ System.out.println("Modules prefix: "+arguments.modulesPrefix);
+
+ GraphStats graphStats = new GraphStats(arguments.degreesFile,
+ arguments.ccsFile,
+ arguments.communitiesfile,
+ arguments.densityFileName);
+
+
+ byte[] byteArray = Files.readAllBytes(Paths.get(arguments.communityStructureFileNamePrefix+1));
+ String blockModelData = new String(byteArray);
+ byteArray = Files.readAllBytes(Paths.get(arguments.communityStructureFileNamePrefix+1+".children"));
+ String childrenData = new String(byteArray);
+ BlockModel blockModel = new BlockModel(blockModelData, childrenData);
+
+ Random random = new Random();
+ random.setSeed(12345L);
+
+ //BasicCommunityStreamer communityStreamer = new BasicCommunityStreamer(graphStats);
+ //CorePeripheryCommunityStreamer communityStreamer = new CorePeripheryCommunityStreamer(graphStats,random);
+ RealCommunityStreamer communityStreamer = new RealCommunityStreamer(graphStats, arguments.modulesPrefix+
+ "communities", random);
+ List