FinalDistinctElementsCount
(aka "AtomsCountFinal"
) and FinalEdgeCount
(aka "ExpressionsCountFinal"
) are
similar to corresponding *List
properties, except we don't have "FinalVertexCount"
(we
should have it and also "DistinctElementsCountList"
, but they are not currently implemented).
The difference is that "VertexCountList"
counts expressions on level 2 in the states
whereas "FinalDistinctElementsCount"
counts all expressions matching _ ? AtomQ
(on any level). The difference
becomes apparent for edges that contain non-trivially nested lists.
For example, consider a rule that performs non-trivial nesting:
In[] := WolframModel[<|
"PatternRules" -> {{a_}} :> {{a + 1}, {a - 1}, {{a + 2, a - 2}}}|>,
{{1}}, 7, "VertexCountList"]
Out[] = {1, 3, 6, 10, 15, 21, 28, 36}
In[] := WolframModel[<|"PatternRules" ->
{{a_}} :> {{a + 1}, {a - 1}, {{a + 2, a - 2}}}|>,
{{1}}, #, "FinalDistinctElementsCount"] & /@ Range[0, 7]
Out[] = {1, 4, 9, 13, 17, 21, 25, 29}
To understand why this is happening, consider the state after one step:
In[] := WolframModel[<|
"PatternRules" -> {{a_}} :> {{a + 1}, {a - 1}, {{a + 2, a - 2}}}|>,
{{1}}, 1, "FinalState"]
Out[] = {{2}, {0}, {{3, -1}}}
This state has 3 vertices (distinct level-2 expressions): 2
, 0
, and {3, -1}
, but 4 atoms: 2
, 0
, 3
, and -1
.
This distinction does not usually come up in our models since vertices and atoms are usually the same things, but it is
significant in exotic cases like this.