Sailboat Graph

Author

Eric W. Weisstein
July 27, 2026

This notebook downloaded from https://mathworld.wolfram.com/notebooks/GraphTheory/SailboatGraph.nb.

For more information, see Eric's MathWorld entry https://mathworld.wolfram.com/SailboatGraph.html.

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

Figure

GraphicsRow[
StyleGraphs[
GraphData["SailboatGraph","Graph","All"]
],
Dividers->All
]

Embeddings

<<MathWorld`Graphs`

Names

GraphData["SailboatGraph","StandardName"]

GraphData["SailboatGraph","StandardNames"]

HouseOfGraphs

hogid=GraphData["SailboatGraph","NotationRules","HouseOfGraphs"]

HouseOfGraphsLookup[hogid]

HouseOfGraphsGraph[hogid]//StyleGraphs[#,ImageSize->Small]&

Wikidata

GraphData["SailboatGraph","WikidataID"]

GraphData["SailboatGraph","WikidataID","URL"]

Construction Robertson et al. 2019

v=Join[Table[{i,2},{i,0,8}],{#,1}&/@{2,4,6},{{1,0},{7,0},{3,4},{5,4}}];
g=Graph[Range[Length[v]],UndirectedEdge@@@Sort[{{13,14},{9,14},{9,16},{2,16},{1,2},{1,13},{2,3},{3,4},{4,5},{5,6},{6,7},{7,8},{8,9},{1,15},{8,15},{4,15},{6,16},{10,13},{3,10},{5,11},{7,12},{12,14},{10,11},{11,12}}],VertexCoordinates->v,VertexLabels->"Name"]

CubicGraphQ[g]

RecognizeGraph[g]

Primary

GraphData["SailboatGraph"]//StyleGraphs[#,ImageSize->Small]&

All

GraphData["SailboatGraph","Graph","All"]//StyleGraphs

CurvedEdge

GraphData["SailboatGraph","Graph","CurvedEdge"]//StyleGraphs

Inexact

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

Degenerate

GraphData["SailboatGraph","Graph","Degenerate"]//StyleGraphs

DegenerateGraphEmbeddingTypes/@GraphData["SailboatGraph","Graph","Degenerate"]//Column

Embeddings

GraphDataEmbeddings[GraphData["SailboatGraph"]]

Default embedding

g0=GraphPlot[Graph[GraphData["SailboatGraph","VertexList"],GraphData["SailboatGraph","Edges"]],GraphLayout->"SpringEmbedding"]

Configuration

GraphData["SailboatGraph","Configuration"]

configurations=GraphData["SailboatGraph","Graph","Configuration"]//StyleGraphs

GeneralizedPetersen

GraphData["SailboatGraph","Graph","GeneralizedPetersen"]//StyleGraphs

IGraph

GraphData["SailboatGraph","Graph","IGraph"]//StyleGraphs

CompleteKPartite

GraphData["SailboatGraph","Graph","CompleteKPartite"]//StyleGraphs

Bipartite

GraphData["SailboatGraph","Bipartite"]

GraphData["SailboatGraph","Graph","Bipartite"]//StyleGraphs

Bilateral

GraphData["SailboatGraph","Graph","Bilateral"]//StyleGraphs

Grid[DeleteCases[Monitor[{g=#,BilateralGraphEmbeddingTypes[#],GraphSymmetryGroup[#]}&/@GraphData["SailboatGraph","Graph","All"],g],{_,_,TransformationGroup[{}]}],Dividers->All,Alignment->{{Center,{Left}}}]//Quiet

Circular

GraphData["SailboatGraph","Graph","Circular"]//StyleGraphs

Circular construction All

GraphData["SailboatGraph","Hamiltonian"]

GraphData["SailboatGraph","HamiltonianCycles"]

GraphData["SailboatGraph","HamiltonianCycleCount"]

GraphData["SailboatGraph","LCF"]

GraphData["SailboatGraph","LCFSignature"]

BilateralHamiltonianCycleQ[GraphData["SailboatGraph"]]

FindBilateralHamiltonianCycle[GraphData["SailboatGraph"]]

Planar

GraphData["SailboatGraph","Planar"]

GraphData["SailboatGraph","Graph","Planar"]//StyleGraphs

MinimalCrossingNumber crossings.uos.de

CrossingNumber[GraphData["SailboatGraph"],Method->"WebCompute"]//AbsoluteTiming

DateString[]

Quit

MinimalCrossingNumber: "EmbeddingScheme" -> 1

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->10])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->60])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->5 3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->1,TimeConstraint->86400])//AbsoluteTiming

MinimalCrossingNumber: "EmbeddingScheme" -> 2

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->10])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->60])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->5 3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->2,TimeConstraint->86400])//AbsoluteTiming

MinimalCrossingNumber: "EmbeddingScheme" -> 3

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->1])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->10])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->60])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->5 3600])//AbsoluteTiming

(cn=CrossingNumber[GraphData["SailboatGraph"],"EmbeddingScheme"->3,TimeConstraint->86400])//AbsoluteTiming

MinimalCrossing

GraphData["SailboatGraph","CN"]

(gs=GraphData["SailboatGraph","Graph","MinimalCrossing"])//StyleGraphs

GraphCrossingCount/@gs

GraphCrossingDiagram/@gs

MinimalRectilinearCrossing

GraphData["SailboatGraph","RCN"]

GraphData["SailboatGraph","Graph","MinimalRectilinearCrossing"]//StyleGraphs

MinimalCrossing construction

CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->10]//AbsoluteTiming

CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->60]//AbsoluteTiming

g=RotateGraph[MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->2]]

mc=MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->3]

mc2=VertexDelete[mc,Range[17,19]]

d=VertexDegree[mc2]

add=Flatten[MapIndexed[Table[#2[[1]],#]&,3-d]]

Length[sub=Select[Subsets[Subsets[add,{2}],{Length[add]/2}],Intersection[EdgeList[mc2],#]==={}&]]

gs=SetProperty[EdgeAdd[mc2,UndirectedEdge@@@#],{VertexLabels->None,VertexCoordinates->Take[GraphEmbedding[mc],16]}]&/@sub;

SelectFirst[gs,IsomorphicGraphQ[#,GraphData["FourthapexGraph"]]&]

GraphPlot[%]

v={};
g=Graph[Range[Length[v]],UndirectedEdge@@@Sort[Sort/@{],VertexLabels->"Name",VertexCoordinates->v]

VertexDegree[g]

r=RecognizeGraph[g]

rcn=RectilinearCrossingCount@g

vs=ToCommonEdges[g,GraphData[r]]

MinimalRectilinearCrossing by hand

GraphData["SailboatGraph","Graphics"]

v={{0,0},{8,0},{8,4},{3,4},{0,4},{1,2},{2,1},{4,1},{6,1},{2,2},{3,2},{4,2},{5,2},{6,2},{7,2},{5,3-1/2}};
g=Graph[Range[Length[v]],UndirectedEdge@@@Sort[Sort/@{{1,2},{2,3},{4,5},{1,5},{6,10},{10,11},{11,12},{12,13},{13,14},{14,15},{3,15},{4,15},{5,6},{1,7},{7,8},{8,9},{2,9},{7,10},{4,11},{8,12},{9,14},{13,16},{6,16},{3,16}}],VertexLabels->"Name",VertexCoordinates->v]

r=RecognizeGraph[g]

rcn=RectilinearCrossingCount@g

ToCommonEdges[g,GraphData[r]]

GetGraphData[r,"File"]

MinimalCrossing construction Tutte

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

(g=MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->cn])//PolyhedralGraphQ//AbsoluteTiming

faces=ReverseSort@SymmetricallyDistinctFaces[g]

Tally[ReverseSort[Length/@faces]]

TutteGraphs=BilateralGraph[CenterGraph@IGLayoutTutte[g,"OuterFace"->#],"ReturnNonbilateralGraph"->True]&/@faces

TutteGraphsWithOuterCrossingPointCounts={
#,
Count[OuterFace[#],_?(GreaterThan[GraphData["SailboatGraph","V"]])]
}&/@TutteGraphs;

Cases[TutteGraphsWithOuterCrossingPointCounts,{g_,0}:>g]

Cases[TutteGraphsWithOuterCrossingPointCounts,{g_,1}:>g]

LocalCrossingNumberWithEmbeddings=
{1+Max[Length/@DeleteCases[
Drop[AdjacencyList[#],GraphData["SailboatGraph","V"]],
_Integer?(LessEqualThan[GraphData["SailboatGraph","V"]]),
{2}
]],#}&/@TutteGraphs

TutteGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[
#,
AdditionalData->Join[Table[True,GraphData["SailboatGraph","V"]],Table[False,cn]],
SameTest->Equal
]
}&/@TutteGraphs;

SymmetricEmbeddingsWithOrientations=DeleteCases[
TutteGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]

Select[SymmetricEmbeddingsWithOrientations[[All,1]],Count[OuterFace[#],_?(GreaterThan[GraphData["SailboatGraph","V"]])]==0&]

MinimalCrossing construction Random 1k [98 s]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

Length[diagrams=DistinctMinimalCrossingDiagramData[
GraphData["SailboatGraph"],
1000,
"CrossingNumber"->cn,
EdgeShapeFunction->"BezierEdge"
]]//AbsoluteTiming

No crossing points on the boundary:

Length[diagrams0=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==0&],"Graph",{}]]//Timing

Take[diagrams0,UpTo[10]]

One crossing point on the boundary:

Length[diagrams1=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==1&],"Graph",{}]]//Timing

Take[diagrams1,UpTo[10]]

graphs=#["Graph"]&/@diagrams;

Symmetric embeddings:

RandomGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[#]
}&/@graphs;//AbsoluteTiming

MaxMemoryUsed[]/10^9.GB

Symmetric embeddings:

Length[SymmetricMinimalEmbeddingData=DeleteCases[
RandomGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]
]//AbsoluteTiming

SymmetricMinimalEmbeddingData

SymmetricMinimalEmbeddingGraphs=SymmetricMinimalEmbeddingData[[All,1]]

GraphCrossingCount/@SymmetricMinimalEmbeddingGraphs

GraphCrossingDiagram/@SymmetricMinimalEmbeddingGraphs

GraphPlot@RotateGraph[StraightenGraph@,-Pi/2]

v={{0,0},{6,0},{1,1},{3,1},{5,1},{1,2},{2,2},{3,2},{4,2},{5,2},{0,3},{1,3},{4,3},{6,3},{0,6},{6,6}}/6;
ee={e[1,2,14,16,15,11,1,3,4,5,2],e[11,12,13,14],e[6,7,8,9,10],e[5,10,16],e[15,7],e[12,6,3],{9,13},{4,8}};
g=Graph[Range@Length@v,UndirectedEdge@@@ee,VertexCoordinates->v,VertexLabels->Automatic]

RecognizeGraph@g

DegenerateGraphEmbeddingTypes@g

GraphCrossingCount@g

MinimalCrossing construction Random 5k [428 s]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

Length[diagrams=DistinctMinimalCrossingDiagramData[
GraphData["SailboatGraph"],
5000,
"CrossingNumber"->cn,
EdgeShapeFunction->"BezierEdge"
]]//AbsoluteTiming

No crossing points on the boundary:

Length[diagrams0=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==0&],"Graph",{}]]//Timing

Take[diagrams0,UpTo[10]]

One crossing point on the boundary:

Length[diagrams1=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==1&],"Graph",{}]]//Timing

Take[diagrams1,UpTo[10]]

graphs=#["Graph"]&/@diagrams;

Symmetric embeddings:

RandomGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[#]
}&/@graphs;//AbsoluteTiming

MaxMemoryUsed[]/10^9.GB

Symmetric embeddings:

Length[SymmetricMinimalEmbeddingData=DeleteCases[
RandomGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]
]//AbsoluteTiming

SymmetricMinimalEmbeddingData

SymmetricMinimalEmbeddingGraphs=SymmetricMinimalEmbeddingData[[All,1]]

GraphCrossingCount/@SymmetricMinimalEmbeddingGraphs

GraphCrossingDiagram/@SymmetricMinimalEmbeddingGraphs

GraphPlot@RotateGraph[StraightenGraph@,{13,14}]

g=ToGridEmbedding[]

RecognizeGraph@g

DegenerateGraphEmbeddingTypes@g

GraphCrossingCount@g

MinimalCrossing construction Random 20k [2061 s]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

Length[diagrams=DistinctMinimalCrossingDiagramData[
GraphData["SailboatGraph"],
20*^3,
"CrossingNumber"->cn,
EdgeShapeFunction->"BezierEdge"
]]//AbsoluteTiming

No crossing points on the boundary:

Length[diagrams0=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==0&],"Graph",{}]]//Timing

Take[diagrams0,UpTo[10]]

One crossing point on the boundary:

Length[diagrams1=Lookup[Select[diagrams,MinimalCrossingOuterCrossingCount[#]==1&],"Graph",{}]]//Timing

Take[diagrams1,UpTo[10]]

graphs=#["Graph"]&/@diagrams;

Symmetric embeddings:

RandomGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[#]
}&/@graphs;//AbsoluteTiming

MaxMemoryUsed[]/10^9.GB

Symmetric embeddings:

Length[SymmetricMinimalEmbeddingData=DeleteCases[
RandomGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]
]//AbsoluteTiming

SymmetricMinimalEmbeddingData

SymmetricMinimalEmbeddingGraphs=SymmetricMinimalEmbeddingData[[All,1]]

GraphCrossingCount/@SymmetricMinimalEmbeddingGraphs

GraphCrossingDiagram/@SymmetricMinimalEmbeddingGraphs

MinimalCrossing construction Random 1k [old]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

(RandomGraphs=Table[MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->cn,RandomSeed->n],{n,1000}]//Union);//Timing

RandomGraphsWithOuterCrossingPointCounts={
#,
Count[OuterFace[#],_?(GreaterThan[GraphData["SailboatGraph","V"]])]
}&/@RandomGraphs;

Small numbers of crossing points on the boundary:

Cases[RandomGraphsWithOuterCrossingPointCounts,{g_,0}:>g]

Cases[RandomGraphsWithOuterCrossingPointCounts,{g_,1}:>g]

Symmetric embeddings:

RandomGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[
#,
AdditionalData->Join[Table[True,GraphData["SailboatGraph","V"]],Table[False,cn]],
SameTest->Equal
]
}&/@RandomGraphs;

MaxMemoryUsed[]/10^9.GB

DeleteCases[
RandomGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]/.g_Graph:>BilateralGraph[CenterGraph@g,"ReturnNonbilateralGraph"->True]

MinimalCrossing construction Random 20k [old]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->1])//AbsoluteTiming

(RandomGraphs=Table[MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->cn,RandomSeed->n],{n,20000}]//Union);//Timing

RandomGraphsWithOuterCrossingPointCounts={
#,
Count[OuterFace[#],_?(GreaterThan[GraphData["SailboatGraph","V"]])]
}&/@RandomGraphs;

Small numbers of crossing points on the boundary:

Cases[RandomGraphsWithOuterCrossingPointCounts,{g_,0}:>g]

Cases[RandomGraphsWithOuterCrossingPointCounts,{g_,1}:>g]

Symmetric embeddings:

RandomGraphsWithSymmetryGroups={
#,
GraphSymmetryGroup[
#,
AdditionalData->Join[Table[True,GraphData["SailboatGraph","V"]],Table[False,cn]],
SameTest->Equal
]
}&/@RandomGraphs;

MaxMemoryUsed[]/10^9.GB

DeleteCases[
RandomGraphsWithSymmetryGroups,
{_,TransformationGroup[{}]}
]/.g_Graph:>BilateralGraph[CenterGraph@g,"ReturnNonbilateralGraph"->True]

MinimalLocalCrossing

GraphData["SailboatGraph",{"LocalCrossingNumber","RectilinearLocalCrossingNumber"}]

GraphData["SailboatGraph","Graph","MinimalLocalCrossing"]//StyleGraphs

MinimalRectilinearLocalCrossing

GraphData["SailboatGraph",{"LocalCrossingNumber","RectilinearLocalCrossingNumber"}]

GraphData["SailboatGraph","Graph","MinimalRectilinearLocalCrossing"]//StyleGraphs

MinimaRectilinearlLocalCrossing construction 1000

AdjacentCrossingsQ[g_Graph,cn_Integer]:=Module[{a=AdjacencyList[g],n=VertexCount[g]-cn},Max[Take[a,-cn]]>n]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->10])//AbsoluteTiming

(gs=Select[Table[MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->cn,RandomSeed->i],{i,1000}],!AdjacentCrossingsQ[#,cn]&]//Union)//Timing

MinimaRectilinearlLocalCrossing construction 20000

AdjacentCrossingsQ[g_Graph,cn_Integer]:=Module[{a=AdjacencyList[g],n=VertexCount[g]-cn},Max[Take[a,-cn]]>n]

(cn=CrossingNumber[GraphData["SailboatGraph"],TimeConstraint->10])//AbsoluteTiming

(gs=Select[Table[MinimalCrossingGraph[GraphData["SailboatGraph"],"CrossingNumber"->cn,RandomSeed->i],{i,20000}],!AdjacentCrossingsQ[#,cn]&]//Union)//Timing

Circulant

GraphData["SailboatGraph","Circulant"]

GraphData["SailboatGraph","Graph","Circulant"]//StyleGraphs

Circulant construction

GraphData["SailboatGraph","NotationRules","Circulant"]

(ci=CirculantIndices[GraphData["SailboatGraph"]])//AbsoluteTiming

CirculantGraph1@@@ci

Cases[GraphData["SailboatGraph","StandardNames"],{"Circulant",i_}:>i]

CirculantGraph1@@@%

Complement graph

compl=GraphData["SailboatGraph","ComplementGraph","Name"]

Line graph

GraphData["SailboatGraph","Line"]

LineGraphQ[GraphData["SailboatGraph"]]//Timing

RootGraph

roots=Select[GraphData[All],GraphData[#,"LineGraph","Name"]==="SailboatGraph"&]

RootGraph[GraphData["SailboatGraph"]]

Halin

GraphData["SailboatGraph","Halin"]

GraphData["SailboatGraph","Graph","Halin"]//StyleGraphs

Rigid

GraphData["SailboatGraph","Rigid"]

GraphData["SailboatGraph","Graph","Rigid"]//StyleGraphs

Flexible

GraphData["SailboatGraph","Flexible"]

GraphData["SailboatGraph","Graph","Flexible"]//StyleGraphs

Voltage

gs=GraphData["SailboatGraph","Graph","Voltage"]//StyleGraphs

VoltageGraphNotation/@gs//Column

Voltage construction

VoltageGraph[GraphData["SailboatGraph"],"MaxResults"->20,Debug->True]

LCF

GraphData["SailboatGraph","LCF"]

GraphData["SailboatGraph","HamiltonianCycleCount"]

GraphData["SailboatGraph","LCFSignature"]

GraphData["SailboatGraph","LCFNotations"]

GraphData["SailboatGraph","Graph","LCF"]//StyleGraphs

Tally[LCFNotation[#][[2]]&/@%]

LCF compute FindBilateralHamiltonianCycle

BilateralHamiltonianCycleQ[GraphData["SailboatGraph"],Debug->True]//AbsoluteTiming

(BilateralHamiltonianCycles=FindBilateralHamiltonianCycle[GraphData["SailboatGraph"],Debug->True])//AbsoluteTiming

CircularEmbeddingFromHamiltonianCycle[GraphData["SailboatGraph"],BilateralHamiltonianCycles[[1]]]

LCFNotation@%

LCF compute All

Divisors[GraphData["SailboatGraph","V"]]

Length[FindHamiltonianCycle[GraphData["SailboatGraph"],All][[All,All,1]]]//Timing

Tally[(lcf=LCF[GraphData["SailboatGraph"],All])[[All,2]]]//Timing

MaxMemoryUsed[]/10.^9 "GB"

DeleteCases[lcf,{_,1}]

LCFGraph@@@DeleteCases[lcf,{_,1}]//StyleGraphs

Tally[LCFNotation[#][[-1]]&/@(nicelcfgs=NiceLCFGraphs[lcf,2,1])]//Timing

Length[gs=nicelcfgs]

gs

NiceLCFEmbeddingsWithSymmetryGroups={#,GraphSymmetryGroup[#]}&/@gs;

DeleteCases[NiceLCFEmbeddingsWithSymmetryGroups,{_,TransformationGroup[{Reflection[InfiniteLine[{0,0},{0,-1}]]}]}]

UnitDistance

GraphData["SailboatGraph","UnitDistance"]

UnitDistanceGraphQ[GraphData["SailboatGraph"],Debug->True]//Timing

GraphData["SailboatGraph","Graph","UnitDistance"]//StyleGraphs

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

UnitDistance by refinement of default embeddings

Graph[edge list]

(g=UnitDistanceEmbeddingRefine[Graph[GraphData["SailboatGraph","EdgeList"]],MaxIterations->500])//Timing

UnitDistanceGraphEmbeddingQ[g]

Graph[vertex list, edge list]

(g=UnitDistanceEmbeddingRefine[Graph[GraphData["SailboatGraph","VertexList"],GraphData["SailboatGraph","EdgeList"]],MaxIterations->500])//Timing

UnitDistanceGraphEmbeddingQ[g]

UnitDistance by refinement of existing embeddings

gs=UnitDistanceEmbeddingRefine[Graph[VertexList[#],EdgeList[#],VertexCoordinates->GraphEmbedding[#]],MaxIterations->500]&/@Complement@@(GraphData["SailboatGraph","Graph",#]&/@{"All","UnitDistance"})

TextGrid[
gdata=SortBy[
{#,DegenerateGraphEmbeddingQ[#],GraphSymmetryGroup[#],Max[Abs[EdgeLengths[#]-1]]}&/@gs,
Last
],
Dividers->All
]

Cases[gdata,{__,0.}]

Symmetric:

gs=Cases[
gdata,
{g_,_,sym:Except[TransformationGroup[{}]],diff_}:>{
HighlightGraph[g1=BilateralGraph[CenterGraph[g],"ReturnNonbilateralGraph"->True],Flatten[FindCoincidentVertices[g1]]],
sym,
diff
}]

UnitDistance by refinement of stored LCF embeddings

FileByteCount[file=FileNameJoin[{$PropertiesDir,"LCFNotations-Nice",GraphNameToFileName["SailboatGraph",".m.gz"]}]]

Tally[(lcf=Import[file])[[All,-1]]]//Timing//AbsoluteTiming

lcf=LCFNotation/@nicelcfgs;

gs=UnitDistanceEmbeddingRefine[LCFGraph@@#,MaxIterations->500]&/@lcf;//Timing

gdata=SortBy[
{#,Max[Abs[EdgeLengths[#]-1]]}&/@gs,
Last
]

Cases[gdata,{g_?UnitDistanceGraphEmbeddingQ,_}:>g]

NondegenerateSymmetricGraphs=Select[
gdata,
And[
DegenerateGraphEmbeddingQ[#[[1]]]===False,
GraphSymmetryGroup[#[[1]]]=!=TransformationGroup[{}]
]&
]/.g_Graph:>CenterGraph[g]

UnitDistance by FindUnitDistanceEmbedding  (random embeddings returning on messages)

gs=FindUnitDistanceEmbedding[GraphData["SailboatGraph"],50,"ReturnWithMessage"->True];//Quiet//Timing

gdata=SortBy[
{#,Max[Abs[EdgeLengths[#]-1]]}&/@gs,
Last
]

Cases[gdata,{g_?UnitDistanceGraphEmbeddingQ,_}:>g]

SymmetricEmebddings=Select[gdata,GraphSymmetryGroup[#[[1]]]=!=TransformationGroup[{}]&]

UnitDistance by FindUnitDistanceEmbedding  (random embedding waiting until UD is found)

FindUnitDistanceEmbedding[GraphData["SailboatGraph"],"ReturnWithMessage"->False]//Quiet//Timing

UnitDistance by FindSubgraphUnitDistanceEmbedding

{$Version,DateString[]}

{"SailboatGraph",l=FindSubgraphUnitDistanceEmbedding[GraphData["SailboatGraph"],TimeConstraint->300,"Results"->All]//Timing}

gs=SortBy[UniqueEmbeddings[l],Replace[RectilinearCrossingCount[#],Infinity->0]&]

Select[IndexGraph/@gs,!DegenerateGraphEmbeddingQ[#]&&GraphSymmetryGroup[#]=!=TransformationGroup[{}]&]//Timing

UnitDistance FindSubgraphUnitDistanceEmbedding

{"SailboatGraph",l=FindSubgraphUnitDistanceEmbedding[GraphData["SailboatGraph"],TimeConstraint->300,"Results"->All]//Timing}

gs=UniqueEmbeddings[l]

gs={,,,,,,,}

Matchstick

GraphData["SailboatGraph","Matchstick"]

GraphData["SailboatGraph","Graph","Matchstick"]//StyleGraphs

3D default

Graph3D[GraphData["SailboatGraph","Edges"]]

3D construction

3D All

GraphData["SailboatGraph","Graph",{"3D","All"}]

3D UnitDistance construction Random

GraphData["SailboatGraph","Dimension"]

(g=UnitDistanceEmbeddingRefine[
Graph3D[
GraphData["SailboatGraph","VertexList"],
GraphData["SailboatGraph","EdgeList"]
],
WorkingPrecision->25])//Timing

EdgeLengths[g]

UnitDistanceGraphEmbeddingQ[g]

3D UnitDistance

GraphData["SailboatGraph","Graph",{"3D","UnitDistance"}]

3D Polyhedron

GraphData["SailboatGraph","Polyhedral"]

GraphData["SailboatGraph","Graph",{"3D","Polyhedron"}]

GraphData

GraphDataClassString

GraphDataClassString["SailboatGraph"]

GraphDataString

file=OpenWrite["~/sailboat.m"]

WriteString[file,GraphDataString[g,
"StandardName"->"SailboatGraph",
"Name"->"sailboat graph",
TimeConstraint->10,
Debug->True,
"Skip"->{"Arboricity"}
]]