diff --git a/Documentation/Images/MyrheimMeyer.png b/Documentation/Images/MyrheimMeyer.png
deleted file mode 100644
index 7119a5a51..000000000
Binary files a/Documentation/Images/MyrheimMeyer.png and /dev/null differ
diff --git a/Documentation/SymbolsAndFunctions/HypergraphPlot.md b/Documentation/SymbolsAndFunctions/HypergraphPlot.md
index 4656cc155..11d677e59 100644
--- a/Documentation/SymbolsAndFunctions/HypergraphPlot.md
+++ b/Documentation/SymbolsAndFunctions/HypergraphPlot.md
@@ -16,7 +16,9 @@ the ordering:
In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}}]
```
-
+
Edges of any arity can be mixed. The binary edges are displayed as non-filled arrows, and the unary edges are shown as
circles around the vertices:
@@ -25,7 +27,9 @@ circles around the vertices:
In[] := HypergraphPlot[{{1, 2, 3}, {3, 4}, {4, 3}, {4, 5, 6}, {1}, {6}, {6}}]
```
-
+
Self-loops are shown as convex polygons around the appropriate number of circular arrows:
@@ -33,7 +37,9 @@ Self-loops are shown as convex polygons around the appropriate number of circula
In[] := HypergraphPlot[{{1, 1, 1}, {1, 2, 3}, {3, 4, 4}}]
```
-
+
Note the difference between a hyper-self-loop and two binary edges pointing in opposite directions:
@@ -41,7 +47,9 @@ Note the difference between a hyper-self-loop and two binary edges pointing in o
In[] := HypergraphPlot[{{1, 2, 1}, {2, 3}, {3, 2}}]
```
-
+
Multiedges are shown in a darker color (because of overlaid partially transparent polygons), or as separate polygons
depending on the layout (and are admittedly sometimes hard to understand):
@@ -50,7 +58,9 @@ depending on the layout (and are admittedly sometimes hard to understand):
In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {3, 4, 5}, {1, 6, 6}, {1, 6, 6}}]
```
-
+
Many [`WolframModel`](WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md)
properties, such as [`"FinalStatePlot"`](WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfStates.md)
@@ -68,7 +78,9 @@ case `"Cyclic"` should be used as the second argument to `HypergraphPlot`:
In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}}, "Cyclic"]
```
-
+
## GraphHighlight and GraphHighlightStyle
@@ -79,7 +91,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
9}, {9}}, GraphHighlight -> {{1, 2, 3}, 4, {9}}]
```
-
+
For a hypergraph with multiedges, only the specified number of edges will be highlighted:
@@ -88,7 +102,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {1, 2, 3}, {3, 4}, {3, 4}, {3,
4}, {4}, {4}}, GraphHighlight -> {{1, 2, 3}, {3, 4}, {3, 4}, {4}}]
```
-
+
The style of the highlight can be specified with **`GraphHighlightStyle`**:
@@ -98,7 +114,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
GraphHighlightStyle -> Directive[Darker @ Green, Thick]]
```
-
+
## "HyperedgeRendering"
@@ -113,7 +131,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
VertexLabels -> Automatic]
```
-
+
## VertexCoordinates
@@ -125,7 +145,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}},
Axes -> True]
```
-
+
Unfortunately, due to limitations of [`GraphEmbedding`](https://reference.wolfram.com/language/ref/GraphEmbedding.html),
specifying coordinates of two or more vertices breaks the scaling of distances. As a result, vertices and arrowheads
@@ -137,7 +159,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}},
VertexCoordinates -> {1 -> {0, 0}, 2 -> {1, 0}}]
```
-
+
```wl
In[] := HypergraphPlot[{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}},
@@ -145,7 +169,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}},
VertexSize -> 0.03, "ArrowheadLength" -> 0.06]
```
-
+
## VertexLabels
@@ -157,7 +183,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {2, 4, 5}, {2, 6, 7, 8}, {8, 9, 1}},
VertexLabels -> Automatic]
```
-
+
## VertexSize and "ArrowheadLength"
@@ -169,7 +197,9 @@ In[] := HypergraphPlot[{{1, 2, 3, 4}, {1, 5, 6}, {2, 7, 8}, {4, 6, 9}},
VertexSize -> 0.1, "ArrowheadLength" -> 0.3]
```
-
+
Note that unlike [`GraphPlot`](https://reference.wolfram.com/language/ref/GraphPlot.html), both vertices and arrowheads
have a fixed size relative to the layout (in fact, the arrowheads are drawn manually as polygons). This fixed size
@@ -184,7 +214,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}, {7, 8, 9}, {9, 10,
VertexStyle -> Transparent]
```
-
+
As a neat example, one can even draw unordered hypergraphs:
@@ -196,7 +228,9 @@ In[] := HypergraphPlot[{{1, 2, 2}, {2, 3, 3}, {3, 1, 1}},
EdgeForm[Directive[Hue[0.63, 0.7, 0.5], Opacity[0.7]]]]|>]
```
-
+
## "MaxImageSize"
@@ -207,13 +241,17 @@ hypergraphs. To demonstrate that, consider the difference:
In[] := HypergraphPlot[#, "MaxImageSize" -> 100] & /@ {{{1}}, {{1, 1}}, {{1, 2, 3}}}
```
-
+
```wl
In[] := HypergraphPlot[#, ImageSize -> 100] & /@ {{{1}}, {{1, 1}}, {{1, 2, 3}}}
```
-
+
## Style Options
@@ -226,7 +264,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
9}, {9}}, PlotStyle -> Directive[Blue, Dotted]]
```
-
+
**`VertexStyle`** works similar to [`GraphPlot`](https://reference.wolfram.com/language/ref/GraphPlot.html):
@@ -235,7 +275,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
9}, {9}}, PlotStyle -> Directive[Blue, Dotted], VertexStyle -> Red]
```
-
+
**`EdgeStyle`** controls edge lines, and `"EdgePolygonStyle"` inherits from it (automatically adding transparency):
@@ -245,7 +287,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
EdgeStyle -> Darker @ Green]
```
-
+
Finally, **`"EdgePolygonStyle"`** controls the hyperedge polygons:
@@ -257,7 +301,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
Directive[Lighter[Green, 0.9], EdgeForm[Dotted]]]
```
-
+
It is possible to specify styles separately for each edge and vertex. Vertex styles are specified in the same order
as `Union @* Catenate` evaluated on the list of edges:
@@ -268,7 +314,9 @@ In[] := HypergraphPlot[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7, 1}, {7, 8, 2}, {4,
VertexStyle -> ColorData[98] /@ Range[9]]
```
-
+
Alternatively, one can specify different styles for different patterns of elements. In this case, styles are specified
as [`Association`](https://reference.wolfram.com/language/ref/Association.html)s with patterns for keys. This can be
@@ -283,7 +331,9 @@ In[] := HypergraphPlot[WolframModel[{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} ->
EdgeStyle -> <|{_, _} -> Darker @ Green, {_, _, _} -> Darker @ Red|>]
```
-
+
## Graphics Options
@@ -299,4 +349,6 @@ In[] := HypergraphPlot[WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
PlotRange -> {{30, 50}, {20, 40}}, Axes -> True]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/RulePlotOfWolframModel.md b/Documentation/SymbolsAndFunctions/RulePlotOfWolframModel.md
index eacf977dc..149e59f72 100644
--- a/Documentation/SymbolsAndFunctions/RulePlotOfWolframModel.md
+++ b/Documentation/SymbolsAndFunctions/RulePlotOfWolframModel.md
@@ -10,7 +10,9 @@ In[] := RulePlot[WolframModel[{{1, 2}, {1, 2}} ->
{{3, 2}, {3, 2}, {2, 1}, {1, 3}}]]
```
-
+
The shared elements between rule sides (vertices `1` and `2` in the example above) are put at the same positions in
the `RulePlot` and highlighted in a darker shade of blue. Shared edges are highlighted as well:
@@ -19,7 +21,9 @@ the `RulePlot` and highlighted in a darker shade of blue. Shared edges are highl
In[] := RulePlot[WolframModel[{{1, 2, 3}} -> {{1, 2, 3}, {3, 4, 5}}]]
```
-
+
Multiple rules can be plotted:
@@ -29,16 +33,22 @@ In[] := RulePlot[WolframModel[{{{1, 1, 2}} ->
{{1, 2, 1}, {3, 4, 2}} -> {{4, 3, 2}}}]]
```
-
+
Passing
a [`WolframModelEvolutionObject`](/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md)
plots its [`"Rules"`](/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/Rules.md)
property:
-
+
-
+
Sometimes an incorrectly scaled layout might be produced due to the issue discussed above
in [`VertexCoordinates`](HypergraphPlot.md#vertexcoordinates):
@@ -48,7 +58,9 @@ In[] := RulePlot[WolframModel[{{1, 2}, {1, 3}, {1, 4}} ->
{{2, 2}, {2, 2}, {2, 5}, {3, 2}}]]
```
-
+
`VertexCoordinates` can be used in that case to specify the layout manually:
@@ -59,7 +71,9 @@ In[] := RulePlot[WolframModel[{{1, 2}, {1, 3}, {1, 4}} ->
4 -> {-1, 0}, 5 -> {2, 1}}]
```
-
+
Some of the [`HypergraphPlot`](HypergraphPlot.md) options are supported,
specifically [`GraphHighlightStyle`](HypergraphPlot.md#graphhighlight-and-graphhighlightstyle)
@@ -77,7 +91,9 @@ In[] := RulePlot[WolframModel[{{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
{{1, 2}, {1, 2}} -> {{1, 3}, {3, 2}}}], Spacings -> 0.03]
```
-
+
**`"RulePartsAspectRatio"`** is used to control the aspect ratio of rule sides. As an example, it can be used to force
rule parts to be square:
@@ -87,4 +103,6 @@ In[] := RulePlot[WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}}],
"RulePartsAspectRatio" -> 1]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md
index 89d870773..e2cb0166a 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/AcyclicGraphTake.md
@@ -12,10 +12,14 @@ In[] := graph = BlockRandom[
]
```
-
+
```wl
In[] := AcyclicGraphTake[graph, {1, 9}]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/BuildData.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/BuildData.md
index 188383bdc..f912de1da 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/BuildData.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/BuildData.md
@@ -18,6 +18,8 @@ If the build directory were not clean, it would have "\*" at the end.
In[] := $SetReplaceBuildTime
```
-
+
These constants are particularly useful for reporting issues with the code.
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/CausalDensityDimension.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/CausalDensityDimension.md
index 7d64c0d43..5fdb25c67 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/CausalDensityDimension.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/CausalDensityDimension.md
@@ -21,7 +21,10 @@ to be the number of causal relations, i.e. the number of pairs *x* ≺ *y* betwe
ratio between *C**2* and *C**1* is dependent on the dimensionality *d* into which
the causal set embeds:
-
,
+$$
+\frac{\langle C_2 \rangle}{\langle C_1 \rangle^2} =
+ \frac{\Gamma\left(d + 1\right) \Gamma\left(\frac{d}{2}\right)}{4 \Gamma\left(\frac{3 d}{2}\right)},
+$$
where *d* is the dimensionality of the (flat) manifold. This expression comes from the fact that the probabilty
that a random choice of elements in the causal set are causally connected is directly proportional to the volume
@@ -46,7 +49,9 @@ sprinkledGraph = BlockRandom[Module[{coordinates, causalSet},
], RandomSeeding -> 0]
```
-
+
```wl
In[] := CausalDensityDimension[sprinkledGraph, {1, 50}]
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/GeneralizedGridGraph.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/GeneralizedGridGraph.md
index b6e65e005..fe44834ff 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/GeneralizedGridGraph.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/GeneralizedGridGraph.md
@@ -9,7 +9,9 @@ it allows for additional specifiers in each direction of the grid:
In[] := GeneralizedGridGraph[{5 -> "Directed", 5 -> "Circular"}]
```
-
+
Possible specifiers are `"Directed"` and `"Circular"`, and they can be combined:
@@ -17,7 +19,9 @@ Possible specifiers are `"Directed"` and `"Circular"`, and they can be combined:
In[] := GeneralizedGridGraph[{3 -> {"Directed", "Circular"}, 6}]
```
-
+
The same options as [`GridGraph`](https://reference.wolfram.com/language/ref/GridGraph.html) are supported. In
addition `"VertexNamingFunction" -> "Coordinates"` names vertices according to their position in a grid:
@@ -27,7 +31,9 @@ In[] := GeneralizedGridGraph[{4, 5, 2},
"VertexNamingFunction" -> "Coordinates", VertexLabels -> Automatic]
```
-
+
Finally, it's possible to use different `EdgeStyle` in different directions by specifying it as a list:
@@ -37,4 +43,6 @@ In[] := GeneralizedGridGraph[{4 -> "Directed", 5, 2},
EdgeStyle -> Darker /@ {Red, Green, Blue}]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphAutomorphismGroup.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphAutomorphismGroup.md
index 8225bc23a..447dc9664 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphAutomorphismGroup.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphAutomorphismGroup.md
@@ -21,7 +21,9 @@ In[] := GroupOrder[
8, 5}, {5, 9, 1}}]]
```
-
+
```wl
Out[] = 24
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphToGraph.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphToGraph.md
index cc7695a55..28950e002 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphToGraph.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphToGraph.md
@@ -19,7 +19,9 @@ In[]:= HypergraphToGraph[
GraphLayout -> "SpringElectricalEmbedding"]
```
-
+
## **"UndirectedDistancePreserving"**
@@ -34,7 +36,9 @@ In[]:= HypergraphToGraph[
GraphLayout -> "SpringElectricalEmbedding"]
```
-
+
## **"StructurePreserving"**
@@ -49,7 +53,14 @@ In[]:= HypergraphToGraph[
VertexLabels -> Automatic]
```
-
+
It is important to mention that this conversion does not lose any information, and it is possible to unambiguously
retrieve the original hypergraph from the resulting [`Graph`](https://reference.wolfram.com/language/ref/Graph.html):
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphUnifications.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphUnifications.md
index b6ac0f8ee..af6a6a0fb 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphUnifications.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/HypergraphUnifications.md
@@ -34,7 +34,9 @@ All unifications can be visualized with **`HypergraphUnificationsPlot`**:
In[] := HypergraphUnificationsPlot[{{1, 2}, {2, 3}}, {{1, 2}, {2, 3}}]
```
-
+
Vertex labels here show the vertex names in the input graphs to which the unification is matched.
@@ -45,4 +47,8 @@ In[] := HypergraphUnificationsPlot[{{1, 2, 3}, {4, 5, 6}, {1, 4}},
{{1, 2, 3}, {4, 5, 6}, {1, 4}}, VertexLabels -> Automatic]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/SetReplaceStyleData.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/SetReplaceStyleData.md
index 737fb2cc3..c17e8ba49 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/SetReplaceStyleData.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/SetReplaceStyleData.md
@@ -12,7 +12,9 @@ For example, here is the default style used to draw polygons in [`HypergraphPlot
In[] := SetReplaceStyleData["SpatialGraph", "EdgePolygonStyle"]
```
-
+
The full specification is `SetReplaceStyleData[theme, plot type, style element]`, however either the last or
the last two elements can be omitted to obtain a
@@ -24,7 +26,14 @@ styles used in [`"CausalGraph"`](../WolframModelAndWolframModelEvolutionObject/P
In[] := SetReplaceStyleData["CausalGraph"]
```
-
+
This function is useful if one needs to produce "fake" example plots using styles consistent with *SetReplace*.
@@ -35,7 +44,12 @@ all options that needs to be passed using an `"Options"` property:
In[] := SetReplaceStyleData["SpatialGraph3D", "Options"]
```
-
+
Alternatively, one can use the `"Function"` property, which would give a function that takes a graph and produces a
correctly styled graph:
@@ -45,4 +59,10 @@ In[] := SetReplaceStyleData["SpatialGraph3D", "Function"][
Graph3D[{1 -> 2, 2 -> 3, 3 -> 1, 3 -> 4, 4 -> 1}]]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/UtilityFunctions/WolframModelRuleValue.md b/Documentation/SymbolsAndFunctions/UtilityFunctions/WolframModelRuleValue.md
index 4942a77e4..2aeea904b 100644
--- a/Documentation/SymbolsAndFunctions/UtilityFunctions/WolframModelRuleValue.md
+++ b/Documentation/SymbolsAndFunctions/UtilityFunctions/WolframModelRuleValue.md
@@ -48,7 +48,7 @@ In[] := WolframModelRuleValue[{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} ->
12}}, "TraditionalSignature"]
```
-
+
In this example, there are 2 binary and 2 ternary edges in the input, and 8 binary and 4 ternary edges in the output.
The more machine-readable form of this can be obtained with **`Signature`** property:
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventDeduplication.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventDeduplication.md
index f6179d1a7..901ccaba1 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventDeduplication.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventDeduplication.md
@@ -14,7 +14,9 @@ In[] := WolframModel[{{a, b}, {a, c}} -> {{b, c}}, {{1, 2}, {1, 3}},
VertexLabels -> Automatic]
```
-
+
In the case above the outputs are different, however sometimes they are the same (more precisely, isomorphic):
@@ -25,7 +27,9 @@ In[] := WolframModel[{{a, b}, {a, c}} -> {{b, c}, {c, b}}, {{1, 2}, {1, 3}},
VertexLabels -> Automatic]
```
-
+
**`EventDeduplication`** option can be used in a case like this to combine these two identical events into one:
@@ -36,7 +40,9 @@ In[] := WolframModel[{{a, b}, {a, c}} -> {{b, c}, {c, b}}, {{1, 2}, {1, 3}},
VertexLabels -> Automatic]
```
-
+
The outputs of the rule need not be identical, but should be isomorphic with respect to renaming of new atoms:
@@ -47,4 +53,6 @@ In[] := WolframModel[{{a, b}, {a, c}} -> {{b, d}, {c, d}}, {{1, 2}, {1, 3}},
VertexLabels -> Automatic]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventOrderingFunction.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventOrderingFunction.md
index 13a8cbb5d..73328c577 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventOrderingFunction.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventOrderingFunction.md
@@ -10,7 +10,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {3, 2}},
{{1, 2}, {2, 2}}, <|"MaxEvents" -> 1|>, "EventsStatesPlotsList"]
```
-
+
```wl
In[] := WolframModel[{{1, 2}} -> {{1, 3}, {3, 2}},
@@ -18,7 +20,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {3, 2}},
"EventOrderingFunction" -> "NewestEdge"]
```
-
+
In this particular so-called non-overlapping system, the order of replacements does not matter. Regardless of order, the
same final state (up to renaming of vertices) is produced for the same fixed number of generations. This will always be
@@ -30,7 +34,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
"EventOrderingFunction" -> #] & /@ {Automatic, "Random"}
```
-
+
For some systems, however, the order of replacements does matter, and non-equivalent final states would be produced for
different orders even if a fixed number of generations is requested:
@@ -40,7 +46,9 @@ In[] := WolframModel[{{1, 2}, {2, 3}} -> {{4, 2}, {4, 1}, {2, 1}, {3, 4}},
{{1, 2}, {2, 3}, {3, 4}, {4, 1}}, 5, "FinalStatePlot"]
```
-
+
```wl
In[] := WolframModel[{{1, 2}, {2, 3}} -> {{4, 2}, {4, 1}, {2, 1}, {3, 4}},
@@ -48,7 +56,9 @@ In[] := WolframModel[{{1, 2}, {2, 3}} -> {{4, 2}, {4, 1}, {2, 1}, {3, 4}},
"EventOrderingFunction" -> "RuleOrdering"]
```
-
+
In a case like that, it is important to be able to specify the desired evolution order, which is the purpose of
the **`"EventOrderingFunction"`** option. `"EventOrderingFunction"` is specified as a list of sorting criteria such as
@@ -58,46 +68,46 @@ criteria, one is chosen uniformly at random (which is why `{}` works as a shorth
Possible sorting criteria are:
-* `"OldestEdge"`: greedily select the edge closest to the beginning of the list (which would typically correspond to the
+- `"OldestEdge"`: greedily select the edge closest to the beginning of the list (which would typically correspond to the
oldest edge). Note, the edges within a single-event output are assumed oldest-to-newest left-to-right as written on
- the right-hand side of the rule. After this criterion, a fixed ***subset*** of edges is guaranteed to be chosen, but
+ the right-hand side of the rule. After this criterion, a fixed **_subset_** of edges is guaranteed to be chosen, but
different orderings of that subset might be possible (which could allow for multiple non-equivalent matches).
-* `"NewestEdge"`: similar to `"OldestEdge"` except edges are chosen from the end of the list rather than from the
+- `"NewestEdge"`: similar to `"OldestEdge"` except edges are chosen from the end of the list rather than from the
beginning.
-* `"LeastRecentEdge"`: this is similar to `"OldestEdge"`, but instead of greedily choosing the oldest edges, it instead
+- `"LeastRecentEdge"`: this is similar to `"OldestEdge"`, but instead of greedily choosing the oldest edges, it instead
avoids choosing newest ones. The difference is best demonstrated in an example:
- ```wl
- In[] := WolframModel[{{x, y}, {y, z}} -> {},
- {{1, 2}, {a, b}, {b, c}, {2, 3}},
- <|"MaxEvents" -> 1|>, "AllEventsList",
- "EventOrderingFunction" -> #] & /@ {"OldestEdge",
- "LeastRecentEdge"}
- Out[] = {{{1, {1, 4} -> {}}}, {{1, {2, 3} -> {}}}}
- ```
+ ```wl
+ In[] := WolframModel[{{x, y}, {y, z}} -> {},
+ {{1, 2}, {a, b}, {b, c}, {2, 3}},
+ <|"MaxEvents" -> 1|>, "AllEventsList",
+ "EventOrderingFunction" -> #] & /@ {"OldestEdge",
+ "LeastRecentEdge"}
+ Out[] = {{{1, {1, 4} -> {}}}, {{1, {2, 3} -> {}}}}
+ ```
Note that in this example `"OldestEdge"` has selected the first and the last edge, whereas `"LeastRecentEdge"`, in an
attempt to avoid the most "recent" last edge, has selected the second and the third ones. In this case, similarly
to `"OldestEdge"`, a fixed set of edges is guaranteed to be chosen, but potentially in multiple orders.
-* `"LeastOldEdge"`: similar to `"LeastRecentEdge"`, but avoids old edges instead of new ones.
+- `"LeastOldEdge"`: similar to `"LeastRecentEdge"`, but avoids old edges instead of new ones.
Note that counterintuitively `"OldestEdge"` sorting is not equivalent to the reverse of `"NewestEdge"` sorting, it is
equivalent to the reverse of `"LeastOldEdge"`. Similarly, `"NewestEdge"` is the reverse of `"LeastRecentEdge"`.
-* `"RuleOrdering"`: similarly to `"OldestEdge"` greedily chooses edges from the beginning of the list, however
- unlike `"OldestEdge"` which would pick the oldest edge with *any* available matches, it chooses edges in the order the
+- `"RuleOrdering"`: similarly to `"OldestEdge"` greedily chooses edges from the beginning of the list, however
+ unlike `"OldestEdge"` which would pick the oldest edge with _any_ available matches, it chooses edges in the order the
left-hand side of (any) rule is written. The difference is best demonstrated in an example:
- ```wl
- In[] := WolframModel[{{x, y}, {y, z}} -> {},
- {{b, c}, {1, 2}, {a, b}, {2, 3}},
- <|"MaxEvents" -> 1|>, "AllEventsList",
- "EventOrderingFunction" -> #] & /@ {"OldestEdge", "RuleOrdering"}
- Out[] = {{{1, {1, 3} -> {}}}, {{1, {2, 4} -> {}}}}
- ```
+ ```wl
+ In[] := WolframModel[{{x, y}, {y, z}} -> {},
+ {{b, c}, {1, 2}, {a, b}, {2, 3}},
+ <|"MaxEvents" -> 1|>, "AllEventsList",
+ "EventOrderingFunction" -> #] & /@ {"OldestEdge", "RuleOrdering"}
+ Out[] = {{{1, {1, 3} -> {}}}, {{1, {2, 4} -> {}}}}
+ ```
Note how `"RuleOrdering"` has selected the second edge first because it matches the first rule input while the first
edge does not.
@@ -105,22 +115,22 @@ Possible sorting criteria are:
In this case, a specific ordered sequence of edges is guaranteed to be matched (including its permutation). However,
multiple matches might still be possible if multiple rules exist which match that sequence.
-* `"ReverseRuleOrdering"`: as the name suggests, this is just the reverse of `"RuleOrdering"`.
+- `"ReverseRuleOrdering"`: as the name suggests, this is just the reverse of `"RuleOrdering"`.
-* `"RuleIndex"`: this simply means it attempts to match the first rule first, and only if no matches to the first rule
+- `"RuleIndex"`: this simply means it attempts to match the first rule first, and only if no matches to the first rule
are possible, it goes to the second rule, and so on.
-* `"ReverseRuleIndex"`: similar to `"RuleIndex"`, but reversed as the name suggests.
+- `"ReverseRuleIndex"`: similar to `"RuleIndex"`, but reversed as the name suggests.
-* `"Random"`: selects a single match uniformly at random. It is possible to do that efficiently because the C++
+- `"Random"`: selects a single match uniformly at random. It is possible to do that efficiently because the C++
implementation of `WolframModel` (the only one that supports `"EventOrderingFunction"`) keeps track of all possible
matches at any point during the evolution. `"Random"` is guaranteed to select a single match, so the remaining sorting
criteria are ignored. It can also be omitted because the random event is always chosen if provided sorting criteria
are insufficient. The seeding can be controlled
with [`SeedRandom`](https://reference.wolfram.com/language/ref/SeedRandom.html). However, the result does depend on
- your platform (Mac/Linux/Windows) and the specific build (version) of *SetReplace*.
+ your platform (Mac/Linux/Windows) and the specific build (version) of _SetReplace_.
-* `"Any"`: the chosen match is undefined. It can select any match, leading to nondeterministic and undefined evolution
+- `"Any"`: the chosen match is undefined. It can select any match, leading to nondeterministic and undefined evolution
order. In some cases, it has better performance than "Random".
As a neat example, here is the output of all individual sorting criteria (default sorting criteria are appended to
@@ -140,4 +150,6 @@ In[] := WolframModel[{{{1, 2}, {1, 3}, {1, 4}} -> {{5, 6}, {6, 7}, {7, 5}, {5,
"ReverseRuleOrdering", "RuleIndex", "ReverseRuleIndex", "Random", "Any"}
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventSelectionFunction.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventSelectionFunction.md
index 49dedbe5b..40a392ecd 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventSelectionFunction.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/EventSelectionFunction.md
@@ -25,7 +25,9 @@ In[] := WolframModel[{{1, 2}, {2, 3}} -> {{1, 3}}, {{1, 2}, {2, 3}, {2, 4}},
Infinity]["ExpressionsEventsGraph", VertexLabels -> Automatic]
```
-
+
In this example we used the default `"GlobalSpacelike"` selection function, and the evolution terminated after a single
event, because the expression `{1, 2}` was used, and it could not be reused to be matched with `{2, 4}`. However, let's
@@ -38,7 +40,9 @@ In[] := WolframModel[{{1, 2}, {2, 3}} -> {{1, 3}}, {{1, 2}, {2, 3}, {2, 4}},
VertexLabels -> Automatic]
```
-
+
In this case, the expression `{1, 2}` was matched twice, which we can also see by looking at its list of destroyer
events:
@@ -62,7 +66,9 @@ In[] := WolframModel[{{{1, 2}, {2, 3}} -> {{1, 2, 3}},
VertexLabels -> Placed[Automatic, After]]
```
-
+
However, `"EventSelectionFunction" -> None` also matches expressions that are branchlike and timelike. So, further
evolution will be generated in the previous example:
@@ -75,7 +81,14 @@ In[] := WolframModel[{{{1, 2}, {2, 3}} -> {{1, 2, 3}},
VertexLabels -> Placed[Automatic, After]]
```
-
+
Similarly, it matches timelike expressions `{1, 2}` and `{1, 2, 3}` below:
@@ -87,7 +100,9 @@ In[] := WolframModel[{{{1, 2}, {2, 3}} -> {{1, 2, 3}},
VertexLabels -> Placed[Automatic, After]]
```
-
+
Because of this branchlike and timelike matching, branches in `"EventSelectionFunction" -> None` evolution are not
separated but can "interfere" with one another.
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludeBoundaryEvents.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludeBoundaryEvents.md
index 4926759a1..044769055 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludeBoundaryEvents.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludeBoundaryEvents.md
@@ -17,7 +17,15 @@ In[] := WolframModel[<|"PatternRules" -> {a_, b_} :> a + b|>,
VertexLabels -> Placed[Automatic, After]]
```
-
+
Properties like [`"AllEventsList"`](../Properties/Events.md) are affected as well:
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludePartialGenerations.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludePartialGenerations.md
index 7d5fb42a2..7b60c597d 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludePartialGenerations.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/IncludePartialGenerations.md
@@ -11,7 +11,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
{{1, 1}}, <|"MaxEvents" -> 42|>]
```
-
+
with
@@ -21,7 +23,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
"IncludePartialGenerations" -> False]
```
-
+
One neat use of this is producing a uniformly random evolution for a complete number of generations:
@@ -33,4 +37,6 @@ In[] := WolframModel[{{1, 2, 3}, {2, 4, 5}} ->
"IncludePartialGenerations" -> False]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/Method.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/Method.md
index 52f60dc08..48aa5ab9b 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/Method.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/Method.md
@@ -31,7 +31,9 @@ In[] := AbsoluteTiming[
{{0}}, <|"MaxEvents" -> 30|>, Method -> "LowLevel"]]
```
-
+
takes almost 10 seconds in C++ implementation, and less than 1/10th of a second in the Wolfram Language implementation:
@@ -41,7 +43,9 @@ In[] := AbsoluteTiming[
{{0}}, <|"MaxEvents" -> 30|>, Method -> "Symbolic"]]
```
-
+
Wolfram Language implementation should be used if:
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/TimeConstraint.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/TimeConstraint.md
index 20e93f440..7fd2dd603 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/TimeConstraint.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Options/TimeConstraint.md
@@ -10,4 +10,6 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}},
{{1, 1}}, Infinity, TimeConstraint -> 1]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/CausalGraphs.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/CausalGraphs.md
index c7c941834..e4f067a01 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/CausalGraphs.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/CausalGraphs.md
@@ -19,7 +19,17 @@ In[] := WolframModel[<|"PatternRules" -> {a_, b_} :> a + b|>,
VertexLabels -> Placed[Automatic, After]]
```
-
+
The causal graph is very similar, it just has the expression-vertices contracted:
@@ -28,7 +38,16 @@ In[] := WolframModel[<|"PatternRules" -> {a_, b_} :> a + b|>,
{3, 8, 8, 8, 2, 10, 0, 9, 7}, Infinity, "CausalGraph"]
```
-
+
Here is an example for a hypergraph model (admittedly considerably harder to understand). Multiedges correspond to
situations where multiple set elements were both created and destroyed by the same pair of events:
@@ -40,7 +59,9 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 20, "CausalGraph"]
```
-
+
**`"LayeredCausalGraph"`** generates the same graph but layers events generation-by-generation. For example, in our
arithmetic causal graph, note how it's arranged differently from an example above:
@@ -50,7 +71,11 @@ In[] := WolframModel[<|"PatternRules" -> {a_, b_} :> a + b|>,
{3, 8, 8, 8, 2, 10, 0, 9, 7}, Infinity, "LayeredCausalGraph"]
```
-
+
Note how slices through the expressions-events graph correspond to states returned by [`"StatesList"`](States.md). Pay
attention to intersections of the slices with edges as well, as they correspond to unused expressions from previous
@@ -66,7 +91,15 @@ In[] := With[{evolution =
Table[Line[{{-10, k}, {10, k}}], {k, 0, 9, 2}]}]]
```
-
+
```wl
In[] := WolframModel[<|"PatternRules" -> {a_, b_} :> a + b|>,
@@ -86,7 +119,13 @@ In[] := WolframModel[{{1}, {1, 2}} -> {{2}}, {{1}, {1, 2}, {2, 3}, {2, 4}},
VertexLabels -> Placed[Automatic, After]]
```
-
+
{{x, z}, {x, w}, {y, w}, {z, w}}},
{{0, 0}, {0, 0}}, 2]["ExpressionsEventsGraph", VertexLabels -> "Index"]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/EdgeAndEventGenerations.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/EdgeAndEventGenerations.md
index 679d58ac4..132dabf09 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/EdgeAndEventGenerations.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/EdgeAndEventGenerations.md
@@ -30,7 +30,11 @@ In[] := With[{
g_ :> ColorData["Rainbow"][g/5], {2}]}]]
```
-
+
Event and expression generations correspond to layers in [`"LayeredCausalGraph"`](CausalGraphs.md)
and [`"ExpressionsEventsGraph"`](CausalGraphs.md):
@@ -48,4 +52,6 @@ In[] := WolframModel[{{1, 2}, {1, 3}, {1, 4}} ->
{{1, 1}, {1, 1}, {1, 1}}, 5, "LayeredCausalGraph"]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/ExpressionSeparations.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/ExpressionSeparations.md
index 0e4270379..2dbcc8751 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/ExpressionSeparations.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/ExpressionSeparations.md
@@ -24,7 +24,13 @@ In[] := Framed[WolframModel[<|"PatternRules" -> #|>, {{1, 2}}, Infinity,
{{{1, 2}} -> {{2, 3}}, {{2, 3}} -> {{3, 4}}}}
```
-
+
One might be tempted to assume that spacelike separated expressions can always be 'assembled' to produce a possible
history for a singleway system. For match-all evolution, however, this is not the case. Match-all rules can match two
@@ -41,7 +47,13 @@ In[] := WolframModel[<|
VertexLabels -> Placed[Automatic, After]]
```
-
+
Further, branchlike separation takes precedence over spacelike separation, and timelike separation takes precedence over
both. As such, expressions `{v, f, 1}` and `{v, f, 2}` here are branchlike separated because one of their common
@@ -56,7 +68,14 @@ In[] := WolframModel[<|"PatternRules" -> {{{v, i}} -> {{v, 1}, {v, 2}},
VertexLabels -> Placed[Automatic, After]]
```
-
+
Specifically, the general algorithm for computing the separation between two expressions `A` and `B` in an
expressions-events graph is:
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureAssociation.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureAssociation.md
index 8202d1ca1..e61ce0333 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureAssociation.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureAssociation.md
@@ -29,7 +29,18 @@ that return a numeric value. Right now the list of properties is:
In[] := WolframModel[{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, w}}, {{0, 0}, {0, 0}}, 5]["FeatureAssociation"]
```
-
"
+
This property is useful for applying machine learning to Wolfram Models explorations:
@@ -41,7 +52,9 @@ In[] := BlockRandom[
]
```
-
+
For [Multiway Systems](/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/MultiwayQ.md)
it only computes features associated with
@@ -56,4 +69,15 @@ In[] := WolframModel[{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, w}}, {{1,
"EventSelectionFunction" -> "MultiwaySpacelike"]["FeatureAssociation"]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureVector.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureVector.md
index 7a7bc0430..acc739b0a 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureVector.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureVector.md
@@ -11,7 +11,9 @@ by [`"FeatureAssociation"`](/Documentation/SymbolsAndFunctions/WolframModelAndWo
In[] := WolframModel[{{x, y}, {x, z}} -> {{x, z}, {x, w}, {y, w}, {z, w}}, {{0, 0}, {0, 0}}, 5]["FeatureVector"]
```
-
+
For the list of features
see [`FeatureAssociation`](/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/FeatureAssociation.md).
@@ -28,4 +30,6 @@ In[] := BlockRandom[
]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/GenerationCounts.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/GenerationCounts.md
index bf032fbd5..aab5d01f0 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/GenerationCounts.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/GenerationCounts.md
@@ -21,7 +21,9 @@ In[] := WolframModel[{{1, 2}} -> {{1, 3}, {1, 3}, {3, 2}}, {{1, 1}},
<|"MaxEvents" -> 42|>, "EventOrderingFunction" -> "Random"]
```
-
+
Note, in this case, only one generation is complete, and seven are partial. That happens because the states grow with
each generation, so it becomes more likely for a random choice to pick an edge from a later generation. Thus earlier
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/MultiwayQ.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/MultiwayQ.md
index f0857202a..a6019e466 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/MultiwayQ.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/MultiwayQ.md
@@ -13,7 +13,12 @@ In[] := EchoFunction[#["ExpressionsEventsGraph"] &][
"EventSelectionFunction" -> "MultiwaySpacelike"]]["MultiwayQ"]
```
-
+
```wl
Out[] = True
@@ -28,7 +33,9 @@ In[] := EchoFunction[#["ExpressionsEventsGraph"] &][WolframModel[
{{1, 2}} -> {{1, 3}, {3, 2}}, {{1, 1}}, 2, "EventSelectionFunction" -> "MultiwaySpacelike"]]["MultiwayQ"]
```
-
+
```wl
Out[] = False
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfEvents.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfEvents.md
index 57062f204..6011e67af 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfEvents.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfEvents.md
@@ -13,6 +13,11 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
3, "EventsStatesPlotsList"]
```
-
+
Here the dotted gray edges are the ones about to be deleted, whereas the red ones have just been created.
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfStates.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfStates.md
index 9f6529a1d..3fdbf8c96 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfStates.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/PlotsOfStates.md
@@ -12,7 +12,9 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 6, "FinalStatePlot"]
```
-
+
```wl
In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
@@ -21,7 +23,9 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 6, "StatesPlotsList"]
```
-
+
These properties take the same options as [`HypergraphPlot`](../../HypergraphPlot.md) (but one has to specify them in a
call to the evolution object, not `WolframModel`):
@@ -34,4 +38,6 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
VertexLabels -> Automatic]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/RuleIndicesForEvents.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/RuleIndicesForEvents.md
index c7af4647e..0dfedae3d 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/RuleIndicesForEvents.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/RuleIndicesForEvents.md
@@ -29,4 +29,6 @@ In[] := With[{
2 -> White}, {1}]], VertexSize -> Medium]]]
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/States.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/States.md
index dce3467e9..3a2e76e31 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/States.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/States.md
@@ -14,7 +14,9 @@ In[] := HypergraphPlot @ WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 6, "FinalState"]
```
-
+
**`"StatesList"`** yields the list of states at each generation:
@@ -25,7 +27,9 @@ In[] := HypergraphPlot /@ WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 6, "StatesList"]
```
-
+
This is identical to using the **`"Generation"`** property mapped over all generations:
@@ -37,7 +41,9 @@ In[] := HypergraphPlot /@ (WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
"Generation", #] &) /@ Range[0, 6]
```
-
+
In fact, the `"Generation"` property can be omitted and the index of the generation can be used directly:
@@ -48,7 +54,9 @@ In[] := HypergraphPlot /@ WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
{{1, 1, 1}, {1, 1, 1}, {1, 1}, {1, 1}, {1, 1}}, 6] /@ Range[0, 6]
```
-
+
`"StatesList"` shows a compressed version of the evolution. To see how the state changes with each applied replacement,
use **`"AllEventsStatesList"`**:
@@ -61,7 +69,9 @@ In[] := HypergraphPlot /@ WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
"AllEventsStatesList"]
```
-
+
Finally, to see a state after a specific event, use **`"StateAfterEvent"`** (aka `"SetAfterEvent"`):
@@ -73,7 +83,11 @@ In[] := HypergraphPlot @ WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
"StateAfterEvent", 42]
```
-
+
`"StateAfterEvent"` is equivalent to taking a corresponding part in `"AllEventsStatesList"`, but it is much faster to
compute than the entire list.
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/StatesAsEdgeIndices.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/StatesAsEdgeIndices.md
index ec67fae23..26b177dbf 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/StatesAsEdgeIndices.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/StatesAsEdgeIndices.md
@@ -28,7 +28,9 @@ In[] := HypergraphPlot /@ With[{
evolution["AllEventsStatesEdgeIndicesList"]]
```
-
+
However, this representation is useful if one needs to distinguish between identical edges.
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/TerminationReason.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/TerminationReason.md
index 8c56c250e..af94f0610 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/TerminationReason.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/Properties/TerminationReason.md
@@ -7,11 +7,11 @@ multiple [stopping conditions](../WolframModelAndWolframModelEvolutionObject.md#
All possible values are:
-* `"MaxEvents"`, `"MaxGenerations"`, `"MaxVertices"`, `"MaxVertexDegree"` and `"MaxEdges"` correspond directly
+- `"MaxEvents"`, `"MaxGenerations"`, `"MaxVertices"`, `"MaxVertexDegree"` and `"MaxEdges"` correspond directly
to [step limiters](../WolframModelAndWolframModelEvolutionObject.md#step-limiters).
-* `"FixedPoint"` means there were no more matches possible to rule inputs.
-* `"TimeConstraint"` could occur if a [`"TimeConstraint"`](../Options/TimeConstraint.md) option is used.
-* `"Aborted"` would occur if the evaluation was manually interrupted (i.e., by pressing ⌘. on a Mac). In that case, a
+- `"FixedPoint"` means there were no more matches possible to rule inputs.
+- `"TimeConstraint"` could occur if a [`"TimeConstraint"`](../Options/TimeConstraint.md) option is used.
+- `"Aborted"` would occur if the evaluation was manually interrupted (i.e., by pressing ⌘. on a Mac). In that case, a
partially computed evolution object is returned.
As an example, in our arithmetic model a `"FixedPoint"` is reached (which is why we can
@@ -33,4 +33,12 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {1, 4}} ->
⌘.
```
-
+
diff --git a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md
index 8a497a2c7..dd8993e91 100644
--- a/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md
+++ b/Documentation/SymbolsAndFunctions/WolframModelAndWolframModelEvolutionObject/WolframModelAndWolframModelEvolutionObject.md
@@ -23,7 +23,9 @@ In[] := WolframModel[{{1, 2, 3}, {2, 4, 5}} ->
{{1, 2, 3}, {2, 4, 5}, {4, 6, 7}}, 10]
```
-
+
Note that this call is different from the [`SetReplace`](../SetReplace.md) function in a variety of ways:
@@ -45,12 +47,16 @@ In[] := WolframModel[{{1, 2, 3}, {2, 4, 5}} ->
{{1, 2, 3}, {2, 4, 5}, {4, 6, 7}}, 3]
```
-
+
One can easily see its internal structure in
its [`InputForm`](https://reference.wolfram.com/language/ref/InputForm.html):
-
+
```wl
Out[] = WolframModelEvolutionObject[<|
@@ -83,7 +89,9 @@ four more triples of edges corresponding to the outputs of remaining events.
belongs. For example, `{5, 8, 1}` only appears in the result after a single step and `{7, 9, 8}` after two steps. Here
we use [`"StatesList"`](Properties/States.md) property to demonstrate that:
-
+
```wl
Out[] = {{{1, 2, 3}, {2, 4, 5}, {4, 6, 7}},
@@ -122,7 +130,9 @@ Other properties of the evolution object describe the relationships between edge
A specific property can be requested from an evolution object by supplying it as an argument to the object itself:
-
+
```wl
Out[] = 109
@@ -131,7 +141,9 @@ Out[] = 109
[Properties](#properties) section describes and gives examples for each available property. The full list of them can
also be obtained with the `"Properties"` property:
-
+
```wl
Out[] = {"EvolutionObject", "FinalState", "FinalStatePlot", "StatesList",
@@ -155,7 +167,9 @@ Out[] = {"EvolutionObject", "FinalState", "FinalStatePlot", "StatesList",
Some properties take additional arguments, which can be supplied after the property name:
-
+
```wl
Out[] = {{8, 1, 3}, {5, 12, 1}, {12, 8, 10}, {8, 5, 4}, {2, 13, 11}, {13, 7,
@@ -164,7 +178,9 @@ Out[] = {{8, 1, 3}, {5, 12, 1}, {12, 8, 10}, {8, 5, 4}, {2, 13, 11}, {13, 7,
A particular generation can be extracted simply by its number (including, i.e., -1 for the final state):
-
+
```wl
Out[] = {{6, 7, 2}, {8, 1, 3}, {4, 11, 7}, {11, 6, 9}, {6, 4, 8}, {5, 12,
@@ -229,11 +245,15 @@ In[] := WolframModel[{{{1, 1, 2}} -> {{2, 2, 1}, {2, 3, 2}, {1, 2, 3}},
{{1, 2, 1}, {3, 4, 2}} -> {{4, 3, 2}}}, {{1, 1, 1}}, 4]
```
-
+
To see which rules were used for each replacement:
-
+
```wl
Out[] = {1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2}
@@ -294,7 +314,9 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} ->
3}}, 6, "FinalStatePlot"]
```
-
+
Alternatively, an [`Association`](https://reference.wolfram.com/language/ref/Association.html) can be used to specify a
more elaborate limiting condition:
@@ -308,7 +330,9 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} ->
<|"MaxVertices" -> 300, "MaxEvents" -> 200|>, "FinalStatePlot"]
```
-
+
Note that the final state here is "less symmetric" because its last generation is incomplete (more on
that [later](../UtilityFunctions/HypergraphAutomorphismGroup.md)). Such incomplete generations can be automatically
@@ -327,7 +351,15 @@ In[] := WolframModel[{{1, 2, 3}, {4, 5, 6}, {2, 5}, {5, 2}} ->
<|"MaxVertices" -> 300, "MaxEvents" -> 200|>]
```
-
+
All possible keys in that association are:
@@ -365,7 +397,9 @@ In[] := WolframModel[{{1, 2, 3}, {2, 4, 5}} -> {{5, 6, 1}, {6, 4, 2}, {4, 5,
{{1, 2, 3}, {2, 4, 5}, {4, 6, 7}}, Automatic]
```
-
+
But evolves the rule much longer if it does not grow:
@@ -374,7 +408,9 @@ In[] := WolframModel[<|"PatternRules" -> {{a_, b_}} :> {{a + b, a - b}}|>,
{{1, 1}}, Automatic]
```
-
+
Currently, it's equivalent to `<|"MaxEvents" -> 5000, "MaxVertices" -> 200|>`, setting `TimeConstraint -> 5` (it still
returns values for all properties even if terminated due to time constraint), and `"IncludePartialGenerations" -> False`