% !TeX spellcheck = cs_CZ
% !TeX root = ../BP_Prokopič_Martin_2021.tex

V~této příručce uvedeme několik příkladů volání implementovaných algoritmů pro Burrows-Wheelerovu transformaci a~vyhledávání v~textu pomocí jazyka \acrshort{aql}. Spustitelnou podobu jeho interpreteru, \code{aql2}, jsme umístili na přiložené médium do složky \code{exe/bin}. Byla zkompilována na Ubuntu 20.04 a závisí na balíčcích \code{libxml2} a \code{libreadline8}. Podrobná dokumentace jazyka \acrshort{aql} a návod na kompilaci se nachází na webu projektu \acrshort{alt} \cite{alt}.

\section{Dopředná a~zpětná transformace}

Dopřednou Burrows-Wheelerovu transformaci slova \texttt{mississippi} provedeme buď přímo pomocí naivního algoritmu příkazem
\begin{lstlisting}
execute stringology::transform::BWTNaive "mississippi" > $bwt
\end{lstlisting}
nebo prostřednictvím pomocného sufixového pole
\begin{lstlisting}
execute stringology::indexing::SuffixArrayNaive "mississippi" | stringology::transform::BWTFromSuffixArray - > $bwt
\end{lstlisting}

V~obou případech dojde k~automatickému přidání ukončovacího symbolu a~uložení výsledku do proměnné \code{\$bwt}. Její obsah vypíšeme pomocí vestavěného příkazu \code{print}.

\begin{lstlisting}
print $bwt
\end{lstlisting}

Místo surové podoby transformovaného řetězce ale uvidíme popis jeho interní reprezentace ve struktuře \code{string::LinearStringTerminatingSymbolBWT}. Pro výpis obsahu samotného pole $L$ provedeme explicitní přetypování na standardní C++ řetězec.

\begin{lstlisting}
print (string::LinearString) $bwt | raw::Compose -
\end{lstlisting}
\vspace{-4pt}
\begin{remark}
	Ukončovací symbol je v tomto případě reprezentován nulovým bajtem, ve většině terminálů se tak nezobrazí.
\end{remark}
\pagebreak

Obsah všech pomocných polí zavedených v~sekci \ref{sec:auxiliary} prozkoumáme voláním algoritmu \code{BWTAuxiliaryDataConstruct}.

\begin{lstlisting}
print stringology::indexing::BWTAuxiliaryDataConstruct $bwt
\end{lstlisting}

Transformovaný text opět dekódujeme a~vypíšeme v~surové podobě, získáme tak zpět vstupní řetězec \texttt{mississippi}.

\begin{lstlisting}
print stringology::transform::BWTDecode $bwt | raw::Compose -
\end{lstlisting}

\section{Vyhledávání v~textu}

Předpokládáme, že v~proměnné \code{\$bwt} máme stále uloženou transformovanou podobu řetězce \texttt{mississippi}. Nyní v~tomto textu vyhledáme vzorek \texttt{ssi} třemi z~implementovaných algoritmů. Všechna volání vrátí stejný výsledek.

\begin{lstlisting}[escapechar=\&]
print stringology::exact::BWTBoyerMoore $bwt "ssi"
print stringology::exact::BWTBinarySearch $bwt "ssi"
print stringology::indexing::SuffixArrayFromBWT $bwt | stringology::query::SuffixArrayFactors - "ssi"
\end{lstlisting}

\subsection{FM-index}

Zjednodušený FM-index zkonstruujeme zavoláním implementovaného algoritmu \code{SimpleFMIndexConstruct}, který nepovinně přijímá velikosti přihrádek, podpřihrádek a~hustotu řídkého sufixového pole (v~\%). Ve výpisu uvádíme výchozí hodnoty těchto argumentů.

\begin{lstlisting}
execute stringology::indexing::SimpleFMIndexConstruct $bwt > $fmi
execute stringology::indexing::SimpleFMIndexConstruct $bwt 16000 1000 2 > $fmi
\end{lstlisting}

Pomocí zjednodušeného FM-indexu uloženého v~proměnné \code{\$fmi} nyní zjistíme počet a~pozice výskytů vzorku \texttt{ssi} ve vstupním textu.

\begin{lstlisting}
print stringology::query::FMIndexCount $fmi "ssi"
print stringology::query::FMIndexFactors $fmi "ssi"
\end{lstlisting}
\vspace{-4pt}
\begin{remark}
	Operace \method{Locate} (algoritmus \code{FMIndexFactors}) není dostupná, pokud pracujeme s~lehkým FM-indexem (poslední argument volání algoritmu \code{SimpleFMIndexConstruct} je roven 0).
\end{remark}