text recu works
This commit is contained in:
@ -1,3 +1,5 @@
|
|||||||
|
use rand::RngExt;
|
||||||
|
|
||||||
use crate::code::LdpcCode;
|
use crate::code::LdpcCode;
|
||||||
|
|
||||||
pub struct BitFlipDecoder<'a> {
|
pub struct BitFlipDecoder<'a> {
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user