Project 2 Activation/Inhibition Cellular Automaton

Programming language

You can use whatever programming language you want. In the past, students have used languages such as C, Java, Python, and Matlab. Warning about Python: several past students preferred programming in Python, however, some of them had issues with their programs taking a long time to run, which is even more of a problem given that you will need to run quite a few experiments. This project requires that you implement a 30x30 structure, and it seems that Python has trouble handling this. So if you choose to use Python, be sure to start early!

Setting up your code

The CA is two dimensional and the space is 30 units in each dimension. The most straight-forward way to represent this space is with a 30x30 array of integers, where each cell contains either 1 or -1. At the beginning of the program, randomly initialize each cell to 1 or -1.

You will also want to keep track of the correlation and mutual information at each possible radius. Probably the easiest way to do this is to use a 15 element array of doubles for each of the three measures. The 15 elements account for each of the possible radii (distances), 0 to 14.

You will also want to keep track of overall entropy and (for 527 students) correlation length (lambda). These variables and the ones mentioned above should all be global.

In order to help automate the process of collecting data, it will be helpful to take in all the parameters on the command line. This includes J1, J2, h, R1, R2, and possibly an ID number for the experiment/run that you are executing so that you can properly name any data files your code will write.

You will also need to average over several runs for each set of parameters that you test. Four runs for each should be enough. Each run should have a different random initial state. You may want additional data structures to keep a running total of individual runs so that you can compute their averages for each of the measures.

Displaying the AICA structure

In order to support your analysis and observations of AICA behavior, it will be very helpful to be able to view the structures generated by a particular set of parameters. Including several of these images in your report will enhance your qualitative analysis of the AICAs.

One way to create an image representing an AICA is to use ASCII art. Simply print the contents of your 30x30 grid to the screen. It the value of the cell is -1, print a space, and if the cell's value is 1, print a *.

A better way of creating an image depicting the AICA is to write code to make a .pgm file. For this, you will need a routine to write data to a file. The top line of the file should read "P2", the second line should read "30 30", and the third line should read "255" (no quotes). The remaining lines will contain the pixel values of the image. Iterate through each cell of your 30x30 grid, and if the cell's value is 1, print "0 " (black) to the file, and if the cell's value is -1, print "255 " (white) to the file. Be sure to include a space after each pixel value, and also write a new line to the file after each row of the grid.

The problem with the .pgm image is that it is only 30x30 pixels and therefore too small to see. One way to fix this is to enlarge the image using an image editing program. Another way is to convert the .pgm image to .jpg format and display it in a web page where the height and width can be specified as in the following command

<img src="myimage.jpg" height=100 width=100 border=1>

Another advantage to creating a web page to display the image is that you can display several images at once, making it easier to compare images with one another. Using this technique will produce images like the following examples.

Calculating distance between cells

The distance between two cells is given as the sum of the absolute difference of the x coordinates and the absolute difference of the y coordinates, as in the formula

The i and j are the two cells, and the subscripts 1 and 2 denote the x and y coordinates.

In computing the absolute difference of the x coordinates, first calculate the absolute value of their difference. If this value is <= 15, then keep it as it is. If this value is > 15, then subtract it from 30. This accounts for the fact that the space is a torus where the cell indices are wrapped around on the top and bottom and the left and right sides. Use this same technique to compute the absolute difference of the y coordinates. Then just add these two absolute differences to get the overall distance between the two cells.

Updating the grid

Before you compute any of the measures, you first need to let the AICA converge using the following update rule

This indicates what state cell i should be in at time step t+1. It is based on the state of the cell and its neighbors at time step t. The first term in the brackets is the bias factor h. The second term gives the effect of nearby cells and the third term denotes the influence of cells that are farther away.

The cells will be updated one at a time (asynchronously) as opposed to updating them all at once. So the second cell that gets updated will depend on the update of the first cell, the third cell to be updated will depend on the updates of the first and second cell, and so on. You will want to keep track of which cells have been updated. A 30x30 array of 0's and 1's corresponding to the grid will work.

The updating process can be implemented with a while loop that runs until all cells have been updated. First, randomly choose a cell that has not yet been updated. Then for this randomly chosen cell, iterate through all the other cells of the grid, computing the distance between the two cells. If this distance is < R1, add it to a running total for near cells, and if the distance is >= R1 and < R2, then add it to the running total for far away cells. This is how you build the two summations that are in the update formula. Once you've iterated through all the other cells, multiply the near sum by J1, multiply the far sum by J2, then take the sum of these two products and h to obtain the value in the brackets of the update formula. If this value is nonnegative, then the new state of the cell to be updated is 1, otherwise, it is -1.

This updating process is repeated until no cell in the grid has been changed from a given time step to the next. So there are actually two nested while loops involved. The inner loop goes until all cells have been updated, and the outer loop goes until no cell has changed (i.e. the AICA has stabilized). It should only take a few iterations for the AICA to stabilize.

Calculating correlation

The correlation at each possible distance (0 to 14) is calculated according to the formula

The first term sums over all pairs of distinct cells i and j and the second term just sums over all cells i. These sums can be accumulated together through a series of nested for loops. The outermost for loop iterates through all possible distances l (0-14). Inside this loop, you will iterate through every cell i of the grid. For each of these cells i, you will iterate through all the cells again, these being with subscript j. You need to be careful that you don't double count cells in your calculations. You can avoid this by including a conditional on the indices of the grid cells i and j. If the two row indices are the same, make sure that the column index of cell j is greater than the column index for cell i. This will reject any duplicate cells. After the index check, compute the distance between cells i and j. If it's the same as the current distance of the outer for loop, then add the product of the values of cells i and j to a running total. This will eventually be the value of the summation in the first term of the correlation formula. Also within this for loop structure, accumulate the sum of the values for cell i. After iterating through all the cells, multiply the summations by the proper coefficients according to the correlation formula above. Note that N is 30 and that Cl is 4l, where l is the current distance (outer for loop variable). Note that if the distance is 0, then the formula simplifies to

Calculating correlation length (lambda) (427 and 527 students)

Correlation length is a measure of how quickly correlation decreases with distance, that is, how far away cells must be to have less effect on each other. Compute this after you have already computed the correlation for each distance, pl. Then iterate through the correlations of each distance, and find the one that is closest to p0/e. The distance where this happens is the value lambda. It will be given by the index of the correlation array.

Calculating entropy

First go through each cell in the grid and accumulate the sum of the converted cell values. To convert the value of a cell, add 1 to it, then divide by 2. This will be for cell i.

Then compute the probability of state value 1 and the probability of state value -1 as follows

Then use these to compute the overall entropy H(S) as follows

Note: If Pr{+1} or Pr{-1} is 0, then let their corresponding term in the formula for H(S) be 0. This will avoid trying to take the log of 0, which is undefined.

Calculating joint entropy

The joint entropy will be computed for each possible distance l (0 to 14). Use the same nested for loop structure as in the computation of correlation and also use the cell index checking logic for avoiding counting cells twice. Inside all these nested for loops, compute the following

After iterating through all the cells, compute the following

Again, use the technique of avoiding taking the log of 0 as described above.

Finally, all the pieces can be combined to obtain the joint entropy for the given distance

Calculating mutual information

This is very straight-forward. Iterate through each possible distance l (0 to 14) and compute the mutual information for each distance as follows

Collecting data

To reduce the amount of tedium, it is a good idea to write the values of all the measures to a file. If you create a .csv file with this data, it can be easily opened in Excel where you can feed it into a graph. The file would contain the values for the parameters J1, J2, h, R1, and R2, as well as the values for all the measures you compute, including correlation, correlation length, overall entropy, and mutual information. It would contain these values for each of the distances l. Note that these values would actually be the averages over the number of runs you do for each set of parameters (probably around 4 runs each).


The objective is to test several different combinations of the five parameters and investigate their effect on the quantitative measures and the qualitative behavior of the system. The more parameter combinations you try, the higher grade you can earn. When I took this class, I tested a total of 90 different combinations. There are three top level experiments, each of which will contain their own set of sub experiments. Following are guidelines for choosing different sets of parameters.

Experiment 1 (extra credit for 420/427/527): Disable the inhibition system by setting J2=0 and J1=1. This means that R2 has no effect on the system, so the system only depends on R1 and h. You can try several different values for R1 (eg. 1, 3, 6, 10, 14) and for each of those, try different values of h starting at 0, and expanding in the positive and negative direction until you don't see any different behavior or you get an AICA with all 1's or all -1's.

Experiment 2 (extra credit for 420/427/527): Disable the activation system by setting J1=0 and J2=-0.1. This time, vary h, R1, and R2. For several tests you can fix one parameter (say R1) and then try several combinations with R2 and h. Note that R2 should always be greater than R1.

Experiment 3: Enable both activation and inhibition by setting J1=1 and J2=-0.1. Again, try different combinations of R1, R2, and h.

Here is a partial listing of possible experiments to run to give you the idea of how to vary the parameters. These are all for experiment 3, so J1=1 and J2=-0.1.

1. R1=1, R2=2, h=0
2. R1=1, R2=5, h=-4
3. R1=1, R2=5, h=-2
4. R1=1, R2=5, h=0
5. R1=1, R2=5, h=2
6. R1=1, R2=5, h=4
7. R1=1, R2=9, h=-6
8. R1=1, R2=9, h=-3
9. R1=1, R2=9, h=0
10. R1=1, R2=9, h=3
11. R1=1, R2=9, h=6
12. R1=1, R2=14, h=-6
13. R1=1, R2=14, h=3
14. R1=1, R2=14, h=0
15. R1=1, R2=14, h=3
16. R1=1, R2=14, h=6
17. R1=3, R2=5, h=-1
18. R1=3, R2=5, h=0
19. R1=3, R2=5, h=1
20. R1=3, R2=9, h=-6
21. R1=3, R2=9, h=-3
22. R1=3, R2=9, h=0
23. R1=3, R2=9, h=3
24. R1=3, R2=9, h=6
25. R1=3, R2=14, h=-6
26. R1=3, R2=14, h=-3
27. R1=3, R2=14, h=0
28. R1=3, R2=14, h=3
29. R1=3, R2=14, h=6
30. R1=7, R2=9, h=-1
31. R1=7, R2=9, h=0
32. R1=7, R2=9, h=1
33. R1=7, R2=14, h=-3
34. R1=7, R2=14, h=0
35. R1=7, R2=14, h=3
36. R1=12, R2=14, h=-2
37. R1=12, R2=14, h=0
38. R1=12, R2=14, h=2
Note the systematic way of varying R1, R2, and h. If you fix all parameters but one, the effect of the one parameter that does vary will be much more evident. You can draw conclusions such as "as R1 increases, the structures get farther apart" or "the system is more chaotic when R1 and R2 are close." Note that these example conclusions may not describe the actual behavior, they are just for demonstration purposes.

Note: It would be a good idea to eliminate the cases of all black and all white from your experiments and/or report since these cases are uninteresting. You can actually have your code check for this by seeing if the cells in the grid are all 1s or all -1s.

Expected ranges of values for the quantitative measures:

Here is what you should expect for the range of values for each of the 3 measures:

Correlation (rho_l): [0, 1]
Joint entropy (H_l): [0, 2]
Mutual information (I_l): [0, 2]

These ranges hold for each of the 3 kinds of experiments.

You should not get any high numbers for these, such as 50 or 80. If you do, then something is wrong with your code.

You should also never get any negative values for any of these measures. Of course, if you get NaN for anything, this is also incorrect. Be sure you are not trying to take the log of 0 or a negative number.

Generating plots of the quantitative measures

You need to create plots for correlation and mutual information for most of your parameter combinations. If you wrote your data to a .csv file, this should be fairly easy to do in Excel. Below is an example of a graph and a visual representation of the corresponding AICA. (This graph includes joint entropy, which you do not need to plot.)


Correlation and mutual information are plotted on the same graph to facilitate comparison. The values on the x axis are the possible distances between cells (0 to 14). Part of your analysis might be to find correlations between the shape of the curves in the graphs and the structures in the images.

(Revised 2016-02-12)