                    (conj rest-things next-thing) (max-summary next-summary rest-summary) even-more-things)))
         [best-thing best-summary rest-things rest-summary])))
 
+(defn summary-str [s] (str (max-reward s) (:status s) (vec (:opt-sol s))))
+(defmethod print-method SimpleSummary [s o] (print-method (summary-str s) o))
+
+(defn assert-valid-summary-change [old-summary new-summary]
+  (util/assert-is (<= (max-reward new-summary) (max-reward old-summary)) "%s" [old-summary new-summary])
+  (when-not (live? old-summary) (assert (= old-summary new-summary))))
+
+
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Subproblems ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   plans-atom     plan-summary-atom       ; Plans directly at node
   child-map-atom descendant-summary-atom ; Plans at descendants
   ])


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Creating ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defn refine-pn [pn input-summary min-reward]
  (let [{:keys [sub-osn excluded-child-set reward-bound]} pn]
    (refine-osn! sub-osn min-reward excluded-child-set)
    (let [new-summary (compute-plan-node-output-summary input-summary sub-osn
                                                        excluded-child-set reward-bound)]
      (assert-valid-summary-change (:output-summary pn) new-summary)
      (assoc pn :output-summary new-summary))))



;;;;;;;;;;;;;;;;;;;;;;;;;;; Splitting Plan Nodes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
