Added graphs and continued work on the proximal decoding results section

This commit is contained in:
2023-04-08 00:34:31 +02:00
parent 8b3354bd45
commit a07fed6cbb
14 changed files with 1611 additions and 10 deletions

View File

@@ -1,7 +1,12 @@
\chapter{Proximal Decoding}%
\label{chapter:proximal_decoding}
TODO
In this chapter, the proximal decoding algorithm is examined.
First, the algorithm itself is described.
Then, some interesting ideas concerning the implementation are presented.
Simulation results are shown, on the basis of which the behaviour of the
algorithm is investigated for different codes and parameters.
Finally, an improvement on proximal decoding is proposed.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -252,16 +257,17 @@ return $\boldsymbol{\hat{c}}$
\section{Implementation Details}%
\label{sec:prox:Implementation Details}
The algorithm as first implemented in Python because of the fast development
process and straightforward debugging.
They have subsequently been reimplemented in C++ using the Eigen%
The algorithm was first implemented in Python because of the fast development
process and straightforward debugging ability.
It was subsequently reimplemented in C++ using the Eigen%
\footnote{\url{https://eigen.tuxfamily.org}}
linear algebra library to achieve higher performance.
The focus has been set on a fast implementation, sometimes at the expense of
memory usage.
The evaluation of the simulation results has been wholly realized in Python.
The gradient of the code-constraint polynomial is given by \cite[Sec. 2.3]{proximal_paper}%
The gradient of the code-constraint polynomial \cite[Sec. 2.3]{proximal_paper}
is given by%
%
\begin{align*}
\nabla h\left( \boldsymbol{x} \right) &= \begin{bmatrix}
@@ -275,9 +281,10 @@ The gradient of the code-constraint polynomial is given by \cite[Sec. 2.3]{proxi
- \prod_{i\in N_c\left( j \right) } x_i \right)
.\end{align*}
%
Evidently, the products
$\prod_{i\in N_c\left( j \right) } x_i,\hspace{1mm}\forall i\in \mathcal{J}$
can be precomputed, as they are the same for all components $x_k$ of $\boldsymbol{x}$.
Since the products
$\prod_{i\in N_c\left( j \right) } x_i,\hspace{2mm}j\in \mathcal{J}$
are the same for all components $x_k$ of $\boldsymbol{x}$, they can be
precomputed.
Defining%
%
\begin{align*}
@@ -315,11 +322,452 @@ $[-\eta, \eta]$ individually.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Results}%
\label{sec:prox:Results}
\section{Simulation Results}%
\label{sec:prox:Simulation Results}
All simulation results presented hereafter are based on Monte Carlo
simulations.
The \ac{BER} and \ac{FER} curves in particular have been generated by
producing at least 100 frame-errors for each data point, unless otherwise
stated.
Figure \ref{fig:prox:results} shows a comparison of the decoding performance
of the proximal decoding algorithm as presented by Wadayama et al. in
\cite{proximal_paper} and the implementation realized for this work.
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}[grid=both, grid style={line width=.1pt},
xlabel={$E_b / N_0$ (dB)}, ylabel={BER},
ymode=log,
legend style={at={(0.5,-0.55)},anchor=south},
width=0.75\textwidth,
height=0.5625\textwidth,
ymax=1.2, ymin=0.8e-4,
xtick={1, 2, ..., 5},
xmin=0.9, xmax=5.6,
legend columns=2,]
\addplot [ForestGreen, mark=*, line width=1pt]
table [x=SNR, y=gamma_0_15, col sep=comma] {res/proximal/ber_paper.csv};
\addlegendentry{$\gamma = 0.15$ (Wadayama et al.)}
\addplot [ForestGreen, mark=triangle, dashed, line width=1pt]
table [x=SNR, y=BER, col sep=comma,
discard if not={gamma}{0.15},
discard if gt={SNR}{5.5},]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.15$ (Own results)}
\addplot [NavyBlue, mark=*, line width=1pt]
table [x=SNR, y=gamma_0_01, col sep=comma] {res/proximal/ber_paper.csv};
\addlegendentry{$\gamma = 0.01$ (Wadayama et al.)}
\addplot [NavyBlue, mark=triangle, dashed, line width=1pt]
table [x=SNR, y=BER, col sep=comma,
discard if not={gamma}{0.01},
discard if gt={SNR}{5.5},]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.01$ (Own results)}
\addplot [RedOrange, mark=*, line width=1pt]
table [x=SNR, y=gamma_0_05, col sep=comma] {res/proximal/ber_paper.csv};
\addlegendentry{$\gamma = 0.05$ (Wadayama et al.)}
\addplot [RedOrange, mark=triangle, dashed, line width=1pt]
table [x=SNR, y=BER, col sep=comma,
discard if not={gamma}{0.05},
discard if gt={SNR}{5.5},]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.05$ (Own results)}
\addplot [RoyalPurple, mark=*, line width=1pt]
table [x=SNR, y=BP, col sep=comma] {res/proximal/ber_paper.csv};
\addlegendentry{BP (Wadayama et al.)}
\end{axis}
\end{tikzpicture}
\caption{Simulation results\protect\footnotemark{} for $\omega = 0.05, K=100$}
\label{fig:prox:results}
\end{figure}
%
\footnotetext{(3,6) regular LDPC code with n = 204, k = 102 \cite[204.33.484]{mackay_enc}}%
%
Looking at the graph in figure \ref{fig:prox:results} one might notice that for
a moderately chosen value of $\gamma$ ($\gamma = 0.05$) the decoding
performance is better than for low ($\gamma = 0.01$) or high
($\gamma = 0.15$) values.
The question arises if there is some optimal value maximazing the decoding
performance, especially since the decoding performance seems to dramatically
depend on $\gamma$.
To better understand how $\gamma$ and the decoding performance are
related, figure \ref{fig:prox:results} was recreated, but with a considerably
larger selection of values for $\gamma$ (figure \ref{fig:prox:results_3d}).%
%
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
legend pos=outer north east,
%legend style={at={(0.5,-0.55)},anchor=south},
ytick={0, 0.05, 0.1, 0.15},
width=0.6\textwidth,
height=0.45\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=14,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = \left[ 0\text{:}0.01\text{:}0.16 \right] $}
\addplot3[NavyBlue, line width=1.5] table [col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.01$}
\addplot3[RedOrange, line width=1.5] table [col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.05$}
\addplot3[ForestGreen, line width=1.5] table [col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addlegendentry{$\gamma = 0.15$}
\end{axis}
\end{tikzpicture}
\caption{BER\protect\footnotemark{} for $\omega = 0.05, K=100$}
\label{fig:prox:results_3d}
\end{figure}%
%
\footnotetext{(3,6) regular LDPC code with n = 204, k = 102 \cite[\text{204.33.484}]{mackay_enc}}%
%
\noindent Evidently, while the performance does depend on the value of
$\gamma$, there is no single optimal value offering optimal performance, but
rather a certain interval in which the performance stays largely the same.
When examining a number of different codes (figure
\ref{fig:prox:results_3d_multiple}), it is apparent that while the exact
landscape of the graph depends on the code, the general behaviour is the same
in each case.
\begin{figure}[H]
\centering
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=10,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_963965.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_963965.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_963965.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_963965.csv};
\end{axis}
\end{tikzpicture}
\caption{$\left( 3, 6 \right)$-regular LDPC code with $n=96, k=48$
\cite[\text{96.3.965}]{mackay_enc}}
\end{subfigure}%
\hfill
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=10,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_bch_31_26.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_bch_31_26.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_bch_31_26.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_bch_31_26.csv};
\end{axis}
\end{tikzpicture}
\caption{BCH code with $n=31, k=26$\\[2\baselineskip]}
\end{subfigure}
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b/N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=14,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20433484.csv};
\end{axis}
\end{tikzpicture}
\caption{$\left( 3, 6 \right)$-regular LDPC code with $n=204, k=102$
\cite[\text{204.33.484}]{mackay_enc}}
\end{subfigure}%
\hfill
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=10,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20455187.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20455187.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20455187.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_20455187.csv};
\end{axis}
\end{tikzpicture}
\caption{$\left( 5, 10 \right)$-regular LDPC code with $n=204, k=102$
\cite[\text{204.55.187}]{mackay_enc}}
\end{subfigure}%
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=10,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_40833844.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_40833844.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_40833844.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_40833844.csv};
\end{axis}
\end{tikzpicture}
\caption{$\left( 3, 6 \right)$-regular LDPC code with $n=408, k=204$
\cite[\text{408.33.844}]{mackay_enc}}
\end{subfigure}%
\hfill
\begin{subfigure}[c]{0.48\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[view={75}{30},
zmode=log,
xlabel={$E_b / N_0$ (dB)},
ylabel={$\gamma$},
zlabel={BER},
width=\textwidth,
height=0.75\textwidth,]
\addplot3[surf,
mesh/rows=17, mesh/cols=10,
colormap/viridis] table [col sep=comma,
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_pegreg252x504.csv};
\addplot3[RedOrange, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.05},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_pegreg252x504.csv};
\addplot3[NavyBlue, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.01},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_pegreg252x504.csv};
\addplot3[ForestGreen, line width=1.5] table[col sep=comma,
discard if not={gamma}{0.15},
x=SNR, y=gamma, z=BER]
{res/proximal/2d_ber_fer_dfr_pegreg252x504.csv};
\end{axis}
\end{tikzpicture}
\caption{LDPC code (Progressive Edge Growth Construction) with $n=504, k=252$
\cite[\text{PEGReg252x504}]{mackay_enc}}
\end{subfigure}%
\vspace{1cm}
\begin{subfigure}[c]{\textwidth}
\centering
\begin{tikzpicture}
\begin{axis}[hide axis,
xmin=10, xmax=50,
ymin=0, ymax=0.4,
legend style={draw=white!15!black,legend cell align=left}]
\addlegendimage{surf, colormap/viridis}
\addlegendentry{$\gamma = \left[ 0\text{ : }0.01\text{ : }0.16 \right] $};
\addlegendimage{NavyBlue, line width=1.5pt}
\addlegendentry{$\gamma = 0.01$};
\addlegendimage{RedOrange, line width=1.5pt}
\addlegendentry{$\gamma = 0.05$};
\addlegendimage{ForestGreen, line width=1.5pt}
\addlegendentry{$\gamma = 0.15$};
\end{axis}
\end{tikzpicture}
\end{subfigure}
\caption{BER for $\omega = 0.05, K=100$ (different codes)}
\label{fig:prox:results_3d_multiple}
\end{figure}
A similar analysis was performed to determine the optimal values for the other
parameters, $\omega$, $K$ and $\eta$.
TODO
Until now, only the \ac{BER} has been considered to assess the decoding
performance.
The \ac{FER}, however, shows considerably worse performance, as can be seen in
figure \ref{TODO}.
One possible explanation might be found in the structure of the proxmal
decoding algorithm \ref{TODO} itself.
As it comprises two separate steps, one responsible for addressing the
likelihood and one for addressing the constraints imposed by the parity-check
matrix, the algorithm could tend to gravitate toward the correct codeword
but then get stuck in a local minimum introduced by the code-constraint
polynomial.
This would yield fewer bit-errors, while still producing a frame error.
This course of thought will be picked up in section
\ref{sec:prox:Improved Implementation} to try to improve the algorithm.
\begin{itemize}
\item Introduction
\begin{itemize}
\item asdf
\item ghjk
\end{itemize}
\item Reconstruction of results from paper
\begin{itemize}
\item asdf
\item ghjk
\end{itemize}
\item Choice of parameters, in particular gamma
\begin{itemize}
\item Introduction (``Looking at these results, the question arises \ldots'')
\item Different gammas simulated for same code as in paper
\item
\end{itemize}
\item The FER problem
\begin{itemize}
\item Intro (``\acs{FER} not as good as the \acs{BER} would have one assume'')
\item Possible explanation
\end{itemize}
\item Computational performance
\begin{itemize}
\item Theoretical analysis
\item Simulation results to substantiate theoretical analysis
\end{itemize}
\item Conclusion
\begin{itemize}
\item Choice of $\gamma$ code-dependant but decoding performance largely unaffected
by small variations
\item Number of iterations independent of \ac{SNR}
\item $\mathcal{O}\left( n \right)$ time complexity, implementation heavily
optimizable
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Improved Implementation}%
\label{sec:prox:Improved Implementation}
\begin{itemize}
\item Improvement using ``ML-on-List''
\begin{itemize}
\item Attach to FER problem
\item
\end{itemize}
\item Decoding performance and comparison with standard proximal decoding
\begin{itemize}
\item asdf
\item ghjk
\end{itemize}
\item Computational performance and comparison with standard proximal decoding
\begin{itemize}
\item asdf
\item ghjk
\end{itemize}
\item Conclusion
\begin{itemize}
\item Summary
\item Up to $\SI{1}{dB}$ gain possible
\end{itemize}
\end{itemize}