\documentclass{scrartcl} \RequirePackage{algorithm} \RequirePackage{algorithmicx} \RequirePackage[noEnd=false]{algpseudocodex} \newcommand{\algorithmautorefname}{Algorithm} % Allow autoref. % Define macros to typeset boolean in pseudocode environments \algnewcommand{\True}{\textbf{\texttt{true}}} \algnewcommand{\False}{\textbf{\texttt{false}}} \algnewcommand{\NIL}{\textbf{\texttt{NIL}}} \algnewcommand{\NULL}{\textbf{\texttt{null}}} \input{definitions.tex} \usepackage{mathtools} \begin{document} \begin{algorithm} \caption{Backtrack a single alignment in a recursive way} \begin{algorithmic}[1] \State $S_{1}$: Array($m$), $S_{2}$: Array($n$), $M$: Array($m+1$, $n+1$), \Function{BacktrackRecurse}{$i$, $j$} \If {$i > 0$ and $j > 0$} \State $substitute = M[i-1][j-1]$ \State $delete = M[i-1][j]$ \State $insert = M[i][j-1]$ \State $min = \min \{ substitute, delete, insert \}$ \If {$substitute = min$} \State $z = $ \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j-1$} \State $z = \begin{pmatrix} S_{1}[i-1] \\ S_{2}[j-1] \end{pmatrix} \circ z$ \ElsIf {$delete = min$} \State $z = $ \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j$} \State $z = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix} \circ z$ \Else \State $z = $ \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i$, $j-1$} \State $z = \begin{pmatrix} \varepsilon \\ S_{2}[j-1] \end{pmatrix} \circ z$ \EndIf \ElsIf {$i > 0$} \State $z = $ \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j$} \State $z = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix} \circ z$ \ElsIf {$j > 0$} \State $z = $ \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i$, $j-1$} \State $z = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix} \circ z$ \Else \State \Return [] \EndIf \State \Return $z$ \EndFunction \Function{Backtrack}{$S_{1}$: Array($m$), $S_{2}$: Array($n$), $M$: Array($m+1$, $n+1$)} \State \Return \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $m$, $n$} \EndFunction \end{algorithmic} \end{algorithm} \begin{algorithm} \caption{Backtrack all the optimum alignments in a recursive way} \begin{algorithmic}[1] \Procedure{Recurse}{$S_{1}$: Array($m$), $S_{2}$: Array($n$), $M$: Array($m+1$, $n+1$), $i$, $j$} \If {$i > 0$ and $j > 0$} \State $substitute = M[i-1][j-1]$ \State $delete = M[i-1][j]$ \State $insert = M[i][j-1]$ \State $min = \min \{ substitute, delete, insert \}$ \If {$substitute = min$} \State $value = \begin{pmatrix} S_{1}[i-1] \\ S_{2}[j-1] \end{pmatrix}$ \State $z' = value \circ z$ \State \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j-1$, $z'$} \EndIf \If {$delete = min$} \State $value = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix}$ \State $z' = value \circ z$ \State \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j$, $z'$} \EndIf \If {$insert = min$} \State $value = \begin{pmatrix} \varepsilon \\ S_{2}[j-1] \end{pmatrix}$ \State $z' = value \circ z$ \State \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i$, $j-1$, $z'$} \EndIf \ElsIf {$i > 0$} \State $value = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix}$ \State $z' = value \circ z$ \State \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i-1$, $j$, $z'$} \ElsIf {$j > 0$} \State $value = \begin{pmatrix} \varepsilon \\ S_{2}[j-1] \end{pmatrix}$ \State $z' = value \circ z$ \State \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $i$, $j-1$, $z'$} \EndIf \State \Call{print}{$z$} \EndProcedure \Procedure{Backtrack}{$S_{1}$: Array($m$), $S_{2}$: Array($n$), $M$: Array($m+1$, $n+1$)} \State \Return \Call{BacktrackRecurse}{$S_{1}$, $S_{2}$, $M$, $m$, $n$, []} \EndProcedure \end{algorithmic} \end{algorithm} \end{document} \end{document} \iffalse \Function{AppendToAll}{$value$, $set$} \Returns {A new set with all elements from $set$ with value appended first to them } \State $res = \{\}$ \For {$element \in set$} \State $element = value \circ element$ \State $res = res \cup element$ \EndFor \State \Return $res$ \EndFunction \fi