Double-Toroidal Graph

Author

Eric W. Weisstein
May 17, 2023

This notebook downloaded from http://mathworld.wolfram.com/notebooks/GraphTheory/Double-ToroidalGraph.nb.

For more information, see Eric's MathWorld entry http://mathworld.wolfram.com/Double-ToroidalGraph.html.

©2023 Wolfram Research, Inc. except for portions noted otherwise

Counts

Connected

Table[Count[GraphGenus/@ConnectedGraphs[n],2],{n,8}]//Timing

Incomplete for n≥9

Length/@Table[GraphData[{"Connected","DoubleToroidal"},n],{n,10}]

Disconnected

Possibly incomplete for n≥9

Length/@Table[GraphData[{"Disconnected","DoubleToroidal"},n],{n,20}]

All

Table[Count[GraphGenus/@Graphs[n],2],{n,8}]//Timing

Incomplete for n≥9

Length/@Table[GraphData["DoubleToroidal",n],{n,10}]

Graph on 8 nodes having genus 2

TextGrid[Sort[{FirstCase[GraphData[#,"StandardNames"],{"DoubleToroidal",n_}:>n],GraphData[#,"Notation"],GraphData[#],#}&/@GraphData["DoubleToroidal",8]],Dividers->All]

Print[{#,GraphGenus[GraphData[#],Method->"Sage"]//AbsoluteTiming}]&/@GraphData["DoubleToroidal",8]

Duke and Haggard (1972)

Duke and Haggard

https://link-springer-com/content/pdf/10.1007%2 FBF02761469.pdf

Duke, R. A.; Haggard, G. "The genus of subgraphs of (Subscript[K, 8])."  Israel J. Math. 11, 452–455, 1972.

Harary et al. 1973.  A maximal Toroidal Graph which is not a Triangulation.  Math. Scand. 33, 108–112, 1973.
https://www.mscand.dk/article/view/11476/9493

(Subscript[B, 1])==(Subscript[K, 8])-(Subscript[K, 3]) == {"CompleteKPartite", {1, 1, 1, 1, 1, 3}} == {"DoubleToroidal", {8, 1}}

b1=Graph[Range[8],UndirectedEdge@@@Complement[Subsets[Range[8],{2}],Sort/@Partition[Range[3],2,1,1]]]

rec=RecognizeGraph[b1]

GraphData[{"DoubleToroidal",{8,1}},"#"]

GraphData[{"DoubleToroidal",{8,1}},"StandardNames"]

GetGraphData[{"CompleteKPartite",{1,1,1,1,1,3}},"File"]

RecognizeGraph[System`GraphComplement[b1]]

Tally[RecognizeGraph/@ConnectedGraphComponents[System`GraphComplement[b1]]]

(Subscript[B, 2])==(Subscript[K, 8])-(2(Subscript[P, 2])⋃(Subscript[P, 3])) == {"DoubleToroidal", {8, 11}}

b2=Graph[Range[8],UndirectedEdge@@@Complement[Subsets[Range[8],{2}],{{1,2},{2,3},{4,5},{6,7}}]]

rec=RecognizeGraph[b2]

GraphData[{"DoubleToroidal",{8,11}},"StandardNames"]

GetGraphData[{"DoubleToroidal",{8,11}},"File"]

RecognizeGraph[System`GraphComplement[b2]]

Tally[RecognizeGraph/@ConnectedGraphComponents[System`GraphComplement[b2]]]

(Subscript[B, 3])==(Subscript[K, 8])-2(Subscript[K, 2,3]) == {"DoubleToroidal", {8, 2}}

GraphData["K2,3","#"]

b3=Graph[Range[8],Complement[EdgeList[GraphData@"K8"],EdgeList[GraphData@"K2,3"]]]

rec=RecognizeGraph[b3]

GraphData[{"DoubleToroidal",{8,2}},"StandardNames"]

GetGraphData[{"DoubleToroidal",{8,2}},"File"]

Tally[RecognizeGraph/@ConnectedGraphComponents[GraphComplement[b3]]]

Mohar (1989)

Mohar, B.  ``An obstruction to Embedding Graphs in Surfaces.''  {\it Disc.\ Math.} {\bf 78}, 135--142, 1989.

(Subscript[K, 8])-(Subscript[C, 4]) == {"DoubleToroidal", {8, 4}}

g=EdgeDelete[CompleteGraph[8],UndirectedEdge@@@Partition[Range[4],2,1,1]]

RecognizeGraph[g]

GraphGenus[g,Debug->True]//AbsoluteTiming

GraphGenus[g,Method->"Sage",Debug->True]//AbsoluteTiming

Graphic

dt=Flatten[Partition[#,UpTo[5]]&/@Table[GraphData["DoubleToroidal",n],{n,10}],1]

GraphicsGrid[Map[(Show[GraphData[#]//StyleGraphs,PlotLabel->If[MissingQ[not=GraphData[#,"Notation"]],TextCell[Style[GraphData[#,"Name"],Directive[FontFamily->"Times",Italic,Black]],TextAlignment->Center,PageWidth->100],
Style[not/.s_String:>Style[s,Italic],Directive[Black,FontFamily->"Times"]]//TraditionalForm
]])&,dt,{2}],Dividers->{All,{Thick,Automatic,Automatic,{Thick}}},ImageSize->500]

Embeddings

<<MathWorld`Graphs`

{"DoubleToroidal", {8, 1}} == {"CompleteKPartite", {1, 1, 1, 1, 1, 3}}

GraphData[{"DoubleToroidal",{8,1}},"StandardName"]

{"DoubleToroidal", {8, 2}}

GraphData[{"DoubleToroidal",{8,2}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,2}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,2}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,2}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,2}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,2}},"Edges"]

v={{0,0},{1,0},{2,0},{2,1},{1,1},{0,1},{3/4,1/2},{5/4,1/2}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,5,6,1,7,6,2,5,1],e[3,5,8,2,4,8,3,7,4],{7,8},e[5,7,2]},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,2}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,2}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,2}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,2}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,2}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,2}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,2}},"Planar"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,2}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,2}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,2}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,2}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,2}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,2}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,2}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,2}},"Circulant"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,2}},"Halin"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,2}},"Rigid"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,2}},"Flexible"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,2}},"LCF"]

GraphData[{"DoubleToroidal",{8,2}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,2}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,2}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,2}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,2}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,2}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,2}},"VertexList"],GraphData[{"DoubleToroidal",{8,2}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,2}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,2}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,2}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,2}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,2}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,2}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,2}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,2}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,2}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 3}}

GraphData[{"DoubleToroidal",{8,3}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,3}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,3}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,3}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,3}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,3}},"Edges"]

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

v={{-1,0},{1,0},{0,Sqrt[3]},{-1/2,1/4},{1/2,1/4},{-1/4,1/2},{1/4,1/2},{0,5/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,1,4,8,5,4,6,8,7,6,5,2,8,1,5,3,4,2,7,4],{3,8},{5,7}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,3}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,3}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,3}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,3}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,3}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,3}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

Planar

GraphData[{"DoubleToroidal",{8,3}},"Planar"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,3}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,3}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,3}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,3}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,3}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,3}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,3}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,3}},"Circulant"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,3}},"Halin"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,3}},"Rigid"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,3}},"Flexible"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,3}},"LCF"]

GraphData[{"DoubleToroidal",{8,3}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,3}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,3}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,3}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,3}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,3}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,3}},"VertexList"],GraphData[{"DoubleToroidal",{8,3}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,3}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,3}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,3}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,3}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,3}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,3}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,3}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,3}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,3}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 4}}

GraphData[{"DoubleToroidal",{8,4}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,4}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,4}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,4}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,4}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,4}},"Edges"]

v={{0,0},{1,0},{2,0},{2,1},{1,1},{0,1},{3/4,1/2},{5/4,1/2}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,5,6,1,7,6,8,1,5,2,6],e[3,7,8,2,4,7,5,8,3,5],{2,7},{4,8}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,4}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,4}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,4}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,4}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,4}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,4}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

quad

DeleteDuplicates[Join[quad,bilat]]

Planar

GraphData[{"DoubleToroidal",{8,4}},"Planar"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,4}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,4}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,4}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,4}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,4}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,4}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,4}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,4}},"Circulant"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,4}},"Halin"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,4}},"Rigid"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,4}},"Flexible"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,4}},"LCF"]

GraphData[{"DoubleToroidal",{8,4}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,4}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,4}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,4}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,4}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,4}},"Graph","UnitDistance"]//StyleGraphs

Select[%,!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&]

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,4}},"VertexList"],GraphData[{"DoubleToroidal",{8,4}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,4}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,4}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,4}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,4}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,4}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,4}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,4}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,4}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,4}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 5}}

GraphData[{"DoubleToroidal",{8,5}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,5}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,5}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,5}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,5}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,5}},"Edges"]

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,5}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,5}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,5}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,5}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,5}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,5}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

quad

Planar

GraphData[{"DoubleToroidal",{8,5}},"Planar"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Planar"]//StyleGraphs

Tutte embedding construction

GraphPlot[RotateGraph[]]

v=Join[];
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

MinimalCrossing

GraphData[{"DoubleToroidal",{8,5}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,5}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,5}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,5}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,5}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,5}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,5}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,5}},"Circulant"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,5}},"Halin"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,5}},"Rigid"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,5}},"Flexible"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,5}},"LCF"]

GraphData[{"DoubleToroidal",{8,5}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,5}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,5}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,5}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,5}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,5}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,5}},"VertexList"],GraphData[{"DoubleToroidal",{8,5}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,5}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,5}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,5}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,5}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,5}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,5}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,5}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,5}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,5}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 6}}

GraphData[{"DoubleToroidal",{8,6}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,6}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,6}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,6}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,6}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,6}},"Edges"]

GraphPlot@RotateGraph[GraphicsToGraph@,Pi/2]

v=Join[CirclePoints[7],{{0,0}}];
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[6,{1,7},1,8,7,5,3,1,4,7],e[7,2,8,6,2,4,6,3,7],e[1,5,2]},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,6}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,6}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,6}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,6}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,6}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,6}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,6}},"Planar"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,6}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,6}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,6}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,6}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,6}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,6}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,6}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,6}},"Circulant"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,6}},"Halin"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,6}},"Rigid"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,6}},"Flexible"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,6}},"LCF"]

GraphData[{"DoubleToroidal",{8,6}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,6}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,6}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,6}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,6}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,6}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,6}},"VertexList"],GraphData[{"DoubleToroidal",{8,6}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,6}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,6}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,6}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,6}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,6}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,6}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,6}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,6}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,6}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 7}}

GraphData[{"DoubleToroidal",{8,7}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,7}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,7}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,7}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,7}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,7}},"Edges"]

v={{0,0},{1,0},{1,1},{0,1},{1/4,1/4},{1/4,3/4},{3/8,1/2},{5/8,1/2}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,1,5,6,4,5,8,6,1,7,4],e[6,2,8,3,7,2,5,7,6,3,5],{7,8}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

v={{-1,0},{1,0},{0,Sqrt[3]},{-1/2,1/4},{1/2,1/4},{-1/4,1/2},{1/4,1/2},{0,5/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[6,1,2,3,1,4,8,5,4,6,8,7,6,5,2,8,1,5,3,4,2,7,4],{3,8},{5,7}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph@g

v={{-1,0},{1,0},{0,Sqrt[3]},{-1/2,1/4},{1/2,1/4},{-1/4,1/2},{1/4,1/2},{0,5/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,1,4,8,5,4,6,8,7,6,5,2,8,1,5,3,4,2,7,4],{3,8},{5,7},{6,3}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,7}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,7}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,7}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,7}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,7}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,7}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,7}},"Planar"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,7}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,7}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,7}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,7}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,7}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,7}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,7}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,7}},"Circulant"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,7}},"Halin"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,7}},"Rigid"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,7}},"Flexible"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,7}},"LCF"]

GraphData[{"DoubleToroidal",{8,7}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,7}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,7}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,7}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,7}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,7}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,7}},"VertexList"],GraphData[{"DoubleToroidal",{8,7}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,7}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,7}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,7}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,7}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,7}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,7}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,7}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,7}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,7}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 8}}

GraphData[{"DoubleToroidal",{8,8}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,8}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,8}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,8}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,8}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,8}},"Edges"]

v={{0,0},{1/2,0},{1,0},{1,1},{0,1},{3/8,1/2},{5/8,1/2},{1/2,7/8}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,5,1,7,6,3,8,1,6,8,7,3],e[5,2,4,8,5,7,4,6],e[5,6,2,7],{2,8}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

v={{-1,0},{1,0},{0,Sqrt[3]},{-1/2,1/4},{1/2,1/4},{-1/4,1/2},{1/4,1/2},{0,5/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,1,4,8,5,4,6,8,7,6,5,2,8,1,5,3,4,2,7,4],{3,8},{5,7},{6,3},{7,3}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph@g

Degenerate

GraphData[{"DoubleToroidal",{8,8}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,8}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,8}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,8}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,8}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,8}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,8}},"Planar"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,8}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,8}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,8}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,8}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,8}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,8}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,8}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,8}},"Circulant"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,8}},"Halin"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,8}},"Rigid"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,8}},"Flexible"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,8}},"LCF"]

GraphData[{"DoubleToroidal",{8,8}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,8}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,8}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,8}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,8}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,8}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,8}},"VertexList"],GraphData[{"DoubleToroidal",{8,8}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,8}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,8}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,8}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,8}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,8}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,8}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,8}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,8}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,8}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 9}}

GraphData[{"DoubleToroidal",{8,9}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,9}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,9}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,9}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,9}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,9}},"Edges"]

v={{0,0},{1,0},{1,1},{0,1},{1/4,1/2},{3/4,1/2},{1/2,1/4},{1/2,3/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[6,1,2,3,4,1,7,2,6,3,8,4,5,1,3,7,4,6,5,8,6,7,5],e[1,8,7],e[4,2,8]},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,9}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,9}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,9}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,9}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,9}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,9}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,9}},"Planar"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,9}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,9}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,9}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,9}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,9}}],"CrossingNumber"->cn,RandomSeed->n]],{n,500}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,9}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,9}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,9}},"Circulant"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,9}},"Halin"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,9}},"Rigid"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,9}},"Flexible"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,9}},"LCF"]

GraphData[{"DoubleToroidal",{8,9}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,9}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,9}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,9}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,9}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,9}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,9}},"VertexList"],GraphData[{"DoubleToroidal",{8,9}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,9}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,9}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,9}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,9}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,9}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,9}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,9}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,9}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,9}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 10}}

GraphData[{"DoubleToroidal",{8,10}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,10}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,10}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,10}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,10}},"EdgeList"]]

Default embedding

GraphPlot@GraphData[{"DoubleToroidal",{8,10}},"Edges"]

v={{0,0},{1,0},{1,1},{0,1},{1/2,1/4},{3/8,1/2},{5/8,1/2},{1/2,3/4}};
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,1,5,2,7,3,6,7],e[4,6,1,3,5,8,4,5,7,8,6,5],e[6,2,8,1],{2,4}},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,10}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,10}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,10}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,10}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,10}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,10}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,10}},"Planar"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,10}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,10}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,10}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,10}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,10}}],"CrossingNumber"->cn,RandomSeed->n]],{n,500}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,10}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,10}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,10}},"Circulant"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,10}},"Halin"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,10}},"Rigid"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,10}},"Flexible"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,10}},"LCF"]

GraphData[{"DoubleToroidal",{8,10}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,10}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,10}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,10}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,10}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,10}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,10}},"VertexList"],GraphData[{"DoubleToroidal",{8,10}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,10}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,10}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,10}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,10}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,10}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,10}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,10}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,10}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,10}},"Graph",{"3D","Polyhedron"}]

{"DoubleToroidal", {8, 11}}

GraphData[{"DoubleToroidal",{8,11}},"StandardName"]

Primary

GraphData[{"DoubleToroidal",{8,11}}]//StyleGraphs[#,ImageSize->Small]&

All

GraphData[{"DoubleToroidal",{8,11}},"Graph","All"]//StyleGraphs

Inexact

Select[GraphData[{"DoubleToroidal",{8,11}},"Graph","All"],(!FreeQ[GraphEmbedding[#],_?InexactNumberQ]&)]//StyleGraphs

Embedding types

GraphDataEmbeddings[GraphData[{"DoubleToroidal",{8,11}},"EdgeList"]]

Default embedding

GraphPlot@RotateGraph[Graph@GraphData[{"DoubleToroidal",{8,11}},"Edges"],-Pi/2]

v[[4,2]]//FullSimplify

v=Join[UnitCirclePoints[5],{{0,(NumericalApproximation[Root, (RowDefault["0.263", FEExpressionsNumericalApproximationElider]), Root[1-20 ((#1)^2)+80 ((#1)^4)&,3], ])},{-1/4,0},{1/4,0}}];
g=Graph[Range[Length[v]],UndirectedEdge@@@{e[1,2,3,4,5,1,8,6,7,5,6,1,7,3,8,5,2,6,4,1],{3,6},e[4,7,2,8,4]},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

Degenerate

GraphData[{"DoubleToroidal",{8,11}},"Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData[{"DoubleToroidal",{8,11}},"Graph","Degenerate"]

Bilateral

GraphData[{"DoubleToroidal",{8,11}},"Graph","Bilateral"]//StyleGraphs

Circular

GraphData[{"DoubleToroidal",{8,11}},"Graph","Circular"]//StyleGraphs

Circular construction

Length[hc=FindHamiltonianCycle[GraphData[{"DoubleToroidal",{8,11}}],All][[All,All,1]]]

Length[bilat=DeleteDuplicatesBy[
DeleteMissing[BilaterallyRotatedGraph@CircularEmbeddingFromHamiltonianCycle[GraphData[{"DoubleToroidal",{8,11}}],#]&/@hc],
CircularCanonicalGraphEmbedding]]//Timing

bilat

Length[quad=DeleteDuplicatesBy[Union@Select[bilat,BilateralGraphEmbeddingQ[#,Axis->"X"]&],CircularCanonicalGraphEmbedding[#,4]&]]

Planar

GraphData[{"DoubleToroidal",{8,11}},"Planar"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Planar"]//StyleGraphs

MinimalCrossing

GraphData[{"DoubleToroidal",{8,11}},{"RCN","CN"}]

GraphData[{"DoubleToroidal",{8,11}},"Graph","MinimalCrossing"]//StyleGraphs

MinimalCrossing construction

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,11}}],TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData[{"DoubleToroidal",{8,11}}],TimeConstraint->10])//AbsoluteTiming

Union[Select[Table[RotateGraph[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,11}}],"CrossingNumber"->cn,RandomSeed->n]],{n,1000}],Max[OuterFace[#]]<=GraphData[{"DoubleToroidal",{8,11}},"V"]&]]//Timing

Table[MinimalCrossingGraph[GraphData[{"DoubleToroidal",{8,11}}],"CrossingNumber"->cn,RandomSeed->i],{i,50}]//Union

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@{},VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph[g]

RectilinearCrossingCount[g]

Circulant

GraphData[{"DoubleToroidal",{8,11}},"Circulant"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Circulant"]//StyleGraphs

Halin

GraphData[{"DoubleToroidal",{8,11}},"Halin"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Halin"]//StyleGraphs

Rigid

GraphData[{"DoubleToroidal",{8,11}},"Rigid"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Rigid"]//StyleGraphs

Flexible

GraphData[{"DoubleToroidal",{8,11}},"Flexible"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Flexible"]//StyleGraphs

LCF

GraphData[{"DoubleToroidal",{8,11}},"LCF"]

GraphData[{"DoubleToroidal",{8,11}},"HamiltonianCycleCount"]

GraphData[{"DoubleToroidal",{8,11}},"LCFSignature"]

GraphData[{"DoubleToroidal",{8,11}},"LCFNotations"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","LCF"]//StyleGraphs

UnitDistance

GraphData[{"DoubleToroidal",{8,11}},"UnitDistance"]

UnitDistanceGraphQ[GraphData[{"DoubleToroidal",{8,11}}],Debug->True]//Timing

GraphData[{"DoubleToroidal",{8,11}},"Graph","UnitDistance"]//StyleGraphs

UnitDistance by refinement

UnitDistanceEmbeddingRefine[Graph[GraphData[{"DoubleToroidal",{8,11}},"VertexList"],GraphData[{"DoubleToroidal",{8,11}},"EdgeList"]],MaxIterations->500]

UnitDistanceEmbeddingRefine[Annotate[#,VertexCoordinates->N[GraphEmbedding[#]]],MaxIterations->500]&/@Complement@@(GraphData[{"DoubleToroidal",{8,11}},"Graph",#]&/@{"All","UnitDistance"})

UnitDistance by FindUnitDistanceEmbedding

FindUnitDistanceEmbedding[GraphData[{"DoubleToroidal",{8,11}}],MaxIterations->5000,"ReturnWithMessage"->True]//Timing

Matchstick

GraphData[{"DoubleToroidal",{8,11}},"Matchstick"]

GraphData[{"DoubleToroidal",{8,11}},"Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData[{"DoubleToroidal",{8,11}},"Edges"]]

3D All

GraphData[{"DoubleToroidal",{8,11}},"Graph",{"3D","All"}]

3D UnitDistance

GraphData[{"DoubleToroidal",{8,11}},"Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData[{"DoubleToroidal",{8,11}},"Polyhedral"]

GraphData[{"DoubleToroidal",{8,11}},"Graph",{"3D","Polyhedron"}]

Parametrized families

Antiprism

Entity["Graph",{"Antiprism",n}]["DoubleToroidal"]

Table[GraphData[{"Antiprism",n},"DoubleToroidal"],{n,3,25}]//Union

Complete

Entity["Graph",{"Complete",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Complete",n},"DoubleToroidal"],{n,30}]

Position[seq,True]//Flatten

Graph genus:

A000933

data=Table[Piecewise[{{Ceiling[(n-3)(n-4)/12],n>2}}],{n,20}]

Planar:

Position[data,0]//Flatten

DoubleToroidal

Position[data,2]//Flatten

CompleteBipartite m×n

Entity["Graph",{"CompleteBipartite",{m,n}}]["DoubleToroidal"]

The following is the graph genus:

Grid[data={#[[1,2]],#[[All,1]]}&/@SplitBy[SortBy[Flatten[Table[{{m,n},Ceiling[(m-2)(n-2)/4]},{n,2,20},{m,2,n}],1],Last],Last],Dividers->All,Alignment->Left]

Planar

FirstCase[data,{0,c_}:>c]

DoubleToroidal

toroidal=FirstCase[data,{2,c_}:>c]

GraphData[{"CompleteBipartite",#},"Genus"]&/@toroidal

GraphData[{"CompleteBipartite",#},"DoubleToroidal"]&/@toroidal

Reduce[Ceiling[(m-2)(n-2)/4]==2&&m≤n,{m,n},PositiveIntegers,Backsubstitution->True]

Ceiling[(m-2)(n-2)/4]/.{m->1,n->1}

CompleteBipartite n×n

Entity["Graph",{"CompleteBipartite",{n,n}}]["DoubleToroidal"]

seq=Table[GraphData[{"CompleteBipartite",{n,n}},"DoubleToroidal"],{n,20}]

Position[seq,True]//Flatten

CompleteTripartite k×m×n

Entity["Graph",{"CompleteTripartite",{k,m,n}}]["DoubleToroidal"]

CompleteTripartite n×n×n

Entity["Graph",{"CompleteTripartite",{n,n,n}}]["DoubleToroidal"]

seq=Table[GraphData[{"Complete",n},"DoubleToroidal"],{n,10}]

Position[seq,True]//Flatten

CubeConnectedCycle

Entity["Graph",{"CubeConnectedCycle",n}]["DoubleToroidal"]

seq=Table[GraphData[{"CubeConnectedCycle",n},"DoubleToroidal"],{n,3,8}]

Cycle

Entity["Graph",{"Cycle",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Cycle",n},"DoubleToroidal"],{n,3,30}]//Union

Empty

Entity["Graph",{"Empty",n}]["DoubleToroidal"]

Table[GraphData[{"Empty",n},"DoubleToroidal"],{n,30}]//Union

Table[GraphData[{"Empty",n},"DoubleToroidalCrossingNumber"],{n,30}]//Union

Grid m×n

Entity["Graph",{"Grid",{m,n}}]["DoubleToroidal"]

GraphData[#,"DoubleToroidal"]&/@Select[GraphData["Grid"],Length[GraphData[#,"NotationRules","Grid"]]==2&]//Union

Grid n×n

Entity["Graph",{"Grid",{n,n}}]["DoubleToroidal"]

Table[GraphData[{"Grid",{n,n}},"DoubleToroidal"],{n,20}]//Union

Grid k×m×n

Entity["Graph",{"Grid",{k,m,n}}]["DoubleToroidal"]

GraphData[#,"DoubleToroidal"]&/@Select[GraphData["Grid"],Length[GraphData[#,"NotationRules","Grid"]]==3&]//Union

Grid n×n×n

Entity["Graph",{"Grid",{n,n,n}}]["DoubleToroidal"]

Table[GraphData[{"Grid",{n,n,n}},"DoubleToroidal"],{n,10}]

Hypercube

Entity["Graph",{"Hypercube",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Hypercube",n},"DoubleToroidal"],{n,0,10}]

Position[seq,True]-1//Flatten

Graph genus:

A000337

data=Table[Piecewise[{{1+(n-4)(2^(n-3)),n>1}}],{n,20}]

Planar:

Position[data,0]//Flatten

DoubleToroidal

Position[data,2]//Flatten

Keller

Entity["Graph",{"Keller",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Keller",n},"DoubleToroidal"],{n,5}]

Knight m×n

Entity["Graph",{"Knight",{m,n}}]["DoubleToroidal"]

GraphData[#,"DoubleToroidal"]&/@GraphData["Knight"]

Knight n×n

Entity["Graph",{"Knight",{n,n}}]["DoubleToroidal"]

Table[GraphData[{"Knight",{n,n}},"DoubleToroidal"],{n,20}]

Ladder

Entity["Graph",{"Ladder",n}]["DoubleToroidal"]

Table[GraphData[{"Ladder",n},"DoubleToroidal"],{n,20}]//Union

MoebiusLadder

Entity["Graph",{"MoebiusLadder",n}]["DoubleToroidal"]

seq=Table[GraphData[{"MoebiusLadder",n},"DoubleToroidal"],{n,3,25}]//Union

Mycielski

Entity["Graph",{"Mycielski",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Mycielski",n},"DoubleToroidal"],{n,11}]

Position[seq,True]//Flatten

Odd

Entity["Graph",{"Prism",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Odd",n},"DoubleToroidal"],{n,7}]

Path

Entity["Graph",{"Path",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Path",n},"DoubleToroidal"],{n,20}]//Union

Prism

Entity["Graph",{"Prism",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Prism",n},"DoubleToroidal"],{n,3,25}]//Union

Star

Entity["Graph",{"Star",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Star",n},"DoubleToroidal"],{n,25}]//Union

Transposition

Entity["Graph",{"Transposition",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Transposition",n},"DoubleToroidal"],{n,6}]

Trapezohedron

Entity["Graph",{"Trapezohedron",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Trapezohedron",n},"DoubleToroidal"],{n,3,20}]//Union

Wheel

Entity["Graph",{"Wheel",n}]["DoubleToroidal"]

seq=Table[GraphData[{"Wheel",n},"DoubleToroidal"],{n,4,20}]//Union