WILLIAM - A general purpose data compression algorithm
Overview
WILLIAM is an inductive programming system based on the
theory of Incremental Compression (IC) [Franz et al. 2021].
Its core principle is that learning = compression:
given a dataset x, the algorithm searches for short descriptions in the form
of compositional features f1, f2, …, fs such that
x = f1(f2(... f_s(r_s)))
with each step achieving some compression. This corresponds to an incremental approximation of the Kolmogorov complexity K(x):
K(x) ≈ Σ l(f*i) + K(r_s) + O(s · log l(x))
where each f*i is the shortest compressing feature at step i.
WILLIAM differs from classical ML approaches in that it does not optimize
parameters in a fixed representation, but searches a broad algorithmic space
for compressing autoencoders.
This yields machine learning algorithms (centralization, regression, classification, decision trees, outlier detection) as emergent special cases of general compression:contentReference[oaicite:0]{index=0}.
For theoretical background, see:
- A Theory of Incremental Compression (Franz, Antonenko, Soletskyi, 2021):contentReference[oaicite:1]{index=1}
- WILLIAM: A Monolithic Approach to AGI (Franz, Gogulya, Löffler, 2019)
- Experiments on the Generalization of Machine Learning Algorithms (Franz, 2020):contentReference[oaicite:2]{index=2}
Key Concepts
-
Incremental Compression
Decomposes data into features and residuals step by step, ensuring that each feature is independent and incompressible. -
Features as Properties
Features formalize algorithmic properties of data and can be related to Martin-Löf randomness tests:
non-random regularities correspond to compressible features. -
Universality
Unlike specialized ML algorithms, WILLIAM discovers short descriptions exhaustively via directed acyclic graphs (DAGs) of operators, reusing values and cutting at information bottlenecks. -
Emergent ML Algorithms
Without any tuning, WILLIAM naturally rediscovers:- data centralization
- outlier detection
- linear regression
- linear classification
- decision tree induction:contentReference[oaicite:3]{index=3}
Limitations and Future Work
Overhead accumulation: IC theory implies additive overhead terms.
Alternative descriptions: currently only one compression path is explored at a time.
Reuse of functions: theory of memory/retrieval still open.
Performance: the Python prototype handles graphs of depth 4–5; C++/Rust backend and parallelization are natural next steps.
Despite these challenges, IC theory provides guarantees: incremental compression reaches Kolmogorov complexity up to logarithmic precision
Installation
For a standard installation, use:
pip install william
For a full installation of all dependencies for further development, testing and graphical output use:
pip install william[dev]
Optional system tools for graph rendering
The render() function in william.rendering produces graph visualizations via external command-line tools.
None of these are hard dependencies — they are only needed when you want PDF/PNG output.
The corresponding tests skip automatically if the tools are missing.
| Tool | Debian package | Purpose |
|---|---|---|
dot |
graphviz |
Layout engine — renders the .dot file directly to PDF or PNG |
pdfcrop |
texlive-extra-utils |
Crops the generated PDF to the graph's bounding box (PDF pipeline only) |
xdg-open |
xdg-utils |
Opens the rendered PDF in the system's default viewer (Linux only) |
xdotool |
xdotool |
Saves/restores the terminal window focus around viewer invocations (X11/Linux only, silently skipped if unavailable) |
Compression examples
You can run various compression tests directly with pytest. Set
export WILLIAM_DEBUG=3
to get visual output after every compression step. Set to 2, if you only want to see the compression results after every task. Now run:
py.test -v -s william/tests/test_alice.py
Enter c and enter to step through the steps with the debugger and look at the generated graphs.
During execution, WILLIAM will:
- Generate synthetic training data for several regression problems:
- Search for a minimal program (tree/DAG) that explains the data.
- Display the compression progress (how the description length decreases).
- Render the resulting Directed Acyclic Graphs (DAGs) as PDF files in your working directory.
License
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). You are free to use, share, and modify the code for non-commercial purposes only, with proper attribution to the original author. For full license details, see the LICENSE.md file.
Releasing
Releases are published automatically when a tag is pushed to GitLab.
# Example for version 1.2.3
export RELEASE=v1.2.3
# Create a tag and push the specific tag to trigger the CI pipeline
git tag $RELEASE && git push origin $RELEASE
Metadata
Release files for william 0.2.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| william-0.2.5-cp314-cp314-manylinux_2_34_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.34+ x86-64 | Details |
| william-0.2.5-cp313-cp313-manylinux_2_34_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.34+ x86-64 | Details |
| william-0.2.5-cp312-cp312-manylinux_2_34_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.34+ x86-64 | Details |
| william-0.2.5-cp311-cp311-manylinux_2_34_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.34+ x86-64 | Details |
Total release size: 11.2 MB
Release files / william-0.2.5-cp314-cp314-manylinux_2_34_x86_64.whl
| Download URL | william-0.2.5-cp314-cp314-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.14 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
9b7b97dd8878522c955378f8f19f8d8409835a796212a9bf7781b2e878907da5
|
|
BLAKE2b-256 checksum How to use checksums |
7392ebfcab9c12fb54feb5cf5d19475458469b95392839cd3a14b33bcde612fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / william-0.2.5-cp313-cp313-manylinux_2_34_x86_64.whl
| Download URL | william-0.2.5-cp313-cp313-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
6d1c88ea54c4586b5b31a627895863c92323033ce41b1c83ce220b0a27720fb8
|
|
BLAKE2b-256 checksum How to use checksums |
2f1ab1f4c18ba58ceda801effee9ba608ce29355a0775f75025e9664c7429f83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / william-0.2.5-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | william-0.2.5-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
43c94fff6a1167bfef1269588d8190f20705bab029b795527d49444735473c88
|
|
BLAKE2b-256 checksum How to use checksums |
4fba8a82f9f48fed12e318ae79a74557c64b1986458fd6aae0c8dec9112dc73a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / william-0.2.5-cp311-cp311-manylinux_2_34_x86_64.whl
| Download URL | william-0.2.5-cp311-cp311-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
6702964721b8b4dd5d13e5edfde4f46696f7af6ad81db65923611e568453e0d8
|
|
BLAKE2b-256 checksum How to use checksums |
dcab2d349ccce86d76c9b0ef982e40dc5ea76fa9b9b20612035ba6eb82d7fada
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|