package ldbc.snb.datagen.generator; import ldbc.snb.datagen.dictionary.Dictionaries; import ldbc.snb.datagen.objects.Knows; import ldbc.snb.datagen.objects.Person; import ldbc.snb.datagen.util.RandomGeneratorFarm; import org.apache.hadoop.conf.Configuration; import java.util.ArrayList; /** * Created by aprat on 11/15/14. */ public class DistanceKnowsGenerator implements KnowsGenerator { private RandomGeneratorFarm randomFarm; public DistanceKnowsGenerator() { this.randomFarm = new RandomGeneratorFarm(); } public void generateKnows( ArrayList<Person> persons, int seed, ArrayList<Float> percentages, int step_index ) { randomFarm.resetRandomGenerators(seed); for( int i = 0; i < persons.size(); ++i ) { Person p = persons.get(i); for( int j = i+1; ( Knows.target_edges(p, percentages, step_index) > p.knows().size() ) && ( j < persons.size() ); ++j ) { if( know(p, persons.get(j), j - i, percentages, step_index)) { Knows.createKnow(randomFarm.get(RandomGeneratorFarm.Aspect.DATE), p, persons.get(j)); } } } } public void initialize( Configuration conf ) { } boolean know( Person personA, Person personB, int dist, ArrayList<Float> percentages, int step_index ) { if( personA.knows().size() >= Knows.target_edges( personA, percentages, step_index) || personB.knows().size() >= Knows.target_edges( personB, percentages, step_index) ) return false; double randProb = randomFarm.get(RandomGeneratorFarm.Aspect.UNIFORM).nextDouble(); double prob = Math.pow(DatagenParams.baseProbCorrelated, dist); if ((randProb < prob) || (randProb < DatagenParams.limitProCorrelated)) { return true; } return false; } }