diff --git a/pac_encoder.hh b/pac_encoder.hh index 98f73eb..573d986 100644 --- a/pac_encoder.hh +++ b/pac_encoder.hh @@ -33,16 +33,20 @@ public: int frozen = length - mesg_bits; for (int i = 0, j = 0; i < length; i += 2) { TYPE msg0 = rank_map[i] < frozen ? PH::one() : message[j++]; + if (j) + conv(&state, msg0 < 0); TYPE msg1 = rank_map[i+1] < frozen ? PH::one() : message[j++]; - conv(&state, msg0 < 0); - conv(&state, msg1 < 0); + if (j) + conv(&state, msg1 < 0); } state |= (state & 126) << 7; - for (int i = 0; i < length; i += 2) { - TYPE msg0 = rank_map[i] < frozen ? PH::one() : *message++; - TYPE msg1 = rank_map[i+1] < frozen ? PH::one() : *message++; - msg0 = 1 - 2 * conv(&state, msg0 < 0); - msg1 = 1 - 2 * conv(&state, msg1 < 0); + for (int i = 0, j = 0; i < length; i += 2) { + TYPE msg0 = rank_map[i] < frozen ? PH::one() : message[j++]; + if (j) + msg0 = 1 - 2 * conv(&state, msg0 < 0); + TYPE msg1 = rank_map[i+1] < frozen ? PH::one() : message[j++]; + if (j) + msg1 = 1 - 2 * conv(&state, msg1 < 0); codeword[i] = PH::qmul(msg0, msg1); codeword[i+1] = msg1; } diff --git a/pac_list_decoder.hh b/pac_list_decoder.hh index f567344..7544d7f 100644 --- a/pac_list_decoder.hh +++ b/pac_list_decoder.hh @@ -49,16 +49,23 @@ struct PACListTree *state = (*state & 8064) | ((*state & 62) << 1) | (input ? 2 : 0) | (output ? 1 : 0); return output; } - static MAP rate0(PATH *metric, int *state, TYPE *hard, TYPE *soft) + static MAP rate0(PATH *metric, int *count, int *state, TYPE *hard, TYPE *soft) { TYPE sft = soft[1]; - for (int k = 0; k < TYPE::SIZE; ++k) - if (conv(state+k, 0) != (sft.v[k] < 0)) - metric[k] += std::abs(sft.v[k]); - TYPE hrd; - for (int k = 0; k < TYPE::SIZE; ++k) - hrd.v[k] = 1 - 2 * (state[k] & 1); - *hard = hrd; + if (*count) { + for (int k = 0; k < TYPE::SIZE; ++k) + if (conv(state+k, 0) != (sft.v[k] < 0)) + metric[k] += std::abs(sft.v[k]); + TYPE hrd; + for (int k = 0; k < TYPE::SIZE; ++k) + hrd.v[k] = 1 - 2 * (state[k] & 1); + *hard = hrd; + } else { + for (int k = 0; k < TYPE::SIZE; ++k) + if (sft.v[k] < 0) + metric[k] -= sft.v[k]; + *hard = PH::one(); + } MAP map; for (int k = 0; k < TYPE::SIZE; ++k) map.v[k] = k; @@ -102,12 +109,12 @@ struct PACListTree soft[1] = PH::prod(soft[2], soft[3]); MAP lmap, rmap; if (rank[0] < frozen) - lmap = rate0(metric, state, hard, soft); + lmap = rate0(metric, count, state, hard, soft); else lmap = rate1(metric, message, maps, count, state, hard, soft); soft[1] = PH::madd(hard[0], vshuf(soft[2], lmap), vshuf(soft[3], lmap)); if (rank[1] < frozen) - rmap = rate0(metric, state, hard+1, soft); + rmap = rate0(metric, count, state, hard+1, soft); else rmap = rate1(metric, message, maps, count, state, hard+1, soft); hard[0] = PH::qmul(vshuf(hard[0], rmap), hard[1]);