ans
rANS entropy coding with bits-back primitives. no_std, zero dependencies.
[]
= "0.4"
Batch API
use ;
let counts = ; // A, B, C
let table = from_counts?;
let message = ;
let bytes = encode?;
let back = decode?;
assert_eq!;
# Ok::
Streaming API
Symbol-at-a-time encoding/decoding. Required for bits-back coding (BB-ANS, ROC).
use ;
let table = from_counts?;
let message = ;
// Encode in reverse order (rANS requirement).
let mut enc = new;
for &sym in message.iter.rev
let bytes = enc.finish;
// Decode in forward order.
let mut dec = new?;
let mut decoded = Vecnew;
for _ in 0..message.len
assert_eq!;
# Ok::
Bits-back primitives
RansDecoder::peek and RansDecoder::advance allow inspecting the decoded slot
before advancing state. RansDecoder::into_encoder preserves the residual stack
so the caller can encode the next model on the same ANS state:
# use ;
# let table = from_counts?;
# let bytes = encode?;
let mut dec = new?;
let sym = dec.peek; // look at slot without advancing
dec.advance?; // advance after external logic
let mut enc = dec.into_encoder; // continue from the residual stack
enc.put?;
# Ok::
Building frequency tables
From integer counts (quantized internally):
use FrequencyTable;
let table = from_counts?;
# Ok::
From floating-point probabilities (e.g. neural network output):
use FrequencyTable;
let table = from_float_probs?;
# Ok::
From pre-normalized frequencies (skip internal quantization):
use FrequencyTable;
// Frequencies must sum to exactly 2^precision_bits.
let table = from_normalized?;
# Ok::
64-bit variant
Rans64Encoder/Rans64Decoder (and batch helpers encode64/decode64) use a
64-bit state and emit 32-bit words during renormalization. This gives finer
frequency resolution and fewer renormalization steps per symbol -- the variant
used by production codecs (JPEG XL, LZFSE).
use ;
let table = from_counts?;
let bytes = encode64?;
let back = decode64?;
assert_eq!;
# Ok::
no_std
Zero dependencies. no_std-compatible (requires alloc). Builds on wasm32-unknown-unknown.
Notes
- Encoding returns a byte vector in stack format: decoding consumes bytes from the end.
precision_bitssets the frequency resolution ($T = 2p$). Typical range: 12-16. The table allocates ~$4 \cdot 2p$ bytes for the slot lookup.
Examples
See examples/README.md for runnable examples with captured output.
License
MIT OR Apache-2.0