      (let [nm (pair-name (sp-name left-sp) right-name)
            right-sp (delay (right-sp-fn (get-output-set! left-sp)))
            right?-atom (atom false) ;; Expand on right            
-           ri-fn    (fn [s ni] (make-pair-subproblem (refine-input left-sp ni) right-name #(refine-input @right-sp %)))
            ss (summaries/make-sum-summarizer nil)
            go-right! (fn [s] 
                        (reset! right?-atom true)                          

                   (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] 

      (when (canonical? s) (add-subsuming-sp! ret s))
      ret)))))

(defmulti get-subproblem (fn get-subproblem-dispatch [nm inp] (first nm)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;     Core Subproblems     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
