          C (if (= raw-solution nil)
              nil
              (map first (filter #(and (sat/positive? %) (= (% 1) 3)) raw-solution)))]
-     ;(println node-clauses)
-     ;(println edge-clauses)
-     ;(println no-more-than-k-bad-edges-clauses)
-     ;(println "solved:")
-     ;(println raw-solution)
-     ;(println C)
      C)))
 
 ;(sat-reduction (uber/graph [:a :b] [:a :c] [:b :e] [:c :e] [:a :e]) 1)
 
 (defn compute-conjugate-order
+  "For a given ordered set, computes the conjugate order.
+  This is a transitive orientation on the not-yet oriented pairs.
+  If that is not possible, returns nil.
+
+  See Section 5.2, Dürrschnabel, Hanika, Stumme (2019) https://arxiv.org/abs/1903.00686"
   ([graph]
     (compute-conjugate-order (lg/nodes graph) #(lg/has-edge? graph %1 %2)))
   ([P <=]

(defn lt-seq
  "Constructs a constraint stating that at most `k` of the given variables `xs` are true.

  This is from ??.

  Could be replaced by `rolling-stones.core/at-most`."      ; todo paper name
  ([xs k]
   (lt-seq xs k (Math/random)))
  ([xs k prefix]

  The coordinates are returned in the form `[[e1 [x1 y1]] [e2 [x2 y2]] ...]`
  where e is the element, and x and y are the corresponding coordinates.

  See Section 5.2, Dürrschnabel, Hanika, Stumme (2019) https://arxiv.org/abs/1903.00686"
  ([graph]
   (compute-coordinates (lg/nodes graph) #(lg/has-edge? graph %1 %2)))
  ([P <=]
