summaryrefslogtreecommitdiff
path: root/src/http/static/viz/1/viz/ghost.cljs
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/static/viz/1/viz/ghost.cljs')
-rw-r--r--src/http/static/viz/1/viz/ghost.cljs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/http/static/viz/1/viz/ghost.cljs b/src/http/static/viz/1/viz/ghost.cljs
new file mode 100644
index 0000000..ca6f86c
--- /dev/null
+++ b/src/http/static/viz/1/viz/ghost.cljs
@@ -0,0 +1,72 @@
+(ns viz.ghost
+ (:require [viz.forest :as forest]
+ [viz.grid :as grid]
+ clojure.set))
+
+(defn new-ghost [grid-def]
+ { :grid (grid/new-grid grid-def)
+ :forest (forest/new-forest)
+ :active-node-ids #{}
+ })
+
+(defn new-active-node [ghost pos]
+ (let [[forest id] (forest/add-node (:forest ghost) pos)
+ grid (grid/add-point (:grid ghost) pos)]
+ (-> ghost
+ (assoc :grid grid :forest forest)
+ (update-in [:active-node-ids] conj id))))
+
+(defn- gen-new-poss [ghost poss-fn id]
+ "generates new positions branching from the given node"
+ (let [pos (:pos (forest/get-node (:forest ghost) id))
+ adj-poss (grid/empty-adjacent-points (:grid ghost) pos)]
+ (poss-fn pos adj-poss)))
+
+(defn- spawn-children [ghost poss-fn id]
+ (reduce (fn [[ghost new-ids] pos]
+ (let [[forest new-id] (forest/spawn-child (:forest ghost) id pos)
+ grid (grid/add-point (:grid ghost) pos)]
+ [(assoc ghost :forest forest :grid grid) (conj new-ids new-id)]))
+ [ghost #{}]
+ (gen-new-poss ghost poss-fn id)))
+
+(defn- spawn-children-multi [ghost poss-fn ids]
+ (reduce (fn [[ghost new-ids] id]
+ (let [[ghost this-new-ids] (spawn-children ghost poss-fn id)]
+ [ghost (clojure.set/union new-ids this-new-ids)]))
+ [ghost #{}]
+ ids))
+
+(defn incr [ghost poss-fn]
+ (let [[ghost new-ids] (spawn-children-multi ghost poss-fn (:active-node-ids ghost))]
+ (assoc ghost :active-node-ids new-ids)))
+
+(defn active-nodes [ghost]
+ (map #(get-in ghost [:forest :nodes %]) (:active-node-ids ghost)))
+
+(defn filter-active-nodes [ghost pred]
+ (assoc ghost :active-node-ids
+ (reduce #(if (pred %2) (conj %1 (:id %2)) %1) #{}
+ (active-nodes ghost))))
+
+(defn remove-roots [ghost]
+ (let [roots (forest/roots (:forest ghost))
+ root-ids (map :id roots)
+ root-poss (map :pos roots)
+ ]
+ (-> ghost
+ (update-in [:active-node-ids] #(reduce disj %1 root-ids))
+ (update-in [:forest] #(reduce forest/remove-node %1 root-ids))
+ (update-in [:grid] #(reduce grid/rm-point %1 root-poss))
+ )))
+
+(defn- eg-poss-fn [pos adj-poss]
+ (take 2 (random-sample 0.6 adj-poss)))
+
+(-> (new-ghost grid/euclidean)
+ (new-active-node [0 0])
+ (incr eg-poss-fn)
+ (incr eg-poss-fn)
+ (incr eg-poss-fn)
+ (remove-roots)
+ )