https://github.com/Engelberg/ubergraph

Ubergraph is a batteries-loaded, immutable graph data structure for Clojure.

Clojure's other main graph library is Loom.  I built Ubergraph to address
Loom's limitations.  For example, unlike Loom, Ubergraph supports:

* Multigraphs and multidigraphs with parallel edges, i.e., multiple edges
between the same pair of nodes in the same direction.
* Multiple weights per edge (as opposed to one "privileged" weight
attribute).
* Weights that are modifiable after initialization (in the immutable sense
of producing a new graph structure with modified weights).
* Mixtures of directed and undirected edges in the same graph.
* The ability to distinguish between an undirected edge and an opposing
pair of directed edges.
* The ability to traverse all a graph's edges while guaranteeing that
undirected edges are visited only once.

Rather than starting over and creating something completely new, I designed
Ubergraph as an extension of of Loom, intended to be as compatible with
Loom as possible, offering a superset of Loom's features. This means that
Ubergraph can typically be used as a drop-in replacement for Loom graphs.
For the most part, Loom's graph algorithms work on ubergraphs, and
Ubergraph's graph algorithms work on loom graphs.  There are some
exceptions to this, because in some cases, the implementation of Loom's
algorithms were not carefully implemented to rely only on Loom's protocol
abstractions, but were hard-coded to specific aspects of Loom's concrete
implementation.  The biggest problem is that some of Loom's algorithms
don't work properly on multigraphs.  To address this, Ubergraph's algorithm
namespace contains a curated collection of algorithms from Loom known to
work properly on ubergraph's more general data structure, and
reimplementations of several key algorithms from Loom known to be broken on
multigraphs.

I encourage people from the Loom community to test all newly submitted
algorithms against Ubergraph's concrete implementation of Loom's protocols
as a way to ensure that the algorithm is properly written to Loom's
protocols, rather than leveraging concrete implementation details.  Also,
this will give you an opportunity to think through whether your algorithm
works properly with multigraphs.  (Relatedly, I welcome pull requests
identifying Loom algorithms which belong in Ubergraph's curated set of Loom
algorithms known to work well with ubergraphs, or multigraph-friendly
reimplementations of those that don't).

Ubergraph has been in use for almost a year, and this new version addresses
all reported issues.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to