One of the simplifying features of the rule BA AB discussed in the previous subsection is that for any finite initial condition, it always evolves to a definite final state after a finite number of steps—so it is possible to construct a complete multiway causal graph for it, and for example to verify that all the causal graphs for specific paths of evolution are identical.

But consider the rule {*A* BB, *B* *A*}:

ResourceFunction["MultiwaySystem"][{"A" -> "BB",
"B" -> "A"}, "A", 5, "StatesGraph"]

This rule is causal invariant, but never evolves to a definite state, and instead keeps growing forever. Including events in the evolution we get:

ResourceFunction["MultiwaySystem"][{"A" -> "BB",
"B" -> "A"}, "A", 5, "EvolutionEventsGraph"]

The corresponding multiway causal graph is:

ResourceFunction["MultiwaySystem"][{"A" -> "BB",
"B" -> "A"}, "A", 5, "CausalGraph"]

And now if we extract possible individual causal graphs from this, we get:

LayeredGraphPlot[EdgeList[#], ImageSize -> {40, 40},
VertexStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph",
"VertexStyle"],
EdgeStyle ->
ResourceFunction["WolframPhysicsProjectStyleData"]["CausalGraph",
"EdgeStyle"]] & /@
ResourceFunction["MultiwaySystem"][{"A" -> "BB", "B" -> "A"}, "A", 5,
"CausalGraphInstances"]

These look somewhat similar, but they are not directly equivalent. And the reason for this has to do with how we are “counting steps” in the evolution of our system. If we evolve for longer, the effect becomes progressively less important. Here are causal graphs generated by a few different randomly chosen specific sequences of updates (each corresponding to a specific path through the multiway system):

Table[SeedRandom[4252 + n];
LayeredGraphPlot[
ResourceFunction["MultiwaySystem"][{"A" -> "BB", "B" -> "A"} ->
"Random", "A", 12, "CausalGraph"],
ImageSize -> {Automatic, 320}], {n, 4}]

Here are the corresponding results after a few more updates:

Table[SeedRandom[4252 + n];
LayeredGraphPlot[
ResourceFunction["MultiwaySystem"][{"A" -> "BB", "B" -> "A"} ->
"Random", "A", 70, "CausalGraphStructure"],
ImageSize -> {Automatic, 140}], {n, 4}]

This is a different rendering:

Table[SeedRandom[4252 + n];
TreePlot[ResourceFunction[
"MultiwaySystem"][{"A" -> "BB", "B" -> "A"} -> "Random", "A", 70,
"CausalGraphStructure"], Center,
ImageSize -> {Automatic, 120}], {n, 4}]

And this is what happens after many more updates (with a somewhat more systematic ordering):

TreePlot[ResourceFunction[
"SubstitutionSystemCausalGraph"][{"A" -> "BB", "B" -> "A"}, "A",
6], Center]

If we continued for an infinite number of updates, all these would give the same result—and the same infinite causal graph, just as we expect from causal invariance. But in the particular cases we are showing, they are being cut off in different ways. And this is directly related to the causal foliations we discussed in the previous subsection.

Here are examples of evolution with specific choices of updating orders:

SeedRandom[242444]; GraphicsRow[
Table[ResourceFunction["SubstitutionSystemCausalPlot"][
ResourceFunction["SubstitutionSystemCausalEvolution"][{"A" -> "BB",
"B" -> "A"}, "A", 10, {"Random", 4}], EventLabels -> False,
CellLabels -> True], 3], ImageSize -> Full]

Adding causal graphs we get:

SeedRandom[242444]; GraphicsRow[
Table[ResourceFunction["SubstitutionSystemCausalPlot"][
ResourceFunction["SubstitutionSystemCausalEvolution"][{"A" -> "BB",
"B" -> "A"}, "A", 10, {"Random", 4}], EventLabels -> False,
CellLabels -> False, CausalGraph -> True], 3], ImageSize -> Full]

Here is what happens if we continue these for longer:

SeedRandom[242444]; GraphicsRow[
Table[ResourceFunction["SubstitutionSystemCausalPlot"][
ResourceFunction["SubstitutionSystemCausalEvolution"][{"A" -> "BB",
"B" -> "A"}, "A", 30, {"Random", 4}], EventLabels -> False,
CellLabels -> False,
"ColorTable" -> {GrayLevel[0.8], GrayLevel[0.65]},
ImageSize -> Medium], 3], ImageSize -> Full]

And here are the causal graphs that correspond to these evolutions:

SeedRandom[242444]; GraphicsRow[
Table[LayeredGraphPlot@
ResourceFunction["SubstitutionSystemCausalGraph"][
ResourceFunction[
"SubstitutionSystemCausalEvolution"][{"A" -> "BB", "B" -> "A"},
"A", 30, {"Random", 4}]], 3], ImageSize -> Full]