Categorygithub.com/yourbasic/graph
modulepackage
0.0.0-20210606180040-8ecfec1c2869
Repository: https://github.com/yourbasic/graph.git
Documentation: pkg.go.dev

# README

Your basic graph GoDoc

Golang library of basic graph algorithms

Topological ordering

Topological ordering, image by David Eppstein, CC0 1.0.

This library offers efficient and well-tested algorithms for

  • breadth-first and depth-first search,
  • topological ordering,
  • strongly and weakly connected components,
  • bipartion,
  • shortest paths,
  • maximum flow,
  • Euler walks,
  • and minimum spanning trees.

The algorithms can be applied to any graph data structure implementing the two Iterator methods: Order, which returns the number of vertices, and Visit, which iterates over the neighbors of a vertex.

All algorithms operate on directed graphs with a fixed number of vertices, labeled from 0 to n-1, and edges with integer cost. An undirected edge {v, w} of cost c is represented by the two directed edges (v, w) and (w, v), both of cost c. A self-loop, an edge connecting a vertex to itself, is both directed and undirected.

Graph data structures

The type Mutable represents a directed graph with a fixed number of vertices and weighted edges that can be added or removed. The implementation uses hash maps to associate each vertex in the graph with its adjacent vertices. This gives constant time performance for all basic operations.

The type Immutable is a compact representation of an immutable graph. The implementation uses lists to associate each vertex in the graph with its adjacent vertices. This makes for fast and predictable iteration: the Visit method produces its elements by reading from a fixed sorted precomputed list.

Virtual graphs

The subpackage graph/build offers a tool for building graphs of type Virtual.

In a virtual graph no vertices or edges are stored in memory, they are instead computed as needed. New virtual graphs are constructed by composing and filtering a set of standard graphs, or by writing functions that describe the edges of a graph.

The following standard graphs are predefined:

  • empty graphs,
  • complete graphs and complete bipartite graphs,
  • grid graphs and complete k-ary trees,
  • cycle graphs and circulant graphs,
  • and hypergraphs.

The following operations are supported:

  • adding and deleting sets of edges,
  • adding cost functions,
  • filtering graphs by edge functions,
  • complement, intersection and union,
  • subgraphs,
  • connecting graphs at a single vertex,
  • joining two graphs by a set of edges,
  • matching two graphs by a set of edges,
  • cartesian product and tensor product.

Non-virtual graphs can be imported, and used as building blocks, by the Specific function. Virtual graphs don't need to be “exported‬”; they implement the Iterator interface and hence can be used directly by any algorithm in the graph package.

Installation

Once you have installed Go, run this command to install the graph package:

go get github.com/yourbasic/graph

Documentation

There is an online reference for the package at godoc.org/github.com/yourbasic/graph.

Roadmap

  • The API of this library is frozen.
  • Bug fixes and performance enhancement can be expected.
  • New functionality might be included.
  • Version numbers adhere to semantic versioning.

The only accepted reason to modify the API of this package is to handle issues that can't be resolved in any other reasonable way.

New features and performance enhancements are limited to basic algorithms and data structures, akin to the ones that you might find in a computer science textbook.

Stefan Nilsson – korthaj

# Packages

Package build offers a tool for building virtual graphs.

# Functions

Acyclic tells if g has no cycles.
BFS traverses g in breadth-first order starting at v.
Bipartition returns a subset U of g's vertices with the property that every edge of g connects a vertex in U to one outside of U.
Check collects data about an Iterator.
Components produces a partition of g's vertices into its (weakly) connected components.
Connected tells if g has exactly one (weakly) connected component.
Copy returns a copy of g.
Equal tells if g and h have the same number of vertices, and the same edges with the same costs.
EulerDirected returns an Euler walk in a directed graph.
EulerUndirected returns an Euler walk following undirected edges in only one direction.
MaxFlow computes a maximum flow from s to t in a graph with nonnegative edge capacities.
MST computes a minimum spanning tree for each connected component of an undirected weighted graph.
New constructs a new graph with n vertices, numbered from 0 to n-1, and no edges.
ShortestPath computes a shortest path from v to w.
ShortestPaths computes the shortest paths from v to all other vertices.
Sort returns an immutable copy of g with a Visit method that returns its neighbors in increasing numerical order.
String returns a description of g with two elements: the number of vertices, followed by a sorted list of all edges.
StrongComponents produces a partition of g's vertices into its strongly connected components.
TopSort returns a topological ordering of the vertices in a directed acyclic graph; if the graph is not acyclic, no such ordering exists and ok is set to false.
Transpose returns the transpose graph of g.

# Constants

The maximum and minimum value of an edge cost.
The maximum and minimum value of an edge cost.

# Structs

Immutable is a compact representation of an immutable graph.
Mutable represents a directed graph with a fixed number of vertices and weighted edges that can be added or removed.
Stats holds basic data about an Iterator.

# Interfaces

Iterator describes a weighted graph; an Iterator can be used to describe both ordinary graphs and multigraphs.