Refactor main function to implement encoding and decoding logic with detailed verification
This commit is contained in:
64
src/main.rs
64
src/main.rs
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user