year: 2022/11
paper: https://arxiv.org/pdf/2211.13619
website: https://paulcousin.net/graph-rewriting-automata/introduction.html
code: https://github.com/paulcousin/graph-rewriting-automata
connections: graph, CA, biologically inspired, graph rewriting automata


Example of evolution starting from a simple initial graph:

Indexing configurations.
The number of possible configurations of node+neighbourhood for their undirected, simple, binary, -regular graphs is , since each of the neighbours and the node itself can be either alive or dead.
The following formula gives us indices from , which uniquely identify each configuration:

If a node is dead and has alive neighbours, its configuration index is
If a node is alive and has alive neighbours, its configuration index is
Note: Order of neighbours does not matter since the graph is undirected.

For we have:

0=0+1: dead, 0 alive neighbors
1=0+1: dead, 1 alive neighbor
2=0+2: dead, 2 alive neighbors
3=0+3: dead, 3 alive neighbors
4=4+0: alive, 0 alive neighbors
5=4+1: alive, 1 alive neighbor
6=4+2: alive, 2 alive neighbors  
7=4+3: alive, 3 alive neighbors

Rules.
A rule deterministically maps each configuration the next state of the node, and whether to apply a division: Dead vs. alive, and divide vs. not divide.
Thus, for each configuration, there are 4 possible outputs, leading to a total of possible rules (for , this is possible rules).

The rule function is composed of two functions:

Rules are also indexed. The unique rule number is computed as:

This allows us to represent each rule as a binary string of length , similarly to wolfram code.
Each unique bit position contributes to the total rule number if it’s a 1, and if it’s a 0, just like in standard binary representation. Here, sets the lower half (LSB) of the bits, and sets the upper half (MSB).

Rule for the example given at the top:

(for )
Read the figure from left to right top to bottom, with the rules in pairs:
… there’s only one configuration where division occurs
… there’s only one configuration where a node dies

Implementation.

We compute a configuration vector :

… adjacency matrix of graph
… state vector
… sum of neighbour states for each node

The next state vector is computed as:

Where is applied element-wise to the configuration vector .

Similarily, the division vector is computed as:

Where is applied element-wise to the configuration vector .

Divisions.

Divisions can now be performed one by one as a combination of simple operations on matrices. The first in signals the vertex to divide.
For the state vector, suffice to triple the line corresponding to this vertex.
For the adjacency matrix, both the line and the column must be tripled. Ones then have to be spread across these lines and columns and the intersection must be filled with a sub-matrix containing zeros on the diagonal and ones everywhere else.
Finally, the first 1 in the division vector is turned into a 0 and then tripled. This process must be repeated until D is a null vector.



Results / Exploration.

Search Space.
They exhaustively explore the set of rules with one division.
This set is color symmetric, i.e. swapping alive/dead states gives an equivalent rule with inverted colors.
Hence it’s sufficient to explore half the rules only.
So there are 4 division rules: divides (dead, 0 alive neighbours), … divides (dead, 3 alive neighbours)).
And there are possible survival rules (8 configurations, each can lead to alive or dead).
Hence,

They use an initial graph which contains all configurations, to ensure , i.e. each rule gets a chance.

They classify by growth type using “several methods, mainly the least squares method”:

For halted (cyclic) patterns, they examine the periods:

Future work.

  • using continuous valued or non-binary discrete states (I suppose via function approximation)
  • working with regular (instead of just -regular) graphs
  • working with non-regular graphs (→ scale-free, small-world, etc.)
  • reaching an extended neighborhood with powers of
  • working with directed graphs using and
  • other topology altering operations (pruning, rewiring, …)