forked from stamps/FAS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimpleFAS.java
More file actions
127 lines (98 loc) · 2.82 KB
/
SimpleFAS.java
File metadata and controls
127 lines (98 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
FAS via DFS back edges
Copyright (C) 2016 by
Michael Simpson <simpsonm@uvic.ca>
All rights reserved.
BSD license.
*/
import java.io.IOException;
import java.util.BitSet;
import java.util.Random;
import it.unimi.dsi.webgraph.ImmutableGraph;
import it.unimi.dsi.webgraph.NodeIterator;
public class SimpleFAS {
String basename; // input graph basename
ImmutableGraph G; // graph G
int n; // number of vertices in G
long e; // number of edges in G
int[] A; // array of nodes to be sorted
Random rand = new Random();
// load graph and initialize class variables
public SimpleFAS(String basename) throws Exception {
this.basename = basename;
System.out.println("Loading graph...");
G = ImmutableGraph.load(basename); //We need random access
System.out.println("Graph loaded");
n = G.numNodes();
e = G.numArcs();
System.out.println("n="+n);
System.out.println("e="+e);
A = new int[n];
for(int i = 0; i < A.length; i++) {
A[i] = i;
}
}
public void shuffle(int[] array) {
int count = array.length;
for (int i = count; i > 1; i--) {
swap(array, i - 1, rand.nextInt(i));
}
}
public void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
public long computeFAS() throws Exception {
shuffle(A);
int[] varray = new int[n];
int i = 0;
for(int u : A) {
varray[u] = i;
i++;
}
long mag = 0;
int self = 0;
long fas = 0;
NodeIterator vi = G.nodeIterator();
while (vi.hasNext()) {
int v = vi.next();
int[] v_neighbors = G.successorArray(v);
int v_deg = G.outdegree(v);
for(int x = 0; x < v_deg; x++) {
int w = v_neighbors[x];
if(v==w) { // Self-loop, ignore
self++;
continue;
}
if (varray[v] > varray[w]) {
mag++;
}
}
}
if (mag > e/2) {
fas = e - mag;
} else {
fas = mag;
}
//System.out.println("fvs size is " + fvs.cardinality());
System.out.println("fas size is " + fas);
//System.out.println("self loops = " + self);
return fas;
}
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
//args = new String[] {"cnr-2000"};
//args = new String[] {"wordassociation-2011"};
if(args.length != 1) {
System.out.println("Usage: java dfsFAS basename");
System.out.println("Output: FAS statistics");
return;
}
System.out.println("Starting " + args[0]);
SimpleFAS fas = new SimpleFAS(args[0]);
fas.computeFAS();
long estimatedTime = System.currentTimeMillis() - startTime;
System.out.println(args[0] + ": Time elapsed = " + estimatedTime/1000.0);
}
}