-
Notifications
You must be signed in to change notification settings - Fork 56
Class StrongComponentProcessor
Ori Roth edited this page Apr 2, 2017
·
3 revisions
public class StrongComponentProcessor<Data> extends EmptyProcessor<Data, Graph<Component<Data>>> {
/*
* Forge (1)
*/
StrongComponentProcessor();
/*
* Type (6)
*/
void before(Graph<Data> g);
void before(Vertex<Data> v);
void after(Vertex<Data> from, Vertex<Data> to);
void revisit(Vertex<Data> from, Vertex<Data> to);
void after(Vertex<Data> v);
Graph<Component<Data>> after(Graph<Data> _);
}
Input types: Comparable<Data>
, Graph<Data>
, Vertex<Data>
.
Output types: Comparable<Data>
, Component<Data>
, Graph<Component<Data>>
.
// SSDLPedia
package il.ac.technion.cs.cs236700.graph;
import static java.lang.Math.min;
import il.ac.technion.cs.cs236700.graph.Graph.Vertex;
import java.util.Stack;
/**
* Implementation of a strong components algorithm.
*
* <Data> the type of information stored in a graph node
* Author: Yossi Gil
* See: 28/06/2007
*/
public class StrongComponentProcessor<Data extends Comparable<Data>> extends EmptyProcessor<Data, Graph<Component<Data>>> {
private int max_dfs = 0;
private final Stack<Vertex<Data>> stack = new Stack<Vertex<Data>>();
private Component<Data>[] vertex2Component;
private int[] dfs;
private int[] lowlink;
private boolean[] stacked;
@Override public void before(final Graph<Data> g) {
final int n = g.vertices.length;
dfs = new int[n];
lowlink = new int[n];
stacked = new boolean[n];
@SuppressWarnings("unchecked") final Component<Data>[] v2c = new Component[n];
vertex2Component = v2c;
}
@Override public void before(final Vertex<Data> v) {
dfs[v.i] = lowlink[v.i] = max_dfs++;
stacked[v.i] = true;
stack.push(v);
}
@Override public void after(final Vertex<Data> from, final Vertex<Data> to) {
lowlink[from.i] = min(lowlink[from.i], lowlink[to.i]);
}
@Override public void revisit(final Vertex<Data> from, final Vertex<Data> to) {
if (stacked[to.i])
lowlink[from.i] = min(lowlink[from.i], dfs[to.i]);
}
@Override public void after(final Vertex<Data> v) {
if (lowlink[v.i] != dfs[v.i])
return;
final Component.Builder<Data> b = new Component.Builder<Data>();
while (true) {
final Graph.Vertex<Data> u = stack.pop();
stacked[u.i] = false;
b.add(u);
if (u == v)
break;
}
final Component<Data> c = b.build();
for (final Graph.Vertex<Data> u : c.vertices)
vertex2Component[u.i] = c;
}
/**
* Create the strongly connected components graph by adding all edges
* between between the strong components. There is an arc from a strong
* component to another if there is at least one edge from a vertex of one
* component to a vertex the other.
*/
@Override public Graph<Component<Data>> after(@SuppressWarnings("unused") final Graph<Data> _) {
final Graph.Builder<Component<Data>> $ = new Graph.Builder<Component<Data>>();
for (final Component<Data> c : vertex2Component) {
$.newVertex(c);
for (final Graph.Vertex<Data> v : c.vertices)
for (final Graph.Vertex<Data> u : v.to)
if (vertex2Component[u.i] != c)
$.newEdge(c, vertex2Component[u.i]);
}
return $.build();
}
}
Metric | Value | Acronym | Explanation |
---|---|---|---|
LOC | 82 | Lines Of Code | Total number of lines in the code |
SCC | 33 | SemiColons Count | Total number of semicolon tokens found in the code. |
NOT | 601 | Number Of Tokens | Comments, whitespace and text which cannot be made into a token not included. |
VCC | 2147 | Visible Characters Count | The total number of non-white (i.e., not space, tab, newline, carriage return, form feed) characters. |
CCC | 1733 | Code Characters Count | Total number of non-white characters in tokens. White space characters in string and character literals are not counted. |
UIC | 49 | Unique Identifiers Count | The number of different identifiers found in the code |
WHC | 4 | Weighted Horizontal Complexity | A heuritistic on horizontal complexity |
y |
Statistic | Value |
---|---|
Average token length | 2.9 |
Tokens/line | 7.3 |
Visible characters/line | 26 |
Code characters/line | 21 |
Semicolons/tokens | 5% |
Comment text percentage | 19% |
Token Kind | Occurrences |
---|---|
KEYWORD | 75 |
OPERATOR | 81 |
LITERAL | 3 |
ID | 220 |
PUNCTUATION | 222 |
COMMENT | 3 |
OTHER | 224 |