feat: add Z=128 support for matrix construction and validation
Make validate_matrix() and run_full_pipeline() accept z parameter instead of using hardcoded Z=32. Thread cn_mode/alpha to validation. Add --z/--cn-mode/--alpha CLI options to full pipeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -757,7 +757,8 @@ def verify_matrix(H_base, z=32):
|
|||||||
# FER Validation
|
# FER Validation
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
def validate_matrix(H_base, lam_s_points, n_frames=200, lam_b=0.1, max_iter=30):
|
def validate_matrix(H_base, lam_s_points, n_frames=200, lam_b=0.1, max_iter=30,
|
||||||
|
z=32, cn_mode='offset', alpha=0.75):
|
||||||
"""
|
"""
|
||||||
Run full Monte Carlo FER simulation for a base matrix.
|
Run full Monte Carlo FER simulation for a base matrix.
|
||||||
|
|
||||||
@@ -765,7 +766,6 @@ def validate_matrix(H_base, lam_s_points, n_frames=200, lam_b=0.1, max_iter=30):
|
|||||||
"""
|
"""
|
||||||
from ldpc_analysis import generic_decode, peg_encode
|
from ldpc_analysis import generic_decode, peg_encode
|
||||||
|
|
||||||
z = Z
|
|
||||||
k = z
|
k = z
|
||||||
H_full = _build_full_h_from_base(H_base, z)
|
H_full = _build_full_h_from_base(H_base, z)
|
||||||
|
|
||||||
@@ -790,7 +790,8 @@ def validate_matrix(H_base, lam_s_points, n_frames=200, lam_b=0.1, max_iter=30):
|
|||||||
llr_q = quantize_llr(llr_float)
|
llr_q = quantize_llr(llr_float)
|
||||||
|
|
||||||
decoded, converged, iters, sw = generic_decode(
|
decoded, converged, iters, sw = generic_decode(
|
||||||
llr_q, H_base, z=z, max_iter=max_iter, q_bits=Q_BITS
|
llr_q, H_base, z=z, max_iter=max_iter, q_bits=Q_BITS,
|
||||||
|
cn_mode=cn_mode, alpha=alpha
|
||||||
)
|
)
|
||||||
total_iter += iters
|
total_iter += iters
|
||||||
|
|
||||||
@@ -813,7 +814,7 @@ def validate_matrix(H_base, lam_s_points, n_frames=200, lam_b=0.1, max_iter=30):
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
|
|
||||||
def run_full_pipeline(lam_b=0.1, seed=42):
|
def run_full_pipeline(lam_b=0.1, seed=42, z=32, cn_mode='offset', alpha=0.75):
|
||||||
"""
|
"""
|
||||||
Full pipeline: optimize -> construct -> validate.
|
Full pipeline: optimize -> construct -> validate.
|
||||||
"""
|
"""
|
||||||
@@ -854,8 +855,8 @@ def run_full_pipeline(lam_b=0.1, seed=42):
|
|||||||
|
|
||||||
# Step 3: Construct matrix
|
# Step 3: Construct matrix
|
||||||
print("\n--- Step 3: Matrix construction ---")
|
print("\n--- Step 3: Matrix construction ---")
|
||||||
H_opt, girth = construct_base_matrix(best_degrees, z=32, n_trials=2000)
|
H_opt, girth = construct_base_matrix(best_degrees, z=z, n_trials=2000)
|
||||||
checks = verify_matrix(H_opt, z=32)
|
checks = verify_matrix(H_opt, z=z)
|
||||||
print(f" Constructed matrix: girth={girth}, rank={checks['actual_rank']}/{checks['expected_rank']}")
|
print(f" Constructed matrix: girth={girth}, rank={checks['actual_rank']}/{checks['expected_rank']}")
|
||||||
print(f" Encodable: {checks['encodable']}, Full rank: {checks['full_rank']}")
|
print(f" Encodable: {checks['encodable']}, Full rank: {checks['full_rank']}")
|
||||||
print(f" Base matrix:\n{H_opt}")
|
print(f" Base matrix:\n{H_opt}")
|
||||||
@@ -867,10 +868,13 @@ def run_full_pipeline(lam_b=0.1, seed=42):
|
|||||||
print(f"\n{'lam_s':>8s} {'Optimized':>12s} {'Original':>12s} {'PEG ring':>12s}")
|
print(f"\n{'lam_s':>8s} {'Optimized':>12s} {'Original':>12s} {'PEG ring':>12s}")
|
||||||
print("-" * 50)
|
print("-" * 50)
|
||||||
|
|
||||||
fer_opt = validate_matrix(H_opt, lam_s_points, n_frames=200, lam_b=lam_b)
|
fer_opt = validate_matrix(H_opt, lam_s_points, n_frames=200, lam_b=lam_b,
|
||||||
fer_orig = validate_matrix(H_BASE, lam_s_points, n_frames=200, lam_b=lam_b)
|
z=z, cn_mode=cn_mode, alpha=alpha)
|
||||||
|
fer_orig = validate_matrix(H_BASE, lam_s_points, n_frames=200, lam_b=lam_b,
|
||||||
|
z=z, cn_mode=cn_mode, alpha=alpha)
|
||||||
fer_peg = validate_matrix(ref_matrices['PEG ring [7,3,3,3,2,2,2,2]'],
|
fer_peg = validate_matrix(ref_matrices['PEG ring [7,3,3,3,2,2,2,2]'],
|
||||||
lam_s_points, n_frames=200, lam_b=lam_b)
|
lam_s_points, n_frames=200, lam_b=lam_b,
|
||||||
|
z=z, cn_mode=cn_mode, alpha=alpha)
|
||||||
|
|
||||||
for lam_s in lam_s_points:
|
for lam_s in lam_s_points:
|
||||||
f_opt = fer_opt[lam_s]['fer']
|
f_opt = fer_opt[lam_s]['fer']
|
||||||
@@ -1016,7 +1020,7 @@ def main():
|
|||||||
print(f" lam_s={lam_s:.1f}: FER={r['fer']:.3f}, BER={r['ber']:.6f}")
|
print(f" lam_s={lam_s:.1f}: FER={r['fer']:.3f}, BER={r['ber']:.6f}")
|
||||||
|
|
||||||
elif args.command == 'full':
|
elif args.command == 'full':
|
||||||
run_full_pipeline(seed=args.seed)
|
run_full_pipeline(seed=args.seed, z=args.z, cn_mode=args.cn_mode, alpha=args.alpha)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
|
|||||||
@@ -283,6 +283,31 @@ class TestNormalizedMinSumDE:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestZ128Support:
|
||||||
|
"""Tests for Z=128 matrix construction and optimization."""
|
||||||
|
|
||||||
|
def test_construct_z128_valid(self):
|
||||||
|
"""Construct matrix for [7,4,4,4,4,3,3,3] with z=128. Verify full rank, girth >= 6, encodable."""
|
||||||
|
from density_evolution import construct_base_matrix, verify_matrix
|
||||||
|
np.random.seed(42)
|
||||||
|
target = [7, 4, 4, 4, 4, 3, 3, 3]
|
||||||
|
H_base, girth = construct_base_matrix(target, z=128, n_trials=500)
|
||||||
|
checks = verify_matrix(H_base, z=128)
|
||||||
|
assert checks['full_rank'], f"Full rank failed: {checks['actual_rank']}/{checks['expected_rank']}"
|
||||||
|
assert girth >= 6, f"Girth {girth} should be >= 6"
|
||||||
|
assert checks['encodable'], "Should be encodable"
|
||||||
|
|
||||||
|
def test_validate_z128_runs(self):
|
||||||
|
"""Run validate_matrix with z=128, n_frames=5 at lam_s=5. Verify returns dict with FER."""
|
||||||
|
from density_evolution import construct_base_matrix, validate_matrix
|
||||||
|
np.random.seed(42)
|
||||||
|
target = [7, 4, 4, 4, 4, 3, 3, 3]
|
||||||
|
H_base, girth = construct_base_matrix(target, z=128, n_trials=200)
|
||||||
|
results = validate_matrix(H_base, lam_s_points=[5.0], n_frames=5, lam_b=0.1, z=128)
|
||||||
|
assert 5.0 in results, f"Expected key 5.0, got {list(results.keys())}"
|
||||||
|
assert 'fer' in results[5.0]
|
||||||
|
|
||||||
|
|
||||||
class TestAlphaOptimization:
|
class TestAlphaOptimization:
|
||||||
"""Tests for alpha sweep optimization."""
|
"""Tests for alpha sweep optimization."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user