Draw the whole medial graph with all tire cuts

Add a --whole mode to draw_medial_tire_cut.py that renders the entire
medial graph M(G) (the assembled cut graph), on a Kamada-Kawai layout,
with the recognised tires highlighted (black annular vertices, blue/red
teeth carrying walk depths, larger red bite apex) and the rest of M(G)
in grey. Add the resulting figure (Figure 3) and a describing paragraph
to the paper for the n=20 seed-72 example, via an \input-ed .tikz file.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 00:07:00 -04:00
parent 9d7cb7644e
commit c64c720e5a
6 changed files with 336 additions and 30 deletions
@@ -2,23 +2,29 @@
Paper-graphics companion to ``run_medial_tire_cut_experiment.py``: it imports Paper-graphics companion to ``run_medial_tire_cut_experiment.py``: it imports
``run_experiment`` from there, runs the pipeline on a random maximal planar ``run_experiment`` from there, runs the pipeline on a random maximal planar
graph, and emits a TikZ ``tikzpicture`` (walk-depth labels + cut slits) for each graph, and emits TikZ. By default it draws one ``tikzpicture`` (walk-depth
recognised full medial tire graph of the decomposition, using ``to_tikz`` from labels + cut slits) per recognised full medial tire graph, using ``to_tikz``
``medial_tire_cut_labelling``. from ``medial_tire_cut_labelling``. With ``--whole`` it instead draws the whole
medial graph M(G) with every tire's cuts applied, on a Kamada--Kawai layout, the
recognised tires highlighted and the rest of M(G) in grey.
This script only renders; the experiment itself draws nothing. Run with the This script only renders; the experiment itself draws nothing. Run with the
repo venv (networkx): ``.venv/bin/python``. repo venv (networkx): ``.venv/bin/python``.
Example: Examples:
.venv/bin/python draw_medial_tire_cut.py -n 20 --seed 72 > panels.tex .venv/bin/python draw_medial_tire_cut.py -n 20 --seed 72 > panels.tex
.venv/bin/python draw_medial_tire_cut.py -n 20 --seed 72 --whole > whole.tex
""" """
from __future__ import annotations from __future__ import annotations
import argparse import argparse
import math
import os import os
import sys import sys
import networkx as nx
_HERE = os.path.dirname(os.path.abspath(__file__)) _HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, _HERE) sys.path.insert(0, _HERE)
@@ -38,14 +44,102 @@ def tikz_panels(n: int, seed: int, scale: float = 1.6) -> tuple[dict, list[str]]
return result, panels return result, panels
# --------------------------------------------------------------------------- #
# The whole medial graph: M(G) with all tire cuts applied.
# --------------------------------------------------------------------------- #
def _is_split(node) -> bool:
return isinstance(node, tuple) and len(node) == 3 and node[1] in ("A", "B")
def _medial_layout(H: nx.Graph) -> dict:
"""A Kamada--Kawai layout of the (planar) cut graph, normalised to the unit
box. The two copies of a cut vertex have different neighbours, so the layout
separates them automatically, showing the slit."""
pos = nx.kamada_kawai_layout(H)
xs = [p[0] for p in pos.values()]
ys = [p[1] for p in pos.values()]
cx, cy = 0.5 * (max(xs) + min(xs)), 0.5 * (max(ys) + min(ys))
span = max(max(xs) - min(xs), max(ys) - min(ys)) or 1.0
return {v: ((p[0] - cx) / span, (p[1] - cy) / span) for v, p in pos.items()}
def medial_tikz(result: dict, scale: float = 9.0) -> str:
"""A TikZ ``tikzpicture`` of the whole medial graph M(G) with every tire's
cuts applied. Tire teeth are coloured and carry their walk depth; annular
medial vertices are black; medial vertices outside any recognised tire are
grey; cut (split) vertices are drawn as separated copies."""
H = result["cut_graph"]
pos = _medial_layout(H)
# role of each medial vertex: annular / up / down / bite, and walk depth.
annular = set()
for d in sorted(result["results"]):
g, bij = result["results"][d]["g"], result["results"][d]["bij"]
annular.update(bij[f"a{k}"] for k in range(g.n))
apex = {r["apex"]: (r["role"], r["walk"]) for r in result["labels"]}
def edge_of(node):
return node[0] if _is_split(node) else node
L = []
A = L.append
A(f"\\begin{{tikzpicture}}[scale={scale},")
A(" med/.style={black!30, line width=0.3pt},")
A(" grey/.style={circle, draw=black!45, fill=black!8, inner sep=0.9pt},")
A(" ann/.style={circle, fill=black, inner sep=1.0pt},")
A(" cutv/.style={circle, draw=red!75!black, fill=red!12, inner sep=1.0pt},")
A(" upv/.style={circle, draw=blue!70!black, fill=blue!15, inner sep=1.3pt},")
A(" downv/.style={circle, draw=red!70!black, fill=red!15, inner sep=1.3pt},")
A(" bitev/.style={circle, draw=red!70!black, fill=red!35, inner sep=1.6pt},")
A(" dlbl/.style={font=\\tiny\\bfseries, text=black, inner sep=0.5pt}]")
def pt(node):
x, y = pos[node]
return f"({x:.3f},{y:.3f})"
for u, v in H.edges():
A(f"\\draw[med] {pt(u)}--{pt(v)};")
for node in H.nodes():
mv = edge_of(node)
if mv in apex:
role, _ = apex[mv]
style = {"up": "upv", "down": "downv", "bite": "bitev"}[role]
elif mv in annular:
style = "cutv" if _is_split(node) else "ann"
else:
style = "grey"
A(f"\\node[{style}] at {pt(node)} {{}};")
for node in H.nodes():
mv = edge_of(node)
if _is_split(node) or mv not in apex:
continue
x, y = pos[node]
A(f"\\node[dlbl] at ({x:.3f},{y:.3f}) [yshift=4.5pt] {{{apex[mv][1]}}};")
A("\\end{tikzpicture}")
return "\n".join(L)
def main() -> None: def main() -> None:
parser = argparse.ArgumentParser(description=__doc__, parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter) formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("-n", type=int, default=20) parser.add_argument("-n", type=int, default=20)
parser.add_argument("--seed", type=int, default=72) parser.add_argument("--seed", type=int, default=72)
parser.add_argument("--scale", type=float, default=1.6) parser.add_argument("--scale", type=float, default=1.6)
parser.add_argument("--whole", action="store_true",
help="draw the whole medial graph M(G) with all cuts, "
"instead of one panel per tread")
args = parser.parse_args() args = parser.parse_args()
if args.whole:
result = run_experiment(n=args.n, seed=args.seed)
treads = sorted(result["results"])
print(f"% whole medial graph: n={args.n} seed={args.seed} "
f"source={result['source']} recognised treads={treads} "
f"|M(G)|={result['M'].number_of_nodes()}")
print(medial_tikz(result, scale=args.scale if args.scale != 1.6 else 9.0))
return
result, panels = tikz_panels(args.n, args.seed, scale=args.scale) result, panels = tikz_panels(args.n, args.seed, scale=args.scale)
treads = sorted(result["results"]) treads = sorted(result["results"])
print(f"% medial tire cut: n={args.n} seed={args.seed} " print(f"% medial tire cut: n={args.n} seed={args.seed} "
+3 -1
View File
@@ -24,4 +24,6 @@
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces The recognised tread $T_2$ of the medial tire decomposition of a random maximal planar graph on $20$ vertices (Example\nonbreakingspace 3.2\hbox {}), with its walk-depth labelling and cut. Black vertices are the annular medial vertices of $A(T)$; blue vertices are up-tooth apexes and red vertices down-tooth apexes, the larger red vertex being the shared apex of the bite on annular edges $2$ and $5$. Each tooth carries its walk depth; the red slits are the two cuts.}}{4}{}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces The recognised tread $T_2$ of the medial tire decomposition of a random maximal planar graph on $20$ vertices (Example\nonbreakingspace 3.2\hbox {}), with its walk-depth labelling and cut. Black vertices are the annular medial vertices of $A(T)$; blue vertices are up-tooth apexes and red vertices down-tooth apexes, the larger red vertex being the shared apex of the bite on annular edges $2$ and $5$. Each tooth carries its walk depth; the red slits are the two cuts.}}{4}{}\protected@file@percent }
\newlabel{fig:real-cut}{{2}{4}} \newlabel{fig:real-cut}{{2}{4}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{4}{}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{4}{}\protected@file@percent }
\gdef \@abspage@last{4} \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces The whole medial graph $M(G)$ of the random maximal planar graph on $20$ vertices from Example\nonbreakingspace 3.2\hbox {}, with all tire cuts applied. Grey vertices are medial vertices outside any recognised tire; the highlighted tread $T_2$ (cf.\ Figure\nonbreakingspace 2\hbox {}) has black annular medial vertices, blue up-tooth and red down-tooth apexes carrying their walk depths, and the larger red vertex is the bite apex. Drawn by \texttt {experiments/draw\_medial\_tire\_cut.py} with the \texttt {--whole} option.}}{5}{}\protected@file@percent }
\newlabel{fig:whole-medial}{{3}{5}}
\gdef \@abspage@last{5}
+29 -25
View File
@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 14 JUN 2026 23:54 This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 15 JUN 2026 00:06
entering extended mode entering extended mode
restricted \write18 enabled. restricted \write18 enabled.
%&-line parsing enabled. %&-line parsing enabled.
@@ -498,33 +498,37 @@ e
LaTeX Warning: `h' float specifier changed to `ht'. LaTeX Warning: `h' float specifier changed to `ht'.
[2] [3] [4] (./paper.aux) ) [2] [3] (./whole_medial_seed72.tikz)
LaTeX Warning: `h' float specifier changed to `ht'.
[4] [5] (./paper.aux) )
Here is how much of TeX's memory you used: Here is how much of TeX's memory you used:
13652 strings out of 478268 13729 strings out of 478268
272685 string characters out of 5846347 274095 string characters out of 5846347
559301 words of memory out of 5000000 595448 words of memory out of 5000000
31481 multiletter control sequences out of 15000+600000 31553 multiletter control sequences out of 15000+600000
477049 words of font info for 58 fonts, out of 8000000 for 9000 477361 words of font info for 59 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191 1302 hyphenation exceptions out of 8191
84i,9n,89p,801b,704s stack positions out of 10000i,1000n,20000p,200000b,200000s 84i,9n,89p,801b,724s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local/texlive/2022/texmf-dist/fonts/type1/publ </usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
ic/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publi msfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
c/amsfonts/cm/cmbx7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ sfonts/cm/cmbx6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
amsfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ onts/cm/cmbx7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a ts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
msfonts/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams ts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfont
fonts/cm/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon s/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/
ts/cm/cmr7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/ cm/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/
cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/ cmr7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr
cmss10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/c 8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10
msy10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cm .pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.
ti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmt pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.p
i8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt1 fb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb
0.pfb> ></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb>
Output written on paper.pdf (4 pages, 180590 bytes). Output written on paper.pdf (5 pages, 198793 bytes).
PDF statistics: PDF statistics:
85 PDF objects out of 1000 (max. 8388607) 93 PDF objects out of 1000 (max. 8388607)
52 compressed objects within 1 object stream 57 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000) 0 named destinations out of 1000 (max. 500000)
13 words of extra memory for PDF output out of 10000 (max. 10000000) 13 words of extra memory for PDF output out of 10000 (max. 10000000)
Binary file not shown.
+25
View File
@@ -387,6 +387,31 @@ tooth carries its walk depth; the red slits are the two cuts.}
\label{fig:real-cut} \label{fig:real-cut}
\end{figure} \end{figure}
The same data sit inside the whole medial graph $M(G)$.
Figure~\ref{fig:whole-medial} draws all of $M(G)$ for the graph of
Example~\ref{ex:real-cut}, with the tread $T_2$ of
Figure~\ref{fig:real-cut} highlighted in place: its annular medial cycle
in black, its up and down teeth in blue and red carrying their walk
depths, and the remaining medial vertices---those outside any recognised
tire---in grey. This is the assembled cut graph emitted by the
experiment: every recognised tread contributes its cuts, and the tire
pieces are glued to the rest of $M(G)$ along their boundary medial
vertices.
\begin{figure}[h]
\centering
\input{whole_medial_seed72.tikz}
\caption{The whole medial graph $M(G)$ of the random maximal planar graph
on $20$ vertices from Example~\ref{ex:real-cut}, with all tire cuts
applied. Grey vertices are medial vertices outside any recognised tire;
the highlighted tread $T_2$ (cf.\ Figure~\ref{fig:real-cut}) has black
annular medial vertices, blue up-tooth and red down-tooth apexes carrying
their walk depths, and the larger red vertex is the bite apex. Drawn by
\texttt{experiments/draw\_medial\_tire\_cut.py} with the \texttt{--whole}
option.}
\label{fig:whole-medial}
\end{figure}
\begin{thebibliography}{9} \begin{thebibliography}{9}
\bibitem{bauerfeld-medial-tire} \bibitem{bauerfeld-medial-tire}
@@ -0,0 +1,181 @@
\begin{tikzpicture}[scale=9.0,
med/.style={black!30, line width=0.3pt},
grey/.style={circle, draw=black!45, fill=black!8, inner sep=0.9pt},
ann/.style={circle, fill=black, inner sep=1.0pt},
cutv/.style={circle, draw=red!75!black, fill=red!12, inner sep=1.0pt},
upv/.style={circle, draw=blue!70!black, fill=blue!15, inner sep=1.3pt},
downv/.style={circle, draw=red!70!black, fill=red!15, inner sep=1.3pt},
bitev/.style={circle, draw=red!70!black, fill=red!35, inner sep=1.6pt},
dlbl/.style={font=\tiny\bfseries, text=black, inner sep=0.5pt}]
\draw[med] (0.137,0.152)--(0.228,0.102);
\draw[med] (0.137,0.152)--(0.080,0.066);
\draw[med] (0.137,0.152)--(0.029,0.177);
\draw[med] (0.137,0.152)--(0.242,0.193);
\draw[med] (0.080,0.066)--(0.135,-0.006);
\draw[med] (0.080,0.066)--(0.029,0.177);
\draw[med] (0.080,0.066)--(0.115,-0.072);
\draw[med] (0.214,0.011)--(0.228,0.102);
\draw[med] (0.214,0.011)--(0.135,-0.006);
\draw[med] (0.214,0.011)--(0.068,-0.062);
\draw[med] (0.214,0.011)--(0.294,0.130);
\draw[med] (0.135,-0.006)--(0.115,-0.072);
\draw[med] (0.135,-0.006)--(0.068,-0.062);
\draw[med] (0.228,0.102)--(0.294,0.130);
\draw[med] (0.228,0.102)--(0.242,0.193);
\draw[med] (0.029,0.177)--(0.004,0.286);
\draw[med] (0.029,0.177)--(-0.082,0.223);
\draw[med] (0.286,0.270)--(0.291,0.380);
\draw[med] (0.286,0.270)--(0.242,0.193);
\draw[med] (0.286,0.270)--(0.294,0.130);
\draw[med] (0.286,0.270)--(0.232,0.388);
\draw[med] (0.004,0.286)--(0.064,0.386);
\draw[med] (0.004,0.286)--(-0.031,0.393);
\draw[med] (0.004,0.286)--(-0.082,0.223);
\draw[med] (0.064,0.386)--(0.167,0.434);
\draw[med] (0.064,0.386)--(0.072,0.500);
\draw[med] (0.064,0.386)--(-0.031,0.393);
\draw[med] (0.167,0.434)--(0.291,0.380);
\draw[med] (0.167,0.434)--(0.243,0.486);
\draw[med] (0.167,0.434)--(0.072,0.500);
\draw[med] (0.242,0.193)--(0.294,0.130);
\draw[med] (0.291,0.380)--(0.232,0.388);
\draw[med] (0.291,0.380)--(0.243,0.486);
\draw[med] (-0.274,0.101)--(-0.238,0.008);
\draw[med] (-0.274,0.101)--(-0.196,0.185);
\draw[med] (-0.274,0.101)--(-0.317,-0.021);
\draw[med] (-0.274,0.101)--(-0.285,0.218);
\draw[med] (0.115,-0.072)--(0.007,-0.115);
\draw[med] (0.115,-0.072)--(0.126,-0.186);
\draw[med] (-0.082,0.223)--(-0.196,0.185);
\draw[med] (-0.082,0.223)--(-0.183,0.280);
\draw[med] (-0.141,-0.061)--(0.007,-0.115);
\draw[med] (-0.141,-0.061)--(-0.238,0.008);
\draw[med] (-0.141,-0.061)--(-0.265,-0.085);
\draw[med] (-0.141,-0.061)--(-0.096,-0.135);
\draw[med] (0.007,-0.115)--(-0.096,-0.135);
\draw[med] (0.007,-0.115)--(0.126,-0.186);
\draw[med] (-0.196,0.185)--(-0.183,0.280);
\draw[med] (-0.196,0.185)--(-0.285,0.218);
\draw[med] (-0.238,0.008)--(-0.317,-0.021);
\draw[med] (-0.238,0.008)--(-0.265,-0.085);
\draw[med] (0.068,-0.062)--(-0.057,-0.111);
\draw[med] (0.068,-0.062)--(0.001,-0.185);
\draw[med] (-0.125,0.434)--(-0.011,0.486);
\draw[med] (-0.125,0.434)--(-0.242,0.353);
\draw[med] (-0.125,0.434)--(-0.031,0.393);
\draw[med] (-0.125,0.434)--(-0.212,0.403);
\draw[med] (-0.282,-0.159)--(-0.317,-0.021);
\draw[med] (-0.282,-0.159)--(-0.187,-0.179);
\draw[med] (-0.282,-0.159)--(-0.220,-0.274);
\draw[med] (-0.282,-0.159)--(-0.265,-0.085);
\draw[med] (-0.011,0.486)--(0.138,0.497);
\draw[med] (-0.011,0.486)--(-0.031,0.393);
\draw[med] (-0.011,0.486)--(0.072,0.500);
\draw[med] (-0.285,0.218)--(-0.242,0.353);
\draw[med] (-0.285,0.218)--(-0.295,0.311);
\draw[med] (-0.317,-0.021)--(-0.265,-0.085);
\draw[med] (0.138,0.497)--(0.232,0.388);
\draw[med] (0.138,0.497)--(0.072,0.500);
\draw[med] (0.138,0.497)--(0.243,0.486);
\draw[med] (-0.242,0.353)--(-0.295,0.311);
\draw[med] (-0.242,0.353)--(-0.212,0.403);
\draw[med] (-0.187,-0.179)--(-0.057,-0.111);
\draw[med] (-0.187,-0.179)--(-0.104,-0.210);
\draw[med] (-0.187,-0.179)--(-0.220,-0.274);
\draw[med] (-0.057,-0.111)--(0.001,-0.185);
\draw[med] (-0.057,-0.111)--(-0.104,-0.210);
\draw[med] (0.232,0.388)--(0.243,0.486);
\draw[med] (-0.137,-0.372)--(-0.104,-0.282);
\draw[med] (-0.137,-0.372)--(-0.134,-0.475);
\draw[med] (-0.137,-0.372)--(-0.220,-0.274);
\draw[med] (-0.137,-0.372)--(-0.035,-0.453);
\draw[med] (0.126,-0.186)--(0.212,-0.281);
\draw[med] (0.126,-0.186)--(0.119,-0.298);
\draw[med] (0.212,-0.281)--(0.280,-0.380);
\draw[med] (0.212,-0.281)--(0.119,-0.298);
\draw[med] (0.212,-0.281)--(0.193,-0.407);
\draw[med] (-0.104,-0.282)--(0.001,-0.185);
\draw[med] (-0.104,-0.282)--(-0.220,-0.274);
\draw[med] (-0.104,-0.282)--(-0.104,-0.210);
\draw[med] (0.280,-0.380)--(0.317,-0.480);
\draw[med] (0.280,-0.380)--(0.193,-0.407);
\draw[med] (0.280,-0.380)--(0.212,-0.500);
\draw[med] (0.001,-0.185)--(-0.104,-0.210);
\draw[med] (-0.183,0.280)--(-0.212,0.403);
\draw[med] (-0.183,0.280)--(-0.295,0.311);
\draw[med] (-0.212,0.403)--(-0.295,0.311);
\draw[med] (0.051,-0.411)--(0.133,-0.397);
\draw[med] (0.051,-0.411)--(-0.035,-0.453);
\draw[med] (0.051,-0.411)--(0.090,-0.495);
\draw[med] (0.051,-0.411)--(0.119,-0.298);
\draw[med] (-0.035,-0.453)--(-0.134,-0.475);
\draw[med] (-0.035,-0.453)--(0.090,-0.495);
\draw[med] (0.119,-0.298)--(0.133,-0.397);
\draw[med] (0.090,-0.495)--(0.193,-0.407);
\draw[med] (0.090,-0.495)--(0.212,-0.500);
\draw[med] (0.193,-0.407)--(0.212,-0.500);
\draw[med] (0.212,-0.500)--(0.317,-0.480);
\node[grey] at (0.137,0.152) {};
\node[grey] at (0.080,0.066) {};
\node[grey] at (0.214,0.011) {};
\node[grey] at (0.135,-0.006) {};
\node[grey] at (0.228,0.102) {};
\node[grey] at (0.029,0.177) {};
\node[grey] at (0.286,0.270) {};
\node[grey] at (0.004,0.286) {};
\node[grey] at (0.064,0.386) {};
\node[grey] at (0.167,0.434) {};
\node[grey] at (0.242,0.193) {};
\node[grey] at (0.291,0.380) {};
\node[grey] at (-0.274,0.101) {};
\node[upv] at (0.115,-0.072) {};
\node[grey] at (-0.082,0.223) {};
\node[upv] at (-0.141,-0.061) {};
\node[ann] at (0.007,-0.115) {};
\node[grey] at (-0.196,0.185) {};
\node[grey] at (-0.238,0.008) {};
\node[grey] at (0.068,-0.062) {};
\node[grey] at (-0.125,0.434) {};
\node[grey] at (-0.282,-0.159) {};
\node[grey] at (-0.011,0.486) {};
\node[grey] at (-0.285,0.218) {};
\node[grey] at (-0.317,-0.021) {};
\node[grey] at (0.138,0.497) {};
\node[grey] at (-0.242,0.353) {};
\node[grey] at (-0.187,-0.179) {};
\node[grey] at (0.294,0.130) {};
\node[grey] at (-0.057,-0.111) {};
\node[grey] at (0.232,0.388) {};
\node[upv] at (-0.137,-0.372) {};
\node[ann] at (0.126,-0.186) {};
\node[ann] at (0.212,-0.281) {};
\node[grey] at (-0.104,-0.282) {};
\node[ann] at (0.280,-0.380) {};
\node[grey] at (0.001,-0.185) {};
\node[grey] at (-0.031,0.393) {};
\node[grey] at (-0.183,0.280) {};
\node[grey] at (-0.212,0.403) {};
\node[ann] at (0.051,-0.411) {};
\node[grey] at (-0.265,-0.085) {};
\node[ann] at (-0.035,-0.453) {};
\node[grey] at (-0.220,-0.274) {};
\node[bitev] at (0.119,-0.298) {};
\node[downv] at (0.090,-0.495) {};
\node[downv] at (0.193,-0.407) {};
\node[grey] at (0.072,0.500) {};
\node[grey] at (-0.295,0.311) {};
\node[grey] at (0.243,0.486) {};
\node[downv] at (0.212,-0.500) {};
\node[grey] at (-0.104,-0.210) {};
\node[cutv] at (-0.134,-0.475) {};
\node[cutv] at (0.317,-0.480) {};
\node[cutv] at (-0.096,-0.135) {};
\node[cutv] at (0.133,-0.397) {};
\node[dlbl] at (0.115,-0.072) [yshift=4.5pt] {6};
\node[dlbl] at (-0.141,-0.061) [yshift=4.5pt] {7};
\node[dlbl] at (-0.137,-0.372) [yshift=4.5pt] {0};
\node[dlbl] at (0.119,-0.298) [yshift=4.5pt] {3};
\node[dlbl] at (0.090,-0.495) [yshift=4.5pt] {1};
\node[dlbl] at (0.193,-0.407) [yshift=4.5pt] {4};
\node[dlbl] at (0.212,-0.500) [yshift=4.5pt] {5};
\end{tikzpicture}