Package ptolemy.graph
Class DirectedAcyclicGraph
- java.lang.Object
-
- ptolemy.graph.Graph
-
- ptolemy.graph.DirectedGraph
-
- ptolemy.graph.DirectedAcyclicGraph
-
- All Implemented Interfaces:
java.lang.Cloneable,CPO<java.lang.Object>
public class DirectedAcyclicGraph extends DirectedGraph implements CPO<java.lang.Object>
A directed acyclic graph (DAG). The graphs constructed by this class cannot have cycles. For performance reasons, this requirement is not checked (except for self-loops) during the construction of the graph (calls toaddandaddEdge), 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 tobottomreturnsnullif the bottom element does not exist.NOTE: This class is a starting point for implementing graph algorithms, more methods will be added.
- Since:
- Ptolemy II 0.2
- Version:
- $Id$
- Author:
- Yuhong Xiong, Shuvra S. Bhattacharyya
- Pt.AcceptedRating:
- Green (kienhuis)
- Pt.ProposedRating:
- Green (yuhong)
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface ptolemy.graph.CPO
CPO.BoundType
-
-
Field Summary
-
Fields inherited from class ptolemy.graph.DirectedGraph
_transitiveClosureAnalysis
-
Fields inherited from interface ptolemy.graph.CPO
HIGHER, INCOMPARABLE, LOWER, SAME
-
-
Constructor Summary
Constructors Constructor Description DirectedAcyclicGraph()Construct an empty DAG.DirectedAcyclicGraph(int nodeCount)Construct an empty DAG with enough storage allocated for the specified number of elements.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method 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.Objectbottom()Return the bottom element of this CPO.intcompare(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.ObjectgreatestElement(java.util.Set<java.lang.Object> subset)Compute the greatest element of a subset.java.lang.ObjectgreatestLowerBound(java.lang.Object e1, java.lang.Object e2)Compute the greatest lower bound (GLB) of two elements.java.lang.ObjectgreatestLowerBound(java.util.Set<java.lang.Object> subset)Compute the greatest lower bound (GLB) of a subset.booleanisLattice()Test if this CPO is a lattice.java.lang.ObjectleastElement(java.util.Set<java.lang.Object> subset)Compute the least element of a subset.java.lang.ObjectleastUpperBound(java.lang.Object e1, java.lang.Object e2)Compute the least upper bound (LUB) of two elements.java.lang.ObjectleastUpperBound(java.util.Set<java.lang.Object> subset)Compute the least upper bound (LUB) of a subset.NonLatticeCounterExamplenonLatticeReason()Return a counterexample reason as to why this graph is not a lattice.static intreverseCompareCode(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.Objecttop()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.-
Methods inherited from class ptolemy.graph.DirectedGraph
_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
-
Methods inherited from class ptolemy.graph.Graph
_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
-
-
-
-
Constructor Detail
-
DirectedAcyclicGraph
public DirectedAcyclicGraph()
Construct an empty DAG.
-
DirectedAcyclicGraph
public DirectedAcyclicGraph(int nodeCount)
Construct an empty DAG with enough storage allocated for the specified number of elements. Memory management is more efficient with this constructor if the number of elements is known.- Parameters:
nodeCount- The number of elements.
-
-
Method Detail
-
bottom
public java.lang.Object bottom()
Return the bottom element of this CPO.
-
compare
public int compare(java.lang.Object e1, java.lang.Object e2)Compare two elements in this CPO.- Specified by:
comparein interfaceCPO<java.lang.Object>- Parameters:
e1- An Object representing a CPO element.e2- An Object representing a CPO element.- Returns:
- One of
CPO.LOWER, CPO.SAME, CPO.HIGHER, CPO.INCOMPARABLE. - Throws:
java.lang.IllegalArgumentException- If at least one of the specified Objects is not an element of this CPO.
-
downSet
public java.lang.Object[] downSet(java.lang.Object e)
Compute the down-set of an element in this CPO.- Specified by:
downSetin interfaceCPO<java.lang.Object>- Parameters:
e- An Object representing an element in this CPO.- Returns:
- An array of of Objects representing the elements in the down-set of the specified element.
- Throws:
java.lang.IllegalArgumentException- If the specified Object is not an element in this CPO.
-
greatestElement
public java.lang.Object greatestElement(java.util.Set<java.lang.Object> subset)
Compute the greatest element of a subset.- Specified by:
greatestElementin interfaceCPO<java.lang.Object>- Parameters:
subset- A set of Objects representing the subset.- Returns:
- An Object representing the greatest element of the subset,
or
nullif the greatest element does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one Object in the specified array is not an element of this CPO.
-
greatestLowerBound
public java.lang.Object greatestLowerBound(java.lang.Object e1, java.lang.Object e2)Compute the greatest lower bound (GLB) of two elements.- Specified by:
greatestLowerBoundin interfaceCPO<java.lang.Object>- Parameters:
e1- An Object representing an element in this CPO.e2- An Object representing an element in this CPO.- Returns:
- An Object representing the GLB of the two specified
elements, or
nullif the GLB does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one of the specified Objects is not an element of this CPO.
-
greatestLowerBound
public java.lang.Object greatestLowerBound(java.util.Set<java.lang.Object> subset)
Compute the greatest lower bound (GLB) of a subset. If the specified array representing the subset has size 0, the subset is considered empty, in which case the top element of this CPO is returned, if it exists. If the subset is empty and the top does not exist,nullis returned.- Specified by:
greatestLowerBoundin interfaceCPO<java.lang.Object>- Parameters:
subset- A set of Objects representing the subset.- Returns:
- An Object representing the GLB of the subset, or
nullif the GLB does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one Object in the specified array is not an element of this CPO.
-
isLattice
public boolean isLattice()
Test if this CPO is a lattice.
-
leastElement
public java.lang.Object leastElement(java.util.Set<java.lang.Object> subset)
Compute the least element of a subset.- Specified by:
leastElementin interfaceCPO<java.lang.Object>- Parameters:
subset- A set of Objects representing the subset.- Returns:
- An Object representing the least element of the subset,
or
nullif the least element does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one Object in the specified array is not an element of this CPO.
-
leastUpperBound
public java.lang.Object leastUpperBound(java.lang.Object e1, java.lang.Object e2)Compute the least upper bound (LUB) of two elements.- Specified by:
leastUpperBoundin interfaceCPO<java.lang.Object>- Parameters:
e1- An Object representing an element in this CPO.e2- An Object representing element in this CPO.- Returns:
- An Object representing the LUB of the two specified
elements, or
nullif the LUB does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one of the specified Objects is not an element of this CPO.
-
leastUpperBound
public java.lang.Object leastUpperBound(java.util.Set<java.lang.Object> subset)
Compute the least upper bound (LUB) of a subset. If the specified array representing the subset has size 0, the subset is considered empty, in which case the bottom element of this CPO is returned, if it exists. If the subset is empty and the bottom does not exist,nullis returned.- Specified by:
leastUpperBoundin interfaceCPO<java.lang.Object>- Parameters:
subset- A set of Objects representing the subset.- Returns:
- An Object representing the LUB of the subset, or
nullif the LUB does not exist. - Throws:
java.lang.IllegalArgumentException- If at least one Object in the specified array is not an element of this CPO.
-
nonLatticeReason
public NonLatticeCounterExample nonLatticeReason()
Return a counterexample reason as to why this graph is not a lattice. If it is a lattice, return null. First check to see if the graph has a cycle. If it does not, then check to see if all pair combinations of elements in the graph have both a least upper bound and a greatest lower bound. The first time a counterexample is found, return it.- Returns:
- A counterexample that demonstrates why this graph is not a lattice, or null if it is.
-
reverseCompareCode
public static final 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.- Parameters:
compareCode- One ofCPO.SAME, CPO.HIGHER, CPO.LOWER, CPO.INCOMPARABLE.- Returns:
- The compare code that represents the opposite result from the given compare code.
-
top
public java.lang.Object top()
Return the top element of this CPO.
-
topologicalSort
public java.lang.Object[] topologicalSort()
Topological sort the whole graph. The implementation uses the method of A. B. Kahn: "Topological Sorting of Large Networks," Communications of the ACM, Vol. 5, 558-562, 1962. It has complexity O(|N|+|E|), where N for nodes and E for edges,- Returns:
- An array of Objects representing the nodes sorted according to the topology.
- Throws:
GraphStateException- If the graph is cyclic.
-
topologicalSort
public java.lang.Object[] topologicalSort(java.lang.Object[] weights)
Sort the given node weights in their topological order. In other words, this method returns the specified node weights according to a topological sort of the corresponding graph nodes. This method use the transitive closure matrix. Since generally the graph is checked for cyclicity before this method is called, the use of the transitive closure matrix should not add any overhead. A bubble sort is used for the internal implementation, so the complexity is O(n^2). The result is unpredictable if the multiple nodes have the same weight (i.e., if the specified weights are not uniquely associated with nodes).- Overrides:
topologicalSortin classDirectedGraph- Parameters:
weights- The given node weights.- Returns:
- The weights in their sorted order.
- See Also:
DirectedGraph.topologicalSort(Collection)
-
upSet
public java.lang.Object[] upSet(java.lang.Object e)
Compute the up-set of an element in this CPO.- Specified by:
upSetin interfaceCPO<java.lang.Object>- Parameters:
e- An Object representing an element in this CPO.- Returns:
- An array of Objects representing the elements in the up-set of the specified element.
- Throws:
java.lang.IllegalArgumentException- If the specified Object is not an element of this CPO.
-
_addEdge
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. The third parameter specifies whether the edge is to be weighted, and the fourth parameter is the weight that is to be applied if the edge is weighted. Returns the edge that is added.- Overrides:
_addEdgein classGraph- Parameters:
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.- Returns:
- The edge.
- Throws:
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.
-
_initializeAnalyses
protected void _initializeAnalyses()
Initialize the list of analyses that are associated with this graph, and initialize the change counter of the graph.- Overrides:
_initializeAnalysesin classDirectedGraph- See Also:
Analysis
-
-