alga

Algebraic graphs

Github星跟踪图

Algebraic graphs

Hackage version Linux & OS X status Windows status

Alga is a library for algebraic construction and manipulation of graphs in Haskell. See
this Haskell Symposium paper and the
corresponding talk for the motivation
behind the library, the underlying theory and implementation details. There is also a
Haskell eXchange talk,
and a tutorial by Alexandre Moine.

Main idea

Consider the following data type, which is defined in the top-level module
Algebra.Graph
of the library:

data Graph a = Empty, Vertex a, Overlay (Graph a) (Graph a), Connect (Graph a) (Graph a)

We can give the following semantics to the constructors in terms of the pair (V, E) of graph vertices and edges:

  • Empty constructs the empty graph (∅, ∅).
  • Vertex x constructs a graph containing a single vertex, i.e. ({x}, ∅).
  • Overlay x y overlays graphs (Vx, Ex) and (Vy, Ey) constructing (Vx ∪ Vy, Ex ∪ Ey).
  • Connect x y connects graphs (Vx, Ex) and (Vy, Ey) constructing (Vx ∪ Vy, Ex ∪ Ey ∪ Vx × Vy).

Alternatively, we can give an algebraic semantics to the above graph construction primitives by defining the following
type class and specifying a set of laws for its instances (see module Algebra.Graph.Class):

class Graph g where
    type Vertex g
    empty   :: g
    vertex  :: Vertex g -> g
    overlay :: g -> g -> g
    connect :: g -> g -> g

The laws of the type class are remarkably similar to those of a semiring,
so we use + and * as convenient shortcuts for overlay and connect, respectively:

  • (+, empty) is an idempotent commutative monoid.
  • (*, empty) is a monoid.
  • * distributes over +, that is: x * (y + z) == x * y + x * z and (x + y) * z == x * z + y * z.
  • * can be decomposed: x * y * z == x * y + x * z + y * z.

This algebraic structure corresponds to unlabelled directed graphs: every expression represents a graph, and every
graph can be represented by an expression. Other types of graphs (e.g. undirected) can be obtained by modifying the
above set of laws. Algebraic graphs provide a convenient, safe and powerful interface for working with graphs in Haskell,
and allow the application of equational reasoning for proving the correctness of graph algorithms.

To represent non-empty graphs, we can drop the Empty constructor -- see module
Algebra.Graph.NonEmpty.

To represent edge-labelled graphs, we can switch to the following data type, as
explained in my Haskell eXchange 2018 talk:

data Graph e a = Empty, Vertex a, Connect e (Graph e a) (Graph e a)

Here e is the type of edge labels. If e is a monoid (<+>, zero) then graph overlay can be recovered
as Connect zero, and <+> corresponds to parallel composition of edge labels.

How fast is the library?

Alga can handle graphs comprising millions of vertices and billions of edges in a matter of seconds, which is fast
enough for many applications. We believe there is a lot of potential for improving the performance of the library, and
this is one of our top priorities. If you come across a performance issue when using the library, please let us know.

Some preliminary benchmarks can be found here.

Blog posts

The development of the library has been documented in the series of blog posts:

Algebraic graphs in other languages

See draft implementations in Agda
and Scala.

主要指标

概览
名称与所有者snowleopard/alga
主编程语言Haskell
编程语言Haskell (语言数: 1)
平台
许可证MIT License
所有者活动
创建于2016-12-05 00:30:03
推送于2025-05-22 07:01:57
最后一次提交
发布数5
最新版本名称v0.6-1 (发布于 )
第一版名称v0.3 (发布于 )
用户参与
星数739
关注者数21
派生数69
提交数505
已启用问题?
问题数112
打开的问题数35
拉请求数175
打开的拉请求数13
关闭的拉请求数18
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?