feat: add normalized min-sum CN update mode

Add cn_mode ('offset'/'normalized') and alpha parameters to
min_sum_cn_update() in ldpc_sim.py and generic_decode() in
ldpc_analysis.py. Normalized mode scales magnitudes by alpha
(default 0.75) instead of subtracting a fixed offset, which
is better suited for low-rate codes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
cah
2026-02-24 16:35:28 -07:00
parent eb255af067
commit b04813fa7c
3 changed files with 70 additions and 7 deletions

View File

@@ -152,7 +152,8 @@ def ira_encode(info, H_base, H_full, z=32):
return codeword
def generic_decode(llr_q, H_base, z=32, max_iter=30, early_term=True, q_bits=6):
def generic_decode(llr_q, H_base, z=32, max_iter=30, early_term=True, q_bits=6,
cn_mode='offset', alpha=0.75):
"""
Parameterized layered min-sum decoder for any QC-LDPC base matrix.
@@ -166,6 +167,8 @@ def generic_decode(llr_q, H_base, z=32, max_iter=30, early_term=True, q_bits=6):
max_iter: maximum iterations
early_term: stop when syndrome is zero
q_bits: quantization bits
cn_mode: 'offset' or 'normalized'
alpha: scaling factor for normalized mode (default 0.75)
Returns:
(decoded_info_bits, converged, iterations, syndrome_weight)
@@ -204,7 +207,10 @@ def generic_decode(llr_q, H_base, z=32, max_iter=30, early_term=True, q_bits=6):
msgs_out = []
for j in range(dc):
mag = min2 if j == min1_idx else min1
mag = max(0, mag - offset)
if cn_mode == 'normalized':
mag = int(mag * alpha)
else:
mag = max(0, mag - offset)
sgn = sign_xor ^ signs[j]
val = -mag if sgn else mag
msgs_out.append(val)