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 events—here 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]