diff --git a/src/main.rs b/src/main.rs index 9a358e7..5702dff 100644 --- a/src/main.rs +++ b/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::validation::pseudo_rand::XorShift64; +use fountain_utility::VecDataOperater; fn main() { - let code_scheme = RandomLTCode::new_from_ideal_solsuiton(k, XorShift64::new(0xFEED)); - let encoder = Encoder::new(code_scheme); + let k = 25; + 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"); + } }