Documentation ¶
Overview ¶
Package graph implements functions and interfaces to deal with formal discrete graphs. It aims to be first and foremost flexible, with speed as a strong second priority.
In this package, graphs are taken to be directed, and undirected graphs are considered to be a special case of directed graphs that happen to have reciprocal edges. Graphs are, by default, unweighted, but functions that require weighted edges have several methods of dealing with this. In order of precedence:
1. These functions have an argument called Cost (and in some cases, HeuristicCost). If this is present, it will always be used to determine the cost between two nodes.
2. These functions will check if your graph implements the Coster (and/or HeuristicCoster) interface. If this is present, and the Cost (or HeuristicCost) argument is nil, these functions will be used.
3. Finally, if no user data is supplied, it will use the functions UniformCost (always returns 1) and/or NulLHeuristic (always returns 0).
For information on the specification for Cost functions, please see the Coster interface.
Finally, although the functions take in a Graph -- they will always use the correct behavior. If your graph implements DirectedGraph, it will use Successors and To where applicable, if undirected, it will use From instead. If it implements neither, it will scan the edge list for successors and predecessors where applicable. (This is slow, you should always implement either Directed or Undirected)
This package will never modify a graph that is not Mutable (and the interface does not allow it to do so). However, return values are free to be modified, so never pass a reference to your own edge list or node list. It also guarantees that any nodes passed back to the user will be the same nodes returned to it -- that is, it will never take a Node's ID and then wrap the ID in a new struct and return that. You'll always get back your original data.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CopyDirected ¶
func CopyDirected(dst MutableDirected, src Graph)
CopyDirected copies nodes and edges as directed edges from the source to the destination without first clearing the destination. CopyDirected will panic if a node ID in the source graph matches a node ID in the destination. If the source is undirected both directions will be present in the destination after the copy is complete. If the source does not implement Weighter, UniformCost is used to define edge weights.
func CopyUndirected ¶
func CopyUndirected(dst MutableUndirected, src Graph)
CopyUndirected copies nodes and edges as undirected edges from the source to the destination without first clearing the destination. CopyUndirected will panic if a node ID in the source graph matches a node ID in the destination. If the source does not implement Weighter, UniformCost is used to define edge weights.
Note that if the source is a directed graph and a fundamental cycle exists with two nodes where the edge weights differ, the resulting destination graph's edge weight between those nodes is undefined.
func UniformCost ¶
UniformCost is a WeightFunc that returns an edge cost of 1 for a non-nil Edge and Inf for a nil Edge.
Types ¶
type Directed ¶
type Directed interface { Graph // HasEdgeFromTo returns whether an edge exists // in the graph from u to v. HasEdgeFromTo(u, v Node) bool // To returns all nodes that can reach directly // to the given node. To(Node) []Node }
Directed is a directed graph.
type Edge ¶
Edge is a graph edge. In directed graphs, the direction of the edge is given from -> to, otherwise the edge is semantically unordered.
type Graph ¶
type Graph interface { // Has returns whether the node exists within the graph. Has(Node) bool // Nodes returns all the nodes in the graph. Nodes() []Node // From returns all nodes that can be reached directly // from the given node. From(Node) []Node // HasEdge returns whether an edge exists between // nodes x and y without considering direction. HasEdge(x, y Node) bool // Edge returns the edge from u to v if such an edge // exists and nil otherwise. The node v must be directly // reachable from u as defined by the From method. Edge(u, v Node) Edge }
Graph is a generalized graph.
type Mutable ¶
type Mutable interface { // NewNodeID returns a new unique arbitrary ID. NewNodeID() int // Adds a node to the graph. AddNode panics if // the added node ID matches an existing node ID. AddNode(Node) // RemoveNode removes a node from the graph, as // well as any edges attached to it. If the node // is not in the graph it is a no-op. RemoveNode(Node) // SetEdge adds an edge from one node to another. // If the nodes do not exist, they are added. // SetEdge will panic if the IDs of the e.From // and e.To are equal. SetEdge(e Edge, cost float64) // RemoveEdge removes the given edge, leaving the // terminal nodes. If the edge does not exist it // is a no-op. RemoveEdge(Edge) }
Mutable is an interface for generalized graph mutation.
type MutableDirected ¶
MutableDirected is a directed graph that can be arbitrarily altered.
type MutableUndirected ¶
type MutableUndirected interface { Undirected Mutable }
MutableUndirected is an undirected graph that can be arbitrarily altered.
type Node ¶
type Node interface {
ID() int
}
Node is a graph node. It returns a graph-unique integer ID.
type Undirected ¶
type Undirected interface { Graph // EdgeBetween returns the edge between nodes x and y. EdgeBetween(x, y Node) Edge }
Undirected is an undirected graph.
type WeightFunc ¶
WeightFunc is a mapping between an edge and an edge weight.