mirror of
https://github.com/aicodix/code.git
synced 2026-04-27 22:35:44 +00:00
added data_len argument for shortened codes
This commit is contained in:
parent
f545b5d6ab
commit
62819a5376
4 changed files with 60 additions and 39 deletions
|
|
@ -34,35 +34,41 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
int compute_syndromes(uint8_t *data, uint8_t *parity, ValueType *syndromes)
|
int compute_syndromes(uint8_t *data, uint8_t *parity, ValueType *syndromes, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $syndromes_i = code(pe^{FCR+i})$
|
// $syndromes_i = code(pe^{FCR+i})$
|
||||||
ValueType coeff(get_be_bit(data, 0));
|
ValueType coeff(get_be_bit(data, 0));
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
syndromes[i] = coeff;
|
syndromes[i] = coeff;
|
||||||
update_syndromes(data, syndromes, 1, K);
|
update_syndromes(data, syndromes, 1, data_len);
|
||||||
update_syndromes(parity, syndromes, 0, NP);
|
update_syndromes(parity, syndromes, 0, NP);
|
||||||
int nonzero = 0;
|
int nonzero = 0;
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
nonzero += !!syndromes[i];
|
nonzero += !!syndromes[i];
|
||||||
return nonzero;
|
return nonzero;
|
||||||
}
|
}
|
||||||
int compute_syndromes(uint8_t *data, uint8_t *parity, value_type *syndromes)
|
int compute_syndromes(uint8_t *data, uint8_t *parity, value_type *syndromes, int data_len = K)
|
||||||
{
|
{
|
||||||
return compute_syndromes(data, parity, reinterpret_cast<ValueType *>(syndromes));
|
return compute_syndromes(data, parity, reinterpret_cast<ValueType *>(syndromes), data_len);
|
||||||
}
|
}
|
||||||
int operator()(uint8_t *data, uint8_t *parity, value_type *erasures = 0, int erasures_count = 0)
|
int operator()(uint8_t *data, uint8_t *parity, value_type *erasures = 0, int erasures_count = 0, int data_len = K)
|
||||||
{
|
{
|
||||||
assert(0 <= erasures_count && erasures_count <= NR);
|
assert(0 <= erasures_count && erasures_count <= NR);
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
if (0) {
|
if (0) {
|
||||||
for (int i = 0; i < erasures_count; ++i) {
|
for (int i = 0; i < erasures_count; ++i) {
|
||||||
int idx = (int)erasures[i];
|
int idx = (int)erasures[i];
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
set_be_bit(data, idx, 0);
|
set_be_bit(data, idx, 0);
|
||||||
else
|
else
|
||||||
set_be_bit(parity, idx-K, 0);
|
set_be_bit(parity, idx-data_len, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (erasures_count && data_len < K) {
|
||||||
|
for (int i = 0; i < erasures_count; ++i)
|
||||||
|
erasures[i] += K - data_len;
|
||||||
|
}
|
||||||
ValueType syndromes[NR];
|
ValueType syndromes[NR];
|
||||||
if (!compute_syndromes(data, parity, syndromes))
|
if (!compute_syndromes(data, parity, syndromes))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -75,12 +81,12 @@ public:
|
||||||
if (1 < (int)magnitudes[i])
|
if (1 < (int)magnitudes[i])
|
||||||
return -1;
|
return -1;
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
int idx = (int)locations[i];
|
int idx = (int)locations[i] + data_len - K;
|
||||||
bool err = (bool)magnitudes[i];
|
bool err = (bool)magnitudes[i];
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
xor_be_bit(data, idx, err);
|
xor_be_bit(data, idx, err);
|
||||||
else
|
else
|
||||||
xor_be_bit(parity, idx-K, err);
|
xor_be_bit(parity, idx-data_len, err);
|
||||||
}
|
}
|
||||||
int corrections_count = 0;
|
int corrections_count = 0;
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
|
|
@ -111,31 +117,37 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
int compute_syndromes(ValueType *data, ValueType *parity, ValueType *syndromes)
|
int compute_syndromes(ValueType *data, ValueType *parity, ValueType *syndromes, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $syndromes_i = code(pe^{FCR+i})$
|
// $syndromes_i = code(pe^{FCR+i})$
|
||||||
ValueType coeff(data[0]);
|
ValueType coeff(data[0]);
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
syndromes[i] = coeff;
|
syndromes[i] = coeff;
|
||||||
update_syndromes(data, syndromes, 1, K);
|
update_syndromes(data, syndromes, 1, data_len);
|
||||||
update_syndromes(parity, syndromes, 0, NP);
|
update_syndromes(parity, syndromes, 0, NP);
|
||||||
int nonzero = 0;
|
int nonzero = 0;
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
nonzero += !!syndromes[i];
|
nonzero += !!syndromes[i];
|
||||||
return nonzero;
|
return nonzero;
|
||||||
}
|
}
|
||||||
int operator()(ValueType *data, ValueType *parity, IndexType *erasures = 0, int erasures_count = 0)
|
int operator()(ValueType *data, ValueType *parity, IndexType *erasures = 0, int erasures_count = 0, int data_len = K)
|
||||||
{
|
{
|
||||||
assert(0 <= erasures_count && erasures_count <= NR);
|
assert(0 <= erasures_count && erasures_count <= NR);
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
if (0) {
|
if (0) {
|
||||||
for (int i = 0; i < erasures_count; ++i) {
|
for (int i = 0; i < erasures_count; ++i) {
|
||||||
int idx = (int)erasures[i];
|
int idx = (int)erasures[i];
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
data[idx] = ValueType(0);
|
data[idx] = ValueType(0);
|
||||||
else
|
else
|
||||||
parity[idx-K] = ValueType(0);
|
parity[idx-data_len] = ValueType(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (erasures_count && data_len < K) {
|
||||||
|
for (int i = 0; i < erasures_count; ++i)
|
||||||
|
erasures[i] = IndexType((int)erasures[i] + K - data_len);
|
||||||
|
}
|
||||||
ValueType syndromes[NR];
|
ValueType syndromes[NR];
|
||||||
if (!compute_syndromes(data, parity, syndromes))
|
if (!compute_syndromes(data, parity, syndromes))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -148,11 +160,11 @@ public:
|
||||||
if (1 < (int)magnitudes[i])
|
if (1 < (int)magnitudes[i])
|
||||||
return -1;
|
return -1;
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
int idx = (int)locations[i];
|
int idx = (int)locations[i] + data_len - K;
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
data[idx] += magnitudes[i];
|
data[idx] += magnitudes[i];
|
||||||
else
|
else
|
||||||
parity[idx-K] += magnitudes[i];
|
parity[idx-data_len] += magnitudes[i];
|
||||||
}
|
}
|
||||||
int corrections_count = 0;
|
int corrections_count = 0;
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
|
|
|
||||||
|
|
@ -59,12 +59,13 @@ public:
|
||||||
set_be_bit(generator, i, get_be_bit(generator, i+1));
|
set_be_bit(generator, i, get_be_bit(generator, i+1));
|
||||||
set_be_bit(generator, NP, 0);
|
set_be_bit(generator, NP, 0);
|
||||||
}
|
}
|
||||||
void operator()(uint8_t *data, uint8_t *parity)
|
void operator()(uint8_t *data, uint8_t *parity, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $code = data * x^{NP} + (data * x^{NP}) \mod{generator}$
|
// $code = data * x^{NP} + (data * x^{NP}) \mod{generator}$
|
||||||
for (int l = 0; l < NP/8; ++l)
|
for (int l = 0; l < NP/8; ++l)
|
||||||
parity[l] = 0;
|
parity[l] = 0;
|
||||||
for (int i = 0; i < K; ++i) {
|
for (int i = 0; i < data_len; ++i) {
|
||||||
if (get_be_bit(data, i) != get_be_bit(parity, 0)) {
|
if (get_be_bit(data, i) != get_be_bit(parity, 0)) {
|
||||||
for (int l = 0; l < (NP-1)/8; ++l)
|
for (int l = 0; l < (NP-1)/8; ++l)
|
||||||
parity[l] = generator[l] ^ slb1(parity, l);
|
parity[l] = generator[l] ^ slb1(parity, l);
|
||||||
|
|
@ -125,12 +126,13 @@ public:
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void operator()(ValueType *data, ValueType *parity)
|
void operator()(ValueType *data, ValueType *parity, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $code = data * x^{NP} + (data * x^{NP}) \mod{generator}$
|
// $code = data * x^{NP} + (data * x^{NP}) \mod{generator}$
|
||||||
for (int i = 0; i < NP; ++i)
|
for (int i = 0; i < NP; ++i)
|
||||||
parity[i] = ValueType(0);
|
parity[i] = ValueType(0);
|
||||||
for (int i = 0; i < K; ++i) {
|
for (int i = 0; i < data_len; ++i) {
|
||||||
if (data[i] != parity[0]) {
|
if (data[i] != parity[0]) {
|
||||||
for (int j = 1; j < NP; ++j)
|
for (int j = 1; j < NP; ++j)
|
||||||
parity[j-1] = generator[NP-j] + parity[j];
|
parity[j-1] = generator[NP-j] + parity[j];
|
||||||
|
|
|
||||||
|
|
@ -33,33 +33,39 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
int compute_syndromes(ValueType *data, ValueType *parity, ValueType *syndromes)
|
int compute_syndromes(ValueType *data, ValueType *parity, ValueType *syndromes, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $syndromes_i = code(pe^{FCR+i})$
|
// $syndromes_i = code(pe^{FCR+i})$
|
||||||
ValueType coeff(data[0]);
|
ValueType coeff(data[0]);
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
syndromes[i] = coeff;
|
syndromes[i] = coeff;
|
||||||
update_syndromes(data, syndromes, 1, K);
|
update_syndromes(data, syndromes, 1, data_len);
|
||||||
update_syndromes(parity, syndromes, 0, NP);
|
update_syndromes(parity, syndromes, 0, NP);
|
||||||
int nonzero = 0;
|
int nonzero = 0;
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
nonzero += !!syndromes[i];
|
nonzero += !!syndromes[i];
|
||||||
return nonzero;
|
return nonzero;
|
||||||
}
|
}
|
||||||
int operator()(ValueType *data, ValueType *parity, IndexType *erasures = 0, int erasures_count = 0)
|
int operator()(ValueType *data, ValueType *parity, IndexType *erasures = 0, int erasures_count = 0, int data_len = K)
|
||||||
{
|
{
|
||||||
assert(0 <= erasures_count && erasures_count <= NR);
|
assert(0 <= erasures_count && erasures_count <= NR);
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
if (0) {
|
if (0) {
|
||||||
for (int i = 0; i < erasures_count; ++i) {
|
for (int i = 0; i < erasures_count; ++i) {
|
||||||
int idx = (int)erasures[i];
|
int idx = (int)erasures[i];
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
data[idx] = ValueType(0);
|
data[idx] = ValueType(0);
|
||||||
else
|
else
|
||||||
parity[idx-K] = ValueType(0);
|
parity[idx-data_len] = ValueType(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (erasures_count && data_len < K) {
|
||||||
|
for (int i = 0; i < erasures_count; ++i)
|
||||||
|
erasures[i] = IndexType((int)erasures[i] + K - data_len);
|
||||||
|
}
|
||||||
ValueType syndromes[NR];
|
ValueType syndromes[NR];
|
||||||
if (!compute_syndromes(data, parity, syndromes))
|
if (!compute_syndromes(data, parity, syndromes, data_len))
|
||||||
return 0;
|
return 0;
|
||||||
IndexType locations[NR];
|
IndexType locations[NR];
|
||||||
ValueType magnitudes[NR];
|
ValueType magnitudes[NR];
|
||||||
|
|
@ -67,24 +73,24 @@ public:
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
return count;
|
return count;
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
int idx = (int)locations[i];
|
int idx = (int)locations[i] + data_len - K;
|
||||||
if (idx < K)
|
if (idx < data_len)
|
||||||
data[idx] += magnitudes[i];
|
data[idx] += magnitudes[i];
|
||||||
else
|
else
|
||||||
parity[idx-K] += magnitudes[i];
|
parity[idx-data_len] += magnitudes[i];
|
||||||
}
|
}
|
||||||
int corrections_count = 0;
|
int corrections_count = 0;
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
corrections_count += !!magnitudes[i];
|
corrections_count += !!magnitudes[i];
|
||||||
return corrections_count;
|
return corrections_count;
|
||||||
}
|
}
|
||||||
int operator()(value_type *data, value_type *parity, value_type *erasures = 0, int erasures_count = 0)
|
int operator()(value_type *data, value_type *parity, value_type *erasures = 0, int erasures_count = 0, int data_len = K)
|
||||||
{
|
{
|
||||||
return (*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity), reinterpret_cast<IndexType *>(erasures), erasures_count);
|
return (*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity), reinterpret_cast<IndexType *>(erasures), erasures_count, data_len);
|
||||||
}
|
}
|
||||||
int compute_syndromes(value_type *data, value_type *parity, value_type *syndromes)
|
int compute_syndromes(value_type *data, value_type *parity, value_type *syndromes, int data_len = K)
|
||||||
{
|
{
|
||||||
return compute_syndromes(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity), reinterpret_cast<ValueType *>(syndromes));
|
return compute_syndromes(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity), reinterpret_cast<ValueType *>(syndromes), data_len);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,12 +48,13 @@ public:
|
||||||
for (int i = 0; i <= NR; ++i)
|
for (int i = 0; i <= NR; ++i)
|
||||||
generator[i] = index(tmp[i]);
|
generator[i] = index(tmp[i]);
|
||||||
}
|
}
|
||||||
void operator()(ValueType *data, ValueType *parity)
|
void operator()(ValueType *data, ValueType *parity, int data_len = K)
|
||||||
{
|
{
|
||||||
|
assert(0 < data_len && data_len <= K);
|
||||||
// $code = data * x^{NR} + (data * x^{NR}) \mod{generator}$
|
// $code = data * x^{NR} + (data * x^{NR}) \mod{generator}$
|
||||||
for (int i = 0; i < NR; ++i)
|
for (int i = 0; i < NR; ++i)
|
||||||
parity[i] = ValueType(0);
|
parity[i] = ValueType(0);
|
||||||
for (int i = 0; i < K; ++i) {
|
for (int i = 0; i < data_len; ++i) {
|
||||||
ValueType feedback = data[i] + parity[0];
|
ValueType feedback = data[i] + parity[0];
|
||||||
if (feedback) {
|
if (feedback) {
|
||||||
IndexType fb = index(feedback);
|
IndexType fb = index(feedback);
|
||||||
|
|
@ -67,9 +68,9 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void operator()(value_type *data, value_type *parity)
|
void operator()(value_type *data, value_type *parity, int data_len = K)
|
||||||
{
|
{
|
||||||
(*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity));
|
(*this)(reinterpret_cast<ValueType *>(data), reinterpret_cast<ValueType *>(parity), data_len);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue