146 lines
4.7 KiB
TeX
146 lines
4.7 KiB
TeX
\chapter{Section alignment}
|
|
|
|
\section{Needleman - Wunsch algorithm}
|
|
|
|
\begin{algorithm}
|
|
\caption{Needleman-Wunsch Algorithm}
|
|
\begin{algorithmic}[1]
|
|
\Procedure{FillMatrix}{$S_{1}$: Array($m$), $S_{2}$: Array($n$)}
|
|
\Comment{$sub(a, b)$ is the substitution score, $del(a)$ and $ins(a)$ are the deletion and insertion penalty, in regard with the reference $S_{1}$ sequence}
|
|
\State $M = $ Array($m+1$, $n+1$)
|
|
\Comment{Initialize the matrix first column and first row}
|
|
\State $P = $ Array($m$, $n$) \Comment{Store the direction of the cell we chose to build the next cell up on.}
|
|
\State $M[0][0] = 0$
|
|
\For {($i = 1$; $i < m+1$; $i++$)}
|
|
\State $M[i][0] = M[i-1][0] + gap\_penalty$
|
|
\EndFor
|
|
\For {($j = 1$; $j < n+1$; $j++$)}
|
|
\State $M[0][j] = M[0][j-1] + gap\_penalty$
|
|
\EndFor
|
|
\Comment{Fill the remaining matrix}
|
|
\For {($i = 1$; $i < m+1$; $i++$)}
|
|
\For {($j = 1$; $j < n+1$; $j++$)}
|
|
\State $delete = M[i-1][j] + gap\_penalty$
|
|
\State $insert = M[i][j-1] + gap\_penalty$
|
|
\State $substitute = M[i-1][j-1] + sub(S_{1}[i-1], S_{2}[j-1])$
|
|
\State $choice = \min \{delete, insert, substitute\}$
|
|
\If {$substitute = choice$}
|
|
\State $P[i-1][j-1] = '\nwarrow'$
|
|
\ElsIf {$deletion = choice$}
|
|
\State $P[i-1][j-1] = '\leftarrow'$
|
|
\Else
|
|
\State $P[i-1][j-1] = '\uparrow'$
|
|
\EndIf
|
|
\State $M[i][j] = choice$
|
|
\EndFor
|
|
\EndFor
|
|
\EndProcedure
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}
|
|
\caption{Needleman-Wunsch Algorithm (Backtrack)}
|
|
\begin{algorithmic}[1]
|
|
\Procedure{ShowAlignment}{$S_{1}$: Array($m$), $S_{2}$: Array($n$)}
|
|
\State $extend_{1} = ''$
|
|
\State $extend_{2} = ''$
|
|
\State $i = m$
|
|
\State $j = n$
|
|
\While{$i > 0$ and $j > 0$}
|
|
\If {$P[i-1][j-1] = '\nwarrow'$}
|
|
\State $extend_{1} = S_{1}[i-1] \circ extend_{1}$
|
|
\State $extend_{2} = S_{2}[j-1] \circ extend_{2}$
|
|
\State $i--$
|
|
\State $j--$
|
|
\ElsIf {$P[i-1][j-1] = '\uparrow'$}
|
|
\State $extend_{1} = S_{1}[i-1] \circ extend_{1}$
|
|
\State $extend_{2} = '-' \circ extend_{2}$
|
|
\State $i--$
|
|
\Else
|
|
\State $extend_{1} = '-' \circ extend_{1}$
|
|
\State $extend_{2} = S_{2}[j-1] \circ extend_{2}$
|
|
\State $j--$
|
|
\EndIf
|
|
\EndWhile
|
|
\While{$i > 0$}
|
|
\State $extend_{1} = S_{1}[i-1] \circ extend_{1}$
|
|
\State $extend_{2} = '-' \circ extend_{2}$
|
|
\State $i--$
|
|
\State \Call{Insert}{0, $alignment$,$tuple$}
|
|
\EndWhile
|
|
\While{$j > 0$}
|
|
\State $extend_{1} = '-' \circ extend_{1}$
|
|
\State $extend_{2} = S_{2}[j-1] \circ extend_{2}$
|
|
\State $j--$
|
|
\EndWhile
|
|
\State \Call{print}{$extend_{1}$}
|
|
\State \Call{print}{$extend_{2}$}
|
|
\EndProcedure
|
|
\State \Call{FillMatrix}{$S_{1}$, $S_{2}$}
|
|
\State \Call{ShowAlignment}{$S_{1}$, $S_{2}$}
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}
|
|
\caption{Needleman-Wunsch Algorithm (Backtrack) }
|
|
\begin{algorithmic}[1]
|
|
\Procedure{FillMatrix}{$S_{1}$: Array($m$), $S_{2}$: Array($n$)}
|
|
\State $M = $ Array($m+1$, $n+1$)
|
|
\State $P = $ Array($m$, $n$)
|
|
\Comment{Store the direction of the cell we chose to build the next cell up on.}
|
|
\State $M[0][0] = 0$
|
|
\For {($i = 1$; $i < m+1$; $i++$)}
|
|
\State $M[i][0] = M[i-1][0] + gap\_penalty$
|
|
\EndFor
|
|
\For {($j = 1$; $j < n+1$; $j++$)}
|
|
\State $M[0][j] = M[0][j-1] + gap\_penalty$
|
|
\EndFor
|
|
\For {($i = 1$; $i < m+1$; $i++$)}
|
|
\For {($j = 1$; $j < n+1$; $j++$)}
|
|
\State $delete = M[i-1][j] + gap\_penalty$
|
|
\State $insert = M[i][j-1] + gap\_penalty$
|
|
\State $substitute = M[i-1][j-1] + sub(S_{1}[i-1], S_{2}[j-1])$
|
|
\State $M[i][j] = \min \{substitute, insert, delete\}$
|
|
\EndFor
|
|
\EndFor
|
|
\EndProcedure
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}
|
|
\caption{Needleman-Wunsch Algorithm, using proper notation (Backtrack)}
|
|
\begin{algorithmic}[1]
|
|
\Procedure{BacktrackAlignment}{$S_{1}$: Array($m$), $S_{2}$: Array($n$)}
|
|
\State $alignment = LinkedList$
|
|
\State $i = m$
|
|
\State $j = n$
|
|
\While{$i > 0$ and $j > 0$}
|
|
\If {$M[i-1][j-1] = M[i][j] - sub(S_{1}[i-1], S_{2}[j-1])$}
|
|
\State $tuple = \begin{pmatrix} S_{1}[i-1] \\ S_{2}[j-1] \end{pmatrix}$
|
|
\State $i--$
|
|
\State $j--$
|
|
\ElsIf {$M[i-1][j-1] = M[i][j-1] - gap\_penalty$}
|
|
\State $tuple = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix}$
|
|
\State $i--$
|
|
\Else
|
|
\State $tuple = \begin{pmatrix} \varepsilon \\ S_{2}[j-1] \end{pmatrix}$
|
|
\State $j--$
|
|
\EndIf
|
|
\State \Call{Insert}{0, $alignment$,$tuple$}
|
|
\EndWhile
|
|
\While{$i > 0$}
|
|
\State $tuple = \begin{pmatrix} S_{1}[i-1] \\ \varepsilon \end{pmatrix}$
|
|
\State $i--$
|
|
\State \Call{Insert}{0, $alignment$,$tuple$}
|
|
\EndWhile
|
|
\While{$j > 0$}
|
|
\State $tuple = \begin{pmatrix} \varepsilon \\ S_{2}[j-1] \end{pmatrix}$
|
|
\State $j--$
|
|
\State \Call{Insert}{0, $alignment$,$tuple$}
|
|
\EndWhile
|
|
\EndProcedure
|
|
\State \Call{FillMatrix}{$S_{1}$, $S_{2}$}
|
|
\State \Call{BacktrackAlignment}{$S_{1}$, $S_{2}$}
|
|
\end{algorithmic}
|
|
\end{algorithm}
|