Refactor main function to implement encoding and decoding logic with detailed verification

This commit is contained in:
2026-04-17 21:32:53 +08:00
parent 99f10a2629
commit 99f9a8099e

View File

@ -1,8 +1,66 @@
use fountain_engine::Encoder; use fountain_engine::{DataOperator, DecodeStatus, Decoder, Encoder};
use fountain_scheme::RandomLTCode; use fountain_scheme::RandomLTCode;
use fountain_scheme::validation::pseudo_rand::XorShift64; use fountain_scheme::validation::pseudo_rand::XorShift64;
use fountain_utility::VecDataOperater;
fn main() { fn main() {
let code_scheme = RandomLTCode::new_from_ideal_solsuiton(k, XorShift64::new(0xFEED)); let k = 25;
let encoder = Encoder::new(code_scheme); let symbol_size = 8;
let mut message_vectors = vec![vec![0u8; symbol_size]; k];
for i in 0..k {
for j in 0..symbol_size {
message_vectors[i][j] = ((i * 31 + j * 17) % 256) as u8;
}
}
let mut encoder_store = VecDataOperater::new(symbol_size);
for (i, vector) in message_vectors.iter().enumerate() {
encoder_store.insert_vector(vector, i);
}
let code_scheme = RandomLTCode::new_from_ideal_soliton(k, XorShift64::new(0xFEED));
let mut encoder = Encoder::new_with_operator(code_scheme.clone(), Box::new(encoder_store));
let mut decoder =
Decoder::new_with_operator(code_scheme, Box::new(VecDataOperater::new(symbol_size)));
let coded_start = k;
let max_coded_symbols = k * 20;
let mut symbols_used = 0;
for offset in 0..max_coded_symbols {
let coded_id = coded_start + offset;
let _ = encoder.encode_coded_vector(coded_id);
let coded_vector = encoder.manager.get_coded_vector(coded_id);
symbols_used += 1;
let status = decoder.add_coded_vector(coded_id, &coded_vector);
if status == DecodeStatus::Decoded {
break;
}
}
if decoder.decode_status() != DecodeStatus::Decoded {
println!("Decoding failed after {} coded symbols", symbols_used);
return;
}
let mut all_correct = true;
for i in 0..k {
let original = &message_vectors[i];
let decoded = decoder.manager.get_data_vector(i);
if original.as_slice() != decoded {
all_correct = false;
println!("Mismatch at source symbol {}", i);
break;
}
}
if all_correct {
println!(
"Decode successful: recovered {} source symbols using {} coded symbols",
k, symbols_used
);
} else {
println!("Decoding completed but verification failed");
}
} }