InfoTheory
1. Unified Information Estimation
Estimate core measures using both Marginal (distribution-based) and Rate (predictive-based) approaches:
- NCD (Normalized Compression Distance): Approximates information distance using compression.
- MI (Mutual Information): Quantifies shared information between sequences.
- NED (Normalized Entropy Distance): A metric distance based on mutual information.
- NTE (Normalized Transform Effort): Variation of Information (VI).
- Intrinsic Dependence: Redundancy Ratio.
- Resistance: Information preservation under noise/transform.
2. Multi-Backend Predictive Engine
Switch between different modeling paradigms seamlessly:
- ROSA+ (Rapid Online Suffix Automaton + Witten Bell): A fast statistical LM. Default backend.
- CTW (Context Tree Weighting): Historically standard for AIXI. Accurate bit-level Bayesian model (KT-estimator).
- Mamba (Neural Network): Deterministic CPU-first Mamba-1 backend with online mode + export.
- RWKV (Neural Network): Portable SIMD RWKV7 CPU inference backend (
wide-based).
3. Integrated MC-AIXI Agent
Includes a full implementation of the Monte Carlo AIXI (MC-AIXI) agent described by Hutter et al. This approximates the incomputable AIXI Agent using Monte-Carlo Tree Search, and is backend-agnostic and can utilize any of the available predictive backends (ROSA, CTW, Mamba, or RWKV) for universal reinforcement learning.
You can use a trained neural model (Mamba-1 or RWKV7) as a rate backend ("world model") for MC-AIXI.
4. Integrated AIQI Agent
The repository also includes AIQI (Universal AI with Q-Induction): a model-free return-prediction agent with periodic augmentation (N >= H) and discretized H-step return targets.
planner: "aiqi"enables AIQI ininfotheory aixi <config.json>.planner: "mc-aixi"(default) keeps the existing MC-AIXI path.- Paper path:
algorithm: "ac-ctw"(or"ctw") is the literal AIQI-CTW path from the paper. - Extensions: AIQI also supports
fac-ctw,rosa,rwkv, and genericrate_backendpredictors. - Intentional exclusion:
zpaqis not supported for AIQI because strict frozen conditioning is required. - Strict paper-domain validation: AIQI enforces
discount_gamma in (0,1)andbaseline_exploration (tau) in (0,1]. - Tie-breaking: greedy action selection uses a fixed tie-break rule (first maximizing action) to match paper assumptions.
- Optional bounded memory: set
history_prune_keep_steps(oraiqi_history_prune_keep_steps) to retain only recent history while preserving exact return construction. - Reproducibility: set
random_seedin config (or planner-specificaiqi_random_seed/mcaixi_random_seed) to make agent-side randomness deterministic across runs. - AIQI uses the same environment interfaces as MC-AIXI, including VM environments.
Compilation & Installation
Platform Support (tested)
infotheory is currently tested on:
- Linux (GNU libc) (
x86_64-unknown-linux-gnu) - Linux (musl) (
x86_64-unknown-linux-musl) - macOS (Intel) (
x86_64-apple-darwin) - macOS (Apple Silicon) (
aarch64-apple-darwin) - Windows (
x86_64-pc-windows-msvc) - FreeBSD (
x86_64-unknown-freebsd) - OpenBSD (
x86_64-unknown-openbsd) - NetBSD (
x86_64-unknown-netbsd) - Cross-target compile validation for RWKV portability:
- AArch64 Linux (GNU/musl) (
aarch64-unknown-linux-gnu,aarch64-unknown-linux-musl) - AArch64 Windows (
aarch64-pc-windows-msvc) - WASM (
wasm32-unknown-unknown, RWKV-only/no-zpaq profile)
- AArch64 Linux (GNU/musl) (
WASM support is compile-target validation for the RWKV path (no zpaq/VM feature path).
Build Prerequisites
- Rust toolchain (stable):
rustuprecommended. - C/C++ toolchain:
clang+lldrecommended on Unix-like systems. - The VM backend is git-only. It is intentionally excluded from the crates.io package and this publish branch because
nyx-liteis repository-local. For VM builds, use a full repository checkout with--recurse-submodules.
Build Configuration
- By default, .cargo/config.toml is set to use march=native as the target-cpu, which will allow LLVM to make full use of your specific CPU. This can improve performance by roughly 2x for the RWKV Model. This may affect binary compatibility depending on your usecase.
Build the CLI
Enable the cli feature (the binary is feature-gated):
Output binary:
./target/release/infotheory(host target)./target/<target-triple>/release/infotheory(cross target)
Build as a library
Add the dependency in your Cargo.toml:
[]
= { = "." } # Or git or whatever, you know rust.
Building nyx-lite (git checkout only)
The VM backend is optional, but it is not part of the crates.io package because it depends on the git-only nyx-lite workspace member. To build VM support, use a full repository checkout with submodules and then run:
Notes:
- VM is Linux/KVM-oriented (
/dev/kvmrequired). - Some
nyx-litetests also require VM image artifacts undernyx-lite/vm_image.
Additional notes
Platform caveats:
- OpenBSD/NetBSD: kernel W^X policies can break ZPAQ JIT at runtime. Set
CARGO_FEATURE_NOJIT=true. - NetBSD: release LTO is problematic in common toolchains; disable release LTO if needed (see
.cargo/config.tomlcomments). - MacOS: Supported on both Intel and Apple Silicon natively.
Optional tooling used by some tests/workflows:
- docker (for tests, or if you want to use it for rootfs generation)
- cpio
- wget (for tests, or to use the provided kernel. you can also use curl instead manually on the download_kernel.sh file )
- cmake (for VM feature, firecracker needs it)
- Lean4 (Toolchain Version 4.14.0)
CLI Usage
The infotheory binary provides a powerful interface for file analysis.
Primitives
# Calculate Mutual Information (ROSA backend, order 8)
# Use CTW backend for NTE (Normalized Transform Effort)
# Calculate NCD with custom ZPAQ method
Compression Backends
CompressionBackend is the canonical compression enum in the library.
CLI:
# ZPAQ standalone (as before)
# Turn any rate backend into a compressor via AC/rANS
For rate-coded metrics, raw framing is used by default to avoid framing overhead.
Explicit compress_bytes_backend / decompress_bytes_backend APIs support framed payloads for roundtrip verification.
Neural Method Strings
Mamba and RWKV can be configured with either a model file or compact method string:
file:/abs/or/relative/model.safetensorsfile:/abs/or/relative/model.safetensors;policy:...cfg:key=value,...[;policy:...]
Supported cfg: keys:
- RWKV7:
hidden,layers,intermediate,decay_rank,a_rank,v_rank,g_rank,seed,train,lr,stride - Mamba-1:
hidden,layers,intermediate,state,conv,dt_rank,seed,train,lr,stride
train supports: none, sgd, adam.
policy supports schedule=... rules (for example 0..100:infer or 0..100:train(scope=head+bias,opt=adam,lr=0.001,stride=1,bptt=1,clip=0,momentum=0.9)).
For RWKV full-parameter training scopes (scope touching non-head parameters), bptt<=1 resolves to the fast default window 8; specify a larger explicit bptt to override it.
Example:
For examples/two.json benchmark plotting, scripts/plot_two_json.sh also accepts INFOTHEORY_BASELINE_SUMMARY_TSV=/path/to/baseline-summary.tsv to emit additional baseline-overlay SVGs.
The benchmark tooling also supports an extra suite for additional rate backends
not in examples/two.json (currently mamba, particle via
examples/particle_fast.json, and sparse-match):
For interactive benchmark analysis (all plot_two_json.sh graph families, subject focus, exact point inspection, overlap-aware readouts), use:
Manual:
Optional online export after processing input:
This writes:
rwkv_online.safetensorsrwkv_online.json(sidecar with resolved config + metadata)
AIXI Agent Mode
# Run the AIXI agent using config-specified backend
Planner switch in config:
Optional generic backend override (uses the shared RateBackend parser; zpaq is intentionally rejected for AIQI):
AIXI Agent Mode (VM via Nyx-Lite)
# VM-backed environment using high-performance Firecracker (Nyx-Lite)
Quick benchmark (AIQI vs MC-AIXI):
Reproducible competitor benchmark (Infotheory Rust/Python vs PyAIXI + C++ MC-AIXI):
Benchmark correctness notes:
- Stochastic environments are seeded from
random_seed(orrng_seed) in CLI and Python run loops for reproducible trajectories. - Reward reporting is normalized to native domain scale in competitor reports (for example Kuhn offset removal for C++/PyAIXI), so cross-implementation reward means are apples-to-apples.
- MC-AIXI tree search uses reference-style UCB scaling while preserving reward-sensitive chance-node reuse for generic environment correctness.
VM config highlights:
- Environment: Use
"environment": "nyx-vm"or"vm"(requiresvmfeature). - Core Config:
vm_config.kernel_image_path: Path tovmlinuxkernel.vm_config.rootfs_image_path: Path torootfs.ext4.vm_config.instance_id: Unique ID for the VM instance.
- Performance:
vm_config.shared_memory_policy: Use"snapshot"for fast resets (fork-server style).vm_config.observation_policy:"shared_memory"for zero-copy observations.
- Rewards & Observations:
vm_reward.mode:"guest"(guest writes to specific address),"pattern", or"trace-entropy".vm_observation.mode:"raw"(bytes) or hash-based.observation_stream_len: Critical for planning consistency. Must match guest output.
Prerequisites:
- Linux with KVM enabled (
/dev/kvmaccessible). vmlinuxkernel androotfs.ext4image valid for Firecracker.- A full repository checkout with
nyx-liteavailable. The crates.io package intentionally excludes this VM dependency.
Setup:
- Ensure you have the
vmlinux-6.1.58kernel in the project root (or update config). - Ensure
nyx-lite/vm_image/dockerimage/rootfs.ext4exists or provide your own. - Build from a full git checkout and enable the feature:
cargo build --release --features vm.
Library Usage
use *;
// Entropy rate of a sequence (uses ROSA by default)
let h = entropy_rate_bytes;
// Switch the entire thread to use CTW for all subsequent calls
set_default_ctx;
Supported Primitives
| Command | Description | Domain |
|---|---|---|
ncd |
Normalized Compression Distance | Compression |
ned |
Normalized Entropy Distance | Shannon |
nte |
Variation of Information | Shannon |
mi |
Mutual Information | Shannon |
id |
Internal Redundancy | Algorithmic |
rt |
Resistance to Transform | Algorithmic |
| and more! |
Python Bindings (infotheory-rs)
This repository now includes PyO3/maturin bindings with package name:
- PyPI distribution:
infotheory-rs - Python import:
infotheory_rs
Quickstart (local, via uv):
Python exposes both string-based backend parsing and direct backend objects. The
current surface includes RateBackend.match(...), RateBackend.sparse_match(...),
RateBackend.ppmd(...), RateBackend.mixture(...), RateBackend.particle(...),
and RateBackend.calibrated(...), plus CalibrationContextKind for calibrated
backends.
Example:
=
=
=
assert >= 0.0
=
=
assert == b
assert > 0
Run Python tests:
Run Python wrapper coverage (enforced in CI):
For full developer test and coverage workflows (Rust + Python + VM), see:
docs/developer-testing.md.
Notes:
- Built as
abi3-py310(compatible with Python 3.10+). - Published wheels are intended to be portable and exclude
vmsupport by default. - VM bindings are git-only for the same reason as the Rust VM backend:
nyx-liteis repository-local and excluded from crates.io publish artifacts. - Linux source builds can opt into VM bindings from a full git checkout with submodules by enabling the Rust
vmfeature when building the extension. Example:uv run maturin develop --release --features vm - Python trait-callback adapters (
PredictorABC,EnvironmentABC,AgentSimulatorABC) are fail-fast: unhandled callback exceptions terminate the process after printing traceback context. This prevents silently continuing planning/search with invalid fallback values.
License
- This is free software, which you may use under either the Apache-2.0 License, or the ISC License, at your choice. Those are available at LICENSE-APACHE and LICENSE respectively.
- Contributing to this repository means you agree to submit all contributions under the above Licensing arrangement. In other words, such that it is available to others under either license(ISC and Apache-2.0), at the others choice.
- Don't forget to add your Copyright notice to the LICENSE file.