diff --git a/pac_encoder.hh b/pac_encoder.hh index 605c082..d2f63ee 100644 --- a/pac_encoder.hh +++ b/pac_encoder.hh @@ -34,8 +34,10 @@ public: int length = 1 << level; int state = 0; for (int i = 0; i < length; i += 2) { - TYPE msg0 = get(frozen, i) ? PH::one() : 1 - 2 * conv(&state, *message++ < 0); - TYPE msg1 = get(frozen, i+1) ? PH::one() : 1 - 2 * conv(&state, *message++ < 0); + TYPE msg0 = get(frozen, i) ? PH::one() : *message++; + TYPE msg1 = get(frozen, i+1) ? PH::one() : *message++; + msg0 = 1 - 2 * conv(&state, msg0 < 0); + 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 ab4ec13..10dd82f 100644 --- a/pac_list_decoder.hh +++ b/pac_list_decoder.hh @@ -27,12 +27,16 @@ struct PACListLeaf *state = ((*state & 126) << 1) | (input ? 2 : 0) | (output ? 1 : 0); return output; } - static MAP rate0(PATH *metric, TYPE *hard, TYPE *soft) + static MAP rate0(PATH *metric, int *state, TYPE *hard, TYPE *soft) { - *hard = PH::one(); + TYPE sft = soft[1]; for (int k = 0; k < TYPE::SIZE; ++k) - if (soft[1].v[k] < 0) - metric[k] -= soft[1].v[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; MAP map; for (int k = 0; k < TYPE::SIZE; ++k) map.v[k] = k; @@ -215,12 +219,12 @@ struct PACListTree soft[1] = PH::prod(soft[2], soft[3]); MAP lmap, rmap; if (frozen & 1) - lmap = PACListLeaf::rate0(metric, hard, soft); + lmap = PACListLeaf::rate0(metric, state, hard, soft); else lmap = PACListLeaf::rate1(metric, message, maps, count, state, hard, soft); soft[1] = PH::madd(hard[0], vshuf(soft[2], lmap), vshuf(soft[3], lmap)); if (frozen >> 1) - rmap = PACListLeaf::rate0(metric, hard+1, soft); + rmap = PACListLeaf::rate0(metric, state, hard+1, soft); else rmap = PACListLeaf::rate1(metric, message, maps, count, state, hard+1, soft); hard[0] = PH::qmul(vshuf(hard[0], rmap), hard[1]);