Utility for computing.
Very simple computation utility for entropy and mutual information on small one-dimensional classical cellular automata (CCA).
sim_cca is a python3 package. If you have all dependencies available, no installation will be necessary. Otherwise, you can install them manually as follows:
pip install docopt numpy sympy
This will also be done automatically, if you run the setup script (requires setuptools):
python setup.py install
The setup script installs an executable named sim_cca. If you didn’t install just use python -m sim_cca instead of plain sim_cca:
Usage: sim_cca [-r RULE] [-a SIZE] [-s COUNT | -p | -n] QUANTITIES... Options: -a SIZE, --alphabet SIZE Alphabet size [default: 2] -r RULE, --rule RULE Local update rule [default: a,b: a^b] -s COUNT, --samples COUNT For monte-carlo mode -p, --picture Draw a picture -n, --numeric Numeric calculations
The -r RULE argument can be any valid lambda expression. Its arguments are the cells neighbors from left to right.
Use the -a SIZE option if you want each cell to have more than two possible states.
The QUANTITIES signify what shannon information measures should be computed. For examples, see below.
The other options specify which of the four available modes should be used:
Use the -p flag to verify that cells are labeled as expected:
$ sim_cca -r 'a,b: a and b' 'I(B0:C1:A1)' -p -- A1 -- B0 -- C1
Note, how the graph shows only that portion of the CCA required for the computation of all cells mentioned in the QUANTITIES parameter.
This mode allows to calculate Shannon information measures on very small CCAs exactly. The input distribution is assumed to be uniform and mutually independent. This is the default mode. Example:
$ sim_cca -r 'a,b: a and b' 'I(B0:B2|B1)' 'H(B1)' I(B0:B2|B1) = -5*log(5)/4 + 3*log(3)/4 + 7*log(2)/4 H(B1) = -3*log(3)/4 + 2*log(2)
This mode is unusable for larger CCAs, because its execution time goes exponentially in the number of possible input configurations.
This essentially is equivalent to the symbolic mode, except that the computation and result is based on floating point values. It should be slightly more performant and have less loading overhead. Use the -n option to request this mode. Example:
$ sim_cca -r 'a,b,c: (a ^ b) or c' 'I(B0:B2)' -n I(B0:B2) = -2.220446049250313e-16
Feel free to consider small values around 10^-16 to be zero.
This mode should be applicable to somewhat larger grids, but will naturally yield inaccurate results. All that it does is to repeatedly evolve the CCA on randomly sampled input configurations. The mode is used if the number of samples is passed via the -s COUNT argument:
$ sim_cca -r 'a,b,c: (a ^ b) or c' 'I(B0:B2)' -s 1000 I(B0:B2) = -2.220446049250313e-16
In general, a cell name consists of a letter and a number. The letter signifies the time starting at A (t=0) and the number labels the spatial index. If the update rule has an uneven number of arguments, there should be no confusion. The labeling is as follows:
A0 A1 A2 B0 B1 B2 C0 C1 C2
Assuming 3 function arguments, B1 is a function of (A0,A1,A2) B1 = f(A0,A1,A2) and is a parent of C0, C1 and C2.
If the update rule has an even number of arguments, the cells at odd time steps should be imagined interleaved, for example:
A0 A1 A2 B0 B1 B2 C0 C1 C2
Assuming 2 function arguments, B0 is a function of (A0,A1) and is preliminary for the computation of C0 and C1.