public class DirectedAcyclicGraph extends DirectedGraph implements CPO<java.lang.Object>
add and
addEdge), but is checked when any of the other methods is
called for the first time after the addition of nodes or edges. If the
graph is cyclic, a GraphTopologyException is thrown. The check for cycles
is done by computing the transitive closure, so the first operation after
a graph change is slower.
This class implements the CPO interface since the Hasse diagram of a CPO
can be viewed as a DAG. Therefore, this class can be viewed as both a DAG
and a finite CPO. In the case of CPO, the node weights
are the CPO elements. The CPO does not require the bottom
element to exist. The call to bottom returns
null if the bottom element does not exist.
NOTE: This class is a starting point for implementing graph algorithms, more methods will be added.
| Green (kienhuis) |
| Green (yuhong) |
CPO.BoundType_transitiveClosureAnalysisHIGHER, INCOMPARABLE, LOWER, SAME| Constructor and Description |
|---|
DirectedAcyclicGraph()
Construct an empty DAG.
|
DirectedAcyclicGraph(int nodeCount)
Construct an empty DAG with enough storage allocated
for the specified number of elements.
|
| Modifier and Type | Method and Description |
|---|---|
protected Edge |
_addEdge(Node node1,
Node node2,
boolean weighted,
java.lang.Object weight)
Create and add an edge with a specified source node, sink node,
and optional weight.
|
protected void |
_initializeAnalyses()
Initialize the list of analyses that are associated with this graph,
and initialize the change counter of the graph.
|
java.lang.Object |
bottom()
Return the bottom element of this CPO.
|
int |
compare(java.lang.Object e1,
java.lang.Object e2)
Compare two elements in this CPO.
|
java.lang.Object[] |
downSet(java.lang.Object e)
Compute the down-set of an element in this CPO.
|
java.lang.Object |
greatestElement(java.util.Set<java.lang.Object> subset)
Compute the greatest element of a subset.
|
java.lang.Object |
greatestLowerBound(java.lang.Object e1,
java.lang.Object e2)
Compute the greatest lower bound (GLB) of two elements.
|
java.lang.Object |
greatestLowerBound(java.util.Set<java.lang.Object> subset)
Compute the greatest lower bound (GLB) of a subset.
|
boolean |
isLattice()
Test if this CPO is a lattice.
|
java.lang.Object |
leastElement(java.util.Set<java.lang.Object> subset)
Compute the least element of a subset.
|
java.lang.Object |
leastUpperBound(java.lang.Object e1,
java.lang.Object e2)
Compute the least upper bound (LUB) of two elements.
|
java.lang.Object |
leastUpperBound(java.util.Set<java.lang.Object> subset)
Compute the least upper bound (LUB) of a subset.
|
NonLatticeCounterExample |
nonLatticeReason()
Return a counterexample reason as to why this graph is not a lattice.
|
static int |
reverseCompareCode(int compareCode)
Return the opposite of the given compare return code, as if the
arguments had been given to compare in the reverse order.
|
java.lang.Object |
top()
Return the top element of this CPO.
|
java.lang.Object[] |
topologicalSort()
Topological sort the whole graph.
|
java.lang.Object[] |
topologicalSort(java.lang.Object[] weights)
Sort the given node weights in their topological order.
|
java.lang.Object[] |
upSet(java.lang.Object e)
Compute the up-set of an element in this CPO.
|
_connect, _connectedSubGraph, _disconnect, _registerNode, backwardReachableNodes, backwardReachableNodes, backwardReachableNodes, backwardReachableNodes, cycleNodeCollection, cycleNodes, edgeExists, edgeExists, inputEdgeCount, inputEdges, isAcyclic, outputEdgeCount, outputEdges, predecessorEdges, predecessors, reachableNodes, reachableNodes, reachableNodes, reachableNodes, sccDecomposition, selfLoopEdgeCount, sinkNodeCount, sinkNodes, sourceNodeCount, sourceNodes, subgraphs, successorEdges, successors, toDirectedAcyclicGraph, topologicalSort, transitiveClosure_connectEdge, _disconnectEdge, _emptyGraph, _registerChange, _registerEdge, addAnalysis, addEdge, addEdge, addEdge, addEdge, addEdge, addEdges, addGraph, addNode, addNode, addNodes, addNodeWeight, addNodeWeights, changeCount, clone, cloneAs, connectedComponents, containsEdge, containsEdgeWeight, containsNode, containsNodeWeight, edge, edge, edgeCount, edgeLabel, edgeLabel, edges, edges, edges, edgeWeight, equals, hashCode, hidden, hiddenEdgeCount, hiddenEdges, hideEdge, incidentEdgeCount, incidentEdges, neighborEdges, neighbors, node, node, nodeCount, nodeLabel, nodeLabel, nodes, nodes, nodes, nodeWeight, removeEdge, removeNode, restoreEdge, selfLoopEdgeCount, selfLoopEdges, selfLoopEdges, subgraph, subgraph, toString, validateWeight, validateWeight, validateWeight, validateWeight, validEdgeWeight, validNodeWeight, weightArraypublic DirectedAcyclicGraph()
public DirectedAcyclicGraph(int nodeCount)
nodeCount - The number of elements.public java.lang.Object bottom()
public int compare(java.lang.Object e1,
java.lang.Object e2)
compare in interface CPO<java.lang.Object>e1 - An Object representing a CPO element.e2 - An Object representing a CPO element.CPO.LOWER, CPO.SAME,
CPO.HIGHER, CPO.INCOMPARABLE.java.lang.IllegalArgumentException - If at least one of the
specified Objects is not an element of this CPO.public java.lang.Object[] downSet(java.lang.Object e)
downSet in interface CPO<java.lang.Object>e - An Object representing an element in this CPO.java.lang.IllegalArgumentException - If the specified Object is not
an element in this CPO.public java.lang.Object greatestElement(java.util.Set<java.lang.Object> subset)
greatestElement in interface CPO<java.lang.Object>subset - A set of Objects representing the subset.null if the greatest element does not exist.java.lang.IllegalArgumentException - If at least one Object in the
specified array is not an element of this CPO.public java.lang.Object greatestLowerBound(java.lang.Object e1,
java.lang.Object e2)
greatestLowerBound in interface CPO<java.lang.Object>e1 - An Object representing an element in this CPO.e2 - An Object representing an element in this CPO.null if the GLB does not exist.java.lang.IllegalArgumentException - If at least one of the
specified Objects is not an element of this CPO.public java.lang.Object greatestLowerBound(java.util.Set<java.lang.Object> subset)
null is returned.greatestLowerBound in interface CPO<java.lang.Object>subset - A set of Objects representing the subset.null if the GLB does not exist.java.lang.IllegalArgumentException - If at least one Object
in the specified array is not an element of this CPO.public boolean isLattice()
public java.lang.Object leastElement(java.util.Set<java.lang.Object> subset)
leastElement in interface CPO<java.lang.Object>subset - A set of Objects representing the subset.null if the least element does not exist.java.lang.IllegalArgumentException - If at least one Object in the
specified array is not an element of this CPO.public java.lang.Object leastUpperBound(java.lang.Object e1,
java.lang.Object e2)
leastUpperBound in interface CPO<java.lang.Object>e1 - An Object representing an element in this CPO.e2 - An Object representing element in this CPO.null if the LUB does not exist.java.lang.IllegalArgumentException - If at least one of the
specified Objects is not an element of this CPO.public java.lang.Object leastUpperBound(java.util.Set<java.lang.Object> subset)
null is returned.leastUpperBound in interface CPO<java.lang.Object>subset - A set of Objects representing the subset.null if the LUB does not exist.java.lang.IllegalArgumentException - If at least one Object
in the specified array is not an element of this CPO.public NonLatticeCounterExample nonLatticeReason()
public static final int reverseCompareCode(int compareCode)
compareCode - One of CPO.SAME, CPO.HIGHER,
CPO.LOWER, CPO.INCOMPARABLE.public java.lang.Object top()
public java.lang.Object[] topologicalSort()
GraphStateException - If the graph is cyclic.public java.lang.Object[] topologicalSort(java.lang.Object[] weights)
topologicalSort in class DirectedGraphweights - The given node weights.DirectedGraph.topologicalSort(Collection)public java.lang.Object[] upSet(java.lang.Object e)
upSet in interface CPO<java.lang.Object>e - An Object representing an element in this CPO.java.lang.IllegalArgumentException - If the specified Object is not
an element of this CPO.protected Edge _addEdge(Node node1, Node node2, boolean weighted, java.lang.Object weight)
_addEdge in class Graphnode1 - The source node of the edge.node2 - The sink node of the edge.weighted - True if the edge is to be weighted.weight - The weight that is to be applied if the edge is to
be weighted.GraphConstructionException - If the specified nodes
are identical.GraphElementException - If either of the specified nodes
is not in the graph.java.lang.NullPointerException - If the edge is to be weighted, but
the specified weight is null.protected void _initializeAnalyses()
_initializeAnalyses in class DirectedGraphAnalysis