 
 (defn tag-branch-insertion-mutate 
   "Returns a version of the given individual with a tag-branch inserted at a random
-location. A tag-branch is a sequence of instructions that 1) produces a boolean
-value by performing a randomly chosen comparison of copies (not popped) of the top 
-two items of a randomly selected type, and 2) branches to one of two tags depending
-on the result. The type-instruction-pairs argument should be a sequence of pairs,
-in which the first element of each is a type and the second element is a Push instruction
-that performs a comparison of the type, as in [:integer 'integer_eq]."
+   location. A tag-branch is a sequence of instructions that 1) produces a boolean
+   value by performing a randomly chosen comparison of copies (not popped) of the top 
+   two items of a randomly selected type, and 2) branches to one of two tags depending
+   on the result. The type-instruction-pairs argument should be a sequence of pairs,
+   in which the first element of each is a type and the second element is a Push instruction
+   that performs a comparison of the type, as in [:integer 'integer_eq]."
   [ind max-points type-instruction-pairs tag-limit]
   (let [old-program (:program ind)
         tag-ref-instruction-1 (symbol (str "tagged_" (str (lrand-int tag-limit)))) 

                       :ancestors (if maintain-ancestors
                                    (cons (:program parent1) (:ancestors parent1))
                                    (:ancestors parent1))))))





(defn ultra
  "Returns the result of applying the ULTRA (Uniform Linear Transformation
   with Repair and Alternation) operation to parent1 and parent2."
  [parent1 parent2 max-points alternation-rate alignment-deviation mutation-rate atom-generators]
  (let [new-program (ultra-operate-on-programs (:program parent1) 
                                               (:program parent2)
