Skip to content

Commit 3f6ee94

Browse files
author
grigory
committed
Small refactoring of RC SCAN
1 parent 066ee16 commit 3f6ee94

File tree

9 files changed

+73
-32
lines changed

9 files changed

+73
-32
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from .codec import BaseCRCPolarCodec, BasePolarCodec
2+
from .constants import *
23
from .decoder import BaseDecoder
34
from .decoding_path import DecodingPathMixin
5+
from .encoder import *
46
from .functions import *
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# LLR = 1000 is high enough to be considered as +∞ for SCAN decoding
2+
INFINITY = 1000

python_polar_coding/polar_codes/fast_ssc/decoder.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import numpy as np
22
from anytree import PreOrderIter
33

4-
from python_polar_coding.polar_codes.sc import SCDecoder
54
from python_polar_coding.polar_codes.base.functions import (
65
compute_left_alpha,
76
compute_right_alpha,
87
)
8+
from python_polar_coding.polar_codes.sc import SCDecoder
99

1010
from .node import FastSSCNode
1111

@@ -75,6 +75,10 @@ def compute_intermediate_alpha(self, leaf):
7575
if node.is_computed:
7676
continue
7777

78+
# No need to compute zero node because output is vector of zeros
79+
if node.is_zero:
80+
continue
81+
7882
parent_alpha = node.parent.alpha
7983

8084
if node.is_left:

python_polar_coding/polar_codes/fast_ssc/node.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def __init__(self, mask, name=ROOT, N_min=None, **kwargs):
4343
def __str__(self):
4444
return ''.join([str(m) for m in self._mask])
4545

46+
def __len__(self):
47+
return self._mask.size
48+
4649
@property
4750
def N(self):
4851
return self._mask.size
@@ -100,6 +103,26 @@ def repetition_min_size(self):
100103
def spc_min_size(self):
101104
return self.M or self.__class__.SPC_MIN_SIZE
102105

106+
@property
107+
def is_zero(self):
108+
return self._node_type == self.ZERO_NODE
109+
110+
@property
111+
def is_one(self):
112+
return self._node_type == self.ONE_NODE
113+
114+
@property
115+
def is_repetition(self):
116+
return self._node_type == self.REPETITION
117+
118+
@property
119+
def is_parity(self):
120+
return self._node_type == self.SINGLE_PARITY_CHECK
121+
122+
@property
123+
def type(self):
124+
return self._node_type
125+
103126
def to_dict(self):
104127
return {
105128
'type': self._node_type,

python_polar_coding/polar_codes/g_fast_ssc/node.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ def __init__(self, AF=1, *args, **kwargs):
2323
self.mask_steps = None
2424
super().__init__(*args, **kwargs)
2525

26+
@property
27+
def is_g_repetition(self):
28+
return self._node_type == self.G_REPETITION
29+
30+
@property
31+
def is_rg_parity(self):
32+
return self._node_type == self.RG_PARITY
33+
2634
def get_node_type(self):
2735
ntype = super().get_node_type()
2836
if ntype != self.OTHER:

python_polar_coding/polar_codes/rc_scan/decoder.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@ def clean_before_decoding(self):
5454
def compute_intermediate_alpha(self, leaf):
5555
"""Compute intermediate Alpha values (LLR)."""
5656
for node in leaf.path[1:]:
57-
if node.is_computed or node.is_leaf:
57+
if node.is_computed or node.is_zero or node.is_one:
5858
continue
5959

60-
node.is_computed = True
6160
parent_alpha = node.parent.alpha
6261

6362
if node.is_left:
@@ -68,6 +67,8 @@ def compute_intermediate_alpha(self, leaf):
6867
left_beta = node.siblings[0].beta
6968
node.alpha = self.compute_right_alpha(parent_alpha, left_beta)
7069

70+
node.is_computed = True
71+
7172
def compute_intermediate_beta(self, node):
7273
"""Compute intermediate BETA values."""
7374
parent = node.parent

python_polar_coding/polar_codes/rc_scan/functions.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import numba
2+
import numpy as np
23

3-
from ..base import compute_alpha
4+
from ..base import INFINITY, compute_alpha
45

56

67
@numba.njit
@@ -21,3 +22,23 @@ def function_2(a, b, c):
2122
2223
"""
2324
return compute_alpha(a, b) + c
25+
26+
27+
@numba.njit
28+
def compute_beta_zero_node(alpha):
29+
"""Compute beta values for ZERO node.
30+
31+
https://arxiv.org/pdf/1510.06495.pdf Section III.C.
32+
33+
"""
34+
return np.ones(alpha.size, dtype=np.double) * INFINITY
35+
36+
37+
@numba.njit
38+
def compute_beta_one_node(alpha):
39+
"""Compute beta values for ONE node.
40+
41+
https://arxiv.org/pdf/1510.06495.pdf Section III.C.
42+
43+
"""
44+
return np.zeros(alpha.size, dtype=np.double)
Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
import numba
21
import numpy as np
32

43
from python_polar_coding.polar_codes.fast_ssc import FastSSCNode
54

6-
# LLR = 1000 is high enough to be considered as +∞ for RC-SCAN decoding
7-
INFINITY = 1000
5+
from .functions import compute_beta_one_node, compute_beta_zero_node
86

97

108
class RCSCANNode(FastSSCNode):
119

1210
def compute_leaf_beta(self):
13-
"""Do nothing.
11+
"""Do nothing for ZERO and ONE nodes.
1412
1513
Unlike SC-based decoders SCAN decoders does not make decisions
1614
in leaves.
1715
1816
"""
17+
if self.is_zero or self.is_one:
18+
return
1919

2020
def initialize_leaf_beta(self):
2121
"""Initialize BETA values on tree building.
@@ -27,9 +27,9 @@ def initialize_leaf_beta(self):
2727
return
2828

2929
if self._node_type == RCSCANNode.ZERO_NODE:
30-
self._beta = self._compute_zero_node_beta(self.alpha)
30+
self._beta = compute_beta_zero_node(self.alpha)
3131
if self._node_type == RCSCANNode.ONE_NODE:
32-
self._beta = self._compute_one_node_beta(self.alpha)
32+
self._beta = compute_beta_one_node(self.alpha)
3333

3434
def get_node_type(self):
3535
"""Get the type of RC SCAN Node.
@@ -45,23 +45,3 @@ def get_node_type(self):
4545
if np.all(self._mask == 1):
4646
return RCSCANNode.ONE_NODE
4747
return RCSCANNode.OTHER
48-
49-
@staticmethod
50-
@numba.njit
51-
def _compute_zero_node_beta(llr):
52-
"""Compute beta values for ZERO node.
53-
54-
https://arxiv.org/pdf/1510.06495.pdf Section III.C.
55-
56-
"""
57-
return np.ones(llr.size, dtype=np.double) * INFINITY
58-
59-
@staticmethod
60-
@numba.njit
61-
def _compute_one_node_beta(llr):
62-
"""Compute beta values for ONE node.
63-
64-
https://arxiv.org/pdf/1510.06495.pdf Section III.C.
65-
66-
"""
67-
return np.zeros(llr.size, dtype=np.double)

python_polar_coding/tests/test_fast_ssc/test_decoder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ def test_complex(self):
169169
np.array([-0.8674, 0.9677, ]),
170170
np.array([-0.7723, 1.8675, -0.2039, -2.5321, ]),
171171
np.array([-0.2514, ]),
172-
np.array([0.8554, ]),
172+
np.array([0, ]),
173173
np.array([-1.2404, ]),
174-
np.array([2.9912, ]),
174+
np.array([0, ]),
175175
np.array([-2.3952, -1.3818, 4.7891, -6.4949, ]),
176176
]
177177

0 commit comments

Comments
 (0)