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.
CPO.BoundType
_transitiveClosureAnalysis
HIGHER, 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, weightArray
public 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 DirectedGraph
weights
- 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 Graph
node1
- 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 DirectedGraph
Analysis