1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.giraph.io.formats;
20
21 import org.apache.giraph.conf.ImmutableClassesGiraphConfiguration;
22 import org.apache.giraph.partition.PartitionUtils;
23 import org.apache.giraph.partition.SimpleLongRangePartitionerFactory;
24 import org.apache.giraph.worker.WorkerInfo;
25
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Random;
29
30
31
32
33 public class PseudoRandomLocalEdgesHelper {
34
35 private float minLocalEdgesRatio;
36
37 private boolean usingRangePartitioner;
38
39 private long numVertices;
40
41 private int numPartitions;
42
43 private long partitionSize;
44
45
46
47
48
49
50
51
52 public PseudoRandomLocalEdgesHelper(long numVertices,
53 float minLocalEdgesRatio,
54 ImmutableClassesGiraphConfiguration conf)
55 {
56 this.minLocalEdgesRatio = minLocalEdgesRatio;
57 this.numVertices = numVertices;
58 usingRangePartitioner =
59 SimpleLongRangePartitionerFactory.class.isAssignableFrom(
60 conf.getGraphPartitionerClass());
61 int numWorkers = conf.getMaxWorkers();
62 List<WorkerInfo> workerInfos = Collections.nCopies(numWorkers,
63 new WorkerInfo());
64 numPartitions =
65 PartitionUtils.computePartitionCount(workerInfos.size(), conf);
66 partitionSize = numVertices / numPartitions;
67 }
68
69
70
71
72
73
74
75
76
77
78 public long generateDestVertex(long sourceVertexId, Random rand) {
79 long destVertexId;
80 if (rand.nextFloat() < minLocalEdgesRatio) {
81 if (usingRangePartitioner) {
82 int partitionId = Math.min(numPartitions - 1,
83 (int) (sourceVertexId / partitionSize));
84 destVertexId = partitionId * partitionSize +
85 (Math.abs(rand.nextLong()) % partitionSize);
86 } else {
87 int partitionId = (int) sourceVertexId % numPartitions;
88 destVertexId = partitionId +
89 numPartitions * (Math.abs(rand.nextLong()) % partitionSize);
90 }
91 } else {
92 destVertexId = Math.abs(rand.nextLong()) % numVertices;
93 }
94 return destVertexId;
95 }
96 }