                                            (:ancestors parent1)))
         :is-random-replacement
         (if use-child false true)))))
+

    :first (fn [p1 p2 g]
             (inc (:age p1)))
    :fidelity (fn [p1 p2 g]
                (sequence-similarity g (:genome p1)))))

;; test effects of :proportionate with expressions like this:
;(float ((age-combining-function {:age-combining-function :proportionate})

  "Runs the program expressed by parent1-genome with both parent genomes
on the genome stack and also available via input instructions, and returns
the resulting top genome."
  ([parent1-genome parent2-genome deterministic? argmap]
   (produce-child-genome-by-autoconstruction 
     parent1-genome parent1-genome parent2-genome deterministic? argmap))
  ([genome-to-run parent1-genome parent2-genome deterministic? argmap]
   (let [run-result (top-item :genome
                              (run-push
                                (translate-plush-genome-to-push-program
                                  {:genome (process-genome-for-autoconstruction
                                             genome-to-run
                                             deterministic?)}
                                  argmap)
                                (-> (->> (make-push-state)
                                         (push-item parent2-genome :genome)
                                         (push-item parent1-genome :genome))
                                    (assoc :parent1-genome parent1-genome)
                                    (assoc :parent2-genome parent2-genome)
                                    (assoc :autoconstructing true))))]
     (if (or (seq? run-result) (vector? run-result))
       (vec run-result)
       []))))

(defn expressed-program-sequence-from-genome
  "Returns an open-close sequenc for the program produced by expressing
