Skip to content
This repository
Browse code

Cleaned up documentation; version bump.

  • Loading branch information...
commit aea916899271ac3f7f2667f923d2625d2e6878b4 1 parent c919230
Lee Spector authored

Showing 3 changed files with 382 additions and 380 deletions. Show diff stats Hide diff stats

  1. +17 379 README.txt
  2. +364 0 old-version-history.txt
  3. +1 1  project.clj
396 README.txt
@@ -2,12 +2,12 @@ README.txt
2 2
3 3 Lee Spector (lspector@hampshire.edu), started 20100227
4 4 See version history at https://github.com/lspector/Clojush/commits/master
  5 +Older version history is in old-version-history.txt.
5 6
6 7 This is the README file accompanying Clojush, an implementation of the
7 8 Push programming language and the PushGP genetic programming system in the
8 9 Clojure programming language. Among other features this implementation
9   -takes advantage of Clojure's facilities for multi-core concurrency. Use
10   -Java's -XX:+UseParallelGC option to take maximum advantage of this feature.
  10 +takes advantage of Clojure's facilities for multi-core concurrency.
11 11
12 12 AVAILABILITY
13 13
@@ -16,7 +16,7 @@ https://github.com/lspector/Clojush/
16 16 REQUIREMENTS
17 17
18 18 To use this code you must have a Clojure programming environment; see
19   -http://clojure.org/. The current version of clojush requires clojure 1.3.
  19 +http://clojure.org/. The current version of Clojush requires Clojure 1.3.
20 20
21 21 Clojure is available for most OS platforms. A good starting point for
22 22 obtaining and using Clojure is http://dev.clojure.org/display/doc/Getting+Started.
@@ -29,7 +29,8 @@ a call like:
29 29
30 30 lein run clojush.examples.simple-regression
31 31
32   -If you would like to change a parameter, you may do so at the command line. For example, to change the default population size from 1000 to 50, call:
  32 +If you would like to change a parameter, you may do so at the command line.
  33 +For example, to change the default population size from 1000 to 50, call:
33 34
34 35 lein run clojush.examples.simple-regression :population-size 50
35 36
@@ -40,21 +41,26 @@ regression problem (symbolic regression of y=x^3-2x^2-x). Although the
40 41 details will vary from run to run, and it's possible that it will fail,
41 42 this usually succeeds in a few generations.
42 43
43   -Another option is to evaluate in the leinigen repl:
  44 +Another option is to evaluate in the leinigen REPL (Read Eval Print Loop):
44 45
45 46 sh> lein repl
46 47 ...
47   - clojush.core=> (use 'clojush.examples.simple-regression))
  48 + clojush.core=> (use 'clojush.examples.simple-regression)
48 49 ...
49 50 clojush.core=> (pushgp)
50 51
51 52 Arguments to pushgp may be specified as in the command line case.
52 53
  54 +To run the examples in an IDE (Integrated Development Environment) for
  55 +Clojure such as Clooj or Eclipse/Counterclockwise, load one of the
  56 +files in src/clojush/examples into the IDE's REPL, type "(pushgp)" into
  57 +the REPL's input area, and hit the enter key.
  58 +
53 59 For large-scale runs you may want to provide additional arguments to
54   -java in order to allow access to more memory and/or to take maximal
55   -advantage of Clojure's concurrency support in the context of clojush's
56   -reliance on garbage collection. For example, you might want to provide a
57   -rguments such as -Xmx2000m and -XX:+UseParallelGC. Details will depend
  60 +Java in order to allow access to more memory and/or to take maximal
  61 +advantage of Clojure's concurrency support in the context of Clojush's
  62 +reliance on garbage collection. For example, you might want to provide
  63 +arguments such as -Xmx2000m and -XX:+UseParallelGC. Details will depend
58 64 on the method that you use to launch your code.
59 65
60 66 DESCRIPTION
@@ -286,383 +292,15 @@ Push3 stuff not (yet) implemented:
286 292
287 293 TO DO (SOMETIME, MAYBE)
288 294
289   -- Clean up issues involving Push globals and PushGP parameters for the same
290   - or similar things.
291 295 - Implement remaining instructions in the Push3 specification.
292 296 - Add more examples.
293 297 - Add support for seeding the random number generator.
294   -- Add improved genetic operators, e.g. fair mutation/crossover and
295   - constant-perturbing mutations.
  298 +- Add improved genetic operators, e.g. fair mutation/crossover.
296 299 - Improve the automatic simplification algorithm.
297 300 - Possibly rename the auxiliary stack the "input" stack if no other
298 301 uses are developed for it.
299 302 - Write a "sufficient-args" fn/macro to clean up Push instruction definitions.
300 303
301   -VERSION HISTORY -- NOW OBSOLETE. See https://github.com/lspector/Clojush/commits/master
302   -20100227: - First distributed version.
303   -20100301: - Added (shutdown-agents) for proper termination.
304   -20100306: - Added history (of total errors of ancestors) to individuals.
305   - - Commented out (shutdown-agents) because it prevents multiple
306   - runs in a single launch of a Clojure REPL.
307   -20100307: - Fixed bug in history: reproductive auto-simplification added
308   - was adding duplicate items.
309   -20100314: - Added instructions: *_shove, code_extract, code_insert,
310   - code_subst, code_contains, code_container, code_position,
311   - code_discrepancy, *_rand. NOTE that the presence of *_rand
312   - instructions means that programs produced using the full set
313   - of instructions may be non-deterministic. As of this writing
314   - pushgp (via evaluate-individual) will evaluate an individual
315   - only once, so it will always have whatever fitness value it
316   - had upon first testing.
317   - - Added globals to support integer_rand and float_rand:
318   - min-random-integer, max-random-integer, min-random-float
319   - max-random-float.
320   - - Fixed bug in code_car that could produce nil.
321   - - Made execute-instruction safe for nil (although it shouldn't
322   - arise anyway).
323   - - Added stress-test for testing and debugging new Push
324   - instructions. See the stress-test documentation string for
325   - details.
326   - - Implemented size limits on intermediate results on code stack
327   - (in code_cons, code_list, code-append, code_insert, code_subst,
328   - exec_s, exec_y).
329   - - Fixed bug in exec_s (was always a noop previously).
330   -20100319: - Added problem-specific-report function (to be customized per
331   - problem). This can also be a convenient place to put other
332   - stuff that you want done once per generation.
333   - - Added support for saving lists of ancestors (maternal line
334   - only) along with global parameters to turn both this and the
335   - saving of total-error histories on and off.
336   - - Added missing calls to "keep-number-reasonable" in numeric
337   - Push instructions. This eliminates some potential crashes from
338   - runaway number growth.
339   -20100320: - Added print-ancestors-of-solution parameter and code.
340   - - Print simplification in report only with non-zero value for
341   - report-simplifications parameter.
342   - - Added sextic polynomial regression example. This example also
343   - demonstrates the use of fitness penalties for abnormally
344   - terminating programs.
345   - - Added a new argument to problem-specific-report (NOTE: not
346   - backward compatible).
347   -20100417: - Added thread-local random number generator objects to avoid
348   - contention.
349   - - Print parameters at the start of pushgp.
350   - - Added readme comments about concurrency, -Xmx2000m, and
351   - -XX:+UseParallelGC.
352   - - Converted time limit code to use System/nanoTime (thanks to
353   - Brian Martin). This means that time limits must now be
354   - expressed in nanoseconds rather than milliseconds, and I
355   - believe it will eliminate contention for shared Date objects
356   - (but this should be checked; if there is contention then
357   - we should revert to using Date and use thread-local date
358   - objects as is being done with the random number generator
359   - objects).
360   - - Added print-return utility function for debugging.
361   - - Added a new Push instruction, code_wrap, which pushes a 1-item
362   - list containing the previous top item of the code stack.
363   - - Added a new Push instruction, code_map, which acts much like
364   - Lisp's (or Scheme's or Clojure's) "map" functions, using the
365   - top item on the exec stack as the function to map and the top
366   - item on the code stack as the list to map it down. The list of
367   - results is left on top of the code stack. This is implemented
368   - as a "macro" instruction that expands into a Push code
369   - fragment that: 1) for each item in the list on top of the
370   - code stack (or for the single non-list item that is there)
371   - quotes the item onto the code stack and then runs the code
372   - that's on top of the exec stack; 2) uses code_wrap to push a
373   - list containing the last result onto the code stack; 3)
374   - executes as many instances of code_cons as are necessary to
375   - add all of the other results onto the list. Note that this
376   - will act like an ordinary "map" function only when the code on
377   - the exec stack leaves a single output on the code stack in
378   - place of each input on the code stack; if it consumes or
379   - produces more or less code then the effect will be quite
380   - different.
381   -20100502: - Made thread-local random integer function (lrand-int) safe for
382   - bignums, but arguments greater than 2^31-1 are treated as if
383   - they were 2^31-1 (2147483647).
384   -20100526: - Reimplemented subst to use clojure.walk/postwalk-replace. Also
385   - fixed comment, which described args backwards. (The behavior
386   - was correct, emulating Common Lisp subst.)
387   -20100918: - Created Eclipse project.
388   - - Deleted re-load/backtrace utils.
389   - - Removed shuffle, as it is now in clojure.core (in Clojure 1.2).
390   - - Removed gratuitous def in define-registered.
391   - - Added atom for instruction-table.
392   - - Added atom for registered-instructions; NOTE: requires user
393   - code that refers to registered-instructions to refer to
394   - @registered-instructions instead. (Example odd.clj changed
395   - to reflect this.)
396   - - Added to-do item "Convert structs to records, which should be
397   - faster. Experiments with Clojure 1.2 show this to be faster
398   - but there are not good examples yet to serve as the basis for
399   - changes.
400   - - Added atoms for global-atom-generators and
401   - global-max-points-in-program.
402   - - Changed pushgp to take keyword arguments rather than a parameter
403   - map. NOTE: this requires calls to pushgp to be written differently.
404   - Updated examples to reflect this.
405   -20100921: - Removed random-element in favor of rand-nth.
406   - - Cleaned up indentation, miscellaneous other cosmetic things.
407   - - Added namespaces for all example files.
408   - - Updated README to mention requirement for clojure 1.2 and to
409   - remove mention of ClojureX which has been discontinued.
410   - - Converted structures to records (a clojure 1.2 feature, should
411   - be faster).
412   -20101005: - Added error-handlers to agents.
413   -20101014: - [Artificial ant, krypto, tg8, decimation]
414   - - Added articial ant example from Koza (via Luke).
415   - - Added "tg8" integer symbolic regression problem.
416   - - Added krypto number puzzle example.
417   - - Added pushgp "decimation" feature, in which elimination
418   - tournaments, conducted after fitness testing, reduce the
419   - size of the population to a specified fraction of its original
420   - size (specified in a decimation-ratio argument to pushgp;
421   - the tournament sized is specified via decimation-tournament-size).
422   - The ordinary tournament-size parameter is still used for subsequent
423   - selection from the decimated population. Any specified trivial
424   - geography applies both to decimation and to subsequent selection.
425   -20101017: - Reverted from records to structs; wasn't significantly faster and
426   - structs allow for greater flexibility in use of state as map.
427   -20101102: - Switched to new clojure.core/frequencies from depricated
428   - seq-utils/frequencies (h/t Kyle Harrington), and similarly
429   - for flatten.
430   - - Added :include-randoms keyword argument for registered-for-type.
431   - Defaults to true, but if specified as false then instructions
432   - ending with "_rand" will be excluded.
433   - - Raised invalid output penalty in tg8 (it was lower than reasonable
434   - errors for that problem).
435   -20101103: - Converted evalpush-limit and evalpush-time-limit into vars
436   - (global-evalupush-limit and global-evalpush-time-limit) bound
437   - to atoms that are reset by calls to pushgp (keyword arguments
438   - :evalpush-limit and :evalpush-time-limit).
439   - - Changed pushgp parameters in the tg8.clj example.
440   -20101104: - Implemented stackless tagging (see http://push.i3ci.hampshire.edu/
441   - 2010/10/28/stackless-tagging/). Tag instructions take one of
442   - the following forms:
443   - tag_<type>_<number>
444   - create tage/value association, with the value taken from the
445   - stack of the given type and the number serving as the tag
446   - untag_<number>
447   - remove the association for the closest-matching tag
448   - tagged_<number>
449   - push the value associated with the closest-matching tag onto
450   - the exec stack (or no-op if no associations).
451   - Here "closest-matching" means the tag with lowest number that
452   - is greater than or equal to the number of the tag being matched,
453   - or the lowest-numbered tag if none meet this criterion. Tag
454   - instructions are not implemented in the same way as other
455   - instructions; they are detected and handled specially by the
456   - interpreter (see execute-instruction). Tag instructions
457   - can be included in pushgp runs by using the new ephemeral
458   - random constant functions tag-instruction-erc,
459   - untag-instruction-erc, and tagged-instruction-erc, each of
460   - which takes a limit (for the numerical part) as an
461   - argument.
462   - - Added examples using tags: tagged_ant, tagged_regression, and
463   - tagged_tg8.
464   -20101106: - Tweaked parameters in ant examples; among other things,
465   - increased simplification since bloat was an issue. Also
466   - added some evolved solutions in comments.
467   -20101107: - Added Koza's lawnmower problem example; this demonstrates how
468   - to add a new type/stack on a problem-specific basis, without
469   - altering clojush.clj.
470   -20101204: - Added pushgp-map, which allows pushgp calls on maps of arguments,
471   - and a demonstration of its use in argmap_regression.clj.
472   - - Added :gen-class and -main definition (thanks Kyle Harrington).
473   - - Fixed eval-push termination to return :abnormal for exceeding
474   - time-limit (thanks Kyle Harrington).
475   -20101205: - Added modified version of Kyle's version of the intertwined
476   - spirals problem.
477   - - Minor changes to this README.
478   -20101208: - Added alternative methods for node selection, used in mutation
479   - and crossover (drafted by Brian Martin, with suggestions
480   - from Kyle Harrington). This introduced three new globals:
481   - global-node-selection-method, global-node-selection-leaf-probability,
482   - and global-node-selection-tournament-size, each of which holds
483   - an atom, and three new parameters to pushgp: node-selection-method,
484   - node-selection-leaf-probability, and node-selection-tournament-size.
485   - The node-selection-method can be :unbiased (in which case nodes
486   - are selected using the uniform distribution that was previously
487   - used -- this is the default), :leaf-probability (in which case
488   - the value of the node-selection-leaf-probability argument,
489   - which defaults to 0.1, specifies the probability that leaves,
490   - as opposed to internal nodes, will be selected -- this is the
491   - method used by Koza and others in tree-based GP), or
492   - :size-tournament (in which case the value of the
493   - node-selection-tournament-size argument, which defaults to 2,
494   - determines the tournament size for node tournaments, with the
495   - largest subtree in the tournament set being selected).
496   -20110111: - Added zipper stack and functions (thanks to Kyle Harrington for
497   - draft code, although this was re-written).
498   - - Added registered-nonrandom function.
499   - - Modified odd.clj example to use registered-nonrandom.
500   - - Added examples/dsoar.clj, a version of the "Dirt-Sensing,
501   - Obstacle-Avoiding Robot" (DSOAR) problem first described in:
502   - Spector, L. 1996. Simultaneous Evolution of Programs and their
503   - Control Structures. In Advances in Genetic Programming 2, edited
504   - by P. Angeline and K. Kinnear, pp. 137-154. Cambridge, MA: MIT Press.
505   - http://helios.hampshire.edu/lspector/pubs/AiGP2-post-final-e.pdf
506   - This version was written by Brian Martin in 2010-2011.
507   -20110118: - Added support for tagged_code_<number> instructions. These are like
508   - tagged_<number> instructions except that retrieved values are pushed
509   - onto the code stack rather than the exec stack. Without these the
510   - only way to get tagged values onto the code stack is to wrap
511   - values with code_quote prior to tagging. An alternative approach
512   - is to add new tagging instructions that automatically perform
513   - code_quote wrapping, but for full generality that would require
514   - new instructions for each type; also quote-tagged values would
515   - always be destined for the code stack, while the scheme adopted
516   - here allows any stored value to be retrieved either to exec or to
517   - code.
518   - - A value of 0 for the evalpush-time-limit parameter of pushgp
519   - now means that no time limit will be enforced. This is also
520   - now the default.
521   -20110322: - Tag reference bug fixed in closest-association (>= changed to <=).
522   - - Added mux (multiplexer) example (a couple of approaches in one file).
523   -20110409: - Added support for no-pop tagging through a var called
524   - global-pop-when-tagging (holding an atom with a boolean value)
525   - and a boolean argument to pushgp called pop-when-tagging.
526   - The defaults are true, for backwards compatibility. If
527   - @global-pop-when-tagging is false (which will result from
528   - passing false as a :pop-when-tagging keyword argument to pushgp)
529   - then executing instructions of the form tag_<type>_<number>
530   - will tag a value as usual, but the tagged item will not be popped
531   - from its source stack.
532   - - Removed no-pop hackage from mux example (thanks Kyle).
533   -20110424: - Added Gaussian mutation for floating point literals. This is
534   - a genetic operator on par with ordinary mutation, crossover,
535   - and simplification, with the probability for applying this operator
536   - set with the gaussian-mutation-probability argument to pushgp
537   - (which defaults to zero). The behavior of this operator, when used,
538   - is controlled by two other arguments to pushgp,
539   - gaussian-mutation-per-number-mutation-probability (which is the
540   - probability that any particular floating point number in the
541   - program will actually be mutated -- this defaults to 0.5) and
542   - gaussian-mutation-standard-deviation (which specifies the standard
543   - deviation of the Gaussian noise generator that is used to
544   - produce changes to numbers -- this defaults to 0.1).
545   - - Added examples/gaussian_mutation_demo.clj to demonstrate Gaussian
546   - mutation.
547   - - Added examples/korns_regression_p12.clj, a symbolic regression
548   - problem based on Michael Korns's draft chapter from GPTP11.
549   -20110505: - Added complex number support. New instructions for the 'complex'
550   - stack include: pop, dup, swap, rot, flush, eq, stackdepth, yank,
551   - yankdup, shove, rand, add, sub, mult, divide, fromfloat,
552   - frominteger, fromfloats, fromintegers, conjugate, magnitude,
553   - and principal_sqrt. (Brian Martin)
554   -20110517: - Added a "scaled-errors" function to support error-scaling as
555   - described by Maarten Keijzer in Scaled Symbolic Regression, in
556   - Genetic Programming and Evolvable Machines 5(3), pp. 259-269,
557   - September 2004. This must be used in a problem's error function,
558   - and then the outputs of the evolved program must be "unscaled."
559   - See the documentation string for scaled-errors and also
560   - examples/scaled_sextic.clj for details.
561   - - Added examples/scaled_sextic.clj to demonstrate the use of
562   - scaled-errors.
563   - - Changed examples/sextic.clj to use squared errors and an error
564   - threshold, in order to facilitate comparisons between the
565   - versions that do and don't use error scaling.
566   - - Made minor changes to the korns_regression_p12 example.
567   -20110526: - Enforce size limits on zipper manipulation results.
568   -20110607: - Added overlap utility function, overlap-demo (which just prints
569   - some examples to show how overlap works), and code_overlap
570   - instruction. Overlap can be applied to any two (possibly
571   - nested) things and it returns a number between 0 (meaning
572   - no overlap) and 1 (meaning exact match). The overlap utility
573   - function returns a ratio, but the code_overlap instruction
574   - pushes a float.
575   - - Removed complex number support from 20110505. There were previous
576   - reports of problems and I've noticed problems from the fact that
577   - (apply + ()) => zero (as opposed to 0) in the clojush namespace
578   - defined by the code as revised for complex number support. If
579   - someone knows how to re-introduce complex number support without
580   - such problems then please let me know.
581   -20110618: - Switched to Kyle Harrington's version of overlap; it's more clear,
582   - possibly faster, and may fix a hard-to-trace bug that cropped up
583   - in a long evolutionary run (?).
584   -20110624: - Replaced lawnmower and dsoar examples with bugfixed versions
585   - (thanks to Kyle Harrington).
586   - - Added namespace and made miscellaneous other changes to
587   - clojush-tests.clj.
588   - - Added support for tagged-code macros. Tagged-code macro calls
589   - have the effect of code instructions, but they take their
590   - code arguments from the tag space and they tag their code return
591   - values. They are implemented as macros to leverage the existing
592   - code instruction set; note that this means that a single call
593   - will contribute more than one iteration step toward the
594   - evalpush-limit. Tagged-code macros appear in programs as hash maps
595   - that map :tagged_code_macro to true, :instruction to a code
596   - instruction, :argument_tags to a sequence of tags to be used
597   - to acquire arguments, and :result_tags to a sequence of tags
598   - to be used for tagging results. Execution of a macro expands
599   - the needed code onto the exec stack to grab arguments from the tag
600   - space and push them on the code stack, execute the code instruction,
601   - and tag results. Note that results will also be left on the code
602   - stack if global-pop-when-tagging is false. Conceptually, tag values
603   - are "baked in" to these macros in much the same way that tag values
604   - are "baked in" to the instruction names for stackless tag
605   - instructions; we use hash maps simply because there is more
606   - information to bake in and this prevents us from having to parse
607   - the names (which would get messy and also waste time). Because
608   - the maps make it difficult to read programs, however, a utility
609   - function called abbreviate-tagged-code-macros is provided to
610   - produce copies of programs with more human-readable (but not
611   - currently executable) representations of tagged-macro calls.
612   - A tagged-code-macro-erc is provided to generate random tagged-code
613   - macros in pushgp runs. A new example, codesize20, provides
614   - a simple demonstration of the use of tagged-code macros.
615   - - Replaced walk-based code-manipulation with walklist functions
616   - that only traverse list structure. This fixes an interaction
617   - between map literals (e.g. tagged-code macros) and program
618   - structure.
619   -20110629: - Fixed abbreviate-tagged-code-macros printing of empty lists.
620   - - Added seq condition to walklist to permit walking of seqs that
621   - aren't actually full-fledged lists.
622   -20110702: - Several fixes/refinements to tagged-code macros:
623   - - Fixed incorrect no-op of arg-free calls with empty tag space.
624   - - Added :additional_args to tagged-code macro structure; the
625   - value should be a list of items and these will be executed
626   - in order before calling the macro's instruction.
627   - - Added optional 5th arg to tagged-code-macro-erc; this should
628   - be a function of zero args that will be called to produce
629   - the value of :additional_args (e.g. if you want to have one
630   - random integer arg then you could specify a 5th arg of
631   - (fn [] (list (lrand-int 101))).
632   - - Changed format produced by abbreviate-tagged-code-macros to
633   - handle :additional_args and to be slightly more concise.
634   -20110714: - Added "trace" argument to eval-push and run-push. If this is
635   - true then the resulting state will map :trace to a list of
636   - executed instructions and literals, in reverse order of
637   - execution. If the argument is :changes then instructions that
638   - have no effect on the state will be excluded.
639   -20110809: - Several additions/enhancements by Kyle Harrington:
640   - - Converted problem-specific-report to a parameter in pushgp.
641   - - Added reporting of program repeat counts in population.
642   - - Added "error-reuse" parameter to pushgp for use in stochastic
643   - and dynamic problems (for which reuse would be turned off).
644   - - Added examples/mackey_glass_int.clj, a symbolic regression
645   - problem as described in Langdon & Banzhaf's 2005 paper
646   - (citation in file).
647   - - Added examples/pagie_hogeweg.clj problem, a difficult
648   - symbolic regression problem when coevolution is not used.
649   - Introduced by Pagie & Hogeweg's 1997 paper (citation in file).
650   -20110911: - Switched from Eclipse to Clooj/Leiningen for development and
651   - rearranged the project for this.
652   - - Added calls to end of all example files.
653   - - Examples can be run from the OS command line (assuming
654   - that leiningen is available) with calls like:
655   - lein run examples.simple-regression
656   - - Added local-file dependency and used file* for file access.
657   - - Removed ant and tagged-ant examples because of bugs related
658   - to confusion of push interpreted states and ant world states.
659   -20111104: - Added string stack and a variety of string stack instructions.
660   - - Added two example pushgp runs that use the string stack in
661   - the file examples/string.clj.
662   -20111112: - Obsoleted this version history in favor of the commit logs
663   - at https://github.com/lspector/Clojush/commits/master
664   -
665   -
666 304 ACKNOWLEDGEMENTS
667 305
668 306 This material is based upon work supported by the National Science Foundation
364 old-version-history.txt
... ... @@ -0,0 +1,364 @@
  1 +VERSION HISTORY -- NOW OBSOLETE. See https://github.com/lspector/Clojush/commits/master
  2 +20100227: - First distributed version.
  3 +20100301: - Added (shutdown-agents) for proper termination.
  4 +20100306: - Added history (of total errors of ancestors) to individuals.
  5 + - Commented out (shutdown-agents) because it prevents multiple
  6 + runs in a single launch of a Clojure REPL.
  7 +20100307: - Fixed bug in history: reproductive auto-simplification added
  8 + was adding duplicate items.
  9 +20100314: - Added instructions: *_shove, code_extract, code_insert,
  10 + code_subst, code_contains, code_container, code_position,
  11 + code_discrepancy, *_rand. NOTE that the presence of *_rand
  12 + instructions means that programs produced using the full set
  13 + of instructions may be non-deterministic. As of this writing
  14 + pushgp (via evaluate-individual) will evaluate an individual
  15 + only once, so it will always have whatever fitness value it
  16 + had upon first testing.
  17 + - Added globals to support integer_rand and float_rand:
  18 + min-random-integer, max-random-integer, min-random-float
  19 + max-random-float.
  20 + - Fixed bug in code_car that could produce nil.
  21 + - Made execute-instruction safe for nil (although it shouldn't
  22 + arise anyway).
  23 + - Added stress-test for testing and debugging new Push
  24 + instructions. See the stress-test documentation string for
  25 + details.
  26 + - Implemented size limits on intermediate results on code stack
  27 + (in code_cons, code_list, code-append, code_insert, code_subst,
  28 + exec_s, exec_y).
  29 + - Fixed bug in exec_s (was always a noop previously).
  30 +20100319: - Added problem-specific-report function (to be customized per
  31 + problem). This can also be a convenient place to put other
  32 + stuff that you want done once per generation.
  33 + - Added support for saving lists of ancestors (maternal line
  34 + only) along with global parameters to turn both this and the
  35 + saving of total-error histories on and off.
  36 + - Added missing calls to "keep-number-reasonable" in numeric
  37 + Push instructions. This eliminates some potential crashes from
  38 + runaway number growth.
  39 +20100320: - Added print-ancestors-of-solution parameter and code.
  40 + - Print simplification in report only with non-zero value for
  41 + report-simplifications parameter.
  42 + - Added sextic polynomial regression example. This example also
  43 + demonstrates the use of fitness penalties for abnormally
  44 + terminating programs.
  45 + - Added a new argument to problem-specific-report (NOTE: not
  46 + backward compatible).
  47 +20100417: - Added thread-local random number generator objects to avoid
  48 + contention.
  49 + - Print parameters at the start of pushgp.
  50 + - Added readme comments about concurrency, -Xmx2000m, and
  51 + -XX:+UseParallelGC.
  52 + - Converted time limit code to use System/nanoTime (thanks to
  53 + Brian Martin). This means that time limits must now be
  54 + expressed in nanoseconds rather than milliseconds, and I
  55 + believe it will eliminate contention for shared Date objects
  56 + (but this should be checked; if there is contention then
  57 + we should revert to using Date and use thread-local date
  58 + objects as is being done with the random number generator
  59 + objects).
  60 + - Added print-return utility function for debugging.
  61 + - Added a new Push instruction, code_wrap, which pushes a 1-item
  62 + list containing the previous top item of the code stack.
  63 + - Added a new Push instruction, code_map, which acts much like
  64 + Lisp's (or Scheme's or Clojure's) "map" functions, using the
  65 + top item on the exec stack as the function to map and the top
  66 + item on the code stack as the list to map it down. The list of
  67 + results is left on top of the code stack. This is implemented
  68 + as a "macro" instruction that expands into a Push code
  69 + fragment that: 1) for each item in the list on top of the
  70 + code stack (or for the single non-list item that is there)
  71 + quotes the item onto the code stack and then runs the code
  72 + that's on top of the exec stack; 2) uses code_wrap to push a
  73 + list containing the last result onto the code stack; 3)
  74 + executes as many instances of code_cons as are necessary to
  75 + add all of the other results onto the list. Note that this
  76 + will act like an ordinary "map" function only when the code on
  77 + the exec stack leaves a single output on the code stack in
  78 + place of each input on the code stack; if it consumes or
  79 + produces more or less code then the effect will be quite
  80 + different.
  81 +20100502: - Made thread-local random integer function (lrand-int) safe for
  82 + bignums, but arguments greater than 2^31-1 are treated as if
  83 + they were 2^31-1 (2147483647).
  84 +20100526: - Reimplemented subst to use clojure.walk/postwalk-replace. Also
  85 + fixed comment, which described args backwards. (The behavior
  86 + was correct, emulating Common Lisp subst.)
  87 +20100918: - Created Eclipse project.
  88 + - Deleted re-load/backtrace utils.
  89 + - Removed shuffle, as it is now in clojure.core (in Clojure 1.2).
  90 + - Removed gratuitous def in define-registered.
  91 + - Added atom for instruction-table.
  92 + - Added atom for registered-instructions; NOTE: requires user
  93 + code that refers to registered-instructions to refer to
  94 + @registered-instructions instead. (Example odd.clj changed
  95 + to reflect this.)
  96 + - Added to-do item "Convert structs to records, which should be
  97 + faster. Experiments with Clojure 1.2 show this to be faster
  98 + but there are not good examples yet to serve as the basis for
  99 + changes.
  100 + - Added atoms for global-atom-generators and
  101 + global-max-points-in-program.
  102 + - Changed pushgp to take keyword arguments rather than a parameter
  103 + map. NOTE: this requires calls to pushgp to be written differently.
  104 + Updated examples to reflect this.
  105 +20100921: - Removed random-element in favor of rand-nth.
  106 + - Cleaned up indentation, miscellaneous other cosmetic things.
  107 + - Added namespaces for all example files.
  108 + - Updated README to mention requirement for clojure 1.2 and to
  109 + remove mention of ClojureX which has been discontinued.
  110 + - Converted structures to records (a clojure 1.2 feature, should
  111 + be faster).
  112 +20101005: - Added error-handlers to agents.
  113 +20101014: - [Artificial ant, krypto, tg8, decimation]
  114 + - Added articial ant example from Koza (via Luke).
  115 + - Added "tg8" integer symbolic regression problem.
  116 + - Added krypto number puzzle example.
  117 + - Added pushgp "decimation" feature, in which elimination
  118 + tournaments, conducted after fitness testing, reduce the
  119 + size of the population to a specified fraction of its original
  120 + size (specified in a decimation-ratio argument to pushgp;
  121 + the tournament sized is specified via decimation-tournament-size).
  122 + The ordinary tournament-size parameter is still used for subsequent
  123 + selection from the decimated population. Any specified trivial
  124 + geography applies both to decimation and to subsequent selection.
  125 +20101017: - Reverted from records to structs; wasn't significantly faster and
  126 + structs allow for greater flexibility in use of state as map.
  127 +20101102: - Switched to new clojure.core/frequencies from depricated
  128 + seq-utils/frequencies (h/t Kyle Harrington), and similarly
  129 + for flatten.
  130 + - Added :include-randoms keyword argument for registered-for-type.
  131 + Defaults to true, but if specified as false then instructions
  132 + ending with "_rand" will be excluded.
  133 + - Raised invalid output penalty in tg8 (it was lower than reasonable
  134 + errors for that problem).
  135 +20101103: - Converted evalpush-limit and evalpush-time-limit into vars
  136 + (global-evalupush-limit and global-evalpush-time-limit) bound
  137 + to atoms that are reset by calls to pushgp (keyword arguments
  138 + :evalpush-limit and :evalpush-time-limit).
  139 + - Changed pushgp parameters in the tg8.clj example.
  140 +20101104: - Implemented stackless tagging (see http://push.i3ci.hampshire.edu/
  141 + 2010/10/28/stackless-tagging/). Tag instructions take one of
  142 + the following forms:
  143 + tag_<type>_<number>
  144 + create tage/value association, with the value taken from the
  145 + stack of the given type and the number serving as the tag
  146 + untag_<number>
  147 + remove the association for the closest-matching tag
  148 + tagged_<number>
  149 + push the value associated with the closest-matching tag onto
  150 + the exec stack (or no-op if no associations).
  151 + Here "closest-matching" means the tag with lowest number that
  152 + is greater than or equal to the number of the tag being matched,
  153 + or the lowest-numbered tag if none meet this criterion. Tag
  154 + instructions are not implemented in the same way as other
  155 + instructions; they are detected and handled specially by the
  156 + interpreter (see execute-instruction). Tag instructions
  157 + can be included in pushgp runs by using the new ephemeral
  158 + random constant functions tag-instruction-erc,
  159 + untag-instruction-erc, and tagged-instruction-erc, each of
  160 + which takes a limit (for the numerical part) as an
  161 + argument.
  162 + - Added examples using tags: tagged_ant, tagged_regression, and
  163 + tagged_tg8.
  164 +20101106: - Tweaked parameters in ant examples; among other things,
  165 + increased simplification since bloat was an issue. Also
  166 + added some evolved solutions in comments.
  167 +20101107: - Added Koza's lawnmower problem example; this demonstrates how
  168 + to add a new type/stack on a problem-specific basis, without
  169 + altering clojush.clj.
  170 +20101204: - Added pushgp-map, which allows pushgp calls on maps of arguments,
  171 + and a demonstration of its use in argmap_regression.clj.
  172 + - Added :gen-class and -main definition (thanks Kyle Harrington).
  173 + - Fixed eval-push termination to return :abnormal for exceeding
  174 + time-limit (thanks Kyle Harrington).
  175 +20101205: - Added modified version of Kyle's version of the intertwined
  176 + spirals problem.
  177 + - Minor changes to this README.
  178 +20101208: - Added alternative methods for node selection, used in mutation
  179 + and crossover (drafted by Brian Martin, with suggestions
  180 + from Kyle Harrington). This introduced three new globals:
  181 + global-node-selection-method, global-node-selection-leaf-probability,
  182 + and global-node-selection-tournament-size, each of which holds
  183 + an atom, and three new parameters to pushgp: node-selection-method,
  184 + node-selection-leaf-probability, and node-selection-tournament-size.
  185 + The node-selection-method can be :unbiased (in which case nodes
  186 + are selected using the uniform distribution that was previously
  187 + used -- this is the default), :leaf-probability (in which case
  188 + the value of the node-selection-leaf-probability argument,
  189 + which defaults to 0.1, specifies the probability that leaves,
  190 + as opposed to internal nodes, will be selected -- this is the
  191 + method used by Koza and others in tree-based GP), or
  192 + :size-tournament (in which case the value of the
  193 + node-selection-tournament-size argument, which defaults to 2,
  194 + determines the tournament size for node tournaments, with the
  195 + largest subtree in the tournament set being selected).
  196 +20110111: - Added zipper stack and functions (thanks to Kyle Harrington for
  197 + draft code, although this was re-written).
  198 + - Added registered-nonrandom function.
  199 + - Modified odd.clj example to use registered-nonrandom.
  200 + - Added examples/dsoar.clj, a version of the "Dirt-Sensing,
  201 + Obstacle-Avoiding Robot" (DSOAR) problem first described in:
  202 + Spector, L. 1996. Simultaneous Evolution of Programs and their
  203 + Control Structures. In Advances in Genetic Programming 2, edited
  204 + by P. Angeline and K. Kinnear, pp. 137-154. Cambridge, MA: MIT Press.
  205 + http://helios.hampshire.edu/lspector/pubs/AiGP2-post-final-e.pdf
  206 + This version was written by Brian Martin in 2010-2011.
  207 +20110118: - Added support for tagged_code_<number> instructions. These are like
  208 + tagged_<number> instructions except that retrieved values are pushed
  209 + onto the code stack rather than the exec stack. Without these the
  210 + only way to get tagged values onto the code stack is to wrap
  211 + values with code_quote prior to tagging. An alternative approach
  212 + is to add new tagging instructions that automatically perform
  213 + code_quote wrapping, but for full generality that would require
  214 + new instructions for each type; also quote-tagged values would
  215 + always be destined for the code stack, while the scheme adopted
  216 + here allows any stored value to be retrieved either to exec or to
  217 + code.
  218 + - A value of 0 for the evalpush-time-limit parameter of pushgp
  219 + now means that no time limit will be enforced. This is also
  220 + now the default.
  221 +20110322: - Tag reference bug fixed in closest-association (>= changed to <=).
  222 + - Added mux (multiplexer) example (a couple of approaches in one file).
  223 +20110409: - Added support for no-pop tagging through a var called
  224 + global-pop-when-tagging (holding an atom with a boolean value)
  225 + and a boolean argument to pushgp called pop-when-tagging.
  226 + The defaults are true, for backwards compatibility. If
  227 + @global-pop-when-tagging is false (which will result from
  228 + passing false as a :pop-when-tagging keyword argument to pushgp)
  229 + then executing instructions of the form tag_<type>_<number>
  230 + will tag a value as usual, but the tagged item will not be popped
  231 + from its source stack.
  232 + - Removed no-pop hackage from mux example (thanks Kyle).
  233 +20110424: - Added Gaussian mutation for floating point literals. This is
  234 + a genetic operator on par with ordinary mutation, crossover,
  235 + and simplification, with the probability for applying this operator
  236 + set with the gaussian-mutation-probability argument to pushgp
  237 + (which defaults to zero). The behavior of this operator, when used,
  238 + is controlled by two other arguments to pushgp,
  239 + gaussian-mutation-per-number-mutation-probability (which is the
  240 + probability that any particular floating point number in the
  241 + program will actually be mutated -- this defaults to 0.5) and
  242 + gaussian-mutation-standard-deviation (which specifies the standard
  243 + deviation of the Gaussian noise generator that is used to
  244 + produce changes to numbers -- this defaults to 0.1).
  245 + - Added examples/gaussian_mutation_demo.clj to demonstrate Gaussian
  246 + mutation.
  247 + - Added examples/korns_regression_p12.clj, a symbolic regression
  248 + problem based on Michael Korns's draft chapter from GPTP11.
  249 +20110505: - Added complex number support. New instructions for the 'complex'
  250 + stack include: pop, dup, swap, rot, flush, eq, stackdepth, yank,
  251 + yankdup, shove, rand, add, sub, mult, divide, fromfloat,
  252 + frominteger, fromfloats, fromintegers, conjugate, magnitude,
  253 + and principal_sqrt. (Brian Martin)
  254 +20110517: - Added a "scaled-errors" function to support error-scaling as
  255 + described by Maarten Keijzer in Scaled Symbolic Regression, in
  256 + Genetic Programming and Evolvable Machines 5(3), pp. 259-269,
  257 + September 2004. This must be used in a problem's error function,
  258 + and then the outputs of the evolved program must be "unscaled."
  259 + See the documentation string for scaled-errors and also
  260 + examples/scaled_sextic.clj for details.
  261 + - Added examples/scaled_sextic.clj to demonstrate the use of
  262 + scaled-errors.
  263 + - Changed examples/sextic.clj to use squared errors and an error
  264 + threshold, in order to facilitate comparisons between the
  265 + versions that do and don't use error scaling.
  266 + - Made minor changes to the korns_regression_p12 example.
  267 +20110526: - Enforce size limits on zipper manipulation results.
  268 +20110607: - Added overlap utility function, overlap-demo (which just prints
  269 + some examples to show how overlap works), and code_overlap
  270 + instruction. Overlap can be applied to any two (possibly
  271 + nested) things and it returns a number between 0 (meaning
  272 + no overlap) and 1 (meaning exact match). The overlap utility
  273 + function returns a ratio, but the code_overlap instruction
  274 + pushes a float.
  275 + - Removed complex number support from 20110505. There were previous
  276 + reports of problems and I've noticed problems from the fact that
  277 + (apply + ()) => zero (as opposed to 0) in the clojush namespace
  278 + defined by the code as revised for complex number support. If
  279 + someone knows how to re-introduce complex number support without
  280 + such problems then please let me know.
  281 +20110618: - Switched to Kyle Harrington's version of overlap; it's more clear,
  282 + possibly faster, and may fix a hard-to-trace bug that cropped up
  283 + in a long evolutionary run (?).
  284 +20110624: - Replaced lawnmower and dsoar examples with bugfixed versions
  285 + (thanks to Kyle Harrington).
  286 + - Added namespace and made miscellaneous other changes to
  287 + clojush-tests.clj.
  288 + - Added support for tagged-code macros. Tagged-code macro calls
  289 + have the effect of code instructions, but they take their
  290 + code arguments from the tag space and they tag their code return
  291 + values. They are implemented as macros to leverage the existing
  292 + code instruction set; note that this means that a single call
  293 + will contribute more than one iteration step toward the
  294 + evalpush-limit. Tagged-code macros appear in programs as hash maps
  295 + that map :tagged_code_macro to true, :instruction to a code
  296 + instruction, :argument_tags to a sequence of tags to be used
  297 + to acquire arguments, and :result_tags to a sequence of tags
  298 + to be used for tagging results. Execution of a macro expands
  299 + the needed code onto the exec stack to grab arguments from the tag
  300 + space and push them on the code stack, execute the code instruction,
  301 + and tag results. Note that results will also be left on the code
  302 + stack if global-pop-when-tagging is false. Conceptually, tag values
  303 + are "baked in" to these macros in much the same way that tag values
  304 + are "baked in" to the instruction names for stackless tag
  305 + instructions; we use hash maps simply because there is more
  306 + information to bake in and this prevents us from having to parse
  307 + the names (which would get messy and also waste time). Because
  308 + the maps make it difficult to read programs, however, a utility
  309 + function called abbreviate-tagged-code-macros is provided to
  310 + produce copies of programs with more human-readable (but not
  311 + currently executable) representations of tagged-macro calls.
  312 + A tagged-code-macro-erc is provided to generate random tagged-code
  313 + macros in pushgp runs. A new example, codesize20, provides
  314 + a simple demonstration of the use of tagged-code macros.
  315 + - Replaced walk-based code-manipulation with walklist functions
  316 + that only traverse list structure. This fixes an interaction
  317 + between map literals (e.g. tagged-code macros) and program
  318 + structure.
  319 +20110629: - Fixed abbreviate-tagged-code-macros printing of empty lists.
  320 + - Added seq condition to walklist to permit walking of seqs that
  321 + aren't actually full-fledged lists.
  322 +20110702: - Several fixes/refinements to tagged-code macros:
  323 + - Fixed incorrect no-op of arg-free calls with empty tag space.
  324 + - Added :additional_args to tagged-code macro structure; the
  325 + value should be a list of items and these will be executed
  326 + in order before calling the macro's instruction.
  327 + - Added optional 5th arg to tagged-code-macro-erc; this should
  328 + be a function of zero args that will be called to produce
  329 + the value of :additional_args (e.g. if you want to have one
  330 + random integer arg then you could specify a 5th arg of
  331 + (fn [] (list (lrand-int 101))).
  332 + - Changed format produced by abbreviate-tagged-code-macros to
  333 + handle :additional_args and to be slightly more concise.
  334 +20110714: - Added "trace" argument to eval-push and run-push. If this is
  335 + true then the resulting state will map :trace to a list of
  336 + executed instructions and literals, in reverse order of
  337 + execution. If the argument is :changes then instructions that
  338 + have no effect on the state will be excluded.
  339 +20110809: - Several additions/enhancements by Kyle Harrington:
  340 + - Converted problem-specific-report to a parameter in pushgp.
  341 + - Added reporting of program repeat counts in population.
  342 + - Added "error-reuse" parameter to pushgp for use in stochastic
  343 + and dynamic problems (for which reuse would be turned off).
  344 + - Added examples/mackey_glass_int.clj, a symbolic regression
  345 + problem as described in Langdon & Banzhaf's 2005 paper
  346 + (citation in file).
  347 + - Added examples/pagie_hogeweg.clj problem, a difficult
  348 + symbolic regression problem when coevolution is not used.
  349 + Introduced by Pagie & Hogeweg's 1997 paper (citation in file).
  350 +20110911: - Switched from Eclipse to Clooj/Leiningen for development and
  351 + rearranged the project for this.
  352 + - Added calls to end of all example files.
  353 + - Examples can be run from the OS command line (assuming
  354 + that leiningen is available) with calls like:
  355 + lein run examples.simple-regression
  356 + - Added local-file dependency and used file* for file access.
  357 + - Removed ant and tagged-ant examples because of bugs related
  358 + to confusion of push interpreted states and ant world states.
  359 +20111104: - Added string stack and a variety of string stack instructions.
  360 + - Added two example pushgp runs that use the string stack in
  361 + the file examples/string.clj.
  362 +20111112: - Obsoleted this version history in favor of the commit logs
  363 + at https://github.com/lspector/Clojush/commits/master
  364 +
2  project.clj
... ... @@ -1,4 +1,4 @@
1   -(defproject lspector/clojush "1.2.40"
  1 +(defproject lspector/clojush "1.3.0"
2 2 :description "The Push programming language and the PushGP genetic programming
3 3 system implemented in Clojure.
4 4 See http://hampshire.edu/lspector/push.html"

0 comments on commit aea9168

Please sign in to comment.
Something went wrong with that request. Please try again.