From 3e0628d890a4203e1bed96fd3d944df7b62a1de7 Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Wed, 6 May 2015 08:47:14 +1200 Subject: [PATCH 1/6] Upgrade to Clojure 1.6 --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index fae20eb..43abc0c 100644 --- a/project.clj +++ b/project.clj @@ -2,14 +2,14 @@ :description "Graph library for Clojure" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.4.0"] + :dependencies [[org.clojure/clojure "1.6.0"] [org.clojure/data.priority-map "0.0.5"]] :url "https://github.com/aysylu/loom" :test-selectors {:default (fn [m] (not (:test-check-slow m))) :all (constantly true) :test-check-slow :test-check-slow} :profiles {:dev - {:dependencies [[org.clojure/clojure "1.5.1"] + {:dependencies [[org.clojure/clojure "1.6.0"] [org.clojure/test.check "0.5.7"]]}} :aliases {"release" ["do" "clean," "with-profile" "default" "deploy" "clojars"]} From 88f20456bf51b970e273310adc83970652e758b3 Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Wed, 6 May 2015 08:59:08 +1200 Subject: [PATCH 2/6] Upgrate to Clojure 1.7-beta2 --- project.clj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index 43abc0c..dd54517 100644 --- a/project.clj +++ b/project.clj @@ -2,15 +2,14 @@ :description "Graph library for Clojure" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.6.0"] + :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/data.priority-map "0.0.5"]] :url "https://github.com/aysylu/loom" :test-selectors {:default (fn [m] (not (:test-check-slow m))) :all (constantly true) :test-check-slow :test-check-slow} :profiles {:dev - {:dependencies [[org.clojure/clojure "1.6.0"] - [org.clojure/test.check "0.5.7"]]}} + {:dependencies [[org.clojure/test.check "0.5.7"]]}} :aliases {"release" ["do" "clean," "with-profile" "default" "deploy" "clojars"]} :plugins [[codox "0.8.12"]] From 31bdc8b3790872d75c43807bc60d1ffb1e836b2b Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Wed, 6 May 2015 09:18:44 +1200 Subject: [PATCH 3/6] Fix the tests due to reordering in Clojure 1.7 --- test/loom/test/alg.clj | 48 ++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/test/loom/test/alg.clj b/test/loom/test/alg.clj index f0888ff..0e3aab0 100644 --- a/test/loom/test/alg.clj +++ b/test/loom/test/alg.clj @@ -197,7 +197,7 @@ [:g :a :b :c :f :e :d] (topsort g5) nil (topsort g7) [5 6 7] (topsort g7 5) - [1 2 4 3] (topsort g14 1) + [1 2 3 4] (topsort g14 1) [1 2 4] (topsort g15 1))) (deftest breadth-first-test @@ -287,19 +287,19 @@ {1 {1 [5], 5 [3], 3 [6 2], 2 [4], 6 [10]} 2 {2 [4], 4 [10]} - 3 {3 [6 2 1], 1 [5], 2 [4], 6 [10]} + 3 {3 [1 6 2], 1 [5], 2 [4], 6 [10]} 4 {4 [10], 10 [2]} - 5 {5 [3], 3 [6 2 1], 2 [4], 6 [10]} - 6 {6 [10 1], 1 [5], 10 [2], 5 [3], 2 [4]} - 7 {4 [10], 8 [9 11], 7 [8], 9 [3 5], 11 [2 4], 3 [1 6]} - 8 {4 [10], 8 [9 11], 9 [3 5 7], 11 [2 4], 3 [1 6]} - 9 {8 [11], 6 [10], 7 [8], 2 [4], 9 [3 5 7], 3 [1 2 6]} + 5 {5 [3], 3 [1 6 2], 2 [4], 6 [10]} + 6 {6 [1 10], 1 [5], 10 [2], 5 [3], 2 [4]} + 7 {4 [10], 8 [11 9], 7 [8], 9 [3 5], 11 [4 2], 3 [1 6]} + 8 {4 [10], 8 [11 9], 9 [7 3 5], 11 [4 2], 3 [1 6]} + 9 {8 [11], 6 [10], 7 [8], 2 [4], 9 [7 3 5], 3 [1 6 2]} 10 {10 [2], 2 [4]} 11 {11 [4 2], 4 [10]}} (all-pairs-shortest-paths g13))) (deftest connectivity-test (are [expected got] (= expected got) - [#{1 2 3 4} #{5 6 7 8} #{9}] (map set (connected-components + [#{5 6 7 8} #{1 2 3 4} #{9}] (map set (connected-components (add-nodes g8 9))) [#{:r :g :b :o :p}] (map set (connected-components g2)) [#{1 2 3 4 5 6 8 7}] (map set (connected-components g9)) @@ -384,12 +384,12 @@ (deftest bipartite-test (are [expected got] (= expected got) {0 1, 1 0, 5 0, 2 1, 3 1, 4 0} (bipartite-color g6) - {5 1, 1 1, 2 0, 3 0, 4 0, 6 0, 7 0, 8 0} (bipartite-color g8) + {1 1, 2 0, 3 0, 4 0, 5 0, 6 1, 7 1, 8 1} (bipartite-color g8) nil (bipartite-color g1) true (bipartite? g6) true (bipartite? g8) false (bipartite? g1) - #{#{2 3 4 6 7 8} #{1 5}} (set (bipartite-sets g8)))) + #{#{2 3 4 5} #{1 6 7 8}} (set (bipartite-sets g8)))) (deftest coloring?-test (are [expected got] (= expected got) @@ -414,23 +414,25 @@ (are [expected got] (= expected got) #{#{2 4 10} #{1 3 5 6} #{11} #{7 8 9}} (set (map set (scc g13))))) -(deftest prim-mst-edges-test - (are [expected got] (= expected got) - [[:a :e 1] [:a :b 3] [:b :c 5] [:c :d 2]] (prim-mst-edges mst_wt_g1) - [[:a :d 1] [:a :b 2] [:b :c 1] [:f :e 1]] (prim-mst-edges mst_wt_g2) - [[:a :c] [:a :b] [:a :d]] (prim-mst-edges mst_unweighted_g3) - [[:a :b 1]] (prim-mst-edges mst_wt_g4) - [[:a :c 2] [:c :b 2]] (prim-mst-edges mst_wt_g5) - [[:a :b 4] [:b :c 8] [:c :i 2] [:c :f 4] [:f :g 2] - [:g :h 1] [:c :d 7] [:d :e 9]] (prim-mst-edges mst_wt_g6))) +(deftest prim-mst-edges-weighted-test + (are [expected got] (= (set expected) (set got)) + [[:e :a 1] [:a :b 3] [:b :c 5] [:c :d 2]] (prim-mst-edges mst_wt_g1) + [[:d :a 1] [:b :d 2] [:c :b 1] [:e :f 1]] (prim-mst-edges mst_wt_g2) + [[:c :a] [:d :b] [:c :d]] (prim-mst-edges mst_unweighted_g3) + [[:b :a 1]] (prim-mst-edges mst_wt_g4) + [[:c :a 2] [:c :b 2]] (prim-mst-edges mst_wt_g5) + [[:b :a 4] [:c :b 8] [:c :i 2] [:c :f 4] [:f :g 2] + [:g :h 1] [:d :c 7] [:e :d 9]] (prim-mst-edges mst_wt_g6))) (deftest prim-mst-test (are [expected got] (= expected got) - [#{:a :b :d :e :f :g :h} [[:a :b][:b :d][:b :a][:f :e][:d :b][:e :f]]] + [#{:a :b :d :e :f :g :h} (set [[:a :b] [:b :d] [:b :a] [:f :e] [:d :b] [:e :f]])] (let [mst (prim-mst mst_wt_g7)] - [(nodes mst) (edges mst)]) - [#{:a :b :c} [[:a :c] [:c :b] [:c :a] [:b :c]]] (let [mst (prim-mst mst_wt_g5)] - [(nodes mst) (edges mst)]))) + [(nodes mst) (set (edges mst))]) + + [#{:a :b :c} (set [[:a :c] [:c :b] [:c :a] [:b :c]])] + (let [mst (prim-mst mst_wt_g5)] + [(nodes mst) (set (edges mst))]))) ;;;;graphs for A* path From 651472992510ff1fbe44335dd2c34a3017573c7b Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Wed, 6 May 2015 11:34:42 +1200 Subject: [PATCH 4/6] Rename files to cljc and add reader conditionals (WIP) --- src/loom/{alg.clj => alg.cljc} | 12 ++++++++---- src/loom/{alg_generic.clj => alg_generic.cljc} | 0 src/loom/{attr.clj => attr.cljc} | 0 src/loom/{flow.clj => flow.cljc} | 3 ++- src/loom/{gen.clj => gen.cljc} | 0 src/loom/{graph.clj => graph.cljc} | 0 src/loom/{io.clj => io.cljc} | 0 src/loom/{label.clj => label.cljc} | 0 src/loom/{multigraph.clj => multigraph.cljc} | 0 9 files changed, 10 insertions(+), 5 deletions(-) rename src/loom/{alg.clj => alg.cljc} (98%) rename src/loom/{alg_generic.clj => alg_generic.cljc} (100%) rename src/loom/{attr.clj => attr.cljc} (100%) rename src/loom/{flow.clj => flow.cljc} (97%) rename src/loom/{gen.clj => gen.cljc} (100%) rename src/loom/{graph.clj => graph.cljc} (100%) rename src/loom/{io.clj => io.cljc} (100%) rename src/loom/{label.clj => label.cljc} (100%) rename src/loom/{multigraph.clj => multigraph.cljc} (100%) diff --git a/src/loom/alg.clj b/src/loom/alg.cljc similarity index 98% rename from src/loom/alg.clj rename to src/loom/alg.cljc index ed8a9ee..930fca7 100644 --- a/src/loom/alg.clj +++ b/src/loom/alg.cljc @@ -200,7 +200,8 @@ can use these functions." (let [nodes (disj (nodes graph) start) path-costs {start 0} paths {start nil} - infinities (repeat Double/POSITIVE_INFINITY) + infinities (repeat #?(:clj Double/POSITIVE_INFINITY + :cljs js/Infinity)) nils (repeat nil) init-costs (interleave nodes infinities) init-paths (interleave nodes nils)] @@ -234,7 +235,9 @@ can use these functions." [costs (->> (keys paths) ;;remove vertices that are unreachable from source - (remove #(= Double/POSITIVE_INFINITY (get costs %))) + (remove #(= #?(:clj Double/POSITIVE_INFINITY + :cljs js/Infinity) + (get costs %))) (reduce (fn [final-paths v] (assoc final-paths v @@ -425,7 +428,8 @@ can use these functions." [g] (letfn [(color-component [coloring start] (loop [coloring (assoc coloring start 1) - queue (conj clojure.lang.PersistentQueue/EMPTY start)] + queue (conj #?(:clj clojure.lang.PersistentQueue/EMPTY + :cljs cljs.core.PersistentQueue/EMPTY) start)] (if (empty? queue) coloring (let [v (peek queue) @@ -551,7 +555,7 @@ can use these functions." for un-weighted graphs." ([wg] (cond - (directed? wg) (throw (Exception. + (directed? wg) (throw (#?(:clj Exception. :cljs js/Error) "Spanning tree only defined for undirected graphs")) :else (let [mst (prim-mst-edges wg (nodes wg) nil #{} [])] (if (weighted? wg) diff --git a/src/loom/alg_generic.clj b/src/loom/alg_generic.cljc similarity index 100% rename from src/loom/alg_generic.clj rename to src/loom/alg_generic.cljc diff --git a/src/loom/attr.clj b/src/loom/attr.cljc similarity index 100% rename from src/loom/attr.clj rename to src/loom/attr.cljc diff --git a/src/loom/flow.clj b/src/loom/flow.cljc similarity index 97% rename from src/loom/flow.clj rename to src/loom/flow.cljc index e7373cc..7f734ee 100644 --- a/src/loom/flow.clj +++ b/src/loom/flow.cljc @@ -100,7 +100,8 @@ (assoc-in flow_1 [vn1 vn0] (- reverse-flow pushback)) flow_1)] (cond (> pushback reverse-flow) (throw - (java.lang.RuntimeException. + (#?(:clj java.lang.RuntimeException. + :cljs js/Object) (str "Path augmentation failure: " vn0 " " vn1))) (> (count path) 2) (recur flow_2 capacity (next path) increase) diff --git a/src/loom/gen.clj b/src/loom/gen.cljc similarity index 100% rename from src/loom/gen.clj rename to src/loom/gen.cljc diff --git a/src/loom/graph.clj b/src/loom/graph.cljc similarity index 100% rename from src/loom/graph.clj rename to src/loom/graph.cljc diff --git a/src/loom/io.clj b/src/loom/io.cljc similarity index 100% rename from src/loom/io.clj rename to src/loom/io.cljc diff --git a/src/loom/label.clj b/src/loom/label.cljc similarity index 100% rename from src/loom/label.clj rename to src/loom/label.cljc diff --git a/src/loom/multigraph.clj b/src/loom/multigraph.cljc similarity index 100% rename from src/loom/multigraph.clj rename to src/loom/multigraph.cljc From 259168361210928f1eef8779b4f34b26f2c6b18f Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Sun, 12 Jul 2015 22:23:09 +1200 Subject: [PATCH 5/6] Add cljs priority-map --- project.clj | 3 ++- src/loom/alg.cljc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index dd54517..02d5744 100644 --- a/project.clj +++ b/project.clj @@ -3,7 +3,8 @@ :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"] - [org.clojure/data.priority-map "0.0.5"]] + [org.clojure/data.priority-map "0.0.5"] + [tailrecursion/cljs-priority-map "1.1.0"]] :url "https://github.com/aysylu/loom" :test-selectors {:default (fn [m] (not (:test-check-slow m))) :all (constantly true) diff --git a/src/loom/alg.cljc b/src/loom/alg.cljc index 930fca7..b3964d7 100644 --- a/src/loom/alg.cljc +++ b/src/loom/alg.cljc @@ -10,7 +10,8 @@ can use these functions." out-degree in-degree weighted? directed? graph transpose] :as graph] [loom.alg-generic :refer [trace-path preds->span]] - [clojure.data.priority-map :as pm] + #?(:clj [clojure.data.priority-map :as pm] + :cljs [tailrecursion.priority-map :as pm]) [clojure.set :as clj.set])) ;;; From 962d60325d3f98dd1ef8011973362e83e896f74c Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Sun, 12 Jul 2015 22:37:14 +1200 Subject: [PATCH 6/6] Convert dataflow to use reader conditionals --- scripts/test | 7 +++++++ src/loom/dataflow.clj | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100755 scripts/test diff --git a/scripts/test b/scripts/test new file mode 100755 index 0000000..c7936f3 --- /dev/null +++ b/scripts/test @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +grench eval "(require 'bolth)" +grench eval "(do (bolth/pretty-refresh) nil)" +grench eval "(clojure.pprint/pprint (bolth/run-all-tests #\".*\" {:clear-screen true :warn-on-slow-test-limit-ms 10 :force-real-stdout true :show-slow-tests true}))" diff --git a/src/loom/dataflow.clj b/src/loom/dataflow.clj index 072fc7b..6dfab56 100644 --- a/src/loom/dataflow.clj +++ b/src/loom/dataflow.clj @@ -11,8 +11,11 @@ (set? start) start (coll? start) (set start) :else #{start})] - (loop [out-values {} - queue (into clojure.lang.PersistentQueue/EMPTY start)] + (loop [out-values {} + queue (into + #?(:clj clojure.lang.PersistentQueue/EMPTY + :cljs #queue []) + start)] (let [node (peek queue) worklist (pop queue) in-value (join (mapv out-values (g/predecessors graph node)))