FusionAtlasPaths={"~/projects/fusionatlas/code/package/"};
$Path=$Path~Join~FusionAtlasPaths;
<<FusionAtlas`

L=25;

LaTeX output

Off[Unset::norep]

Clear[tree]
tree[g1_,g2_]:=tree[g1,g2]={{g1,g2},Null,Null}//.{{h1_BigraphWithDuals,h2_BigraphWithDuals},Null,Null}:>With[{extensions=((*FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][h1,h2,1,"Weeds"->Weeds[{g1,g2}]]=.;*)FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][h1,h2,1,"Weeds"->Weeds[{g1,g2}]])},{{h1,h2},Cases[extensions[[1]],p_/;DimensionOfGenerator[p]<Sqrt[L]],{#,Null,Null}&/@Cases[extensions[[2]],p_/;DimensionOfGenerator[p]<Sqrt[L]]}]

tikzTree[{g1_,g2_}]:=
"\\begin{tikzpicture}\n"<>"[
level 1/.style={level distance=46mm, sibling distance=40mm,nodes={draw, fill=white, rectangle, rounded corners}},
level 2/.style={level distance=52mm, sibling distance=20mm},
level 3/.style={level distance=58mm, sibling distance=25mm},
level 4/.style={level distance=64mm},
grow=right]"<>"\\node[draw, fill=white, rectangle, rounded corners] "<>tikzNode[g1,g2,tree[g1,g2]]<>";\n"<>"\\end{tikzpicture}\n"

tikzNode[g1_BigraphWithDuals,g2_BigraphWithDuals,{{h1_BigraphWithDuals,h2_BigraphWithDuals},vines_,leaves_}]:=
If[MemberQ[Weeds[g1,g2],{h1,h2}],"[fill=red!30]",""]<>"{$\\begin{array}{c}\\bigraph{"<>GraphToString[h1]<>"}\\\\\\bigraph{"<>GraphToString[h2]<>"}\\end{array}$"<>StringJoin@@("\\ref{"<>GraphToString[#[[1]]]<>"}"&/@vines)<>"}" <>"\n"<>StringJoin@@("child {node "<>tikzNode[g1,g2,#]<>"}"&/@leaves)

GraphToString[{G1_BigraphWithDuals,G2_BigraphWithDuals}]:="\\left(\\bigraph{"<>GraphToString[G1]<>"}, \\bigraph{"<>GraphToString[G2]<>"}\\right)"

typesetVinesAndWeeds[tag_,{g1_,g2_}]:=Module[{weeds=Weeds[{g1,g2}],vines=Vines[{g1,g2}]},
"\\begin{align*}\n"<>
If[Length[vines]>0,"\\cV_{"<>tag<>"} & = \\Big\\{ "<>GraphToString[vines[[1]]]<>
StringJoin@@(", \\\\\n & \\qquad" <>GraphToString[#]&/@Rest[vines])<>" \\Big\\}"<>
If[Length[weeds]>0,"\\\\\n \\intertext{and}\n",""],""]<>
If[Length[weeds]>0,
"\\cW_{"<>tag<>"} & = \\Big\\{ "<>GraphToString[weeds[[1]]]<>
StringJoin@@(", \\\\\n & \\qquad" <>GraphToString[#]&/@Rest[weeds])<>" \\Big\\}\n",""]<>
"\\end{align*}\n"
]

Initial cases

A4=BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}}],DualData[{1},{1}]];

A3=BigraphWithDuals[GradedBigraph[{{1}},{{1}}],DualData[{1},{1}]];

A2=BigraphWithDuals[GradedBigraph[{{1}}],DualData[{1}]];

Clear[Weeds,Vines,IgnoredWeeds,KilledWeeds]

Weeds[]={{A3,A3},{A2,A2}};

Weeds[{_,_}]:={}
Vines[{_,_}]:={}

Vines[]={};

Clear[ExtendOneStep]

IgnoredWeeds[]={};

IgnoreWeed[{g1_,g2_}]:=(AppendTo[IgnoredWeeds[],{g1,g2}];Weeds[]=DeleteCases[Weeds[],{g1,g2}];)

KilledWeeds[]={};
KillWeed[{g1_,g2_},reason_String]:=(AppendTo[IgnoredWeeds[],{{g1,g2},reason}];Weeds[]=DeleteCases[Weeds[],{g1,g2}];)

ExtendOneStep[{g1_,g2_}]/;MemberQ[Weeds[],{g1,g2}]∧(Weeds[{g1,g2}]==Vines[{g1,g2}]=={}):=ExtendOneStep[{g1,g2}]=Module[{odometer},
odometer=Cases[#,{BigraphWithDuals[g_,_],_}/;DimensionOfGenerator[g]<Sqrt[L]]&/@FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][g1,g2,1,"Weeds"->{}];
Vines[{g1,g2}]=odometer[[1]];
Vines[]=Vines[]~Join~Vines[{g1,g2}];
Weeds[{g1,g2}]=odometer[[2]];
Weeds[]=DeleteCases[Weeds[],{g1,g2}]~Join~Weeds[{g1,g2}];
Weeds[{g1,g2}]
]

Length[ExtendOneStep[{A3,A3}]]

Length[ExtendOneStep[{A2,A2}]]

IgnoreWeed[{A4,A4}];IgnoreWeed[{A3,A3}];

KillWeed[(Subscript[Γ, o1,b]),"Rotational eigenspaces don't match up."];
KillWeed[(Subscript[Γ, o2,b]),"Rotational eigenspaces don't match up."];

DisplayBigraph/@Weeds[]

Triple points

Depth + 2

DisplayBigraph/@ExtendOneStep[(Subscript[Γ, o1,a])]

DisplayBigraph/@ExtendOneStep[(Subscript[Γ, o1,c])]

DisplayBigraph/@ExtendOneStep[(Subscript[Γ, e1])]

KillWeed[#,"Fails triple point obstruction (even)"]&/@Cases[Weeds[],s_/;!EvenTriplePointObstruction[s]];

KillWeed[#,"Fails triple point obstruction (odd)"]&/@Cases[Weeds[],s_/;!OddTriplePointObstruction[s]];

magicNumbers=Table[DimensionOfLowWeightSpace[#[[1,1]]][k],{k,DepthOfBranchPoint[#[[1,1]]]+1,GraphDepth[#[[1,1]]]}]&;

magicNumbers/@Weeds[]

Table[seeds[1,k]=Cases[Weeds[],g_/;MatchQ[magicNumbers[g],{1,k,___}]],{k,-1,2}];

seeds[2]=Cases[Weeds[],g_/;MatchQ[magicNumbers[g],{2,___}]];

DisplayBigraph/@seeds[1,2]

Magic numbers 12

Clear[RunOdometer]
RunOdometer[{g1_,g2_}]:=RunOdometer[{g1,g2}]=Module[{},
Vines[{g1,g2}]=Complement[Cases[FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][g1,g2,∞,"Weeds"->Weeds[{g1,g2}]][[1]],{BigraphWithDuals[g_,_],_}/;DimensionOfGenerator[g]<Sqrt[L]],Weeds[{g1,g2}]];
Vines[]=Vines[]~Join~Vines[{g1,g2}];
Weeds[]=DeleteCases[Weeds[],{g1,g2}]~Join~Weeds[{g1,g2}];
Vines[{g1,g2}]
]

{g1,g2}=seeds[1,2][[1]];

Weeds[{g1,g2}]

DisplayBigraph/@RunOdometer[seeds[1,2][[1]]]

typesetVinesAndWeeds["e12,a",seeds[1,2][[1]]]

tikzTree[seeds[1,2][[1]]]

(DisplayBigraph/@RunOdometer[#])&/@seeds[1,2]

Magic numbers 11

DisplayBigraph/@seeds[1,1]

RunOdometer[seeds[1,1][[1]]]

{g1,g2}=seeds[1,1][[2]];

Weeds[{g1,g2}]=Union[Truncate[#,6]&/@FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][g1,g2,3,"Weeds"->Weeds[{g1,g2}]][[2]]]

RunOdometer[seeds[1,1][[2]]]

{g1,g2}=seeds[1,1][[3]];

Weeds[{g1,g2}]={{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1}},{{1,0},{1,0},{0,1}},{{0,1,0},{0,1,0},{0,0,1}}],DualData[{1},{1},{3,2,1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1}},{{1,0},{1,0},{0,1}},{{0,1,0},{0,0,1},{0,1,0}}],DualData[{1},{1},{3,2,1}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1}},{{1,0},{1,0},{0,1}},{{1,0,0},{0,1,0},{0,0,1},{0,0,1}}],DualData[{1},{1},{3,2,1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1}},{{1,0},{1,0},{0,1}},{{1,0,0},{0,0,1},{0,1,0},{0,0,1}}],DualData[{1},{1},{3,2,1}]]}};

RunOdometer[seeds[1,1][[3]]]

DisplayBigraph/@Vines[]

KnownObstructions[{BigraphWithDuals[g1_GradedBigraph,_],BigraphWithDuals[g2_GradedBigraph,_]}]:=KnownObstructions[g1]~Join~KnownObstructions[g2]

DisplayBigraph/@Cases[Vines[]~Join~(Translate[#,2]&/@Vines[])~Join~(Translate[#,4]&/@Vines[]),v_/;KnownObstructions[v]=={}]

Magic numbers 10

DisplayBigraph/@({o10}=seeds[1,0])

Weeds[o10]={{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{1,0}},{{1,0}},{{1},{1}}],DualData[{1},{1},{1,2},{1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{0,1}},{{1,0},{1,0},{0,1}},{{0,1,0},{0,0,1}}],DualData[{1},{1},{1,2},{3,2,1}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{1,0}},{{1,0},{0,1}},{{1,0},{1,0},{0,1}},{{0,1,0},{0,0,1}},{{1,0},{0,1},{0,1}}],DualData[{1},{1},{1,2},{1,2},{2,1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{0,1}},{{1,0},{1,0},{0,1},{0,1}},{{0,1,0,0},{0,0,0,1},{1,0,0,0}},{{1,0,0},{0,1,0},{0,1,0},{0,0,1}},{{0,0,0,1},{1,0,0,0},{0,1,0,0}}],DualData[{1},{1},{1,2},{4,2,3,1},{3,2,1,4}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{1,0}},{{1,0},{0,1}},{{1,0},{0,1}},{{1,0},{0,1}},{{1,0},{0,1}}],DualData[{1},{1},{1,2},{1,2},{2,1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1}},{{1,0},{0,1}},{{1,0},{1,0},{0,1},{0,1}},{{0,0,0,1},{1,0,0,0}},{{1,0},{0,1}},{{0,1},{1,0}}],DualData[{1},{1},{1,2},{4,2,3,1},{1,2}]]}};

DisplayBigraph/@Weeds[o10]

{g1,g2}=o10;

Global`$JVMHeap=1024;
RestartJava[]

DisplayBigraph/@Union[Truncate[#,6]&/@FindBigraphPairExtensionsUpToDepth[Sqrt[L]+(10.^(-3))][g1,g2,4,"Weeds"->Weeds[{g1,g2}]][[2]]]

DisplayBigraph/@RunOdometer[o10]

DisplayBigraph/@{"bwd1v1v1v1p1v1x0p0x1v1x0p0x1p0x1v1x0x0p0x0x1duals1v1v1x2v2x1x3","bwd1v1v1v1p1v1x0p1x0v0x1v1p1duals1v1v1x2v1"}

DisplayBigraph/@{"bwd1v1v1v1p1v1x0p0x1v1x0p1x0p0x1p0x1v0x1x0x0p0x0x1x0p0x0x0x1v1x0x0p1x0x0p0x1x0p0x0x1v1x0x0x0p0x0x1x0p0x0x0x1duals1v1v1x2v1x3x2x4v1x4x3x2","bwd1v1v1v1p1v1x0p1x0v1x0p0x1v0x1p1x0p0x1v1x0x0p0x1x0v0x1p1x0p0x1duals1v1v1x2v1x2v2x1"}

typesetVinesAndWeeds["o10",o10]

tikzTree[o10]

Quadruple points

DisplayBigraph/@seeds[2]

DisplayBigraph/@(Weeds[seeds[2][[1]]]={{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0}}],DualData[{1},{1},{1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0}}],DualData[{1},{1},{1}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0}}],DualData[{1},{1},{1,2}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0}}],DualData[{1},{1},{1,2}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0},{0,1}}],DualData[{1},{1},{1,2}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0},{0,1}}],DualData[{1},{1},{1,2}]]}})

DisplayBigraph/@RunOdometer[seeds[2][[1]]]

DisplayBigraph/@(Weeds[seeds[2][[2]]]={{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{1,0,0}}],DualData[{1},{1},{1,2,3}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{1,0,0}}],DualData[{1},{1},{1,2,3}]]},{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0}}],DualData[{1},{1},{1,2,3},{1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{1,0,0},{0,1,0}},{{1,0}}],DualData[{1},{1},{1,2,3},{1}]]}})

DisplayBigraph/@RunOdometer[seeds[2][[2]]]

typesetVinesAndWeeds["o2,a",seeds[2][[2]]]

tikzTree[seeds[2][[2]]]

DisplayBigraph/@(Weeds[seeds[2][[3]]]={{BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{0,1,0}}],DualData[{1},{1},{3,2,1}]],BigraphWithDuals[GradedBigraph[{{1}},{{1}},{{1}},{{1},{1},{1}},{{0,1,0}}],DualData[{1},{1},{3,2,1}]]}})

DisplayBigraph/@RunOdometer[seeds[2][[3]]]

Conclusions

Weeds[]

DisplayBigraph/@Weeds[]

Vines[]=Union[Vines[]]

DisplayBigraph/@Vines[]