7.13. CA Tables¶
The function we have so far works if the CA is “totalitic”, which means that the rules only depend on the sum of the neighbors. But most rules also depend on which neighbors are on and off. For example, 100 and 001 have the same sum, but for many CAs, they would yield different results.
We can make
step2 more general using a window with elements [\(4\), \(2\), \(1\)], which interprets the neighborhood as a binary number. For example, the neighborhood \(100\) yields \(4\); \(010\) yields \(2\), and \(001\) yields \(1\). Then we can take these results and look them up in the rule table.
Here’s the more general version of
def step3(array, i, window=[4,2,1]): row = array[i-1] c = np.correlate(row, window, mode='same') array[i] = table[c]
The first two lines are the same. Then the last line looks up each element from
table and assigns the result to
Here’s the function that computes the table:
def make_table(rule): rule = np.array([rule], dtype=np.uint8) table = np.unpackbits(rule)[::-1] return table
rule, is an integer between \(0\) and \(255\). The first line puts
rule into an array with a single element so we can use
unpackbits, which converts the rule number to its binary representation. For example, here’s the table for Rule 150:
>>> table = make_table(150) >>> print(table) [0 1 1 0 1 0 0 1]
The code in this section is encapsulated in the
Cell1D class, defined in
Cell1D.py in the repository for this book.