text recu works

This commit is contained in:
2026-02-13 17:32:46 +01:00
parent b343675fa7
commit 5e997b58d9
5 changed files with 43 additions and 9 deletions

View File

@ -1,3 +1,5 @@
use rand::RngExt;
use crate::code::LdpcCode; use crate::code::LdpcCode;
pub struct BitFlipDecoder<'a> { pub struct BitFlipDecoder<'a> {

View File

@ -7,6 +7,7 @@ pub struct DenseEncoder {
pub k: usize, pub k: usize,
pub n: usize, pub n: usize,
pub col_swaps: Vec<(usize, usize)>, pub col_swaps: Vec<(usize, usize)>,
pub rank: usize,
} }
impl DenseEncoder { impl DenseEncoder {
@ -33,6 +34,7 @@ impl DenseEncoder {
k, k,
n, n,
col_swaps, col_swaps,
rank,
} }
} }
@ -48,10 +50,25 @@ impl DenseEncoder {
.collect(); .collect();
// Reverse les changement de colonnes // Reverse les changement de colonnes
for &(c1, c2) in self.col_swaps.iter().rev() { // for &(c1, c2) in self.col_swaps.iter().rev() {
codeword.swap(c1, c2); // codeword.swap(c1, c2);
} // }
self.g_matrix
.apply_inverse_permutation(&mut codeword, &self.col_swaps);
codeword codeword
} }
pub fn extract_message(&self, decoded_codeword: &[u8]) -> Vec<u8> {
let mut working_copy = decoded_codeword.to_vec();
self.g_matrix
.apply_permutation(&mut working_copy, &self.col_swaps);
let mut message = Vec::with_capacity(self.k);
for i in 0..self.k {
message.push(working_copy[self.rank + i]);
}
message
}
} }

View File

@ -29,6 +29,6 @@ fn main() {
// let res = Analyzer::run_batch(config); // let res = Analyzer::run_batch(config);
// Analyzer::save_csv(&res, "ldpc_analysis_results.csv"); // Analyzer::save_csv(&res, "ldpc_analysis_results.csv");
let message = "Je"; let message = "Je suis un test";
simulation::run_simulation(message, 3, 6, 0.02); simulation::run_simulation(message, 3, 6, 0.01);
} }

View File

@ -130,4 +130,16 @@ impl MatrixGF2 {
} }
(rank, col_swaps) (rank, col_swaps)
} }
pub fn apply_inverse_permutation(&self, data: &mut [u8], swaps: &[(usize, usize)]) {
for &(c1, c2) in swaps.iter().rev() {
data.swap(c1, c2);
}
}
pub fn apply_permutation(&self, data: &mut [u8], swaps: &[(usize, usize)]) {
for &(c1, c2) in swaps.iter() {
data.swap(c1, c2);
}
}
} }

View File

@ -39,7 +39,9 @@ pub fn run_simulation(text: &str, wc: usize, wr: usize, error_prob: f64) {
println!("Encodage"); println!("Encodage");
let mut rng = rand::rng(); let mut rng = rand::rng();
let message: Vec<u8> = (0..k).map(|_| rng.random_range(0..2)).collect(); // let message: Vec<u8> = (0..k).map(|_| rng.random_range(0..2)).collect();
let mut message = message_bits.clone();
message.resize(encoder.k, 0);
let codeword = encoder.encode(&message); let codeword = encoder.encode(&message);
@ -71,8 +73,8 @@ pub fn run_simulation(text: &str, wc: usize, wr: usize, error_prob: f64) {
match decoder.decode(&received, max_iter) { match decoder.decode(&received, max_iter) {
Some(decoded) => { Some(decoded) => {
let decoded_message = &decoded[0..encoder.k]; let decoded_message_bits = encoder.extract_message(&decoded);
let res_text = utils::bits_to_string(decoded_message); let res_text = utils::bits_to_string(&decoded_message_bits);
if decoded == codeword { if decoded == codeword {
println!(" -> Réussite"); println!(" -> Réussite");
} else { } else {
@ -81,7 +83,8 @@ pub fn run_simulation(text: &str, wc: usize, wr: usize, error_prob: f64) {
println!(" -> Texte recu : {}", res_text); println!(" -> Texte recu : {}", res_text);
} }
None => { None => {
let failed_text = utils::bits_to_string(&received[0..encoder.k]); let rec_bits = encoder.extract_message(&received);
let failed_text = utils::bits_to_string(&rec_bits);
println!( println!(
" -> Echec : impossible decorriger après {} itérations", " -> Echec : impossible decorriger après {} itérations",
max_iter max_iter