              evalpush-limit evalpush-time-limit node-selection-method node-selection-leaf-probability
              node-selection-tournament-size pop-when-tagging gaussian-mutation-probability 
              gaussian-mutation-per-number-mutation-probability gaussian-mutation-standard-deviation
-	     reuse-errors problem-specific-report]
+	     reuse-errors problem-specific-report use-single-thread random-seed]
       :or {error-function (fn [p] '(0)) ;; pgm -> list of errors (1 per case)
            error-threshold 0
            population-size 1000
            max-points 50
            atom-generators (concat @registered-instructions
-                             (list 
-                               (fn [] (lrand-int 100))
-                               (fn [] (lrand))))
+                                   (list 
+                                    (fn [] (lrand-int 100))
+                                    (fn [] (lrand))))
            max-generations 1001
            mutation-probability 0.4
            mutation-max-points 20

from 0 to the specified limit (exclusive)."
  [types limit]
  (fn [] (symbol (str "tag_"
                   (name (rand-nth types))
                   "_"
                   (str (rand-int limit))))))

(defn untag-instruction-erc
  "Returns a function which, when called on no arguments, returns a symbol of the form
untag_<number> where number is in the range from 0 to the specified limit (exclusive)."
  [limit]
  (fn [] (symbol (str "untag_"
                   (str (rand-int limit))))))

(defn tagged-instruction-erc
  "Returns a function which, when called on no arguments, returns a symbol of the form
tagged_<number> where number is in the range from 0 to the specified limit (exclusive)."
  [limit]
  (fn [] (symbol (str "tagged_"
                   (str (rand-int limit))))))

(defn tagged-code-instruction-erc
  "Returns a function which, when called on no arguments, returns a symbol of the form
tagged_code_<number> where number is in the range from 0 to the specified limit (exclusive)."
  [limit]
  (fn [] (symbol (str "tagged_code_"
                   (str (rand-int limit))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; tagged-code macros

  ([] (. thread-local-random-generator (nextFloat)))
  ([n] (* n (lrand))))

(defn lrand-nth
  "Return a random element of the collection."  
  [coll]
  (nth coll (. thread-local-random-generator (nextInt (count coll)))))

(defn decompose
  "Returns a list of at most max-parts numbers that sum to number.
The order of the numbers is not random (you may want to shuffle it)."
