sclass CompressorSearch {
// public
CompressionRegime regime;
byte[] inputData;
new Best best;
*(CompressionRegime *regime) {}
*(CompressionRegime *regime, byte[] *inputData) {}
// can submit concurrently!
Submission submit(A compression) { ret _submit(compression); }
// private (although Submission is returned)
class Submission {
toString {
ret linesLL(
"Compressor " + (correct() ? "correct" : "incorrect"),
"Compression factor " + score(),
"Code:",
decompressor(),
"Code as bytes:",
bytesToHex(compressed())
);
}
void setDecompressor(A decompressor) {
this.decompressor_cache = decompressor;
}
byte[] inputData() { ret inputData; }
simplyCached byte[] compressed() {
ret decompressor_cache == null ?: regime.decompressorToBytes(decompressor_cache);
}
simplyCached A decompressor() {
ret compressed_cache == null ?: regime.decompressorFromBytes(compressed_cache);
}
int compressedSize() { ret l(compressed()); }
simplyCached double score() {
ret doubleRatio(inputDataSize(), compressedSize());
}
bool decompressed;
O decompressedValue;
O decompressed() {
if (!decompressed) {
decompressedValue = regime.runDecompressor(decompressor());
set decompressed;
}
ret decompressedValue;
}
simplyCached Bool correct() {
ret byteArraysEqual(toByteArray(decompressed()), inputData());
}
}
int inputDataSize() { ret l(inputData); }
Submission _submit(A compression) {
if (compression == null) null;
new Submission s;
s.setDecompressor(compression);
if (s.score() > best.score())
if (!s.correct())
warn("Compressor didn't verify");
else
best.put(s, s.score());
ret s;
}
}