Minimalist hypergraphs:
(require '[clojure.math.combinatorics :as c] '[hypergraphs.core :as hg] '[hypergraphs.utils :as hg-utils])
;; This library uses sets extensively:
(def some-nodes #{1 2 3 4})
;; Here's a not-very-busy hypergraph. Each hyperedge is a set of 1 or
;; more nodes which are considered adjacent.
(def sparse-hg [some-nodes #{ #{1 2} #{2 3 4} }])
;; Here's a complete hypergraph; the set of hypernodes is the Powerset
;; of the nodeset (excluding the empty set)
(def complete-hg [some-nodes
(into #{} (->> (c/subsets some-nodes)
(filter #(< 1 (count %)))
(map set))])
(hg/nodes complete-hg)
;=> #{1 4 3 2}
(hg/edges complete-hg)
;=> #{#{4 3} #{1 4 3 2} #{4 3 2} #{1 4} #{4 2} #{1 3 2} #{1 3} #{1 2} #{1 4 3} #{3 2} #{1 4 2}}
(hg/neighbors complete-hg 1)
;=> #{1 4 3 2}
(hg/nodes sparse-hg)
;=> #{1 4 3 2}
(hg/edges sparse-hg)
;=> #{#{4 3} #{1 2}}
(hg/neighbors sparse-hg 1)
;=> #{1 2}
;; Let's find paths as a first exercise:
(hg/naive-paths sparse-hg 1 4)
;=> ((#{1 2} #{4 3 2}))
;; Yay!
(hg-utils/naive-paths complete-hg 1 4)
;=> ...
;; Go get some coffee. Time to figure out what good pathfinding algos
;; for hypergraphs look like...
Not yet.
Just about everything :)
Copyright © 2014 Patrick Flor
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.