Ullmann -- some more
This commit is contained in:
parent
0bf014766a
commit
2dbaba6779
1 changed files with 47 additions and 9 deletions
|
@ -377,7 +377,7 @@ out to be still too slow in real-world cases --- which looks unlikely ---,
|
||||||
would be to try to multithread this computation.
|
would be to try to multithread this computation.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\section{Group equality}
|
\section{Group equality}\label{sec:group_equality}
|
||||||
|
|
||||||
Given two circuit group gates, the task of group equality is to determine
|
Given two circuit group gates, the task of group equality is to determine
|
||||||
whether the two groups are structurally equivalent, as discussed above.
|
whether the two groups are structurally equivalent, as discussed above.
|
||||||
|
@ -517,17 +517,55 @@ The refining function is detailed in Figure~\ref{alg:ullmann_refine}.
|
||||||
\caption{Ullmann's refining function}\label{alg:ullmann_refine}
|
\caption{Ullmann's refining function}\label{alg:ullmann_refine}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Ullmann for \emph{isomatch}}
|
||||||
|
|
||||||
|
\paragraph{Graph used.} Our circuit is not actually a graph just as-is: indeed,
|
||||||
|
a wire can be connected to multiple circuits (multiple gates' inputs, or even
|
||||||
|
multiple gates' outputs when using tristate circuits). This could be transposed
|
||||||
|
into a graph with $\frac{n(n-1)}{2}$ edges (the complete subgraph) for this
|
||||||
|
particular wire. Though, internally, a wire is better represented as a vertex
|
||||||
|
itself, with $n$ edges linking it to the connected gates. This representation
|
||||||
|
is also used in Ullmann's implementation, leading to a permutation matrix of
|
||||||
|
$\left(\card{\text{needle gates}} + \card{\text{needle wires}}\right) \times
|
||||||
|
\left(\card{\text{haystack gates}} + \card{\text{haystack wires}}\right)$.
|
||||||
|
|
||||||
|
\paragraph{Final result.} Once a result (\ie{} a correct permutation) is
|
||||||
|
obtained, we further need to check it is actually a solution of our problem.
|
||||||
|
Indeed, while the structure is guaranteed by the algorithm to be the same, we
|
||||||
|
still need to check that every circuit is equal to its matched one, through the
|
||||||
|
procedure described in Section~\ref{sec:group_equality}. So far, only the
|
||||||
|
equality of signatures was checked. We only need to check the circuits, as the
|
||||||
|
wires are necessarily actually matching.
|
||||||
|
|
||||||
|
\paragraph{Non-overlapping results.} We want our results to be non-overlapping
|
||||||
|
(because we won't be able to perform a search-and-replace if it is not the
|
||||||
|
case). Whenever two potential results are conflicting, an arbitrary one of the
|
||||||
|
two can be returned (a human user is operating the software and can make a
|
||||||
|
narrower search if needed).
|
||||||
|
|
||||||
|
To match this specification, we must keep track of the circuits that are
|
||||||
|
already included in a match. We also cannot include an ancestor of a circuit
|
||||||
|
that was included in a match in another match (though this is not possible,
|
||||||
|
because the needle can't be included in itself, but signature collisions could
|
||||||
|
occur).
|
||||||
|
|
||||||
\subsection{Implementation optimisations}
|
\subsection{Implementation optimisations}
|
||||||
|
|
||||||
|
\paragraph{Initial permutation matrix.} The matrix is first filled according to
|
||||||
|
the signatures matches. It is then refined a bit more, by making sure that for
|
||||||
|
every match, every potentially matching gate has the same ``wire kinds''.
|
||||||
|
Indeed, a gate needle's wire must have at least the same inbound adjacent
|
||||||
|
signatures as its matching haystack wire, and same goes for outbound adjacent
|
||||||
|
signatures. Thus, two circuits cannot be matched if this condition is not
|
||||||
|
respected for each pair of corresponding wires of those circuits, and their
|
||||||
|
corresponding cell in the permutation matrix can be nulled.
|
||||||
|
|
||||||
The matrix is first filled according to the signatures matches. It is then
|
\paragraph{Pre-check.} The needle will, in most cases, not be found at all in
|
||||||
refined a bit more, by making sure that for every match, every potentially
|
a given hierarchy group of the haystack. To avoid wasting computation time, we
|
||||||
matching gate has the same ``wire kinds''. Indeed, a gate needle's wire must
|
first check that every signature present in the needle is present at least as
|
||||||
have at least the same inbound adjacent signatures as its matching haystack
|
many times in the haystack. This simple check saved a lot of time.
|
||||||
wire, and same goes for outbound adjacent signatures. Thus, two circuits cannot
|
|
||||||
be matched if this condition is not respected for each pair of corresponding
|
\todo{More stuff?}
|
||||||
wires of those circuits, and their corresponding cell in the permutation matrix
|
|
||||||
can be nulled.
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\section{Performance}
|
\section{Performance}
|
||||||
|
|
Loading…
Add table
Reference in a new issue