diff --git a/papers/medial_tire_cuts/experiments/draw_medial_tire_cut.py b/papers/medial_tire_cuts/experiments/draw_medial_tire_cut.py new file mode 100644 index 0000000..1feffba --- /dev/null +++ b/papers/medial_tire_cuts/experiments/draw_medial_tire_cut.py @@ -0,0 +1,63 @@ +"""Draw the walk-depth labelling and cut of a medial tire decomposition. + +Paper-graphics companion to ``run_medial_tire_cut_experiment.py``: it imports +``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 +recognised full medial tire graph of the decomposition, using ``to_tikz`` from +``medial_tire_cut_labelling``. + +This script only renders; the experiment itself draws nothing. Run with the +repo venv (networkx): ``.venv/bin/python``. + +Example: + .venv/bin/python draw_medial_tire_cut.py -n 20 --seed 72 > panels.tex +""" + +from __future__ import annotations + +import argparse +import os +import sys + +_HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, _HERE) + +from run_medial_tire_cut_experiment import run_experiment # noqa: E402 +from medial_tire_cut_labelling import to_tikz # noqa: E402 + + +def tikz_panels(n: int, seed: int, scale: float = 1.6) -> tuple[dict, list[str]]: + """Run the experiment and return ``(result, panels)``, one TikZ panel per + recognised tread, each showing that tread's walk-depth labelling and cut.""" + result = run_experiment(n=n, seed=seed) + panels = [] + for d in sorted(result["results"]): + rec = result["results"][d] + panels.append(to_tikz(rec["g"], depth=rec["depth"], cuts=rec["cuts"], + entry_edge=rec["entry_edge"], scale=scale)) + return result, panels + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("-n", type=int, default=20) + parser.add_argument("--seed", type=int, default=72) + parser.add_argument("--scale", type=float, default=1.6) + args = parser.parse_args() + + result, panels = tikz_panels(args.n, args.seed, scale=args.scale) + treads = sorted(result["results"]) + print(f"% medial tire cut: n={args.n} seed={args.seed} " + f"source={result['source']} recognised treads={treads}") + if not panels: + print("% (no recognised full medial tire graphs for this graph)") + for d, panel in zip(treads, panels): + g = result["results"][d]["g"] + print(f"% --- tread {d}: |A(T)|={g.n} word={g.tooth_word} " + f"bites={sorted(g.bites)} ---") + print(panel) + + +if __name__ == "__main__": + main() diff --git a/papers/medial_tire_cuts/paper.aux b/papers/medial_tire_cuts/paper.aux index a51b9a6..55636d1 100644 --- a/papers/medial_tire_cuts/paper.aux +++ b/papers/medial_tire_cuts/paper.aux @@ -11,14 +11,17 @@ \newlabel{ex:worked-cut}{{2.3}{2}} \@writefile{toc}{\contentsline {section}{\tocsection {}{3}{Chaining across the tire tree}}{2}{}\protected@file@percent } \citation{bauerfeld-medial-tire} -\bibcite{bauerfeld-medial-tire}{1} \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces A full medial tire graph (left) and its walk-depth labelling and cut (right), from Example\nonbreakingspace 2.3\hbox {}. Black vertices are the annular medial vertices of the cycle $A(T)$; blue vertices are up-tooth apexes, red vertices are down-tooth apexes, and the larger red vertex is the shared apex of the bite on annular edges $0$ and $4$. On the right, each tooth carries its walk depth, and the two red slits mark the cuts: \emph {cut\nonbreakingspace 1} duplicates $a_5$ as the root-face traversal closes, and \emph {cut\nonbreakingspace 2} duplicates $a_1$ as the bite's inner-gap face closes. After the cuts the only bounded faces are the eight teeth.}}{3}{}\protected@file@percent } \newlabel{fig:worked-cut}{{1}{3}} \newlabel{rem:chaining-candidates}{{3.1}{3}} +\newlabel{ex:real-cut}{{3.2}{3}} +\bibcite{bauerfeld-medial-tire}{1} \newlabel{tocindent-1}{0pt} \newlabel{tocindent0}{12.7778pt} \newlabel{tocindent1}{17.77782pt} \newlabel{tocindent2}{0pt} \newlabel{tocindent3}{0pt} +\@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}} \@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{4}{}\protected@file@percent } \gdef \@abspage@last{4} diff --git a/papers/medial_tire_cuts/paper.log b/papers/medial_tire_cuts/paper.log index eaca148..5c08961 100644 --- a/papers/medial_tire_cuts/paper.log +++ b/papers/medial_tire_cuts/paper.log @@ -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:46 +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 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -500,10 +500,10 @@ LaTeX Warning: `h' float specifier changed to `ht'. [2] [3] [4] (./paper.aux) ) Here is how much of TeX's memory you used: - 13648 strings out of 478268 - 272620 string characters out of 5846347 - 558283 words of memory out of 5000000 - 31477 multiletter control sequences out of 15000+600000 + 13652 strings out of 478268 + 272685 string characters out of 5846347 + 559301 words of memory out of 5000000 + 31481 multiletter control sequences out of 15000+600000 477049 words of font info for 58 fonts, out of 8000000 for 9000 1302 hyphenation exceptions out of 8191 84i,9n,89p,801b,704s stack positions out of 10000i,1000n,20000p,200000b,200000s @@ -521,7 +521,7 @@ msy10.pfb> -Output written on paper.pdf (4 pages, 176366 bytes). +Output written on paper.pdf (4 pages, 180590 bytes). PDF statistics: 85 PDF objects out of 1000 (max. 8388607) 52 compressed objects within 1 object stream diff --git a/papers/medial_tire_cuts/paper.pdf b/papers/medial_tire_cuts/paper.pdf index 746d9dd..aed0895 100644 Binary files a/papers/medial_tire_cuts/paper.pdf and b/papers/medial_tire_cuts/paper.pdf differ diff --git a/papers/medial_tire_cuts/paper.tex b/papers/medial_tire_cuts/paper.tex index 3040cca..5199488 100644 --- a/papers/medial_tire_cuts/paper.tex +++ b/papers/medial_tire_cuts/paper.tex @@ -309,6 +309,84 @@ graph, tire decomposition at a vertex level source, and chained walk-depth labelling and cut---is carried out by the experiment script \texttt{experiments/run\_medial\_tire\_cut\_experiment.py}. +\begin{example}[A medial tire cut from a random graph] +\label{ex:real-cut} +Run on a random maximal planar graph on $20$ vertices (seed $72$, level +source vertex $9$), the experiment yields a single recognised tread +$T_2$, drawn in Figure~\ref{fig:real-cut} with the walk-depth labelling +and cut emitted by the graphics companion +\texttt{experiments/draw\_medial\_tire\_cut.py}. Its annular cycle has +length $8$, with up teeth on annular edges $0,3,4$, singleton down teeth +on $1,6,7$, and a bite on the non-incident annular edges $2$ and $5$ (the +central shared apex). Entering at the up tooth on edge $0$ with walk +depth $0$, the root face is labelled in order ($0,1,2$ then $3,4,5$) and +\emph{cut~1} duplicates $a_0$ as it closes; the walk then descends through +the bite into its inner-gap face, labelling the two teeth there ($6,7$), +and \emph{cut~2} duplicates $a_3$ as that face closes. The two cuts leave +only the outer face and the eight teeth as $3$-faces. +\end{example} + +\begin{figure}[h] +\centering +\begin{tikzpicture}[scale=1.6, + ann/.style={circle, fill=black, inner sep=1.0pt}, + upv/.style={circle, draw=blue!70!black, fill=blue!12, inner sep=1.4pt}, + downv/.style={circle, draw=red!70!black, fill=red!12, inner sep=1.4pt}, + bitev/.style={circle, draw=red!70!black, fill=red!32, inner sep=1.7pt}, + cyc/.style={black, line width=1.0pt}, + tth/.style={black!55, line width=0.4pt}, + lbl/.style={font=\scriptsize}, + dlbl/.style={font=\scriptsize\bfseries, text=black}, + cut/.style={red!80!black, line width=1.3pt}, + cutlbl/.style={font=\tiny, text=red!75!black}] +\draw[cyc] (0.000,1.000)--(0.707,0.707)--(1.000,0.000)--(0.707,-0.707)--(0.000,-1.000)--(-0.707,-0.707)--(-1.000,-0.000)--(-0.707,0.707)--cycle; +\draw[tth] (0.559,1.349)--(0.000,1.000) (0.559,1.349)--(0.707,0.707); +\draw[tth] (0.559,-1.349)--(0.707,-0.707) (0.559,-1.349)--(0.000,-1.000); +\draw[tth] (-0.559,-1.349)--(0.000,-1.000) (-0.559,-1.349)--(-0.707,-0.707); +\draw[tth] (0.554,0.230)--(0.707,0.707) (0.554,0.230)--(1.000,0.000); +\draw[tth] (-0.554,0.230)--(-1.000,-0.000) (-0.554,0.230)--(-0.707,0.707); +\draw[tth] (-0.230,0.554)--(-0.707,0.707) (-0.230,0.554)--(0.000,1.000); +\draw[tth] (0.000,-0.318)--(1.000,0.000) (0.000,-0.318)--(0.707,-0.707); +\draw[tth] (0.000,-0.318)--(-0.707,-0.707) (0.000,-0.318)--(-1.000,-0.000); +\node[ann] at (0.000,1.000) {}; +\node[ann] at (0.707,0.707) {}; +\node[ann] at (1.000,0.000) {}; +\node[ann] at (0.707,-0.707) {}; +\node[ann] at (0.000,-1.000) {}; +\node[ann] at (-0.707,-0.707) {}; +\node[ann] at (-1.000,-0.000) {}; +\node[ann] at (-0.707,0.707) {}; +\node[upv] at (0.559,1.349) {}; +\node[upv] at (0.559,-1.349) {}; +\node[upv] at (-0.559,-1.349) {}; +\node[downv] at (0.554,0.230) {}; +\node[downv] at (-0.554,0.230) {}; +\node[downv] at (-0.230,0.554) {}; +\node[bitev] at (0.000,-0.318) {}; +\node[dlbl] at (0.456,1.101) {0}; +\node[dlbl] at (0.704,0.292) {1}; +\node[dlbl] at (0.427,-0.336) {2}; +\node[dlbl] at (0.456,-1.101) {7}; +\node[dlbl] at (-0.456,-1.101) {6}; +\node[dlbl] at (-0.427,-0.336) {3}; +\node[dlbl] at (-0.704,0.292) {4}; +\node[dlbl] at (-0.292,0.704) {5}; +\draw[cut] (0.000,0.840)--(0.000,1.160); +\node[cutlbl] at (0.000,1.300) {cut 1}; +\draw[cut] (0.594,-0.594)--(0.820,-0.820); +\node[cutlbl] at (0.919,-0.919) {cut 2}; +\node[lbl, text=blue!60!black] at (0.689,1.663) {entry}; +\end{tikzpicture} +\caption{The recognised tread $T_2$ of the medial tire decomposition of a +random maximal planar graph on $20$ vertices +(Example~\ref{ex:real-cut}), 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.} +\label{fig:real-cut} +\end{figure} + \begin{thebibliography}{9} \bibitem{bauerfeld-medial-tire}