 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     Wrappers     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defn make-wrapped-subproblem [nm inp-set prefix-set inner-sp output-wrap child-watch ri-fn]
+  (util/assert-is (contains? prefix-set (first (sp-name inner-sp))))
+  (let [ret (make-subproblem nm inp-set (sp-ts inner-sp)
+                             (fn [_] (throw (RuntimeException.)))
+                             ri-fn summaries/or-summary)]
+    (connect-and-watch! ret inner-sp
+      (fn [o] (set-output-set! ret (output-wrap o)))
+      (fn [inner-child] (child-watch ret inner-child)))
+    ret))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;     Output Collection     ;;;;;;;;;;;;;;;;;;;;;;;;;;
 

                   (set-output-set! s out-set)
                   (schedule-decrease! s)))) ;; TODO? 
           (do (reset! state :go) ;; Die
               (summaries/add-bound! s Double/NEGATIVE_INFINITY)))))     
     (fn summarize [s] (@sm-fn s)))))

(defmethod get-subproblem :Atomic [[_ fs :as n] inp-set] 

                         (fn ignore-output [_] nil) 
                         (fn right-child [right-child] (add-sp-child! s (make-pair-subproblem left-sp right-child) true)))
                       (summaries/summary-changed-local! ss))
           ret (make-subproblem nm (input-set left-sp) nil 
                 (fn eval! [s] (schedule-decrease! s) (go-right! s)) ;; TODO: ??
                 (fn [s ni] (if (= ni (input-set left-sp)) s
                                (make-pair-subproblem (refine-input left-sp ni)
                                                      right-name #(refine-input @right-sp %))))
                 (fn [s] 
                   (or (and (not @right?-atom)
                            (solved-terminal? left-sp)
