SourceFiles.org - Use the Source, Luke
Home | Register | News | Forums | Guide | MyLinks | Bookmark

Related Sites

Latest News
  General News
  Reviews
  Press Releases
  Software
  Hardware
  Security
  Tutorials
  Off Topic


Back to files

Summary

A generic and fairly complete cellular automata simulation engine.

Overview

CAGE is a fairy generic and complete cellular automaton simulation engine in Python. It supports both 1D and 2D automata, a variety of prepackaged rules, and the concept of "agents" which can move about independently on the map for implementing agent behavior.

CAGE comes with numerous examples of fully-functional CA systems, including Conway's Game of Life, Langton's self-reproducing automaton, Langton's "vants," and 1D automata rule explorers. It also comes with simple displayers (including a curses interface for 2D automata). Also included is a unique implementation of a finite state machine (ant.py).

Note that CAGE is implemented entirely in Python, and due to its very generalized nature, is not designed for speed. It is sufficient to update a 80x24 Conway's Game of Life grid at a few times per second on a modern machine. CAGE is intended primarily as an education toolkit, rather than an industrial-strength CA simulator.

Getting the software

The current version of cage is 1.1.3.

The software is available in a tarball here: "http://www.alcyone.com/software/cage/cage-latest.tar.gz", http://www.alcyone.com/software/cage/cage-latest.tar.gz.

The official URL for this Web site is "http://www.alcyone.com/software/cage/", http://www.alcyone.com/software/cage/.

License

This code is released under the "LGPL", http://www.gnu.org/copyleft/lesser.html.

Introduction

In very general terms, a cellular automaton has the following key

features
  • time is measured in discrete steps, called time units;
  • a network of cells, each of which with a well-defined state at each time unit;
  • at each time unit, each cell has a series of other cells which constitutes its neighorhood;
  • the state each of cell changes according to a state transition function which depends on the state of that cell and the states of the cells of its neighbors;
  • in synchronous automata (the typical usage), all cell transitions take place simultaneously.

In most cellular automata (and most textbook definitions), the cellular network is arranged into a rigid lattice (i.e., a line or a grid), and for any given cell its neighborhood is constant (that is, the same for all time steps). These assumptions, however, are not present in CAGE.

CAGE employs the following abstractions of the cellular automaton model (and classes):

**State** -- The state of a cell is repesented with an integer from 0 to N, where N is the total number of allowed states.

**Address** -- An address is merely a tuple of one more integers that represents the location of a cell in a given topology.

**Dimensionality** -- The number of elements of the tuple in an

      address; this must match the dimensionality of the topology
      being used.

**Topology** -- Topologies determine the arrangements of cells in

      a network.  Topologies can be bounded (where they have an edge,
      and any addresses off that edge are taken as having some
      background state), or unbounded (usually where they wrap around
      on themselves, such as for the surface of a sphere).  Topologies
      have the ability to normalize addresses, and additionally can
      make morphologically identical clones of the same size and shape
      (not necessarily their actual cellular states) for synchronous
      automata that need to maintain multiple topologies for the sake
      of simultaneous update.  Note:  Topologies and neighborhoods
      are intended to be used as mixin classes, in order to make maps
      that automatas use.

**Neighborhood** -- Neighborhoods encapsulate the translation of

      addresses (not cell states) to a list of their neighbors, taking
      into account the topology they are connected with.  The abstract
      Neighborhood class also supports a wide variety of helper
      methods (which need not be overridden) in order to help do
      common operations with neighborhoods, such as finding neighbors
      in a given state, summing the states of all neighbors, etc.
      Some automata make a distinction between inclusive and exclusive
      neighborhoods -- inclusive ones include the cell itself (whose
      neighborhood is being computed), whereas exclusive ones do not.
      CAGE does not make this distinction; some helper methods support
      an optional inclusive argument for making this distinction; the
      list of neighboring addresses should never include an address
      consisting of all zeroes.  Note:  Topologies and neighborhoods
      are intended to be used as mixin classes, in order to make maps
      that automatas use.

**Map** -- The Map is the high-level class that the Automaton uses

      in order to do operations on the cellular network, intended to
      be a mixing of a Topology and a Neighborhood.

**Automaton** -- The Automaton class is the core of the CAGE

      system.  An Automaton knows how to update itself each turn; this
      is the primary class which does the busy work of processing a
      cellular automaton system.  Typically the Automaton class stores
      a map, and has a rule method that specifies the transition
      function.  There is no restriction that an Automaton must house
      exactly one map; for an agent-based automata it might store
      none, or for interacting automata overlaid on top of each other
      it might store several.

**SynchronousAutomaton** -- A synchronous automaton is one in

      which all processing is done simultaneously -- that is, during
      the processing of an update, the transitions of any given cell
      will not affect the transition of any other cell.  For this to
      be accomplished, the SynchronousAutomaton creates and stores a
      clone of the map in order to act as a work area, and the real
      and work maps are swapped when processing is complete.
      Most cellular automata are typically synchronous.

**Rule** -- The rule class is an optional mixin class (intended to

      be mixed into an Automaton) which implements generic rules that
      are independent of topology, neighborhood, and/or
      dimensionality.

**Agent** -- CAGE supports the concept of agents, which are

      individual objects that can interact with the automata
      independently of a cell.  Agents typically have a location
      (specified as an address) and a direction, which allow them to
      move freely over an underlying automata topology (though
      strictly speaking it is not necessary for one to exist).  This
      allows simulation of, for instance, Langton vants, or ants which
      drop pheromones, and so on.

**Direction** -- To facilitate implementing independent agents,

      CAGE also introduces the abstraction of a direction, which
      allows agents to specify a facing.  Directions are subclassed
      according to the topology and neighborhood they would be most
      appropriate for.  Directions have a facing, as well as an
      advance method which allows agents to move along the direction
      specified.

**Initializer** -- An initializer is used to set the initial

      states of an automaton map to the desired settings before the
      automaton begins.

**Player** -- Finally, a player represents the abstraction that

      displays an automaton on the screen.  Two main classes are
      provided, a LinePlayer for use with 1D automata, and a
      CursesPlayer, which uses curses to display 2D automata and a
      simple user interface.  Also included is an ImagePlayer, which
      uses "PIL",
      http://www.pythonware.com/library/pil/handbook/index.htm to
      render a "movie" of a 1D automaton.  Players support a size
      attribute that can be passed into a map/automaton constructor
      that supports dynamic sizing of the map to the terminal size;
      for this reason, a Player is constructed, and then an Automaton
      is constructed with its size attribute; this allows the Player
      to give feedback to the Automaton, so that, for instance, the
      screen size can be autodetected by the Player.

Known issues

  • CAGE is not designed for speed, and probably never will be. It is designed primarily for educational or experimental purposes. However, given the speed issues, some in-Python optimizations might be in order, such as support for only updating dynamically-resizing regions for automata with largely quiescent states, to reduce processing overhead. Since speed itself is not the primary concern, this is a fairly low priority, however.
  • Only 1- and 2-dimensional topologies are truly supported, although the core system could be easily extended to support 3- or higher-dimensional automata. Visualization, of course, would present a problem.
  • There is strictly no need for states to be represented as integers, perhaps the concept of a state could be generalized to include any object which support the required operators (integers, rationals, floats, even vectors).

Wish list

  • Use of NumPy for faster array access.
  • For interactivity, help screens in the CursesPlayer and the like are probably warranted.
  • A more uniform form of invocation of each of the sample automata, e.g., command command line arguments for specifying the neighborhood, boundary conditions, number of states, and so on, via command lines.
  • An obvious enhancement would be a module which can read and write standard cellular automata pattern file formats.
  • An interactive graphical Player would be a good idea, maybe using Tkinter one of the other user interface libraries.
  • More examples, especially of Agent-based automata, are warranted. Some of the systems described in the first few chapters of A New Kind of Science, for instance, are promising.
  • A sort of reverse map for agents would be a good idea, so that automata with the need to lookup agents at a particular address would be easier to write.

References

  • Cellular Automata Machines, Toffoli, Margolus.
  • Cellular Automata and Complexity, Wolfram.
  • Cellular Automata: Theory and Experiment, Gutowitz (ed.).
  • A New Kind of Science, Wolfram.

Release history

  • 1.1.3; 2003 Oct 5. Fix AsynchronousAutomaton updating method; add a chain reaction demo; changed license to LGPL.
  • 1.1.2; 2002 Nov 4. Workaround for reported crashes on some Linux systems in either curses or the Python curses glue layer.
  • 1.1.1; 2002 Jul 23. The Conway automaton inadvertently defaulted to "high life" instead of the standard rule.
  • 1.1; 2002 Jul 21. More examples, much better abstraction of dimensionality, PointInitializers, simple ImagePlayer (using PIL) and rule 110 example, concept of Rule mixins, 1D nontotalistic and totalistic rule examples, separation of concept of "icon" from Automaton classes.
  • 1.0; 2002 Mar 29. Initial release.

Author

This module was written by "Erik Max Francis", http://www.alcyone.com/max/. If you use this software, have suggestions for future releases, or bug reports, "I'd love to hear about it", mailto:software@alcyone.com.

Version

Version 1.1.3 $Date: 2003/10/05 $ $Author: max $


Other Sites

Discussion Groups
  Beginners
  Distributions
  Networking / Security
  Software
  PDAs

About | FAQ | Privacy | Awards | Contact
Comments to the webmaster are welcome.
Copyright 2006 Sourcefiles.org All rights reserved.