diff --git a/pac_list_decoder.hh b/pac_list_decoder.hh index 0b0e130..ab4ec13 100644 --- a/pac_list_decoder.hh +++ b/pac_list_decoder.hh @@ -11,30 +11,8 @@ Copyright 2025 Ahmet Inan namespace CODE { -template -struct PACListNode -{ - typedef PolarHelper PH; - typedef typename PH::PATH PATH; - typedef typename PH::MAP MAP; - static const int N = 1 << M; - static MAP rate0(PATH *metric, TYPE *hard, TYPE *soft) - { - for (int i = 0; i < N; ++i) - hard[i] = PH::one(); - for (int i = 0; i < N; ++i) - for (int k = 0; k < TYPE::SIZE; ++k) - if (soft[i+N].v[k] < 0) - metric[k] -= soft[i+N].v[k]; - MAP map; - for (int k = 0; k < TYPE::SIZE; ++k) - map.v[k] = k; - return map; - } -}; - template -struct PACListNode +struct PACListLeaf { typedef PolarHelper PH; typedef typename PH::PATH PATH; @@ -128,17 +106,10 @@ struct PACListTree { for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::prod(soft[i+N], soft[i+N/2+N]); - MAP lmap, rmap; - if (frozen[0] == 0xffffffff) - lmap = PACListNode::rate0(metric, hard, soft); - else - lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen[0]); + MAP lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen[0]); for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::madd(hard[i], vshuf(soft[i+N], lmap), vshuf(soft[i+N/2+N], lmap)); - if (frozen[1] == 0xffffffff) - rmap = PACListNode::rate0(metric, hard+N/2, soft); - else - rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen[1]); + MAP rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen[1]); for (int i = 0; i < N/2; ++i) hard[i] = PH::qmul(vshuf(hard[i], rmap), hard[i+N/2]); return vshuf(lmap, rmap); @@ -157,17 +128,10 @@ struct PACListTree { for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::prod(soft[i+N], soft[i+N/2+N]); - MAP lmap, rmap; - if ((frozen & ((1<<(1<<(M-1)))-1)) == ((1<<(1<<(M-1)))-1)) - lmap = PACListNode::rate0(metric, hard, soft); - else - lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); + MAP lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::madd(hard[i], vshuf(soft[i+N], lmap), vshuf(soft[i+N/2+N], lmap)); - if (frozen >> (N/2) == ((1<<(1<<(M-1)))-1)) - rmap = PACListNode::rate0(metric, hard+N/2, soft); - else - rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); + MAP rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); for (int i = 0; i < N/2; ++i) hard[i] = PH::qmul(vshuf(hard[i], rmap), hard[i+N/2]); return vshuf(lmap, rmap); @@ -186,17 +150,10 @@ struct PACListTree { for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::prod(soft[i+N], soft[i+N/2+N]); - MAP lmap, rmap; - if ((frozen & ((1<<(1<<(M-1)))-1)) == ((1<<(1<<(M-1)))-1)) - lmap = PACListNode::rate0(metric, hard, soft); - else - lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); + MAP lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::madd(hard[i], vshuf(soft[i+N], lmap), vshuf(soft[i+N/2+N], lmap)); - if (frozen >> (N/2) == ((1<<(1<<(M-1)))-1)) - rmap = PACListNode::rate0(metric, hard+N/2, soft); - else - rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); + MAP rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); for (int i = 0; i < N/2; ++i) hard[i] = PH::qmul(vshuf(hard[i], rmap), hard[i+N/2]); return vshuf(lmap, rmap); @@ -215,17 +172,10 @@ struct PACListTree { for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::prod(soft[i+N], soft[i+N/2+N]); - MAP lmap, rmap; - if ((frozen & ((1<<(1<<(M-1)))-1)) == ((1<<(1<<(M-1)))-1)) - lmap = PACListNode::rate0(metric, hard, soft); - else - lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); + MAP lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::madd(hard[i], vshuf(soft[i+N], lmap), vshuf(soft[i+N/2+N], lmap)); - if (frozen >> (N/2) == ((1<<(1<<(M-1)))-1)) - rmap = PACListNode::rate0(metric, hard+N/2, soft); - else - rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); + MAP rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); for (int i = 0; i < N/2; ++i) hard[i] = PH::qmul(vshuf(hard[i], rmap), hard[i+N/2]); return vshuf(lmap, rmap); @@ -244,17 +194,10 @@ struct PACListTree { for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::prod(soft[i+N], soft[i+N/2+N]); - MAP lmap, rmap; - if ((frozen & ((1<<(1<<(M-1)))-1)) == ((1<<(1<<(M-1)))-1)) - lmap = PACListNode::rate0(metric, hard, soft); - else - lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); + MAP lmap = PACListTree::decode(metric, message, maps, count, state, hard, soft, frozen & ((1<<(1<<(M-1)))-1)); for (int i = 0; i < N/2; ++i) soft[i+N/2] = PH::madd(hard[i], vshuf(soft[i+N], lmap), vshuf(soft[i+N/2+N], lmap)); - if (frozen >> (N/2) == ((1<<(1<<(M-1)))-1)) - rmap = PACListNode::rate0(metric, hard+N/2, soft); - else - rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); + MAP rmap = PACListTree::decode(metric, message, maps, count, state, hard+N/2, soft, frozen >> (N/2)); for (int i = 0; i < N/2; ++i) hard[i] = PH::qmul(vshuf(hard[i], rmap), hard[i+N/2]); return vshuf(lmap, rmap); @@ -272,14 +215,14 @@ struct PACListTree soft[1] = PH::prod(soft[2], soft[3]); MAP lmap, rmap; if (frozen & 1) - lmap = PACListNode::rate0(metric, hard, soft); + lmap = PACListLeaf::rate0(metric, hard, soft); else - lmap = PACListNode::rate1(metric, message, maps, count, state, hard, soft); + 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 = PACListNode::rate0(metric, hard+1, soft); + rmap = PACListLeaf::rate0(metric, hard+1, soft); else - rmap = PACListNode::rate1(metric, message, maps, count, state, hard+1, soft); + rmap = PACListLeaf::rate1(metric, message, maps, count, state, hard+1, soft); hard[0] = PH::qmul(vshuf(hard[0], rmap), hard[1]); return vshuf(lmap, rmap); }