 (def argmap
   {:error-function (count-odds-error-function count-odds-data-domains)
    :atom-generators count-odds-atom-generators
-   :max-points 300
-   :max-points-in-initial-program 150
-   :evalpush-limit 600
+   :max-points 500
+   :max-points-in-initial-program 250
+   :evalpush-limit 1500
    :population-size 1000
    :max-generations 300
    :parent-selection :lexicase

  [data-domains]
  (let [[train-cases test-cases] (map count-odds-test-cases
                                      (test-and-train-data-from-domains data-domains))]
    (when false ;; Change to false to not print test cases
      (doseq [[i case] (map vector (range) train-cases)]
        (println (format "Train Case: %3d | Input/Output: %s" i (str case))))
      (doseq [[i case] (map vector (range) test-cases)]

;;Can make Count Odds test data like this:
;(test-and-train-data-from-domains count-odds-data-domains)

; Helper function for error function
(defn count-odds-test-cases
  "Takes a sequence of inputs and gives IO test cases of the form
   [input output]."
  [inputs]
  (map #(vector %
                (count (filter odd? %)))
       inputs))

; Define error function. For now, each run uses different random inputs
