   "Retains one random individual to represent each error vector."
   [pop]
   (map lrand-nth (vals (group-by #(:errors %) pop))))
+
+(defn possibly-remove-individuals-with-empty-genomes
+  "When :autoconstuctive is truthy, and at least one individual in pop has a non-empty
+  genome, remove those with empty genomes."
+  [pop {:keys [autoconstructive]}]
+  (if autoconstructive
+    (let [with-non-empty-genomes (filter #(not (empty? (:genome %))) pop)]
+      (if (not (empty? with-non-empty-genomes))
+        with-non-empty-genomes
+        pop))
+    pop))
   
 (defn lexicase-selection
   "Returns an individual that does the best on the fitness cases when considered one at a
    time in random order.  If trivial-geography-radius is non-zero, selection is limited to parents within +/- r of location"
-  [pop location {:keys [trivial-geography-radius]}]
+  [pop location {:keys [trivial-geography-radius] :as argmap}]
   (let [lower (mod (- location trivial-geography-radius) (count pop))
         upper (mod (+ location trivial-geography-radius) (count pop))
         popvec (vec pop)

                                                               1
                                                               (inc sel-count)))))
    selected))

                   (subvec popvec lower (inc upper))
                   (into (subvec popvec lower (count pop)) 
                         (subvec popvec 0 (inc upper)))))]
    (loop [survivors (retain-one-individual-per-error-vector 
                       (possibly-remove-individuals-with-empty-genomes
                         subpop argmap))
           cases (lshuffle (range (count (:errors (first subpop)))))]
      (if (or (empty? cases)
              (empty? (rest survivors)))
