Evolutionary Computing with Push

Lee Spector

Push is a programming language (actually a family of languages) designed for evolutionary computation, to be used as the programming language within which evolving programs are expressed.

The quickest way to become familiar with the core ideas of Push is to watch this video: An Even Quicker Introduction to the Push Programming Language

You can experiment with a Push interpreter in your browser here.

The public-facing pages of the Push Language Discourse site provide additional information.

The reason that it is more accurate to call Push a family of languages than a single language is that it has been the subject of continuous variation and research for many years. Versions of Push have been written in several languages by several people, and each new version has generally added new features, dropped old features, and/or changed naming conventions.

All versions of Push share a stack-based execution architecture with a separate stack for each type, and with types and instructions that permit the run-time manipulation and execution of code.  This allows programs to implement and use arbitrary and potentially novel control structures. This expressiveness is combined with syntactic minimality: the only syntax rule is that parentheses must be balanced. It is therefore trivial to generate and transform syntactically valid Push programs.

The name PushGP is used for any genetic programming system that evolves programs in the Push programming language. PushGP systems have been used for applications ranging from intelligent agent design to automatic quantum computer programming.

Features of most PushGP implementations include:

Other Push-based evolutionary computation systems have been developed, including some that implement autoconstructive evolution. In an autoconstructive evolution system the evolving programs manipulate code to construct their own children, including their children's code for reproduction and diversification. This contrasts with standard genetic programming systems (like PushGP) in which hand-written genetic operators are used to produce children from parents. Many features of the Push programming language were first developed to support autoconstructive evolution, but have turned out to be useful for standard genetic programming as well.

Many Push-related publications can be found on Lee Spector's publications page, including the 2002 article in the journal Genetic Programming and Evolvable Machines that provides an introduction to the general principles and philosophy of the Push project. The GECCO-2005 paper introduced significant new features of Push3, many of which have been maintained through subsequent versions of the language. Additional extensions are described in subsequent publications. Older (in some cases incomplete or obsolete) information is available in the Push Redux, Alan Robinson's Division III (senior) thesis, The Push 2.0 Programming Language Description, The Push 3.0 Programming Language Description, the archives of the inactive Push email list, and the inactive Push project blog.


Code

Push3 and subsequent variants:

Push2:

Push1:


Related Work


Acknowledgments

This material is based upon work supported by the National Science Foundation under Grants No. 0308540, 0216344, 1017817, 1129139, and 1331283. Any opinions, findings, and conclusions or recommendations expressed in this publication are those of the authors and do not necessarily reflect the views of the National Science Foundation.

This project was also supported by the Defense Advanced Research Project Agency (DARPA) and the Air Force Research Laboratory (AFRL) through funding for the project "Multi-type, Self-adaptive Genetic Programming for Complex Applications.