Module polarcodes.decoder_utils

Expand source code
import numpy as np
from polarcodes.utils import *

def hard_decision(y):
    """
        Hard decision of a log-likelihood.
    """

    if y >= 0:
        return 0
    else:
        return 1

def upper_llr(l1, l2):
    """
    Update top branch LLR in the log-domain.
    This function supports shortening by checking for infinite LLR cases.

    Parameters
    ----------
    l1: float
        input LLR corresponding to the top branch
    l2: float
        input LLR corresponding to the bottom branch

    Returns
    ----------
    float
        the top branch LLR at the next stage of the decoding tree

    """

    # check for infinite LLR, used in shortening
    if l1 == np.inf and l2 != np.inf:
        return l2
    elif l1 != np.inf and l2 == np.inf:
        return l1
    elif l1 == np.inf and l2 == np.inf:
        return np.inf
    else:  # principal decoding equation
        return logdomain_sum(l1 + l2, 0) - logdomain_sum(l1, l2)

def lower_llr(l1, l2, b):
    """
    Update bottom branch LLR in the log-domain.
    This function supports shortening by checking for infinite LLR cases.

    Parameters
    ----------
    l1: float
        input LLR corresponding to the top branch
    l2: float
        input LLR corresponding to the bottom branch
    b: int
        the decoded bit of the top branch

    Returns
    ----------
    float, np.nan
        the bottom branch LLR at the next stage of the decoding tree
    """

    if b == 0:  # check for infinite LLRs, used in shortening
        if l1 == np.inf or l2 == np.inf:
            return np.inf
        else:  # principal decoding equation
            return l1 + l2
    elif b == 1:  # principal decoding equation
        return l1 - l2
    return np.nan

def active_llr_level(i, n):
    """
        Find the first 1 in the binary expansion of i.
    """

    mask = 2**(n-1)
    count = 1
    for k in range(n):
        if (mask & i) == 0:
            count += 1
            mask >>= 1
        else:
            break
    return min(count, n)

def active_bit_level(i, n):
    """
        Find the first 0 in the binary expansion of i.
    """

    mask = 2**(n-1)
    count = 1
    for k in range(n):
        if (mask & i) > 0:
            count += 1
            mask >>= 1
        else:
            break
    return min(count, n)

Functions

def active_bit_level(i, n)

Find the first 0 in the binary expansion of i.

Expand source code
def active_bit_level(i, n):
    """
        Find the first 0 in the binary expansion of i.
    """

    mask = 2**(n-1)
    count = 1
    for k in range(n):
        if (mask & i) > 0:
            count += 1
            mask >>= 1
        else:
            break
    return min(count, n)
def active_llr_level(i, n)

Find the first 1 in the binary expansion of i.

Expand source code
def active_llr_level(i, n):
    """
        Find the first 1 in the binary expansion of i.
    """

    mask = 2**(n-1)
    count = 1
    for k in range(n):
        if (mask & i) == 0:
            count += 1
            mask >>= 1
        else:
            break
    return min(count, n)
def hard_decision(y)

Hard decision of a log-likelihood.

Expand source code
def hard_decision(y):
    """
        Hard decision of a log-likelihood.
    """

    if y >= 0:
        return 0
    else:
        return 1
def lower_llr(l1, l2, b)

Update bottom branch LLR in the log-domain. This function supports shortening by checking for infinite LLR cases.

Parameters

l1 : float
input LLR corresponding to the top branch
l2 : float
input LLR corresponding to the bottom branch
b : int
the decoded bit of the top branch

Returns

float, np.nan
the bottom branch LLR at the next stage of the decoding tree
Expand source code
def lower_llr(l1, l2, b):
    """
    Update bottom branch LLR in the log-domain.
    This function supports shortening by checking for infinite LLR cases.

    Parameters
    ----------
    l1: float
        input LLR corresponding to the top branch
    l2: float
        input LLR corresponding to the bottom branch
    b: int
        the decoded bit of the top branch

    Returns
    ----------
    float, np.nan
        the bottom branch LLR at the next stage of the decoding tree
    """

    if b == 0:  # check for infinite LLRs, used in shortening
        if l1 == np.inf or l2 == np.inf:
            return np.inf
        else:  # principal decoding equation
            return l1 + l2
    elif b == 1:  # principal decoding equation
        return l1 - l2
    return np.nan
def upper_llr(l1, l2)

Update top branch LLR in the log-domain. This function supports shortening by checking for infinite LLR cases.

Parameters

l1 : float
input LLR corresponding to the top branch
l2 : float
input LLR corresponding to the bottom branch

Returns

float
the top branch LLR at the next stage of the decoding tree
Expand source code
def upper_llr(l1, l2):
    """
    Update top branch LLR in the log-domain.
    This function supports shortening by checking for infinite LLR cases.

    Parameters
    ----------
    l1: float
        input LLR corresponding to the top branch
    l2: float
        input LLR corresponding to the bottom branch

    Returns
    ----------
    float
        the top branch LLR at the next stage of the decoding tree

    """

    # check for infinite LLR, used in shortening
    if l1 == np.inf and l2 != np.inf:
        return l2
    elif l1 != np.inf and l2 == np.inf:
        return l1
    elif l1 == np.inf and l2 == np.inf:
        return np.inf
    else:  # principal decoding equation
        return logdomain_sum(l1 + l2, 0) - logdomain_sum(l1, l2)