use haagenti_zstd::fse::{FseTable, TansEncoder, OFFSET_ACCURACY_LOG, OFFSET_DEFAULT_DISTRIBUTION};
fn main() {
println!("=== Checking OF Predefined Table ===\n");
let of_table =
FseTable::from_predefined(&OFFSET_DEFAULT_DISTRIBUTION, OFFSET_ACCURACY_LOG).unwrap();
println!(
"OF table: accuracy_log={}, size={}\n",
OFFSET_ACCURACY_LOG,
1 << OFFSET_ACCURACY_LOG
);
println!("OF Decode Table:");
for state in 0..32 {
let entry = of_table.decode(state);
println!(
" state {:2}: symbol={:2}, num_bits={}, baseline={:2}",
state, entry.symbol, entry.num_bits, entry.baseline
);
}
println!("\nOF Default Distribution:");
for (sym, &prob) in OFFSET_DEFAULT_DISTRIBUTION.iter().enumerate() {
if prob != 0 {
println!(" symbol {:2}: prob={:2}", sym, prob);
}
}
println!("\nStates that decode to symbol 0:");
let mut count = 0;
for state in 0..32 {
if of_table.decode(state).symbol == 0 {
let entry = of_table.decode(state);
println!(
" state {}: symbol={}, num_bits={}, baseline={}",
state, entry.symbol, entry.num_bits, entry.baseline
);
count += 1;
}
}
println!(" Total: {} state(s)", count);
println!("\n=== Checking OF Encoder ===");
let mut encoder = TansEncoder::from_decode_table(&of_table);
encoder.init_state(0);
let init_state = encoder.get_state();
println!("\nEncoder init_state(0):");
println!(" Resulting state: {}", init_state);
println!(
" This state decodes to symbol: {}",
of_table.decode(init_state as usize).symbol
);
encoder.init_state(5);
let state_5 = encoder.get_state();
println!("\nEncoder init_state(5):");
println!(" Resulting state: {}", state_5);
println!(
" This state decodes to symbol: {}",
of_table.decode(state_5 as usize).symbol
);
encoder.init_state(5);
let (bits, num_bits) = encoder.encode_symbol(0);
let new_state = encoder.get_state();
println!("\nEncoder.encode_symbol(0) from state_5:");
println!(" Bits output: {} ({} bits)", bits, num_bits);
println!(" New state: {}", new_state);
println!(
" New state decodes to symbol: {}",
of_table.decode(new_state as usize).symbol
);
println!("\n=== Verification ===");
println!(
"If decoder starts at state {} and reads {} bits:",
new_state, num_bits
);
let entry = of_table.decode(new_state as usize);
println!(
" Entry: symbol={}, num_bits={}, baseline={}",
entry.symbol, entry.num_bits, entry.baseline
);
println!(" Decoder would read {} bits from stream", entry.num_bits);
println!(
" With value {}, new state = {} + {} = {}",
bits,
entry.baseline,
bits,
entry.baseline as u32 + bits
);
println!("\n=== Cross-check: which state gives symbol 5? ===");
for state in 0..32 {
if of_table.decode(state).symbol == 5 {
let entry = of_table.decode(state);
println!(
" state {}: symbol={}, num_bits={}, baseline={}",
state, entry.symbol, entry.num_bits, entry.baseline
);
}
}
println!("\n=== Key Verification ===");
encoder.init_state(5); let starting_decode_state = encoder.get_state();
println!("Encoder state for symbol 5: {}", starting_decode_state);
println!(
" Decodes to: {}",
of_table.decode(starting_decode_state as usize).symbol
);
let (out_bits, out_num) = encoder.encode_symbol(0);
let ending_decode_state = encoder.get_state();
println!("\nAfter encoding symbol 0:");
println!(" Output: {} ({} bits)", out_bits, out_num);
println!(" New state: {}", ending_decode_state);
println!(
" New state decodes to: {}",
of_table.decode(ending_decode_state as usize).symbol
);
let decoder_entry = of_table.decode(ending_decode_state as usize);
println!("\nDecoder at state {}:", ending_decode_state);
println!(" Symbol (what we just decoded): {}", decoder_entry.symbol);
println!(" num_bits to read for update: {}", decoder_entry.num_bits);
println!(" baseline for update: {}", decoder_entry.baseline);
let decoder_new_state = decoder_entry.baseline as u32 + out_bits;
println!(
" If decoder reads {} bits and gets value {}:",
decoder_entry.num_bits, out_bits
);
println!(
" New state = {} + {} = {}",
decoder_entry.baseline, out_bits, decoder_new_state
);
println!(
" This state decodes to symbol: {}",
of_table.decode(decoder_new_state as usize).symbol
);
if decoder_new_state == starting_decode_state {
println!("\n✓ VERIFIED: Decoder correctly transitions back to symbol 5 state");
} else {
println!(
"\n✗ MISMATCH: Expected state {}, got {}",
starting_decode_state, decoder_new_state
);
}
}