ans
rANS entropy coding with bits-back primitives. no_std, zero dependencies.
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, which is the key operation for bits-back coding:
# 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
# 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.
License
MIT OR Apache-2.0