Skip to content

Commit 9288391

Browse files
committed
Multiple source RPQ draft.
1 parent 461df95 commit 9288391

File tree

1 file changed

+144
-1
lines changed

1 file changed

+144
-1
lines changed

tex/RPQ.tex

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,151 @@ \chapter{Поиск путей с регулярными ограничения
22

33
\section{Достижимость между всеми парами вершин}
44

5-
Через тензорное произведение
5+
Через тензорное произведение.
6+
7+
Классическое построение пересечения автоматов строит их тензорное произведение.
8+
9+
Так как мы хотим отвечать ещё и на вопрос о достижимости, что нам надо ещё и транзитивное замыкание посчитать.
610

711
\section{Достижимость с несколькими источниками}
812

913
Достижимость от нескольких стартовых вершин через обход в ширину, основанный на линейной алгебре~\cite{9286186}.
14+
15+
Алгоритм принимает на вход граф $\mathcal{G}$, детерминированный конечный автомат $\mathcal{R}$, описывающий регулярную грамматику, и множество начальных вершин $V_{src}$ графа.
16+
17+
Граф $\mathcal{G}$ и автомат $\mathcal{R}$ можно представить в виде булевых матриц смежности. Так, в виде словаря для каждой метки графа заводится булева матрица смежности, на месте $(i, j)$ ячейки которой стоит 1, если $i$ и $j$ вершины графа соединены ребром данной метки. Такая же операция проводится для автомата грамматики $\mathcal{R}$.
18+
19+
Далее, мы оперируем с двумя словарями, где ключом является символ метки ребра графа или символ алфавита автомата, а значением --- соответствующая им булевая матрица.
20+
21+
Для каждого символа из пересечения этих множеств строится матрица $\mathfrak{D}$, как прямая сумма булевых матриц. То есть, строится матрица $\mathfrak{D} = Bool_{\mathcal{R}_a} \bigoplus Bool_{\mathcal{G}_a}$, которая определяется как
22+
23+
\begin{equation}
24+
\mathfrak{D} =
25+
\left[
26+
\begin{matrix}
27+
Bool_{\mathcal{R}_a} & 0\\
28+
0 & Bool_{\mathcal{G}_a}
29+
\end{matrix}
30+
\right]
31+
\end{equation}
32+
33+
Где $\mathcal{R}_{a}$ и $\mathcal{G}_{a}$ матрицы смежности соответствующих символов автомата грамматики $\mathcal{R}$ и графа $\mathcal{G}$ для символа $a \in A_\mathcal{R} \cap A_\mathcal{G}$, $A_\mathcal{R} \cap A_\mathcal{G}$ --- пересечение алфавитов. Такая конструкция позволяет синхронизировать алгоритм обхода в ширину одновременно для графа и грамматики.
34+
35+
Далее вводится матрица $M$, хранящая информацию о фронте обхода. Она нужна для выделения множества пройденных вершин и не допускает зацикливание алгоритма.
36+
\begin{equation}
37+
M^{k \times (k + n)} =
38+
\left[
39+
\begin{matrix}
40+
Id_k & Matrix_{k \times n }
41+
\end{matrix}
42+
\right]
43+
\end{equation}
44+
45+
Где $Id_k$ --- единичная матрица размера $k$, $k$ --- количество вершин в автомате $\mathcal{R}$, $Matrix_{k \times n }$ --- матрица, хранящая в себе маску пройденных вершин в автомате графа, $n$ --- количество вершин в графе $\mathcal{G}$.
46+
47+
\subsection{Выходные данные}
48+
49+
На выходе строится множество $\mathcal{P}$ пар вершин $(v, w)$ графа $\mathcal{G}$ таких, что вершина $w$ достижима из множества начальных вершин, при этом $v \in V_{src}$, $w \not\in V_{src}$. Это множество представляется в виде матрицы размера $|V|\times|V|$, где $(i,j)$ ячейка содержит 1, если пара вершин с индексами $(i, j) \in \mathcal{P}$.
50+
51+
\subsection{Процесс обхода графа}
52+
53+
Алгоритм обхода заключается в последовательном умножении матрицы $M$ текущего фронта на матрицу $\mathfrak{D}$. В результате чего, находится матрица $M'$ содержащая информацию о вершинах, достижимых на следующем шаге. Далее, с помощью операций перестановки и сложения векторов $M'$ преобразуется к виду матрицы $M$ и присваивается ей. Итерации продолжаются пока $M'$ содержит новые вершины, не содержащиеся в $M$. На листинге~\ref{BFSRPQ1} представлен этот алгоритм.
54+
55+
\begin{algorithm}[t]
56+
\caption{Алгоритм достижимости в графе с регулярными ограничениями на основе поиска в ширину, выраженный с помощью операций матричного умножения}\label{BFSRPQ1}
57+
\begin{algorithmic}[1]
58+
\Procedure{BFSBasedRPQ}{$\mathcal{R}=\langle Q, \Sigma, P, F, q \rangle,\mathcal{G}=\langle V, E, L \rangle, V_{src}$}
59+
\State $\mathcal{P}\gets~${Матрица смежности графа}
60+
\State $\mathfrak{D}\gets Bool_\mathcal{R} \bigoplus Bool_\mathcal{G}$\Comment{Построение матриц $\mathfrak{D}$}
61+
\State $M\gets CreateMasks(|Q|,|V|)$ \Comment{Построение матрицы $M$}
62+
\State $M'\gets SetStartVerts(M, V_{src})$ \Comment{Заполнение нач. вершин}
63+
64+
\While{Матрица~$M$~меняется}{}
65+
\State $M\gets M'\langle\neg M\rangle$\Comment{Применение комплементарной маски}
66+
\ForAll{$a\in (\Sigma \cap L)$}
67+
\State $M'\gets M~$any.pair$~\mathfrak{D}$
68+
\Comment{Матр. умножение в полукольце}
69+
\State $M'\gets TransformRows(M')$\label{TransformRows}
70+
\Comment{Приведение $M'$ к виду $M$}
71+
\EndFor
72+
\State {$Matrix\gets extractRightSubMatrix(M')$}
73+
\State $V\gets Matrix.reduceVector()$ \Comment{Сложение по столбцам}
74+
\For{$k \in 0\dots|V_{src}|-1$}
75+
\State $W\gets\mathcal{P}.getRow(k)$
76+
\State $\mathcal{P}.setRow(k, V+W)$
77+
\EndFor
78+
\EndWhile
79+
\State \textbf{return} $\mathcal{P}$
80+
\EndProcedure
81+
\end{algorithmic}
82+
\end{algorithm}
83+
84+
В алгоритме~\ref{BFSRPQ1}, в~\ref{TransformRows} строке происходит трансформация строчек в матрице $M'$. Это делается для того, чтобы представить полученную во время обхода матрицу $M'$, содержащую новый фронт, в виде матрицы $M$. Для этого требуется так переставить строчки $M'$, чтобы она содержала корректные по своему определению значения. То есть, имела единицы на главной диагонали, а все остальные значения в первых $k$ столбцах были нулями. Подробнее эта процедура описана в листинге~\ref{AlgoTransformRows}.
85+
86+
\begin{algorithm}[H]
87+
\caption{Алгоритм трансформации строчек}\label{AlgoTransformRows}
88+
\begin{algorithmic}[1]
89+
\Procedure{TransformRows}{$M$}
90+
\State{$T \gets extractLeftSubMatrix(M)$}
91+
\State{$Ix, Iy \gets$ итераторы по индексам ненулевых элементов $T$}
92+
\For{$i \in 0\dots|Iy|$}
93+
\State{$R\gets M.getRow(Ix[i])$}
94+
\State{$M'.setRow(Iy[i], R + M'.getRow(Iy[i]))$}
95+
\EndFor
96+
\EndProcedure
97+
\end{algorithmic}
98+
\end{algorithm}
99+
100+
\pagebreak
101+
102+
\subsection{Модификации алгоритма}
103+
104+
Рассмотрим $V_{src}$ --- множество начальных вершин, состоящее из $r$ элементов. Для каждой начальной вершины $v_{src}^i \in V_{src}$ отметим соответствующие индексы в матрице $M$ единицами, получив матрицу $M(v_{src}^i)$, и построим матрицу $\mathfrak{M}$ следующим образом.
105+
106+
\begin{equation}
107+
\mathfrak{M}^{(k*r) \times (k + n)} =
108+
\left[
109+
\begin{matrix}
110+
M(v_{src}^1) \\
111+
M(v_{src}^2) \\
112+
M(\dots) \\
113+
M(v_{src}^r) \\
114+
\end{matrix}
115+
\right]
116+
\end{equation}
117+
118+
Матрица $\mathfrak{M}$ собирается из множества матриц $M(v_{src}^i)$ и позволяет хранить информацию о том, из какой начальной вершины достигаются новые вершины во время обхода.
119+
120+
\begin{algorithm}[t]
121+
\caption{Модификация алгоритма для поиска конкретной исходной вершины}\label{BFSRPQ2}
122+
\begin{algorithmic}[1]
123+
\Procedure{BFSBasedRPQ}{$\mathcal{R}=\langle Q, \Sigma, P, F, q \rangle,\mathcal{G}=\langle V, E, L \rangle, V_{src}$}
124+
\State $\mathcal{P}\gets~${Матрица смежности графа}
125+
\State $\mathfrak{D}\gets Bool_\mathcal{R} \bigoplus Bool_\mathcal{G}$
126+
\State $\mathfrak{M}\gets CreateMasks(|Q|,|V|)$
127+
\State $\mathfrak{M}'\gets SetStartVerts(\mathfrak{M}, V_{src})$
128+
129+
\While{Матрица~$\mathfrak{M}$~меняется}{}
130+
\State $\mathfrak{M}\gets \mathfrak{M}'\langle\neg\mathfrak{M}\rangle$
131+
\ForAll{$a\in (\Sigma \cap L)$}
132+
\State $\mathfrak{M}'\gets \mathfrak{M}~$any.pair$~\mathfrak{D}$
133+
\ForAll{$M \in \mathfrak{M}'$}
134+
\State $M\gets TransformRows(M)$
135+
\EndFor
136+
\EndFor
137+
\ForAll{$M_k \in \mathfrak{M}'$}
138+
\State $Matrix\gets extractSubMatrix(M)$
139+
\State $V\gets Matrix.reduceVector()$
140+
\State $W\gets\mathcal{P}.getRow(k)$
141+
\State $\mathcal{P}.setRow(k, V+W)$
142+
\EndFor
143+
\EndWhile
144+
\State \textbf{return} $\mathcal{P}$
145+
\EndProcedure
146+
\end{algorithmic}
147+
\end{algorithm}
148+
149+
В листинге~\ref{BFSRPQ2} представлен модифицированный алгоритм. Основное его отличие заключается в том, что для каждой достижимой вершины находится конкретная исходная вершина, из которой начинался обход.
150+
151+
Таким образом, алгоритмы~\ref{BFSRPQ1}~и~\ref{BFSRPQ2} решают сформулированные в пункте \ref{sec:3.3} задачи достижимости.
152+

0 commit comments

Comments
 (0)