/* (up to date version of the text is on discord) "Recognition By Compression" Components: -INPUT DATA - e. g. an image to compress -It is a SEARCH for the best COMPRESSOR of the INPUT DATA -a CURRENT BEST COMPRESSED VERSION of the input data [possibly updated when improvements are made] -a COMPRESSED VERSION of data x is a PIECE OF CODE computing x -a COMPRESSED LOSSY VERSION of data x is a PIECE OF CODE computing y with diff(x, y) small -SEARCH STRATEGIES (generators of ever improving scored compressed versions for some input data) -Compression SCORERS (let's say simply by the size of the compressed version; this is for losslesss compressors) (LOSSY compressions are difficult to score, TBD) Later: -SEMANTIC LINKERS that make sense of a compressed version of an image */ sclass RecognitionByCompression_v1 extends Meta { record CompressedData(S code) { byte[] get aka decompress() { ret toByteArray(dm_javaEval(code)); } } class CompressorSearch { byte[] inputData; new Best bestCompression; *() {} *(byte[] *inputData) {} int inputDataSize() { ret l(inputData); } int compressorSize(CompressedData compression) { ret gzipBytesCompressedLength(toUtf8(compression.code)); } double score(CompressedData compression) { ret doubleRatio(inputDataSize(), compressorSize(compression)); } bool verify(CompressedData compression) { ret byteArraysEqual(compression!, inputData); } void submit(CompressedData compression) { double score = score(compression); if (score > best.score()) if (!verify(compression)) warn("Compressor didn't verify"); else best.put(compression, score); } } }