In[]:=
CanonicalParts[array_]:=PatternCanonicalize2[ResourceFunction["ArrayCrop"][SparseArray[Thread[#->1]]]]&/@CausalSeparation[Position[array,1]]
In[]:=
Clear[SparseCanonicalParts]
In[]:=
SparseCanonicalParts[sa_]:=PatternCanonicalize2[ResourceFunction["ArrayCrop"][SparseArray[Thread[#->1]]]]&/@CausalSeparation[sa["ExplicitPositions"]]
In[]:=
PatternCheck[patt_,db_]:=If[#=!={},#[[1,1,1]],None]&[Position[db,patt]]
In[]:=
IsPrimitive[array_]:=Length[CausalSeparation[Position[array,1]]]==1
In[]:=
primitives=Select[Keys[Select[Select[$LifeData,KeyExistsQ[#,"InitialWeight"]&&KeyExistsQ[#,"MatrixData"]&],2<#InitialWeight<4000&&(Times@@Dimensions[#MatrixData])<4000&]],IsPrimitive[Normal[$LifeData[#]["MatrixData"]]]&];
In[]:=
allprims=Association[ParallelMap[(#->((If[#["InitialWeight"]>1000,Nothing,If[!KeyExistsQ[#,"Period"],{PatternCanonicalize2[ResourceFunction["ArrayCrop"][#["MatrixData"]]]},If[#["Period"]>150,Nothing,Union[PatternCanonicalize2[ResourceFunction["ArrayCrop"][#]]&/@CellularAutomaton["GameOfLife",{#["MatrixData"],0},#["Period"]]]]]])&)[$LifeData[#]])&,primitives]];
In[]:=
allparts=ParallelMap[{#Name,#["Year"],If[Times@@Dimensions[#["MatrixData"]]<10^6,Length[CanonicalParts[Normal[#["MatrixData"]]]],TooBig]}&,$LifeData];
In[]:=
{#Name,Times@@Dimensions[#["MatrixData"]]}&/@Select[$LifeData,Times@@Dimensions[#["MatrixData"]]>10^6&]
Out[]=
Jaws{Jaws,1884174},Catacryst{Catacryst,4527460},Metacatacryst{Metacatacryst,875952957},6-engine Cordership gun{6-engine Cordership gun,1368525},V gun{V gun,2922525},26-cell quadratic growth{26-cell quadratic growth,244336177},OTCA metapixel{OTCA metapixel,4235364},p1 megacell{p1 megacell,1073872900},Maximum volatility gun{Maximum volatility gun,1133741},Period-59 glider gun{Period-59 glider gun,12608462},1×N quadratic growth{1×N quadratic growth,1013783},24-cell quadratic growth{24-cell quadratic growth,5689398},25-cell quadratic growth{25-cell quadratic growth,3675984},Switch engine ping-pong{Switch engine ping-pong,38679815585},Silverfish{Silverfish,575278200}
In[]:=
SparseCanonicalParts[$LifeData["Catacryst"]["MatrixData"]]
Out[]=
{{{0,0,0,0,0,1,1},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{1,1,1,1,0,0,0}},{{0,0,0,1,1,1},{0,1,0,0,1,0},{1,0,0,0,0,0},{0,1,0,1,0,0}},{{0,0,0,0,0,1,1},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{1,1,1,1,0,0,0}},{{0,0,0,0,0,1,1},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{1,1,1,1,0,0,0}},{{0,0,0,1,1,1},{0,1,0,0,1,0},{1,0,0,0,0,0},{0,1,0,1,0,0}},{{0,0,0,0,0,1,1},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{1,1,1,1,0,0,0}},{{0,0,0,1},{0,0,1,0},{1,0,1,0},{0,1,0,0}},{{0,0,1},{1,1,1},{0,1,0}}}
In[]:=
Length[%90]
Out[]=
8
In[]:=
CausalSeparation[$LifeData["Catacryst"]["MatrixData"]["ExplicitPositions"]]
Out[]=
{{{1766,31},{1767,31},{1768,29},{1768,30},{1769,28},{1770,28},{1771,28},{1772,28}},{{1750,4},{1751,3},{1751,4},{1752,1},{1752,4},{1754,1},{1754,3},{1755,2}},{{1697,1181},{1697,1182},{1698,1183},{1699,1183},{1700,1184},{1700,1185},{1700,1186},{1700,1187}},{{1674,1202},{1675,1202},{1676,1203},{1676,1204},{1677,1205},{1678,1205},{1679,1205},{1680,1205}},{{13,2378},{14,2377},{14,2378},{15,2375},{15,2378},{17,2375},{17,2377},{18,2376}},{{1,2351},{2,2351},{3,2349},{3,2350},{4,2348},{5,2348},{6,2348},{7,2348}},{{182,2539},{183,2538},{183,2540},{184,2540},{185,2541}},{{151,2553},{151,2554},{152,2554},{152,2555},{153,2554}}}
In[]:=
Length[%]
Out[]=
8
In[]:=
partcounts=ParallelMap[{#Name,#["Year"],If[#MatrixData["ExplicitLength"]<10^5,Length[CausalSeparation[#["MatrixData"]["ExplicitPositions"]]],TooBig]}&,$LifeData];
In[]:=
TakeLargestBy[$LifeData,Times@@Dimensions[#MatrixData]&,5]
Out[]=
In[]:=
TakeLargestBy[$LifeData,#MatrixData["ExplicitLength"]&,5]
Out[]=
In[]:=
#MatrixData["ExplicitLength"]&/@%
Out[]=
Silverfish220807,p1 megacell205145,Period-59 glider gun160697,OTCA metapixel64691,V gun29519
In[]:=
Histogram[Values[Last/@partcounts],{1}]
Out[]=
In[]:=
Histogram[Values[Last/@partcounts],{1},{"Log","Probability"}]
Out[]=
In[]:=
Max[Last/@partcounts]
Out[]=
Max[5548,TooBig]
In[]:=
Values/@Map[Last,GroupBy[partcounts,#[[2]]&],{2}]
Out[]=
In[]:=
MostKeySortCount[#,1]Length[#]&/@
Out[]=
19691,1970,1971,1972,1973,19750,1976,1977,1978,19791,1980,1982,19830,1984,1985,19860,19881,1989,1990,19910,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,20070,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,20240
54
59
45
62
8
9
121
124
3
5
7
9
1
3
3
5
2
3
1
9
1
2
17
26
2
7
19
32
1
2
6
19
3
19
1
10
11
35
6
25
3
5
7
16
3
4
3
11
3
8
3
13
8
17
1
4
1
3
3
17
6
23
6
13
1
9
3
16
3
13
3
34
1
5
3
16
1
5
4
13
1
4
2
17
4
99
1
194
In[]:=
ListStepPlot,AspectRatio->.4,Frame->True,Filling->Axis
Out[]=
Count total number of canonical parts. Then number of distinct canonical parts....
Fraction that don’t have multiple modular parts:
Accumulating Modular Parts
Accumulating Modular Parts
For each pattern, find its canonical modular parts...