I get the impression that DAG bottom sets should be just those vertices with no out edges. However, it looks like they also include nodes in the middle:
(let [g (-> (g/directed-acyclic-graph)
(g/link :a1 :b)
(g/link :a2 :b)
(g/link :b :c1)
(g/link :b :c2)
(g/link :a3 :c3))]
(testing "top"
(is (= #{:a1 :a2 :a3} (datafy (g/top g)))))
(testing "bottom"
; Is the presence of b here a bug, or expected behavior?
(is (= #{:b :c1 :c2 :c3} (datafy (g/bottom g)))))))
I get the impression that DAG bottom sets should be just those vertices with no out edges. However, it looks like they also include nodes in the middle: