Compare commits
2 commits
740a2ab6a3
...
1621d258f9
Author | SHA1 | Date | |
---|---|---|---|
Théophile Bastian | 1621d258f9 | ||
Théophile Bastian | f141526b66 |
|
@ -350,9 +350,61 @@ The ``IO adjacency'' term is an additional term in the signatures of order
|
|||
above $0$, indicating what input and output pins of the circuit group
|
||||
containing the current gate are adjacent to it.
|
||||
|
||||
The default order of signature used in all computations, unless more is useful,
|
||||
is 2, after a few benchmarks.
|
||||
|
||||
\todo{explain range of $n$}
|
||||
|
||||
\paragraph{Efficiency.} Every circuit memoizes all it can concerning its
|
||||
signature: the inner signature, the IO adjacency, the signatures of order $n$
|
||||
already computed, etc.
|
||||
|
||||
This memoization, alongside with the exclusive use of elementary operations,
|
||||
makes the computation of a signature very fast. The computation is linear in
|
||||
the number of gates in a circuit, times the order computed; the computation is
|
||||
lazy.
|
||||
|
||||
To keep those memoized values up to date whenever the structure of the circuit
|
||||
is changed (since this is meant to be integrated in a programming language, fl,
|
||||
meaning the structure of the circuit will possibly be created, checked for
|
||||
signature, altered, then checked again), each circuit keeps track of a
|
||||
``timestamp'' of last modification, which is incremented whenever the circuit
|
||||
or its children are modified. A memoized data is always stored alongside with a
|
||||
timestamp of computation, which invalidates a previous result when needed.
|
||||
|
||||
One possible path of investigation for future work, if the computation turns
|
||||
out to be still too slow in real-world cases --- which looks unlikely ---,
|
||||
would be to try to multithread this computation.
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\section{Group equality}
|
||||
\todo{}
|
||||
|
||||
Given two circuit group gates, the task of group equality is to determine
|
||||
whether the two groups are structurally equivalent, as discussed above.
|
||||
|
||||
Group equality itself is handled as a simple backtracking algorithm, trying to
|
||||
establish a match (an isomorphism, that is, a permutation of the gates of one
|
||||
of the groups) between the two groups given.
|
||||
|
||||
The gates of the two groups are matched by equal signatures, equal number of
|
||||
inputs and outputs, based on the signature of default order (that is, 2). A few
|
||||
checks are made, \eg{} every matching group must have the same size on both
|
||||
sides (if not, then, necessary, the two groups won't match). Then, the worst
|
||||
case of number of permutations to check is evaluated.
|
||||
|
||||
If this number is too high, the signature order will be incremented, and the
|
||||
matching groups re-created accordingly, until a satisfyingly low number of
|
||||
permutations is reached (or the diameter of the circuit is reached, meaning
|
||||
that increasing the order of signature won't have any additional impact). This
|
||||
order increase ``on-demand'' proved itself very efficient, effectively lowering
|
||||
the number of permutations examined to no more than $4$ in studied cases.
|
||||
|
||||
Once a permutation is judged worth to be examined, the group equality is run
|
||||
recursively on all its matched gates. If this step succeeds, the graph
|
||||
structure is then checked. If both steps succeeds, the permutation is correct
|
||||
and an isomorphism has been found; if not, we move on to the next permutation.
|
||||
|
||||
\todo{Anything more to tell here?}
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\section{Pattern-match}
|
||||
|
@ -360,6 +412,11 @@ containing the current gate are adjacent to it.
|
|||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\section{Performance}
|
||||
|
||||
\todo{}
|
||||
|
||||
\subsection{Corner cases}
|
||||
|
||||
\todo{}
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
Loading…
Reference in a new issue