Add Tuple struct with precomputed inverse index
This commit is contained in:
parent
2cb1665e2e
commit
7f992433dc
25
jsc.cpp
25
jsc.cpp
@ -64,21 +64,14 @@ QList<CodewordPair> JSC::compress(QString text){
|
|||||||
bool hasPrefix = false;
|
bool hasPrefix = false;
|
||||||
auto d = w.toLatin1().data();
|
auto d = w.toLatin1().data();
|
||||||
for(quint32 i = 0; i < JSC::size; i++){
|
for(quint32 i = 0; i < JSC::size; i++){
|
||||||
|
quint32 len = JSC::list[i].size;
|
||||||
// TODO: we could probably precompute these sizes
|
if(strncmp(d, JSC::list[i].str, len) == 0){
|
||||||
quint32 len = strlen(JSC::list[i]);
|
|
||||||
|
|
||||||
if(strncmp(d, JSC::list[i], len) == 0){
|
|
||||||
w = QString(w.mid(len));
|
w = QString(w.mid(len));
|
||||||
|
|
||||||
auto word = JSC::list[i];
|
auto index = JSC::list[i].index;
|
||||||
auto index = lookup(word, &ok);
|
bool isLast = w.isEmpty();
|
||||||
if(ok){
|
out.append({ codeword(index, isLast, b, s, c), len + (isLast ? 1 : 0) /* for the space that follows */});
|
||||||
bool isLast = w.isEmpty();
|
hasPrefix = true;
|
||||||
out.append({ codeword(index, isLast, b, s, c), len + (isLast ? 1 : 0) /* for the space that follows */});
|
|
||||||
hasPrefix = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -140,8 +133,8 @@ QString JSC::decompress(Codeword const& bitvec){
|
|||||||
|
|
||||||
j = j*s + bytes[start + k] + base[k];
|
j = j*s + bytes[start + k] + base[k];
|
||||||
|
|
||||||
out.append(QString(JSC::map[j])); // table.first.key(j));
|
out.append(QString(JSC::map[j].str));
|
||||||
if(separators.first() == start + k){
|
if(!separators.isEmpty() && separators.first() == start + k){
|
||||||
out.append(" ");
|
out.append(" ");
|
||||||
separators.removeFirst();
|
separators.removeFirst();
|
||||||
}
|
}
|
||||||
@ -158,7 +151,7 @@ quint32 JSC::lookup(QString w, bool * ok){
|
|||||||
|
|
||||||
quint32 JSC::lookup(char const* b, bool *ok){
|
quint32 JSC::lookup(char const* b, bool *ok){
|
||||||
for(quint32 i = 0; i < JSC::size; i++){
|
for(quint32 i = 0; i < JSC::size; i++){
|
||||||
if(strcmp(b, JSC::map[i]) == 0){
|
if(strcmp(b, JSC::map[i].str) == 0){
|
||||||
if(ok) *ok = true;
|
if(ok) *ok = true;
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
11
jsc.h
11
jsc.h
@ -15,6 +15,11 @@
|
|||||||
typedef QPair<QVector<bool>, quint32> CodewordPair; // Tuple(Codeword, N) where N = number of characters
|
typedef QPair<QVector<bool>, quint32> CodewordPair; // Tuple(Codeword, N) where N = number of characters
|
||||||
typedef QVector<bool> Codeword; // Codeword bit vector
|
typedef QVector<bool> Codeword; // Codeword bit vector
|
||||||
|
|
||||||
|
typedef struct Tuple{
|
||||||
|
char const * str;
|
||||||
|
int size;
|
||||||
|
int index;
|
||||||
|
} Tuple;
|
||||||
|
|
||||||
class JSC
|
class JSC
|
||||||
{
|
{
|
||||||
@ -30,9 +35,9 @@ public:
|
|||||||
static quint32 lookup(QString w, bool *ok);
|
static quint32 lookup(QString w, bool *ok);
|
||||||
static quint32 lookup(char const* b, bool *ok);
|
static quint32 lookup(char const* b, bool *ok);
|
||||||
|
|
||||||
static const quint32 size = 233638;
|
static const quint32 size = 114712;
|
||||||
static char const* map[];
|
static const Tuple map[114712];
|
||||||
static char const* list[];
|
static const Tuple list[114712];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // JSC_H
|
#endif // JSC_H
|
||||||
|
348343
jsc_list.cpp
348343
jsc_list.cpp
File diff suppressed because it is too large
Load Diff
348354
jsc_map.cpp
348354
jsc_map.cpp
File diff suppressed because it is too large
Load Diff
@ -6136,7 +6136,7 @@ QStringList MainWindow::buildMessageFrames(const QString &text){
|
|||||||
|
|
||||||
auto frames = Varicode::buildMessageFrames(mycall, basecall, mygrid, compound, selectedCall, text);
|
auto frames = Varicode::buildMessageFrames(mycall, basecall, mygrid, compound, selectedCall, text);
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
qDebug() << "frames:";
|
qDebug() << "frames:";
|
||||||
foreach(auto frame, frames){
|
foreach(auto frame, frames){
|
||||||
auto dt = DecodedText(frame);
|
auto dt = DecodedText(frame);
|
||||||
@ -8740,8 +8740,18 @@ void MainWindow::buildMessageFramesAndUpdateCountDisplay(){
|
|||||||
);
|
);
|
||||||
|
|
||||||
connect(t, &BuildMessageFramesThread::finished, t, &QObject::deleteLater);
|
connect(t, &BuildMessageFramesThread::finished, t, &QObject::deleteLater);
|
||||||
connect(t, &BuildMessageFramesThread::resultReady, this, [this, text](const QStringList frames){
|
connect(t, &BuildMessageFramesThread::resultReady, this, [this](const QStringList frames){
|
||||||
updateFrameCountDisplay(text, frames.length());
|
|
||||||
|
QStringList text;
|
||||||
|
qDebug() << "frames:";
|
||||||
|
foreach(auto frame, frames){
|
||||||
|
auto dt = DecodedText(frame);
|
||||||
|
qDebug() << "->" << frame << dt.message() << Varicode::frameTypeString(dt.frameType());
|
||||||
|
text.append(dt.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFrameCountDisplay(text.join(""), frames.length());
|
||||||
|
|
||||||
});
|
});
|
||||||
t->start();
|
t->start();
|
||||||
#endif
|
#endif
|
||||||
|
@ -882,7 +882,6 @@ private:
|
|||||||
bool isMyCallIncluded(QString const &text);
|
bool isMyCallIncluded(QString const &text);
|
||||||
bool isAllCallIncluded(QString const &text);
|
bool isAllCallIncluded(QString const &text);
|
||||||
QString callsignSelected();
|
QString callsignSelected();
|
||||||
void clearCallsignSelected();
|
|
||||||
bool isRecentOffset(int offset);
|
bool isRecentOffset(int offset);
|
||||||
void markOffsetRecent(int offset);
|
void markOffsetRecent(int offset);
|
||||||
bool isDirectedOffset(int offset, bool *pIsAllCall);
|
bool isDirectedOffset(int offset, bool *pIsAllCall);
|
||||||
|
76
varicode.cpp
76
varicode.cpp
@ -1550,42 +1550,8 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
static const int frameSize = 72;
|
static const int frameSize = 72;
|
||||||
|
|
||||||
QString frame;
|
QString frame;
|
||||||
QVector<bool> frameBits;
|
|
||||||
|
|
||||||
frameBits.append(Varicode::intToBits(FrameDataPadded, 3));
|
#if USE_HUFF_DATA_PACKING
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
foreach(auto pair, JSC::compress(input)){
|
|
||||||
auto bits = pair.first;
|
|
||||||
auto chars = pair.second;
|
|
||||||
|
|
||||||
if(frameBits.length() + bits.length() < frameSize){
|
|
||||||
frameBits.append(bits);
|
|
||||||
i += chars;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pad = frameSize - frameBits.length();
|
|
||||||
if(pad){
|
|
||||||
// the way we will pad is this...
|
|
||||||
// set the bit after the frame to 0 and every bit after that a 1
|
|
||||||
// to unpad, seek from the end of the bits until you hit a zero... the rest is the actual frame.
|
|
||||||
for(int i = 0; i < pad; i++){
|
|
||||||
frameBits.append(i == 0 ? (bool)0 : (bool)1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 value = Varicode::bitsToInt(frameBits.constBegin(), 64);
|
|
||||||
quint8 rem = (quint8)Varicode::bitsToInt(frameBits.constBegin() + 64, 8);
|
|
||||||
frame = Varicode::pack72bits(value, rem);
|
|
||||||
|
|
||||||
*n = i;
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// [3][69] = 72
|
// [3][69] = 72
|
||||||
QVector<bool> frameDataBits;
|
QVector<bool> frameDataBits;
|
||||||
|
|
||||||
@ -1625,6 +1591,40 @@ QString Varicode::packDataMessage(const QString &input, int *n){
|
|||||||
quint8 rem = (quint8)Varicode::bitsToInt(allBits.constBegin() + 64, 8);
|
quint8 rem = (quint8)Varicode::bitsToInt(allBits.constBegin() + 64, 8);
|
||||||
frame = Varicode::pack72bits(value, rem);
|
frame = Varicode::pack72bits(value, rem);
|
||||||
|
|
||||||
|
*n = i;
|
||||||
|
#else
|
||||||
|
QVector<bool> frameBits;
|
||||||
|
|
||||||
|
frameBits.append(Varicode::intToBits(FrameDataPadded, 3));
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
foreach(auto pair, JSC::compress(input)){
|
||||||
|
auto bits = pair.first;
|
||||||
|
auto chars = pair.second;
|
||||||
|
|
||||||
|
if(frameBits.length() + bits.length() < frameSize){
|
||||||
|
frameBits.append(bits);
|
||||||
|
i += chars;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pad = frameSize - frameBits.length();
|
||||||
|
if(pad){
|
||||||
|
// the way we will pad is this...
|
||||||
|
// set the bit after the frame to 0 and every bit after that a 1
|
||||||
|
// to unpad, seek from the end of the bits until you hit a zero... the rest is the actual frame.
|
||||||
|
for(int i = 0; i < pad; i++){
|
||||||
|
frameBits.append(i == 0 ? (bool)0 : (bool)1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
quint64 value = Varicode::bitsToInt(frameBits.constBegin(), 64);
|
||||||
|
quint8 rem = (quint8)Varicode::bitsToInt(frameBits.constBegin() + 64, 8);
|
||||||
|
frame = Varicode::pack72bits(value, rem);
|
||||||
|
|
||||||
*n = i;
|
*n = i;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1642,7 +1642,6 @@ QString Varicode::unpackDataMessage(const QString &text, quint8 *pType){
|
|||||||
quint64 value = Varicode::unpack72bits(text, &rem);
|
quint64 value = Varicode::unpack72bits(text, &rem);
|
||||||
auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);
|
auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);
|
||||||
|
|
||||||
#if 0
|
|
||||||
quint8 type = Varicode::bitsToInt(bits.mid(0, 3));
|
quint8 type = Varicode::bitsToInt(bits.mid(0, 3));
|
||||||
if(type == FrameDataUnpadded){
|
if(type == FrameDataUnpadded){
|
||||||
bits = bits.mid(3);
|
bits = bits.mid(3);
|
||||||
@ -1653,12 +1652,17 @@ QString Varicode::unpackDataMessage(const QString &text, quint8 *pType){
|
|||||||
return unpacked;
|
return unpacked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_HUFF_DATA_PACKING
|
||||||
// huff decode the bits (without escapes)
|
// huff decode the bits (without escapes)
|
||||||
unpacked = Varicode::huffDecode(hufftable, bits);
|
unpacked = Varicode::huffDecode(hufftable, bits);
|
||||||
|
|
||||||
// then... unescape special characters
|
// then... unescape special characters
|
||||||
unpacked = Varicode::huffUnescape(unpacked);
|
unpacked = Varicode::huffUnescape(unpacked);
|
||||||
|
|
||||||
|
if(pType) *pType = type;
|
||||||
|
#else
|
||||||
|
unpacked = JSC::decompress(bits);
|
||||||
|
|
||||||
if(pType) *pType = type;
|
if(pType) *pType = type;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user