In[]:=
HypergraphAutomorphismGroup[{{x,y},{x,z}}]
Out[]=
PermutationGroup[{Cycles[{{2,3}}]}]
FroAll[rule,transform[multirule[states]]===multirule[transform[states]]]
Various kinds of transformations:
- pure node permutation
- more complex edge swapping
- pure node permutation
- more complex edge swapping
Analogy:
Analogy:
For strings, we can ask if a rule commutes with Reverse or with A↔B
In[]:=
MultiwaySystem[{"BA""AB"},StringTuples["AB",5],4,"StatesGraph"]
Out[]=
In[]:=
MultiwaySystem[{"BA""AB","AB""BA"},StringTuples["AB",4],4,"StatesGraph"]
Out[]=
Symmetry implies conservation law:
If rule is symmetric under exchange of A,B, then it preserves numbers of As and Bs
If rule is symmetric under exchange of A,B, then it preserves numbers of As and Bs
In[]:=
MultiwaySystem[{"AAA""ABA"},StringTuples["AB",4],5,"StatesGraph"]
Out[]=
Reversal symmetry doesn’t work, because of embedding inside string
In[]:=
StringTuples["AB",3]
Out[]=
{AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB}
Like C, P :)
In[]:=
MultiwaySystem["BA""AB",StringTuples["AB",3],1]
Out[]=
{{AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB},{AAB,ABA,ABB,BAB}}
In[]:=
MultiwaySystem["BA""AB",StringTuples["AB",4],1]
Out[]=
{{AAAA,AAAB,AABA,AABB,ABAA,ABAB,ABBA,ABBB,BAAA,BAAB,BABA,BABB,BBAA,BBAB,BBBA,BBBB},{AAAB,AABA,AABB,ABAA,ABAB,ABBA,ABBB,BAAB,BABA,BABB,BBAB}}
In[]:=
MultiwaySystem[{"BA""AB","AB""BA"},StringTuples["AB",3],1]
Out[]=
{{AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB},{AAB,ABA,ABB,BAA,BAB,BBA}}
In[]:=
MultiwaySystem["BA""AB",StringTuples["AB",4],1,"StatesGraph"]
Out[]=
Has an additional symmetry of preserving # of As and Bs
In[]:=
MultiwaySystem["AAA""ABA",StringTuples["AB",5],3,"StatesGraph"]
Out[]=
In[]:=
MultiwaySystem["AAA""ABA",StringTuples["AB",5],1]//Last
Out[]=
{AAABA,AABAA,AABAB,ABAAA,ABAAB,ABABA,ABABB,BAABA,BABAA,BABAB,BBABA}
Symmetry transformation commutes with rule:
Symmetry transformation commutes with rule:
In[]:=
MultiwaySystem["AAA""ABA",StringReverse/@StringTuples["AB",5],1]//Last
Out[]=
{AAABA,AABAA,AABAB,ABAAA,ABAAB,ABABA,ABABB,BAABA,BABAA,BABAB,BBABA}
In[]:=
Sort@(StringReverse/@(MultiwaySystem["AAA""ABA",StringTuples["AB",5],1]//Last))
Out[]=
{AAABA,AABAA,AABAB,ABAAA,ABAAB,ABABA,ABABB,BAABA,BABAA,BABAB,BBABA}
Graph example
Graph example
HypergraphAutomorphismGroup[{{x,y},{x,z}}]
In[]:=
Graph[MultiwaySystem[WolframModel[{{1,2,3}}{{2,3,1}}],List/@Permutations[Range[3]],1,"StatesGraph"],VertexSize3]
Out[]=
This still only gives one canonical output:
[[ incorrect one-way edges... ]]
When you are looking at the multistate, you care about the relative indices in the multistate
Two cases:
global multiway : canonicalize the whole hypergraph
local multiway system: there are internally many ways to do matches, even when the indices on the original hypergraph are external [equivalent to canonicalize only newly created vertices]
global multiway : canonicalize the whole hypergraph
local multiway system: there are internally many ways to do matches, even when the indices on the original hypergraph are external [equivalent to canonicalize only newly created vertices]
Canonicalization Approaches
Canonicalization Approaches
Global case, generating a new variable for everything, and considering them distinct:
Local case:
2nd step:
RESULT WITHOUT USING Hash:
Format
Format
If start purely from a self loop, everything that comes out is a pure tree.....
Inner variants:
Inner variants:
In general, could imagine trees trees
In general, could imagine trees trees