Source code for kaira.models.fec.encoders.single_parity_check_code
"""Single parity-check coding module for forward error correction.
This module implements single parity-check codes for binary data transmission.
A single parity-check code extends (n-1) information bits with a single parity bit,
creating a code of length n with dimension k = n-1.
The parity bit is chosen to ensure that the total number of 1s in the codeword is even,
providing the ability to detect (but not correct) a single error. Single parity-check
codes are among the simplest error detection codes, offering modest protection with
minimal redundancy.
For more theoretical background on single parity-check codes, see :cite:`lin2004error,moon2005error`.
This implementation follows standard conventions in coding theory for binary linear block codes,
with elements belonging to the binary field GF(2) :cite:`richardson2008modern`.
"""
from typing import Any
import torch
from kaira.models.registry import ModelRegistry
from .linear_block_code import LinearBlockCodeEncoder
def _generate_single_parity_check_matrix(dimension: int) -> torch.Tensor:
"""Generate the generator matrix for a single parity-check code.
Args:
dimension: The dimension k of the code (number of information bits)
Returns:
Generator matrix G for single parity-check code of shape (k, k+1)
"""
# Create a k×k identity matrix for the systematic part
identity = torch.eye(dimension, dtype=torch.int64)
# Create a column of ones for the parity part
parity_column = torch.ones((dimension, 1), dtype=torch.int64)
# Concatenate the identity matrix and the parity column
gen_matrix = torch.cat([identity, parity_column], dim=1)
return gen_matrix
[docs]
@ModelRegistry.register_model("single_parity_check_code_encoder")
class SingleParityCheckCodeEncoder(LinearBlockCodeEncoder):
"""Encoder for single parity-check codes.
A single parity-check code extends a message of k bits with a single parity bit,
creating a codeword of length n = k + 1. The parity bit is chosen so that
the total number of 1s in the codeword is even.
The resulting code has the following properties:
- Length: n = k + 1
- Dimension: k
- Minimum distance: d = 2
This code can detect a single error but cannot correct any errors.
Its dual is the repetition code.
Attributes:
dimension (int): The dimension k of the code (number of information bits)
minimum_distance (int): The minimum Hamming distance of the code (always 2)
Args:
dimension (int): The dimension k of the code (number of information bits)
*args: Variable positional arguments passed to the base class.
**kwargs: Variable keyword arguments passed to the base class.
"""
[docs]
def __init__(self, dimension: int, *args: Any, **kwargs: Any):
"""Initialize the single parity-check encoder.
Args:
dimension: The dimension k of the code (number of information bits)
*args: Variable positional arguments passed to the base class.
**kwargs: Variable keyword arguments passed to the base class.
Raises:
ValueError: If the dimension is not a positive integer
"""
if dimension <= 0:
raise ValueError(f"Dimension must be a positive integer, got {dimension}")
# Generate the generator matrix for the code
generator_matrix = _generate_single_parity_check_matrix(dimension)
# Initialize the base class with the generator matrix
super().__init__(generator_matrix, *args, **kwargs)
# Store single parity-check specific parameters
self.dimension = dimension
self.minimum_distance = 2
[docs]
@classmethod
def from_parameters(cls, dimension: int, *args: Any, **kwargs: Any) -> "SingleParityCheckCodeEncoder":
"""Create a single parity-check encoder from parameters.
This is an alternative constructor that creates the encoder directly from
the single parity-check parameters.
Args:
dimension: The dimension k of the code (number of information bits)
*args: Variable positional arguments passed to the constructor.
**kwargs: Variable keyword arguments passed to the constructor.
Returns:
A SingleParityCheckCodeEncoder instance
"""
return cls(dimension, *args, **kwargs)
[docs]
@classmethod
def from_length(cls, length: int, *args: Any, **kwargs: Any) -> "SingleParityCheckCodeEncoder":
"""Create a single parity-check encoder from the code length.
This is an alternative constructor that creates the encoder given the
desired code length n. The dimension k will be n-1.
Args:
length: The length n of the code
*args: Variable positional arguments passed to the constructor.
**kwargs: Variable keyword arguments passed to the constructor.
Returns:
A SingleParityCheckCodeEncoder instance
Raises:
ValueError: If the length is less than 2
"""
if length < 2:
raise ValueError(f"Code length must be at least 2, got {length}")
# Dimension = length - 1
dimension = length - 1
return cls(dimension, *args, **kwargs)