From f30d695832f8dbe868d3caf72e196eb5197f8fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Fri, 25 Aug 2017 01:02:17 +0200 Subject: [PATCH] Add Ullmann refining process example --- report/img/refine_haystack_bad.png | Bin 0 -> 10429 bytes report/img/refine_haystack_ok.png | Bin 0 -> 17774 bytes report/img/refine_needle.png | Bin 0 -> 10001 bytes report/img/ullmann_refine/haystack_bad.dot | 7 +++++ report/img/ullmann_refine/haystack_ok.dot | 9 ++++++ report/img/ullmann_refine/needle.dot | 6 ++++ report/report.tex | 32 ++++++++++++++++++++- 7 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 report/img/refine_haystack_bad.png create mode 100644 report/img/refine_haystack_ok.png create mode 100644 report/img/refine_needle.png create mode 100644 report/img/ullmann_refine/haystack_bad.dot create mode 100644 report/img/ullmann_refine/haystack_ok.dot create mode 100644 report/img/ullmann_refine/needle.dot diff --git a/report/img/refine_haystack_bad.png b/report/img/refine_haystack_bad.png new file mode 100644 index 0000000000000000000000000000000000000000..af93d38682d7d25226fe6db062ea98c5ac028d84 GIT binary patch literal 10429 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 KUoLAN{C@zcmqGCW literal 0 HcmV?d00001 diff --git a/report/img/refine_haystack_ok.png b/report/img/refine_haystack_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..932e93a5fc289b1c782f3320cca5970b34c667ac GIT binary patch literal 17774 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®`Bw@>Scz5OmC-3h+kgh)5ifuX$& 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 a; + y -> a; + z -> x; + z -> y; +} diff --git a/report/img/ullmann_refine/haystack_ok.dot b/report/img/ullmann_refine/haystack_ok.dot new file mode 100644 index 0000000..0d07431 --- /dev/null +++ b/report/img/ullmann_refine/haystack_ok.dot @@ -0,0 +1,9 @@ +digraph haystack_ok { + a [style=filled, label=a’]; + x -> a; + y -> a; + z -> a; + y -> x; + y -> z; + z -> x; +} diff --git a/report/img/ullmann_refine/needle.dot b/report/img/ullmann_refine/needle.dot new file mode 100644 index 0000000..ef468a1 --- /dev/null +++ b/report/img/ullmann_refine/needle.dot @@ -0,0 +1,6 @@ +digraph G { + a [style=filled]; + b -> a; + c -> a; + b -> c; +} diff --git a/report/report.tex b/report/report.tex index e5b13d9..2c6a3db 100644 --- a/report/report.tex +++ b/report/report.tex @@ -553,6 +553,18 @@ words, a match between $i$ and $j$ is only possible if every neighbour $k$ of $i$ (in needle) has a possibly matching (\wrt{} $perm$) vertex $k'$ (in haystack) which is a neighbour of $j$. +For instance, for the needle from Figure~\ref{fig:refine_needle}'s, we can try +to check the ones corresponding to the vertex $a$ (the coloured one). Refining +it while matching it with Figure~\ref{fig:refine_haystack_ok} will leave a $1$ +on the match $a-a'$, since every neighbour of $a$ can be matched with a +neighbour of $a'$ (which, hopefully, are a $1$ in the matrix): $b$ matches $y$ +and $c$ matches $z$, for instance. It is not the case with the haystack from +Figure~\ref{fig:refine_haystack_bad}: if the process went far enough already, +there should be no corresponding vertex for either $b$ or $c$, since there are +no such two vertices with an edge linking them. If there is indeed no match at +this point for either $w$ or $c$, the $1$ in the cell matching $a - a'$ will be +turned to a $0$. + This condition is checked on every $1$ in the permutation matrix. If it is not met, the cell is nulled. This, though, potentially creates new ones not matching the condition: the process must be run again, until no new zeroes @@ -565,7 +577,25 @@ of the adjacency of $j$ and the permutation matrix row of $k$. The refining function is detailed in Figure~\ref{alg:ullmann_refine}. -\todo{Insert explaining figure} +\begin{figure}[h] + \centering + \begin{minipage}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{img/refine_needle.png} + \caption{Needle}\label{fig:refine_needle} + \end{minipage} + \begin{minipage}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{img/refine_haystack_ok.png} + \caption{Matching haystack}\label{fig:refine_haystack_ok} + \end{minipage} + \begin{minipage}{0.3\textwidth} + \centering + \includegraphics[width=0.5\textwidth]{img/refine_haystack_bad.png} + \caption{Non-matching haystack}\label{fig:refine_haystack_bad} + \end{minipage} + \caption{Example: Ullmann refining process} +\end{figure} \begin{figure}[h] \begin{algorithmic}