@@ -136,6 +136,8 @@ def ldpc_bp_decode(llr_vec, ldpc_code_params, n_iters):
136136 cnode_msgs = np .zeros (n_cnodes * max_cnode_deg )
137137 vnode_msgs = np .zeros (n_vnodes * max_vnode_deg )
138138
139+ _limit_llr_v = np .vectorize (_limit_llr )
140+
139141 # Initialize vnode messages with the LLR values received
140142 for vnode_idx in xrange (n_vnodes ):
141143 start_idx = vnode_idx * max_vnode_deg
@@ -149,39 +151,30 @@ def ldpc_bp_decode(llr_vec, ldpc_code_params, n_iters):
149151
150152 # Check Node Update
151153 for cnode_idx in xrange (n_cnodes ):
152- #start_idx = cnode_idx*max_cnode_deg
153- #offset = cnode_deg_list[cnode_idx]
154- #vnode_list = cnode_adj_list[start_idx:start_idx+offset]
155- #msg_prod = np.prod(np.tanh(vnode_msgs[vnode_list*max_vnode_deg + cnode_vnode_map[cnode_idx*max_cnode_deg + np.arange(cnode_deg_list[cnode_idx], int)]]/2.0))
156154
157- msg_prod = 1.0
158- for i in xrange (cnode_deg_list [cnode_idx ]):
159- vnode = cnode_adj_list [cnode_idx * max_cnode_deg + i ]
160- msg_prod *= np .tanh (vnode_msgs [vnode * max_vnode_deg +
161- cnode_vnode_map [cnode_idx * max_cnode_deg + i ]]/ 2.0 )
155+ start_idx = cnode_idx * max_cnode_deg
156+ offset = cnode_deg_list [cnode_idx ]
157+ vnode_list = cnode_adj_list [start_idx :start_idx + offset ]
158+ vnode_list_msgs_tanh = np .tanh (vnode_msgs [vnode_list * max_vnode_deg +
159+ cnode_vnode_map [start_idx :start_idx + offset ]]/ 2.0 )
160+ msg_prod = np .prod (vnode_list_msgs_tanh )
162161
163162 # Compute messages on outgoing edges using the incoming message product
164- for i in xrange (cnode_deg_list [cnode_idx ]):
165- vnode = cnode_adj_list [cnode_idx * max_cnode_deg + i ]
166- c_msg = 2.0 * np .arctanh (msg_prod / np .tanh (vnode_msgs [vnode * max_vnode_deg +
167- cnode_vnode_map [cnode_idx * max_cnode_deg + i ]]/ 2.0 ))
168- cnode_msgs [cnode_idx * max_cnode_deg + i ] = c_msg
169-
163+ cnode_msgs [start_idx :start_idx + offset ]= 2.0 * np .arctanh (msg_prod / vnode_list_msgs_tanh )
170164
171165 # Variable Node Update
172166 for vnode_idx in xrange (n_vnodes ):
173167
174- msg_sum = 0
175168 # Compute sum of all incoming messages at the variable node
176- for i in xrange (vnode_deg_list [vnode_idx ]):
177- cnode = vnode_adj_list [vnode_idx * max_vnode_deg + i ]
178- msg_sum += cnode_msgs [cnode * max_cnode_deg + vnode_cnode_map [vnode_idx * max_vnode_deg + i ]]
169+ start_idx = vnode_idx * max_vnode_deg
170+ offset = vnode_deg_list [vnode_idx ]
171+ cnode_list = vnode_adj_list [start_idx :start_idx + offset ]
172+ cnode_list_msgs = cnode_msgs [cnode_list * max_cnode_deg + vnode_cnode_map [start_idx :start_idx + offset ]]
173+ msg_sum = np .sum (cnode_list_msgs )
179174
180175 # Compute messages on outgoing edges using the incoming message sum
181- for i in xrange (vnode_deg_list [vnode_idx ]):
182- cnode = vnode_adj_list [vnode_idx * max_vnode_deg + i ]
183- v_msg = _limit_llr (llr_vec [vnode_idx ] + msg_sum - cnode_msgs [cnode * max_cnode_deg + vnode_cnode_map [vnode_idx * max_vnode_deg + i ]])
184- vnode_msgs [vnode_idx * max_vnode_deg + i ] = v_msg
176+ vnode_msgs [start_idx :start_idx + offset ] = _limit_llr_v (llr_vec [vnode_idx ] + msg_sum -
177+ cnode_list_msgs )
185178
186179 # Update output LLRs and decoded word
187180 out_llrs [vnode_idx ] = llr_vec [vnode_idx ] + msg_sum
0 commit comments