void LinearCheckNodeUpdater::updateNode( unsigned int nodeInd, MultiVector<float>& messages) { uint32_t begin = messages.begin(nodeInd); uint32_t end = messages.end(nodeInd); uint32_t N = end - begin; if(N == 1) { messages[begin] = m_checkNodesPriorLogPmQ[nodeInd].getFloat(); return; } // Convert all message values into log(p-q) values for (unsigned int j = begin; j < end; j++) { m_messagesPmQ.push_back(LogPmQ(messages[j])); } // calculate the multiplication from the right of p-q values: // rightSum[j] = encodedSoftBit[i] * messages[-1].p-q * messages[-2].p-q * ... * messages[-j].p-q LogPmQ curSum = m_checkNodesPriorLogPmQ[nodeInd]; // get log(p-q) m_rightSum.push_back(curSum); // go over all messages except the first one (which will never be // needed anyway) for(unsigned int rightInd = N - 1; rightInd > 0; rightInd--) { curSum += m_messagesPmQ[rightInd]; m_rightSum.push_back(curSum); } // special case for j = 0 messages[begin] = m_rightSum[N - 1].getFloat(); // now we use curSum as the cumulative multiplication from the // left rather than right curSum = m_messagesPmQ[0]; for (unsigned int j = 1; j < N; j++) { messages[begin + j] = (curSum + m_rightSum[N - j - 1]).getFloat(); //assert(isfinite(messages[begin + j])); curSum += m_messagesPmQ[j]; } m_rightSum.clear(); m_messagesPmQ.clear(); }
void LinearCheckNodeUpdater::updateNode( unsigned int nodeInd, MultiVector<BipartiteBP::QLLR>& messages) { uint32_t begin = messages.begin(nodeInd); uint32_t end = messages.end(nodeInd); uint32_t N = end - begin; #ifdef SUPER_VERBOSE std::cout << "CheckNode " << nodeInd << " \t" << N << " neighbors: "; for (uint32_t jj = 0; jj < N; jj++) { std::cout << messages[begin + jj] << ", "; } std::cout << std::endl; #endif if(N == 1) { messages[begin] = m_checkNodesPriorQLLR[nodeInd]; return; } // Convert all message values into log(p-q) values for (unsigned int j = begin; j < end; j++) { m_messagesWorkArr.push_back(messages[j]); } // calculate the multiplication from the right of p-q values: // rightSum[j] = encodedSoftBit[i] * messages[-1].p-q * messages[-2].p-q * ... * messages[-j].p-q itpp::QLLR curSum = m_checkNodesPriorQLLR[nodeInd]; // get log(p-q) m_rightSum.push_back(curSum); // go over all messages except the first one (which will never be // needed anyway) for(unsigned int rightInd = N - 1; rightInd > 0; rightInd--) { #ifdef SUPER_VERBOSE std::cout << "\t\tcurSum=" << curSum << " qllr=" << m_messagesWorkArr[rightInd] << " boxPlus=" << m_llrCalc.Boxplus(curSum, m_messagesWorkArr[rightInd]) << std::endl; #endif curSum = m_llrCalc.Boxplus(curSum, m_messagesWorkArr[rightInd]); m_rightSum.push_back(curSum); } #ifdef SUPER_VERBOSE std::cout << "\t\tRightSum: "; for (uint32_t jj = 0; jj < N; jj++) { std::cout << m_rightSum[jj] << ", "; } std::cout << std::endl; #endif // special case for j = 0 messages[begin] = m_rightSum[N - 1]; // now we use curSum as the cumulative multiplication from the // left rather than right curSum = m_messagesWorkArr[0]; for (unsigned int j = 1; j < N; j++) { messages[begin + j] = m_llrCalc.Boxplus(curSum, m_rightSum[N - j - 1]); //assert(isfinite(messages[begin + j])); curSum = m_llrCalc.Boxplus(curSum, m_messagesWorkArr[j]); } m_rightSum.clear(); m_messagesWorkArr.clear(); #ifdef SUPER_VERBOSE std::cout << "\t\tOut: "; for (uint32_t jj = 0; jj < N; jj++) { std::cout << messages[begin + jj] << ", "; } std::cout << std::endl; #endif }