only start conv with the first info bit

This commit is contained in:
Ahmet Inan 2026-02-15 11:29:19 +01:00
commit 98959b8d9e
2 changed files with 28 additions and 17 deletions

View file

@ -33,16 +33,20 @@ public:
int frozen = length - mesg_bits; int frozen = length - mesg_bits;
for (int i = 0, j = 0; i < length; i += 2) { for (int i = 0, j = 0; i < length; i += 2) {
TYPE msg0 = rank_map[i] < frozen ? PH::one() : message[j++]; 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++]; TYPE msg1 = rank_map[i+1] < frozen ? PH::one() : message[j++];
conv(&state, msg0 < 0); if (j)
conv(&state, msg1 < 0); conv(&state, msg1 < 0);
} }
state |= (state & 126) << 7; state |= (state & 126) << 7;
for (int i = 0; i < length; i += 2) { for (int i = 0, j = 0; i < length; i += 2) {
TYPE msg0 = rank_map[i] < frozen ? PH::one() : *message++; TYPE msg0 = rank_map[i] < frozen ? PH::one() : message[j++];
TYPE msg1 = rank_map[i+1] < frozen ? PH::one() : *message++; if (j)
msg0 = 1 - 2 * conv(&state, msg0 < 0); msg0 = 1 - 2 * conv(&state, msg0 < 0);
msg1 = 1 - 2 * conv(&state, msg1 < 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] = PH::qmul(msg0, msg1);
codeword[i+1] = msg1; codeword[i+1] = msg1;
} }

View file

@ -49,16 +49,23 @@ struct PACListTree<TYPE, 1>
*state = (*state & 8064) | ((*state & 62) << 1) | (input ? 2 : 0) | (output ? 1 : 0); *state = (*state & 8064) | ((*state & 62) << 1) | (input ? 2 : 0) | (output ? 1 : 0);
return output; 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]; TYPE sft = soft[1];
for (int k = 0; k < TYPE::SIZE; ++k) if (*count) {
if (conv(state+k, 0) != (sft.v[k] < 0)) for (int k = 0; k < TYPE::SIZE; ++k)
metric[k] += std::abs(sft.v[k]); if (conv(state+k, 0) != (sft.v[k] < 0))
TYPE hrd; metric[k] += std::abs(sft.v[k]);
for (int k = 0; k < TYPE::SIZE; ++k) TYPE hrd;
hrd.v[k] = 1 - 2 * (state[k] & 1); for (int k = 0; k < TYPE::SIZE; ++k)
*hard = hrd; 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; MAP map;
for (int k = 0; k < TYPE::SIZE; ++k) for (int k = 0; k < TYPE::SIZE; ++k)
map.v[k] = k; map.v[k] = k;
@ -102,12 +109,12 @@ struct PACListTree<TYPE, 1>
soft[1] = PH::prod(soft[2], soft[3]); soft[1] = PH::prod(soft[2], soft[3]);
MAP lmap, rmap; MAP lmap, rmap;
if (rank[0] < frozen) if (rank[0] < frozen)
lmap = rate0(metric, state, hard, soft); lmap = rate0(metric, count, state, hard, soft);
else else
lmap = rate1(metric, message, maps, count, state, hard, soft); lmap = rate1(metric, message, maps, count, state, hard, soft);
soft[1] = PH::madd(hard[0], vshuf(soft[2], lmap), vshuf(soft[3], lmap)); soft[1] = PH::madd(hard[0], vshuf(soft[2], lmap), vshuf(soft[3], lmap));
if (rank[1] < frozen) if (rank[1] < frozen)
rmap = rate0(metric, state, hard+1, soft); rmap = rate0(metric, count, state, hard+1, soft);
else else
rmap = rate1(metric, message, maps, count, state, hard+1, soft); rmap = rate1(metric, message, maps, count, state, hard+1, soft);
hard[0] = PH::qmul(vshuf(hard[0], rmap), hard[1]); hard[0] = PH::qmul(vshuf(hard[0], rmap), hard[1]);