# 6.2 Multiway Systems for Our Models

Just like for the string substitution systems of section 5, we can construct multiway systems [1:5.6] for our models, in which we include a separate path for every possible updating event that can occur:

ResourceFunction["MultiwaySystem"][ "WolframModel" -> {{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}}, {{{0, 0}, {0, 0}}}, 2, "EvolutionEventsGraph", VertexSize -> {0.9972222222222222`, 0.29916666666666664`}] // LayeredGraphPlot

For string systems, it is straightforward to determine when states in the system should be merged: one just has see whether the strings corresponding to them are identical. For our systems, it is more complicated: we have to determine whether the hypergraphs associated with states are isomorphic [85], in the sense that they are structurally the same, independent of how their nodes might be labeled.

Continuing one more step with our rule, we see some cases of merging:

CloudGet["https://wolfr.am/LmHho8Tr"]; g = Graph[ ResourceFunction["MultiwaySystem"][ "WolframModel" -> {{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}}, {{{0, 0}, {0, 0}}}, 3, "StatesGraph", VertexSize -> 1.8, PerformanceGoal -> "Quality"], AspectRatio -> 1/2]; newgraph[g, {1, .7}]

Here is an alternative rendering, now also showing the particular path obtained by following our “standard updating order”:

g = ResourceFunction["MultiwaySystem"][ "WolframModel" -> {{{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}}, {{{0, 0}, {0, 0}}}, 3, "StatesGraph", VertexSize -> 2, GraphLayout -> "SpringElectricalEmbedding"]; HighlightGraph[g, Style[Subgraph[ g, {{{1, 1}, {1, 1}}, {{1, 1}, {1, 2}, {1, 2}, {1, 2}}, {{1, 1}, {1, 2}, {1, 2}, {1, 3}, {1, 3}, {2, 3}}, {{1, 1}, {1, 2}, {1, 2}, {1, 3}, {3, 2}, {1, 4}, {3, 4}, {3, 4}}}], Red, Thick]]

In general, each path in the multiway system corresponds to a possible sequence of updating eventshere shown along with the causal relationships that exist between them:

Graph[ResourceFunction["MultiwaySystem"][ "WolframModel" -> { {{x, y}, {x, z}} -> {{x, y}, {x, w}, {y, w}, {z, w}}}, {{{0, 0}, {0, 0}}}, 3, "EvolutionCausalGraph"], VertexSize -> 2.5, PerformanceGoal -> "Quality", GraphLayout -> "LayeredDigraphEmbedding", AspectRatio -> .8]