 (def max-random-string-length 10) ;; The maximum length of string created by the string_rand instruction
 (def max-points-in-random-expressions 50) ;; The maximum length of code created by the string_rand instruction
 
+;; These atoms are used in different places and are therefore difficult to make fully functional
+(def timer-atom (atom 0)) ;; Used for timing of different parts of pushgp
+(def timing-map (atom {:initialization 0 :reproduction 0 :report 0 :fitness 0 :other 0}))  ;; Used for timing of different parts of pushgp
+(def solution-rates (atom (repeat 0))) ;; Is used in historically-assessed hardness
+(def elitegroups (atom ())) ;; Is used for elitegroup lexicase selection (will only work if lexicase-selection is off)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; The globals below may be reset by arguments to pushgp
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(def global-pop-when-tagging (atom true)) ;; When true, tagging instructions will pop the exec stack when tagging; otherwise, the exec stack is not popped

;; Special defs not used by Push instructions, but still need to be globally def'ed, go here.
(def timer-atom (atom 0)) ;; Used for timing of different parts of pushgp
(def timing-map (atom {:initialization 0 :reproduction 0 :report 0 :fitness 0 :other 0}))  ;; Used for timing of different parts of pushgp



;;-------DONE THROUGH HERE

;; The following globals may be reset by arguments to pushgp or other systems that use Push.
(def global-use-bushy-code (atom false))

;; solution-rates is used in HAH:
;; Historically-assessed hardness (http://hampshire.edu/lspector/pubs/kleinspector-gptp08-preprint.pdf)
;; using the "Previous Generation / Difference" method.
(def solution-rates (atom (repeat 0)))

;; elitegroups is used for elitegroup lexicase selection (will only work if lexicase-selection is off)
(def elitegroups (atom ()))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;   globals
;; The values def'ed here tend to remain constant over all runs. The atoms
;; not starting with "global-" are used in a variety of places and therefore
;; it is easiest to keep them global. The atoms starting with "global-"
;; may change depending on arguments to pushgp.
;;
;; Most of the values and atoms in this file are those that are used by Push
;; instructions; all others, with few exceptions, should be defined in push-argmap
;; in pushgp.clj and should be passed to whatever functions use them as arguments.

;; push-types is the list of stacks used by the Push interpreter
(def push-types '(:exec :integer :float :code :boolean :string :zip
