Skip to content

Commit

Permalink
added dual graph
Browse files Browse the repository at this point in the history
  • Loading branch information
MeikeWeiss committed Sep 18, 2024
1 parent eaacded commit 053452e
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 4 deletions.
31 changes: 31 additions & 0 deletions doc/planar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -427,3 +427,34 @@ fail
</Description>
</ManSection>
<#/GAPDoc>

<#GAPDoc Label="DualPlanarGraph">
<ManSection>
<Attr Name="DualPlanarGraph" Arg="digraph"/>
<Returns>A digraph or <K>fail</K>.</Returns>
<Description>
If <A>digraph</A> is a planar digraph, then <E>DualPlanarGraph</E> returns the the dual graph of <A>digraph</A>.
If <A>digraph</A> is not planar, then fail is returned.<P/>

The dual graph of a planar digraph <A>digraph</A> has a vertex for each face of <A>digraph</A> and an edge for
each pair of faces that are separated by an edge from each other.
Vertex <A>i</A> of the dual graph corresponds to the facial walk at the <A>i</A>-th position calling
<E>FacialWalks</E> of <A>digraph</A> with the rotation system returned by <E>PlanarEmbedding</E>.

<Example><![CDATA[
gap> D := CompleteDigraph(4);;
gap> dualD := DualPlanarGraph(D);
<immutable digraph with 4 vertices, 12 edges>
gap> IsIsomorphicDigraph(D, dualD);
true
gap> cube := Digraph([[2, 4, 5], [1, 3, 6], [2, 4, 7], [1, 3, 8],
> [1, 6, 8], [2, 5, 7], [3, 6, 8], [4, 5, 7]]);
<immutable digraph with 8 vertices, 24 edges>
gap> oct := DualPlanarGraph(cube);;
gap> IsIsomorphicDigraph(oct, CompleteMultipartiteDigraph([2, 2, 2]));
true
]]></Example>
</Description>
</ManSection>

<#/GAPDoc>
1 change: 1 addition & 0 deletions doc/z-chap4.xml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
<#Include Label="PlanarEmbedding">
<#Include Label="OuterPlanarEmbedding">
<#Include Label="SubdigraphHomeomorphicToK">
<#Include Label="DualPlanarGraph">
</Section>

<Section><Heading>Hashing</Heading>
Expand Down
1 change: 1 addition & 0 deletions gap/planar.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ DeclareAttribute("KuratowskiOuterPlanarSubdigraph", IsDigraph);
DeclareAttribute("SubdigraphHomeomorphicToK23", IsDigraph);
DeclareAttribute("SubdigraphHomeomorphicToK4", IsDigraph);
DeclareAttribute("SubdigraphHomeomorphicToK33", IsDigraph);
DeclareAttribute("DualPlanarGraph", IsDigraph);

# Properties . . .

Expand Down
41 changes: 41 additions & 0 deletions gap/planar.gi
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,47 @@ SUBGRAPH_HOMEOMORPHIC_TO_K4);
InstallMethod(SubdigraphHomeomorphicToK33, "for a digraph", [IsDigraph],
SUBGRAPH_HOMEOMORPHIC_TO_K33);

InstallMethod(DualPlanarGraph, "for a digraph", [IsDigraph],
function(D)
local digraph, rotationSystem, facialWalks, dualEdges,
cycle1, cycle2, commonNodes, i;

if not IsPlanarDigraph(D) then
return fail;
fi;

digraph := DigraphSymmetricClosure(DigraphRemoveLoops(
DigraphRemoveAllMultipleEdges(DigraphMutableCopyIfMutable(D))));
rotationSystem := PlanarEmbedding(digraph);
facialWalks := FacialWalks(digraph, rotationSystem);

dualEdges := [];
for cycle1 in [1 .. Length(facialWalks) - 1] do
for cycle2 in [cycle1 .. Length(facialWalks)] do
if cycle1 = cycle2 then
if not IsDuplicateFree(facialWalks[cycle1]) then
Add(dualEdges, [cycle1, cycle1]);
fi;
else
commonNodes := Intersection(facialWalks[cycle1],
facialWalks[cycle2]);
if Length(commonNodes) = Length(facialWalks[cycle1]) then
for i in [1 .. Length(commonNodes)] do
Add(dualEdges, [cycle1, cycle2]);
Add(dualEdges, [cycle2, cycle1]);
od;
else
for i in [1 .. Length(commonNodes) - 1] do
Add(dualEdges, [cycle1, cycle2]);
Add(dualEdges, [cycle2, cycle1]);
od;
fi;
fi;
od;
od;
return DigraphByEdges(dualEdges);
end);

########################################################################
# 2. Properties
########################################################################
Expand Down
15 changes: 11 additions & 4 deletions tst/standard/attr.tst
Original file line number Diff line number Diff line change
Expand Up @@ -1074,11 +1074,11 @@ gap> DigraphAllUndirectedSimpleCircuits(g);
# FacialCycles
gap> g := Digraph([]);;
gap> rotationSy := [];;
gap> FacialWalks(g,rotationSy);
gap> FacialWalks(g, rotationSy);
[ ]
gap> g := Digraph([[2],[1,3],[2,4],[3]]);;;
gap> rotationSy := [[2],[1,3],[2,4],[3]];;
gap> FacialWalks(g,rotationSy);
gap> g := Digraph([[2], [1, 3], [2, 4], [3]]);;;
gap> rotationSy := [[2], [1, 3], [2, 4], [3]];;
gap> FacialWalks(g, rotationSy);
[ [ 1, 2, 3, 4, 3, 2 ] ]
gap> g := CycleDigraph(4);;
gap> planar := PlanarEmbedding(g);
Expand All @@ -1095,6 +1095,13 @@ gap> rotationSystem := PlanarEmbedding(g);
gap> FacialWalks(g, rotationSystem);
[ [ 1, 3, 6 ], [ 1, 4, 5 ], [ 1, 5, 3 ], [ 1, 6, 4 ], [ 2, 3, 5 ],
[ 2, 4, 6 ], [ 2, 5, 4 ], [ 2, 6, 3 ] ]
gap> g := Digraph([[2, 3, 4], [1, 3, 5], [1, 2, 4], [1, 3, 5], [2, 4, 6], [5, 7, 9], [6, 8, 10], [7, 9, 10], [6, 8, 10], [7, 8, 9]]);;
gap> rotationSy := PlanarEmbedding(g);
[ [ 2, 4, 3 ], [ 3, 5, 1 ], [ 1, 4, 2 ], [ 1, 5, 3 ], [ 2, 4, 6 ],
[ 5, 7, 9 ], [ 8, 10, 6 ], [ 9, 10, 7 ], [ 6, 10, 8 ], [ 7, 8, 9 ] ]
gap> FacialWalks(g, rotationSy);
[ [ 1, 2, 3 ], [ 1, 3, 4 ], [ 1, 4, 5, 6, 7, 8, 9, 6, 5, 2 ], [ 2, 5, 4, 3 ],
[ 6, 9, 10, 7 ], [ 7, 10, 8 ], [ 8, 10, 9 ] ]

# Issue #676
gap> D := Digraph([[], [3], []]);;
Expand Down
20 changes: 20 additions & 0 deletions tst/standard/planar.tst
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,26 @@ gap> D := CompleteDigraph(3);
gap> KuratowskiOuterPlanarSubdigraph(D);
fail

# DualPlanarGraph
gap> DualPlanarGraph(CompleteDigraph(5));
fail
gap> D := CycleDigraph(4);
<immutable cycle digraph with 4 vertices>
gap> DualPlanarGraph(D);
<immutable multidigraph with 2 vertices, 8 edges>
gap> D := ChainDigraph(4);
<immutable chain digraph with 4 vertices>
gap> DualPlanarGraph(D);
<immutable empty digraph with 0 vertices>
gap> D := Digraph([[2, 3, 4], [1, 3, 5], [1, 2, 4], [1, 3, 5], [2, 4, 6], [5, 7, 9], [6, 8, 10], [7, 9, 10], [6, 8, 10], [7, 8, 9]]);;
gap> dualD := DualPlanarGraph(D);
<immutable multidigraph with 7 vertices, 29 edges>
gap> DigraphHasLoops(dualD);
true
gap> D := CompleteDigraph(3);;
gap> DualPlanarGraph(D);
<immutable multidigraph with 2 vertices, 6 edges>

# Kernel function boyers_planarity_check, errors
gap> IS_PLANAR(2);
Error, Digraphs: boyers_planarity_check (C): the 1st argument must be a digrap\
Expand Down

0 comments on commit 053452e

Please sign in to comment.