Package com.google.javascript.jscomp.graph

# Class Graph<N,E>

java.lang.Object
com.google.javascript.jscomp.graph.Graph<N,E>

Type Parameters:
  `N` - Value type that the graph node stores.
  `E` - Value type that the graph edge stores.

All Implemented Interfaces:
  `AdjacencyGraph<N,E>`

Direct Known Subclasses:
  `DiGraph`, `UndiGraph`

public abstract class Graph<N,E> extends Object implements AdjacencyGraph<N,E>
The base generic class for graph-like data structure and algorithms in the compiler.

Nodes and edges in the graph can store a piece of data that this graph is used to represent. For example, a variable interference graph might store a variable in the node. This piece of data can be accessed with `GraphNode.getValue()` and `Graph.GraphEdge.getValue()`.

Algorithms and analysis can annotate information on the nodes and edges using `GraphNode.getValue()` and `Graph.GraphEdge.getValue()`. For example, a graph coloring algorithm can store the color as an annotation. If multiple analyses are required, it is up to the user of the analysis to save the annotated solution between passes.

We implemented our own graph data structure (as opposed to using `com.google.common.graph`) for two reasons. First, aside from the node's label value, we would like to annotate information on the nodes and edges. Using a map to annotate would introduce too much overhead during fix point analysis. Also, `com.google.common.graph` does not support labeling of edges. Secondly, not using another external package would limit our dependencies.

TODO(user): All functionality for removing nodes and edges.

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static interface`
`Graph.GraphEdge<N,E>`
A generic edge.

## Constructor Summary

Constructors
Constructor
Description
`Graph()`

## Method Summary

Modifier and Type
Method
Description
`final void`
`clearEdgeAnnotations()`
Makes each edge's annotation null.
`final void`
`clearNodeAnnotations()`
Makes each node's annotation null.
`abstract void`
`connect(N n1, E edge, N n2)`
Connects two nodes in the graph with an edge.
`final void`
`connectIfNotFound(N n1, E edge, N n2)`
Connects two nodes in the graph with an edge if such edge does not already exists between the nodes.
`abstract GraphNode<N,E>`
`createNode(N value)`
Gets a node from the graph given a value.
`abstract void`
`disconnect(N n1, N n2)`
Disconnects two nodes in the graph by removing all edges between them.
`abstract List<Graph.GraphEdge<N,E>>`
`getEdges()`
Gets an immutable list of all edges.
`abstract List<Graph.GraphEdge<N,E>>`
`getEdges(N n1, N n2)`
Retrieves an edge from the graph.
`abstract Graph.GraphEdge<N,E>`
`getFirstEdge(N n1, N n2)`
Retrieves any edge from the graph.
`abstract List<GraphNode<N,E>>`
`getNeighborNodes(N value)`
Gets the neighboring nodes.
`abstract Iterator<GraphNode<N,E>>`
`getNeighborNodesIterator(N value)`
`abstract int`
`getNodeDegree(N value)`
Gets the degree of a node.
`abstract Collection<GraphNode<N,E>>`
`getNodes()`
Gets an immutable list of all nodes.
`int`
`getWeight(N value)`
Returns a weight for the given value to be used in ordering nodes, e.g.
`final boolean`
`hasNode(N n)`
Checks whether the node exists in the graph (`createNode(Object)` has been called with that value).
`abstract boolean`
`isConnected(N n1, E e, N n2)`
Checks whether two nodes in the graph are connected by the given edge type.
`abstract boolean`
`isConnected(N n1, N n2)`
Checks whether two nodes in the graph are connected.
`final void`
`popEdgeAnnotations()`
Restores edges' annotation values to state before last `pushEdgeAnnotations()`.
`final void`
`popNodeAnnotations()`
Restores nodes' annotation values to state before last `pushNodeAnnotations()`.
`final void`
`pushEdgeAnnotations()`
Pushes edges' annotation values.
`final void`
`pushNodeAnnotations()`
Pushes nodes' annotation values.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface com.google.javascript.jscomp.graph.AdjacencyGraph

`getNode, newSubGraph`

## Constructor Details

### Graph

public Graph()

## Method Details

### connect

public abstract void connect(N n1, E edge, N n2)
Connects two nodes in the graph with an edge.

Parameters:
  `n1` - First node.
  `edge` - The edge.
  `n2` - Second node.

### disconnect

public abstract void disconnect(N n1, N n2)
Disconnects two nodes in the graph by removing all edges between them.

Parameters:
  `n1` - First node.
  `n2` - Second node.

### connectIfNotFound

public final void connectIfNotFound(N n1, E edge, N n2)
Connects two nodes in the graph with an edge if such edge does not already exists between the nodes.

Parameters:
  `n1` - First node.
  `edge` - The edge.
  `n2` - Second node.

### createNode

public abstract GraphNode<N,E> createNode(N value)
Gets a node from the graph given a value. New nodes are created if that value has not been assigned a graph node. Values equality are compared using `Object.equals`.

Parameters:
  `value` - The node's value.
Returns:
  The corresponding node in the graph.

### getNodes

public abstract Collection<GraphNode<N,E>> getNodes()
Gets an immutable list of all nodes.

Specified by:
  `getNodes` in interface `AdjacencyGraph<N,E>`

### getEdges

public abstract List<Graph.GraphEdge<N,E>> getEdges()
Gets an immutable list of all edges.

### getNodeDegree

public abstract int getNodeDegree(N value)
Gets the degree of a node.

Parameters:
  `value` - The node's value.
Returns:
  The degree of the node.

### getWeight

public int getWeight(N value)
Description copied from interface: `AdjacencyGraph`
Returns a weight for the given value to be used in ordering nodes, e.g. in `GraphColoring`.

Specified by:
  `getWeight` in interface `AdjacencyGraph<N,E>`

### getNeighborNodes

public abstract List<GraphNode<N,E>> getNeighborNodes(N value)
Gets the neighboring nodes.

Parameters:
  `value` - The node's value.
Returns:
  A list of neighboring nodes.

### getNeighborNodesIterator

public abstract Iterator<GraphNode<N,E>> getNeighborNodesIterator(N value)

### getEdges

public abstract List<Graph.GraphEdge<N,E>> getEdges(N n1, N n2)
Retrieves an edge from the graph.

Parameters:
  `n1` - Node one.
  `n2` - Node two.
Returns:
  The list of edges between those two values in the graph.

### getFirstEdge

public abstract Graph.GraphEdge<N,E> getFirstEdge(N n1, N n2)
Retrieves any edge from the graph.

Parameters:
  `n1` - Node one.
  `n2` - Node two.
Returns:
  The first edges between those two values in the graph. null if there are none.

### hasNode

public final boolean hasNode(N n)
Checks whether the node exists in the graph (`createNode(Object)` has been called with that value).

Parameters:
  `n` - Node.
Returns:
  `true` if it exist.

### isConnected

public abstract boolean isConnected(N n1, N n2)
Checks whether two nodes in the graph are connected.

Parameters:
  `n1` - Node 1.
  `n2` - Node 2.
Returns:
  `true` if the two nodes are connected.

### isConnected

public abstract boolean isConnected(N n1, E e, N n2)
Checks whether two nodes in the graph are connected by the given edge type.

Parameters:
  `n1` - Node 1.
  `e` - The edge type.
  `n2` - Node 2.

### clearNodeAnnotations

public final void clearNodeAnnotations()
Description copied from interface: `AdjacencyGraph`
Makes each node's annotation null.

Specified by:
  `clearNodeAnnotations` in interface `AdjacencyGraph<N,E>`

### clearEdgeAnnotations

public final void clearEdgeAnnotations()
Makes each edge's annotation null.

### pushNodeAnnotations

public final void pushNodeAnnotations()
Pushes nodes' annotation values. Restored with `popNodeAnnotations()`. Nodes' annotation values are cleared.

### popNodeAnnotations

public final void popNodeAnnotations()
Restores nodes' annotation values to state before last `pushNodeAnnotations()`.

### pushEdgeAnnotations

public final void pushEdgeAnnotations()
Pushes edges' annotation values. Restored with `popEdgeAnnotations()`. Edges' annotation values are cleared.

### popEdgeAnnotations

public final void popEdgeAnnotations()
Restores edges' annotation values to state before last `pushEdgeAnnotations()`.