diff --git a/latex/thesis/chapters/decoding_techniques.tex b/latex/thesis/chapters/decoding_techniques.tex index 575b455..375e301 100644 --- a/latex/thesis/chapters/decoding_techniques.tex +++ b/latex/thesis/chapters/decoding_techniques.tex @@ -143,11 +143,13 @@ which minimizes the objective function $f$ (as shown in figure \ref{fig:dec:spac \Ac{LP} decoding is a subject area introduced by Feldman et al. \todo{Space before citation?} -\cite{feldman_paper}. They reframed the decoding problem as an -\textit{integer linear program} and subsequently presented a relaxation into -a \textit{linear program}, lifting the integer requirement. -The optimization method used to solve this problem that is examined in this -work is \ac{ADMM}. +\cite{feldman_paper}. They reframe the decoding problem as an +\textit{integer linear program} and subsequently present two relaxations into +\textit{linear programs}, one representing a formulation of exact \ac{LP} +decoding and an approximation with a more manageable representation. +To solve the resulting linear program, various optimization methods can be +used. +The one examined in this work is \ac{ADMM}. \todo{Why chose ADMM?} Feldman at al. begin by looking at the \ac{ML} decoding problem% @@ -189,73 +191,315 @@ decoding is the following:% .\end{align*}% % -As solving integer linear programs is generally NP-hard, the decoding problem \todo{New \S?} +As solving integer linear programs is generally NP-hard, this decoding problem has to be approximated by one with looser constraints. -A technique called \textit{\ac{LP} Relaxation} is applied, -essentially removing the requirement for the components of $\boldsymbol{c}$ -to be integer values. -In order to provide a formal definition of the relaxed constraints, the -authors go on to define the concept of the \textit{codeword polytope} -(figure \ref{fig:dec:poly}) as -being the convex hull of all possible codewords: +A technique called \textit{relaxation} is applied, +essentially modifying the constraints in order to broaden the considered +domain (e.g. by lifting the integer requirement). +First, the authors present an equivalent \ac{LP} formulation of exact \ac{ML} +decoding, redefining the constraints in terms of the \text{codeword polytope} % \begin{align*} \text{poly}\left( \mathcal{C} \right) = \left\{ \sum_{c \in \mathcal{C}} \lambda_{\boldsymbol{c}} \boldsymbol{c} \text{ : } \lambda_{\boldsymbol{c}} \ge 0, \sum_{\boldsymbol{c} \in \mathcal{C}} \lambda_{\boldsymbol{c}} = 1 \right\} -.\end{align*} +,\end{align*} % +% +which represents the \textit{convex hull} of all possible codewords, +i.e. the set of convex linear combinations of all codewords +(visualized in figure \ref{fig:dec:poly}). +However, since the number of constraints needed to characterize this codeword +polytope is exponential in the code length, this formulation is relaxed futher. + + +% +% Codeword polytope visualization figure +% \begin{figure}[H] \centering - \tikzstyle{codeword} = [color=KITblue, fill=KITblue, - draw, circle, inner sep=0pt, minimum size=4pt] + % + % Left side - codeword polytope + % - \tdplotsetmaincoords{60}{245} - \begin{tikzpicture}[scale=1, transform shape, tdplot_main_coords] - % Cube + \begin{subfigure}[c]{0.45\textwidth} + \centering + + \begin{subfigure}{\textwidth} + \centering + + \begin{align*} + \boldsymbol{H} &= + \begin{bmatrix} + 1 & 1 & 1\\ + 0 & 1 & 1 + \end{bmatrix}\\[1em] + \mathcal{C} &= \left\{ + \begin{bmatrix} + 0\\ + 0\\ + 0 + \end{bmatrix}, + \begin{bmatrix} + 0\\ + 1\\ + 1 + \end{bmatrix} + \right\} + \end{align*} - \draw[dashed] (0, 0, 0) -- (2, 0, 0); - \draw[dashed] (2, 0, 0) -- (2, 0, 2); - \draw[] (2, 0, 2) -- (0, 0, 2); - \draw[] (0, 0, 2) -- (0, 0, 0); + \caption{Definition of the visualized code} + \label{fig:} + \end{subfigure} \\[7em] + \begin{subfigure}{\textwidth} + \centering - \draw[] (0, 2, 0) -- (2, 2, 0); - \draw[] (2, 2, 0) -- (2, 2, 2); - \draw[] (2, 2, 2) -- (0, 2, 2); - \draw[] (0, 2, 2) -- (0, 2, 0); + \tikzstyle{codeword} = [color=KITblue, fill=KITblue, + draw, circle, inner sep=0pt, minimum size=4pt] - \draw[] (0, 0, 0) -- (0, 2, 0); - \draw[dashed] (2, 0, 0) -- (2, 2, 0); - \draw[] (2, 0, 2) -- (2, 2, 2); - \draw[] (0, 0, 2) -- (0, 2, 2); + \tdplotsetmaincoords{60}{25} + \begin{tikzpicture}[scale=1, transform shape, tdplot_main_coords] + % Cube - % Codeword Polytope + \coordinate (p000) at (0, 0, 0); + \coordinate (p001) at (0, 0, 2); + \coordinate (p010) at (0, 2, 0); + \coordinate (p011) at (0, 2, 2); + \coordinate (p100) at (2, 0, 0); + \coordinate (p101) at (2, 0, 2); + \coordinate (p110) at (2, 2, 0); + \coordinate (p111) at (2, 2, 2); - \draw[line width=1pt, color=KITblue] (0, 0, 0) -- (2, 0, 2); - \draw[line width=1pt, color=KITblue] (0, 0, 0) -- (2, 2, 0); - \draw[line width=1pt, color=KITblue] (0, 0, 0) -- (0, 2, 2); + \draw[] (p000) -- (p100); + \draw[] (p100) -- (p101); + \draw[] (p101) -- (p001); + \draw[] (p001) -- (p000); - \draw[line width=1pt, color=KITblue] (2, 0, 2) -- (2, 2, 0); - \draw[line width=1pt, color=KITblue] (2, 0, 2) -- (0, 2, 2); + \draw[dashed] (p010) -- (p110); + \draw[] (p110) -- (p111); + \draw[] (p111) -- (p011); + \draw[dashed] (p011) -- (p010); - \draw[line width=1pt, color=KITblue] (0, 2, 2) -- (2, 2, 0); + \draw[dashed] (p000) -- (p010); + \draw[] (p100) -- (p110); + \draw[] (p101) -- (p111); + \draw[] (p001) -- (p011); - % Polytope Annotations + % Polytope Vertices - \node[codeword] (c000) at (0, 0, 0) {};% {$\left( 0, 0, 0 \right) $}; - \node[codeword] (c101) at (2, 0, 2) {};% {$\left( 1, 0, 1 \right) $}; - \node[codeword] (c110) at (2, 2, 0) {};% {$\left( 1, 1, 0 \right) $}; - \node[codeword] (c011) at (0, 2, 2) {};% {$\left( 0, 1, 1 \right) $}; + \node[codeword] (c000) at (p000) {}; + \node[codeword] (c011) at (p011) {}; + + % Polytope Edges - \node[color=KITblue, right=0cm of c000] {$\left( 0, 0, 0 \right) $}; - \node[color=KITblue, above=0cm of c101] {$\left( 1, 0, 1 \right) $}; - \node[color=KITblue, left=0cm of c110] {$\left( 1, 1, 0 \right) $}; - \node[color=KITblue, left=-0.1cm of c011] {$\left( 0, 1, 1 \right) $}; - \end{tikzpicture} + \draw[line width=1pt, color=KITblue] (c000) -- (c011); + + % Polytope Annotations - \caption{Codeword polytope of a single parity-check code} + \node[color=KITblue, below=0cm of c000] {$\left( 0, 0, 0 \right) $}; + \node[color=KITblue, above=0cm of c011] {$\left( 0, 1, 1 \right) $}; + \end{tikzpicture} + + \caption{Codeword polytope} + \label{fig:} + \end{subfigure} + \end{subfigure} \hfill% +% + % + % Right side - relaxed polytope + % +% + \begin{subfigure}[c]{0.45\textwidth} + \centering + + \begin{subfigure}{\textwidth} + \centering + + \tikzstyle{codeword} = [color=KITblue, fill=KITblue, + draw, circle, inner sep=0pt, minimum size=4pt] + + \tdplotsetmaincoords{60}{25} + \begin{tikzpicture}[scale=1, transform shape, tdplot_main_coords] + % Cube + + \coordinate (p000) at (0, 0, 0); + \coordinate (p001) at (0, 0, 2); + \coordinate (p010) at (0, 2, 0); + \coordinate (p011) at (0, 2, 2); + \coordinate (p100) at (2, 0, 0); + \coordinate (p101) at (2, 0, 2); + \coordinate (p110) at (2, 2, 0); + \coordinate (p111) at (2, 2, 2); + + \draw[] (p000) -- (p100); + \draw[] (p100) -- (p101); + \draw[] (p101) -- (p001); + \draw[] (p001) -- (p000); + + \draw[dashed] (p010) -- (p110); + \draw[] (p110) -- (p111); + \draw[] (p111) -- (p011); + \draw[dashed] (p011) -- (p010); + + \draw[dashed] (p000) -- (p010); + \draw[] (p100) -- (p110); + \draw[] (p101) -- (p111); + \draw[] (p001) -- (p011); + + % Polytope Vertices + + \node[codeword] (c000) at (p000) {}; + \node[codeword] (c101) at (p101) {}; + \node[codeword] (c110) at (p110) {}; + \node[codeword] (c011) at (p011) {}; + + % Polytope Edges + + \draw[line width=1pt, color=KITblue] (c000) -- (c101); + \draw[line width=1pt, color=KITblue] (c000) -- (c110); + \draw[line width=1pt, color=KITblue] (c000) -- (c011); + + \draw[line width=1pt, color=KITblue] (c101) -- (c110); + \draw[line width=1pt, color=KITblue] (c101) -- (c011); + + \draw[line width=1pt, color=KITblue] (c011) -- (c110); + + % Polytope Annotations + + \node[color=KITblue, below=0cm of c000] {$\left( 0, 0, 0 \right) $}; + \node[color=KITblue, right=0.17cm of c101] {$\left( 1, 0, 1 \right) $}; + \node[color=KITblue, right=0cm of c110] {$\left( 1, 1, 0 \right) $}; + \node[color=KITblue, above=0cm of c011] {$\left( 0, 1, 1 \right) $}; + \end{tikzpicture} + + \caption{Local codeword polytope of parity-check + $\begin{bmatrix} 1 & 1 & 1 \end{bmatrix}$} + \label{fig:} + \end{subfigure} \\[1em] + \begin{subfigure}{\textwidth} + \centering + + \tikzstyle{codeword} = [color=KITblue, fill=KITblue, + draw, circle, inner sep=0pt, minimum size=4pt] + + \tdplotsetmaincoords{60}{25} + \begin{tikzpicture}[scale=1, transform shape, tdplot_main_coords] + % Cube + + \coordinate (p000) at (0, 0, 0); + \coordinate (p001) at (0, 0, 2); + \coordinate (p010) at (0, 2, 0); + \coordinate (p011) at (0, 2, 2); + \coordinate (p100) at (2, 0, 0); + \coordinate (p101) at (2, 0, 2); + \coordinate (p110) at (2, 2, 0); + \coordinate (p111) at (2, 2, 2); + + \draw[] (p000) -- (p100); + \draw[] (p100) -- (p101); + \draw[] (p101) -- (p001); + \draw[] (p001) -- (p000); + + \draw[dashed] (p010) -- (p110); + \draw[] (p110) -- (p111); + \draw[] (p111) -- (p011); + \draw[dashed] (p011) -- (p010); + + \draw[dashed] (p000) -- (p010); + \draw[] (p100) -- (p110); + \draw[] (p101) -- (p111); + \draw[] (p001) -- (p011); + + % Polytope Vertices + + \node[codeword] (c000) at (p000) {}; + \node[codeword] (c011) at (p011) {}; + \node[codeword] (c100) at (p100) {}; + \node[codeword] (c111) at (p111) {}; + + % Polytope Edges + + \draw[line width=1pt, color=KITblue] (c000) -- (c011); + \draw[line width=1pt, color=KITblue] (c000) -- (c100); + \draw[line width=1pt, color=KITblue] (c100) -- (c111); + \draw[line width=1pt, color=KITblue] (c111) -- (c011); + + % Polytope Annotations + + \node[color=KITblue, below=0cm of c000] {$\left( 0, 0, 0 \right) $}; + \node[color=KITblue, above=0cm of c011] {$\left( 0, 1, 1 \right) $}; + \node[color=KITblue, below=0cm of c100] {$\left( 1, 0, 0 \right) $}; + \node[color=KITblue, above=0cm of c111] {$\left( 1, 1, 1 \right) $}; + \end{tikzpicture} + + \caption{Local codeword polytope of parity-check + $\begin{bmatrix} 0 & 1 & 1 \end{bmatrix}$} + \end{subfigure}\\[1em] + \begin{subfigure}{\textwidth} + \centering + + \tikzstyle{codeword} = [color=KITblue, fill=KITblue, + draw, circle, inner sep=0pt, minimum size=4pt] + \tikzstyle{pseudocodeword} = [color=KITred, fill=KITred, + draw, circle, inner sep=0pt, minimum size=4pt] + + \tdplotsetmaincoords{60}{25} + \begin{tikzpicture}[scale=1, transform shape, tdplot_main_coords] + % Cube + + \coordinate (p000) at (0, 0, 0); + \coordinate (p001) at (0, 0, 2); + \coordinate (p010) at (0, 2, 0); + \coordinate (p011) at (0, 2, 2); + \coordinate (p100) at (2, 0, 0); + \coordinate (p101) at (2, 0, 2); + \coordinate (p110) at (2, 2, 0); + \coordinate (p111) at (2, 2, 2); + + \draw[] (p000) -- (p100); + \draw[] (p100) -- (p101); + \draw[] (p101) -- (p001); + \draw[] (p001) -- (p000); + + \draw[dashed] (p010) -- (p110); + \draw[] (p110) -- (p111); + \draw[] (p111) -- (p011); + \draw[dashed] (p011) -- (p010); + + \draw[dashed] (p000) -- (p010); + \draw[] (p100) -- (p110); + \draw[] (p101) -- (p111); + \draw[] (p001) -- (p011); + + % Polytope Vertices + + \node[codeword] (c000) at (p000) {}; + \node[codeword] (c011) at (p011) {}; + \node[pseudocodeword] (cpseudo) at (2, 1, 1) {}; + + % Polytope Edges + + \draw[line width=1pt, color=KITblue] (c000) -- (c011); + \draw[line width=1pt, color=KITred] (cpseudo) -- (c000); + \draw[line width=1pt, color=KITred] (cpseudo) -- (c011); + + % Polytope Annotations + + \node[color=KITblue, below=0cm of c000] {$\left( 0, 0, 0 \right) $}; + \node[color=KITblue, above=0cm of c011] {$\left( 0, 1, 1 \right) $}; + \node[color=KITred, right=0.03cm of cpseudo] + {$\left( 1, \frac{1}{2}, \frac{1}{2} \right) $}; + \end{tikzpicture} + + \caption{Relaxed codeword polytope} + \label{fig:} + \end{subfigure} + \end{subfigure} + + \caption{Visualization of the codeword polytope and the relaxed codeword + polytope for an example code} \label{fig:dec:poly} \end{figure}