11 KiB
Hutter Prize Submission Strategy for PIST Extended Encoding
Exact Corpus Identity
enwik9 = first 10⁹ bytes of enwiki-20060303-pages-articles.xml
This is a fixed historical XML dump. It is not "any Wikipedia dump" — it is exactly this 2006 snapshot. The first gigabyte includes:
- XML markup (
<page>,<revision>,<text>, etc.) - English Wikipedia article templates
- Cross-references, infoboxes, tables
- Multi-language section headers
- MediaWiki syntax (
[[link]],{{template}},'''bold''', etc.)
Source: http://mattmahoney.net/dc/textdata.html
Current Record
| Metric | Value |
|---|---|
| Record holder | fx2-cmix (Kaido Orav and Byron Knoll, 2024) |
| Current record L | 110,793,128 bytes (~105.6 MiB) |
| Prize-eligible target | S ≤ floor(0.99 × L) = 109,685,196 bytes |
| Any record target | S < 110,793,128 bytes |
| Prize fund Z | 500,000€ (not depleted after awards) |
| Prize formula | Award = 500,000€ × (1 − S/L) = 500,000€ × (L − S) / L |
| Minimum payout | 5,000€ (at exactly 1% improvement) |
| enwik9 uncompressed | 1,000,000,000 bytes |
| Current compression ratio | 11.08% |
Prize Scenarios (Corrected)
| Improvement (L−S)/L | S (bytes) | Prize (€) |
|---|---|---|
| 1% (minimum) | 109,685,196 | 5,000 |
| 2% | 108,577,266 | 10,000 |
| 5% | 105,253,472 | 25,000 |
| 10% | 99,713,815 | 50,000 |
The formula is linear in improvement, not exponential. A 2% improvement pays ~2× the 1% prize.
Scoring Formula: S = S1 + S2
The official rule counts both the compressor and the archive:
- S1 = size of
comp9.exe(or zipped source) — the compressor - S2 = size of
archive9.exe— the self-extracting archive (decompressor + compressed data) - S = S1 + S2 must be < L
Important nuance: The compressor may be counted as a zipped package, not just raw executable size. The exact packaging rule depends on submission format.
Size Budget (1% Prize)
| Component | Typical Size | Notes |
|---|---|---|
| Decompressor binary | ~10-20KB | C code compiled with -O3 -s |
| Compressed data | ~109,650KB | The program stream + residuals |
| S2 (archive9.exe) | ~109,665KB | Binary + embedded data |
| Compressor (S1) | Variable | Counted as submitted (executable or zip) |
| Total S target | < 109,685,196 bytes | Very tight margin |
This means S2 alone must be < 109.7MB. The decompressor gets ~20KB of headroom.
The current PAQ record compresses to ~110.8MB total. To win even 1%, PIST must beat PAQ by ~1.1MB. This requires PAQ-level or better compression.
Hardware and Resource Constraints
Both compression and decompression are constrained:
| Resource | Limit | Notes |
|---|---|---|
| CPU | 1 single core | No multi-threading, no SIMD reliance |
| GPU | 0 | No GPU acceleration |
| RAM | < 10GB | For both comp9 and archive9 |
| Temporary disk | < 100GB | HDD scratch space |
| Runtime | < 70,000 / T hours | T = test machine Geekbench 5 score |
| Practical runtime | ≲ 50 hours | Approximation; depends on T |
The test machine is specified at: http://browser.primatelabs.com/v4/cpu/145066
Critical Blockers for PIST
1. Python Is Disqualified
| Problem | Why | Fix |
|---|---|---|
| External dependency | Python interpreter not guaranteed on test machine | Rewrite decoder in C |
| Slow execution | Python ~100× slower than C for 1GB stream | C with -O3 |
| Large footprint | Python + script >> 1MB | Static C binary ~10-20KB |
Status: hutter_pist_decoder.c skeleton created. Needs completion and testing.
2. Single-Core Deterministic Arithmetic
| Implication | Impact on PIST |
|---|---|
| No parallel basis search | Fine — PIST coordinates are O(1) arithmetic, no search |
| No SIMD | Fine — scalar n = k² + t is already fast |
| No GPU matrix ops | Fine — no neural networks in decoder |
Advantage: PIST decoder is pure register-machine arithmetic. It is naturally single-core optimal.
3. RAM Budget
| Operation | RAM | Safe? |
|---|---|---|
| Streaming decode (byte-at-a-time) | ~1KB | Yes |
| Bootstrap basis + stack | ~512B | Yes |
| Loading enwik9 (compressor only) | 1GB | Yes (9GB headroom) |
| Context mixing tables | ~2-4MB | Yes |
| Neural model weights | >1GB | No — do not use |
4. Runtime Budget
| Phase | Target | PIST Estimate |
|---|---|---|
| Decompression (archive9.exe) | < ~50h | ~2-4 hours for 1GB at 1μs/byte |
| Compression (comp9.exe) | < ~50h | Compressor can be slower; only runs once |
| Verification (committee) | Must pass | Deterministic output, easy to verify |
Advantage: PIST decompression is O(N) with ~20 arithmetic ops per byte. At 100ns/byte on a 3GHz core, 1GB = 100 seconds. Even at 1μs/byte = ~16 minutes.
Model / Dictionary / LUT Accounting Rule
Every piece of knowledge required for decompression must be counted in S.
This explicitly includes:
- Grammar tables, semantic maps, tokenizers
- Mass-number fields, LUTs, transform recipes
- Article reorder lists, decoder-side priors
- Any pre-trained model weights
- Bootstrap basis vectors
Implication for PIST: The 16-byte bootstrap basis is tiny and easily counted. Any larger grammar or semantic table must either:
- Be included in
archive9.exe(counts in S2), or - Be reconstructed by the compressor and not needed by the decoder
The PIST architecture is well-suited to this: the decoder computes coordinates from n alone. No external tables needed. The bootstrap basis is the only decoder-side state.
Self-Contained Binary Requirement
archive9.exe must:
- Be a single executable file (Windows or Linux x86, 32/64-bit)
- Run with zero external inputs — no network, no files, no DLLs, no environment variables
- Output exactly the 10⁹-byte enwik9 file, byte-for-byte
- Contain all compressed data embedded within itself
Implementation: Append compressed data after the compiled binary. The binary reads itself to locate the data offset (marked with a magic sequence).
Path to Submission
Phase 1: Minimal Viable C Decoder (Week 1-2)
Goal: archive9.exe compiles, runs, and outputs exactly 1GB on test data.
- Fix
hutter_pist_decoder.cEMIT logic (currently placeholder) - Implement proper instruction semantics (LOAD, XOR, FUSE, HALT)
- Add magic marker for self-reading data offset
- Test roundtrip on 1KB, 1MB synthetic data
- Optimize:
gcc -O3 -s -fno-stack-protector -fomit-frame-pointer - Verify binary size < 20KB
Phase 2: Compressor Search Prototype (Week 3-6)
Goal: A Python script comp9.py that finds a program stream P where decode(P) = enwik9.
- Bootstrap basis optimization (find 16 bytes that minimize residuals)
- Instruction sequence search (simulated annealing / genetic algorithm)
- Residual encoding (arithmetic coding of prediction errors)
- Test on enwik8 (100MB) first — do not touch enwik9 until this works
Phase 3: Enwik9-Specific Tuning (Week 7-10)
enwik9 is a 2006 Wikipedia XML dump with predictable structure:
- XML tag template detection (
<page>,<revision>,<text>) - MediaWiki syntax patterns (
[[,{{,''',==) - Cross-reference link structure
- Infobox and table templates
- English n-gram frequency modeling
Phase 4: Submission Verification (Week 11-12)
- Document all source code (required before payout)
- Choose OSI-approved license (e.g., GPL-3.0, MIT, Apache-2.0)
- Verify losslessness:
./archive9.exe | cmp - enwik9 - Measure exact sizes:
wc -c comp9.zip archive9.exe - Profile peak RAM and temp disk usage
- Record wall-clock and CPU time on reference hardware
- Submit to Hutter Prize forum (30-day public comment period)
- If multiple authors: agree on prize split in writing
Reproducibility Checklist
A submission must include all of the following:
- Exact source revision / git tag
- Build instructions — exact compiler flags and commands
- OSI-approved license declared in repository
- Exact command to build and run comp9
- Exact output filename produced by archive9
- SHA-256 or bytewise verification procedure against enwik9
- Peak RAM measurement during both compression and decompression
- Peak temp disk measurement
- Single-core enforcement notes — how the code avoids multi-threading
- Wall-clock and CPU-time logs
- Attestation: no network, no external dictionary, no hidden files, no environment variables, no runtime downloads
- Contributor payout agreement (if multiple authors)
Size Budget (Detailed)
Target for 1% prize: S < 109,685,196 bytes
| Line Item | Bytes | Notes |
|---|---|---|
| C decoder binary | 12,000-18,000 | Stripped, optimized |
| Bootstrap basis | 16 | Embedded in binary |
| Magic marker + metadata | ~100 | Offset marker, version |
| Compressed program stream | ~109,660,000 | The actual data |
| archive9.exe (S2) | ~109,678,000 | |
| comp9 source zip (S1) | ~500,000 | Compressor + docs |
| Total S | ~110,178,000 | Still above L — needs better compression |
The margin is razor-thin. To win 1%, the compressed data must be ~1.1MB smaller than PAQ's. This requires either:
- Better prediction (lower entropy = shorter arithmetic-coded stream)
- Smaller decompressor (but C is already near minimum)
- Or both
What PAQ/cmix Does That PIST Currently Lacks
| Feature | PAQ/cmix | PIST Status | Gap |
|---|---|---|---|
| Context mixing (multiple models, weighted) | Yes | No | High |
| Adaptive weight learning (online gradient descent) | Yes | No | High |
| Bit-level arithmetic coding | Yes | Byte-level | Medium |
| Long-range string matching (LZP) | Yes | No | High |
| Pre-trained neural network (cmix) | Yes (LSTM) | No | High |
| enwik9-specific model tuning | Yes (years) | No | High |
Realistic Assessment
| Milestone | Probability | Effort |
|---|---|---|
| Functional C decoder | 95% | 2 weeks |
| Beats gzip (~270MB total) | 80% | 4 weeks |
| Beats bzip2 (~200MB total) | 60% | 8 weeks |
| Beats LZMA (~140MB total) | 30% | 16 weeks |
| Beats PAQ record (110.8MB) | 5% | 6+ months |
| Wins Hutter Prize 1% | 2% | 1+ year |
The Hutter Prize represents the state of the art in text compression. PAQ and cmix are the product of decades of research by multiple contributors. PIST is a novel architecture but is not yet competitive without:
- Context mixing (multiple prediction models)
- Adaptive weight learning
- Bit-level arithmetic coding
- Long-range pattern matching
- Extensive enwik9-specific tuning
Recommended Intermediate Goal
Do not target enwik9 directly.
Target the Large Text Compression Benchmark enwik8 (100MB) first:
- http://mattmahoney.net/dc/text.html
- Public leaderboard
- Faster iteration
- Proves architecture before scaling
A reasonable intermediate milestone: beat bzip2 on enwik8. This validates the approach without requiring PAQ-level sophistication.
Immediate Action Items
- Fix
hutter_pist_decoder.c— complete EMIT, test roundtrip on small data - Write
comp9.py— Python compressor prototype - Test on enwik8 first (download from Matt Mahoney's site)
- Measure compression ratio vs gzip/bzip2/lzma baseline
- If results are promising, add context mixing to decoder
- Port compressor to C only if Python prototype shows competitive ratios