5.18 The Relationship between Graphs, and the Multiway Causal Graph

In the course of this section, we have seen various ways of describing and relating the possible behaviors of systems. In many ways the most general is the combined multiway evolution and multiway causal graph.

For the rule

{"A" -> "AB"}

starting from AA this graph has the form:

ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 3, "EvolutionCausalGraph"] // ResourceFunction["LayeredGraphPlot3D"]

Continuing for another step, we have:

ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 4, "EvolutionCausalGraphStructure"] // ResourceFunction["LayeredGraphPlot3D"]

There are several different kinds of descriptions that we can derive from this graph. The standard multiway graph gives the evolution relationship between states:

Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 4, "StatesGraph"], VertexCoordinates -> {{0, 0}, {-1, -1}, {1, -1}, {-2, -2}, {0, -2}, {2, -2}, {-3, -3}, {-1, -3}, {1, -3}, {3, -3}, {-4, -4}, {-2, -4}, {0, -4}, \ {2, -4}, {4, -4}}]

Each possible path through this graph corresponds to a possible evolution history for the system.

The multiway causal graph gives the causal relationships between all events that can happen on any branch. The full multiway causal graph for the rule shown here is infinite. But truncating to show only the part contained in the graph above, one gets:

ResourceFunction[ "MultiwaySystem"][{"A" -> "AB"}, "AA", 4, "CausalGraph"]

Continuing for more steps one gets:

Framed[GraphicsRow[ Subgraph[ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 6, "CausalGraphStructure"], #] & /@ ({Join[#[[1]], #[[3]]], Join[#[[2]], #[[4]]]} &@ ConnectedComponents[ UndirectedGraph[ ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 6, "CausalGraphStructure"]]])], FrameStyle -> LightGray]

From the multiway causal graph, one can project out the specific causal graph for each possible evolution history, corresponding to each possible branch in the multiway system. But for rules like the one shown here that have the property of causal invariance, every one of these specific causal graphs (at least if extended far enough) must have exactly the same structure. For the particular rule shown here, this structure is extremely simple:

ResourceFunction["SubstitutionSystemCausalGraph"][{"A" -> "AB"}, "A", 6]

(In effect, the nodes here are “generic events” in the system, and could be labeled just by copies of the underlying local rule.)

The multiway graph and multiway causal graph effectively give two different “vertical views” of the original graphusing respectively states as nodes and events as nodes. But an alternative is to view the graph in terms of “horizontal slices”. To get such slices we have to do foliations.

But now if we look at horizontal slices associated with states, we get the branchial graphs, which for this rule with this initial condition are rather trivial:

Prepend[Table[ Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", t, "BranchialGraph"], ImageSize -> {400, 30}], {t, 2, 4}], Framed[Graph[ ResourceFunction["MultiwaySystem"][{"A" -> "AB"}, "AA", 1, "BranchialGraph"], ImageSize -> Scaled[1]], ImageSize -> {400, 30}, FrameStyle -> None, FrameMargins -> None]] // Column

In principle we could also ask about horizontal slices associated with events. But by construction the events analog of the branchial graph must just consist of a collection of complete graphs.

However, a particular sequence of slices through any particular causal graph defines an actual sequence of states for the underlying system, and thus a possible evolution history, such as:

SubstitutionSystem["A" -> "AB", "AA", 4]

As a slightly cleaner example with similar behavior, consider the rule:

{"A" -> "AB", "A" -> "BA"}

The combined multiway evolution and multiway causal graph in this case is

ResourceFunction["MultiwaySystem"][{"A" -> "AB", "A" -> "BA"}, "A", 4, "EvolutionCausalGraph"]

and the individual multiway evolution and causal graphs are both regular 2D grids:

Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", "A" -> "BA"}, "A", 9, #], GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> 1/2, ImageSize -> 300] & /@ {"StatesGraphStructure", "CausalGraphStructure"}

The rules we have used as an example so far have behavior that is in a sense fairly trivial. But consider now the related rule with slightly less trivial behavior:

{"A" -> "AB", "B" -> "A"}

For this rule, the combined multiway evolution and causal graph has the form:

Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, "A", 6, "EvolutionCausalGraphStructure"], GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> 1/2]

On their own, the state evolution graph and the event causal graph have the forms:

Graph[ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, "A", 6, #], GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> 1/2, ImageSize -> 230] & /@ {"StatesGraphStructure", "CausalGraphStructure"}

The sequence of branchial graphs is:

Table[Graph[ ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, "A", t, "BranchialGraphStructure"], ImageSize -> 80], {t, 2, 6}]

This rule is causal invariant, and so the multiway causal graph decomposes into many identical copies of causal graphs for all individual possible paths of evolution. In this case, these graphs all have the form:

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

But even though the multiway causal graph can be decomposed into identical pieces, it still contains more information than any of them. Because in effect it describes not only “spatial” causal relationships between events happening in different places in the underlying string, but also “branchial” causal relationships between events happening on different branches of the multiway system.

And just like for other graphs, we can study the large-scale structure of multiway causal graphs. We can define a quantity which is the multiway analog of the cone volume Ct for individual causal graphs. For the rule shown here, the various graph growth rates (as computed with our standard foliation) have the forms:

GraphicsGrid[Partition[ ListLinePlot[ Most[ResourceFunction["RaggedMeanAround"][ Values[ResourceFunction["GraphNeighborhoodVolumes"][ #[[1]]]]]], Frame -> True, Epilog -> Text[Style[TraditionalForm[#[[2]]], GrayLevel[.2], 12, Italic, FontFamily -> "Source Serif Pro"], Scaled[{0.12, 0.85}]], PlotStyle -> ResourceFunction["WolframPhysicsProjectStyleData"][ "GenericLinePlot", "PlotStyles"]] & /@ { {ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, {"A"}, 12, "StatesGraph"], Subscript["M", "t"]}, {ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, {"A"}, 12, "BranchialGraph"], Subscript["B", "b"]}, {ResourceFunction["SubstitutionSystemCausalGraph"][{"A" -> "AB", "B" -> "A"}, "A", 8], Subscript["C", "t"]}, {ResourceFunction["MultiwaySystem"][{"A" -> "AB", "B" -> "A"}, {"A"}, 10, "CausalGraph"], Subsuperscript["C", "t", "M"]}}, 2], ImageSize -> 400]

As another example, consider the “sorting” rule

{"BA" -> "AB"}

starting from BABABABA. The combined multiway evolution and causal graph has the (terminating) form:

Graph[ResourceFunction["MultiwaySystem"][{"BA" -> "AB"}, StringJoin[Table["BA", 4]], 10, "EvolutionCausalGraphStructure"], GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> 1/2]

The multiway evolution and causal graphs on their own are:

Graph[ResourceFunction["MultiwaySystem"][{"BA" -> "AB"}, StringJoin[Table["BA", 4]], 10, #], GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> 1/2, ImageSize -> 230] & /@ {"StatesGraphStructure", "CausalGraphStructure"}

The branchial graphs are

Table[Graph[ ResourceFunction["MultiwaySystem"][{"BA" -> "AB"}, StringJoin[Table["BA", 4]], t, "BranchialGraphStructure"], ImageSize -> 60], {t, 1, 8}]

and the causal graph for a single (finite) path of evolution is:

TreePlot[ResourceFunction[ "SubstitutionSystemCausalGraph"][{"BA" -> "AB"}, StringJoin[Table["BA", 4]], 12], Center]

Earlier in this section we looked at the multiway evolution graphs generated by all 12 inequivalent 2: 12, 11 rules. The pictures below now compare these with the multiway causal graphs for the same rules (starting from all possible length-3 strings of As and Bs, and run for 4 steps of our standard multiway foliation):

Function[r, GraphicsRow[ ResourceFunction["MultiwaySystem"][r, ResourceFunction["StringTuples"]["AB", 3], 4, #] & /@ {"StatesGraphStructure", "CausalGraphStructure"}, ImageSize -> 200, Frame -> All, FrameStyle -> LightGray]] /@ ResourceFunction["EnumerateSubstitutionSystemRules"][{1 -> 2, 1 -> 1}, 2]

The multiway causal graph is in some ways a kind of dual to the multiway evolution graphresulting in many similarities among the graphs in the pictures above. Like Mt for multiway evolution graphs, for multiway causal graphs typically seems to grow either polynomially or exponentially.

But even in a case like the rule

{"AA" -> "AAA"}

where the causal graph for a single evolution has the fairly regular form

ResourceFunction["SubstitutionSystemCausalGraph"][ "AA" -> "AAA", "AA", 11]

the full multiway causal graph is quite complex. This shows how it builds up over the first few steps (in our standard multiway foliation):

Table[Graph[ ResourceFunction["MultiwaySystem"][{"AA" -> "AAA"}, "AA", t, "CausalGraph"], GraphLayout -> "SpringElectricalEmbedding"], {t, 1, 5}]

And here are 3D renderings after 8 and 9 steps:

Graph3D[ResourceFunction["MultiwaySystem"][{"AA" -> "AAA"}, "AA", #, "CausalGraphStructure"], GraphLayout -> "SpringElectricalEmbedding", ImageSize -> 260] & /@ {8, 9}