1 | // CompressionSearch |
2 | |
3 | // The terms are flying all over the place with this one |
4 | // (compressor, decompressor, compression, decompression, ...) |
5 | |
6 | // Basic idea: INPUT DATA (byte list) is compressed into a |
7 | // CUSTOM OBJECT (called the "COMPRESSION"), which, when run |
8 | // under a fitting COMPRESSION REGIME produces the INPUT DATA. |
9 | // |
10 | // Every compression can also be converted to and from a byte array |
11 | // (the compression regime does this). |
12 | |
13 | sclass CompressionSearch<A> extends Probabilistic {
|
14 | // user-set |
15 | |
16 | settable CompressionRegime<A> regime; |
17 | settable L<Byte> inputData; |
18 | |
19 | // public output variables |
20 | |
21 | new Best<Submission> best; |
22 | |
23 | *(CompressionRegime<A> *regime) {}
|
24 | *(CompressionRegime<A> *regime, LByte *inputData) {}
|
25 | *(CompressionRegime<A> *regime, byte[] inputData) { this.inputData = byteArrayToList(inputData); }
|
26 | |
27 | // can submit concurrently! |
28 | Submission submit(A compression) { ret _submit(compression); }
|
29 | |
30 | // private (although Submission is returned) |
31 | |
32 | class Submission {
|
33 | toString {
|
34 | ret linesLL( |
35 | "Compressor " + (correct() ? "correct" : "incorrect"), |
36 | "Compression factor " + score(), |
37 | "Code:", |
38 | indentx(str(decompressor())), |
39 | "Code as bytes:", |
40 | indentx(bytesToHex(compressed())) |
41 | ); |
42 | } |
43 | |
44 | void setDecompressor(A decompressor) {
|
45 | this.decompressor_cache = decompressor; |
46 | } |
47 | |
48 | LByte inputData() { ret inputData; }
|
49 | byte[] inputDataAsArray() { ret byteListToArray(inputData); }
|
50 | |
51 | simplyCached byte[] compressed() {
|
52 | ret decompressor_cache == null ?: regime.decompressorToBytes(decompressor_cache); |
53 | } |
54 | |
55 | simplyCached A decompressor() {
|
56 | ret compressed_cache == null ?: regime.decompressorFromBytes(compressed_cache); |
57 | } |
58 | |
59 | int compressedSize() { ret l(compressed()); }
|
60 | |
61 | simplyCached double score() {
|
62 | ret doubleRatio(inputDataSize(), compressedSize()); |
63 | } |
64 | |
65 | bool decompressed; |
66 | O decompressedValue; |
67 | |
68 | O decompressed() {
|
69 | if (!decompressed) {
|
70 | decompressedValue = regime.runDecompressor(decompressor()); |
71 | set decompressed; |
72 | } |
73 | ret decompressedValue; |
74 | } |
75 | |
76 | simplyCached Bool correct() {
|
77 | ret eq(toByteList(decompressed()), inputData()); |
78 | } |
79 | } |
80 | |
81 | int inputDataSize() { ret l(inputData); }
|
82 | |
83 | Submission _submit(A compression) {
|
84 | if (compression == null) null; |
85 | new Submission s; |
86 | s.setDecompressor(compression); |
87 | if (s.score() > best.score()) |
88 | if (!s.correct()) |
89 | warn("Compressor didn't verify");
|
90 | else |
91 | best.put(s, s.score()); |
92 | ret s; |
93 | } |
94 | |
95 | A bestCompression aka get() {
|
96 | var s = best!; |
97 | ret s?.decompressor(); |
98 | } |
99 | |
100 | void addStrategy(AbstractCompressor compressor) {
|
101 | if (compressor == null) ret; |
102 | initAction(compressor); |
103 | compressor.setSearch(this); |
104 | compressor.run(); |
105 | } |
106 | |
107 | run {}
|
108 | } |
Began life as a copy of #1033083
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1033156 |
| Snippet name: | CompressionSearch - backup 2 |
| Eternal ID of this version: | #1033156/1 |
| Text MD5: | f06b41656472bf41c68a9174738e38b9 |
| Author: | stefan |
| Category: | javax / recognition by compression |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2021-10-15 20:00:56 |
| Source code size: | 3000 bytes / 108 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 332 / 365 |
| Referenced in: | [show references] |