       (do (assert (pred (get m k) v)) m)
     (assoc m k v)))
 
+(defn spos [s]  (try  (map #(env/get-var s %) '[[atx] [aty]]) (catch Exception e)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Data Structures ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                                  cpa-val)
                    best-rew    (- 0 neg-rew (:reward-to-state best))
                    [good-parents bad-parents] (split-with #(= (second %) best-rew) cur-parents)]
                (util/assert-is (seq good-parents) "%s" [neg-rew (:reward-to-state best) best-rew (map second cur-parents) (env/action-name (:action (:sanode best)))])
                (reset! (:remaining-parents-atom best) bad-parents)
                (when (seq bad-parents)
                  (queues/pq-replace! queue best 
                                      (- 0 (:reward-to-state best) (second (first bad-parents)))))
                (doseq [[parent parent-reward] good-parents]
                  (queues/pq-add-all! queue
                    (update-parent cache parent parent-reward 
                                   (:effects best) (:reward-to-state best) (:sanode best))))
                (recur))))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    Top-level    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn pp [q xs]
  ;(println "adding" (count xs)) 
  (queues/pq-add-all! q xs))

(defn sahucs-inverted [henv]
  (let [e     (hierarchy/env henv)
