30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
"""Utilities for working with planar dual graphs."""
|
|
from typing import Any
|
|
from sage.all import Graph
|
|
|
|
|
|
def find_vertex_for_dual_face(dual_face: Any) -> Any | None:
|
|
"""Return the primal vertex shared by all faces in the dual face, or None."""
|
|
shared_vertices = None
|
|
for dual_edge in dual_face:
|
|
vertices = set(map(lambda e: e[0], dual_edge[0]))
|
|
if shared_vertices:
|
|
shared_vertices.intersection_update(vertices)
|
|
else:
|
|
shared_vertices = vertices
|
|
if len(shared_vertices) == 1:
|
|
return shared_vertices.pop()
|
|
return None
|
|
|
|
|
|
def _dual_edge_has_vertex(dual_edge: Any, vertex: Any) -> bool:
|
|
return any(vertex in edge for dual_vertex in dual_edge for edge in dual_vertex)
|
|
|
|
|
|
def find_dual_face_for_removed_vertex(planar_dual: Graph, vertex: Any) -> Any | None:
|
|
"""Return the dual face of length 5 whose every dual edge contains the given vertex."""
|
|
for dual_face in list[Any](planar_dual.faces()): # type: ignore[call-arg]
|
|
if len(dual_face) == 5 and all(_dual_edge_has_vertex(de, vertex) for de in dual_face):
|
|
return dual_face
|
|
return None
|