Compare commits
24 Commits
08a57f903f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e997b58d9 | |||
| b343675fa7 | |||
| 8c2abd902c | |||
| 826cfe8569 | |||
| 04b0d79058 | |||
| 36402570ee | |||
| 369a83bcfd | |||
| 6a23a35f40 | |||
| f4201536de | |||
| 2096cff73c | |||
| 22db186237 | |||
| a7ce4a1a17 | |||
| a6b2690721 | |||
| 33a376967a | |||
| a1da2efedf | |||
| 6433bb5e9d | |||
| 1c7daec957 | |||
| d478be5f77 | |||
| 92d847ba69 | |||
| 374243bc1e | |||
| 8df29fb7a2 | |||
| 17337f3298 | |||
| 11ef294a5a | |||
| 092b6bc791 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*.d
|
||||
Code/ldpc/target
|
||||
Code/ldpc/src/target
|
||||
52
Code/ldpc/Cargo.lock
generated
52
Code/ldpc/Cargo.lock
generated
@ -40,6 +40,37 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
@ -116,6 +147,7 @@ name = "ldpc"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"rand",
|
||||
"rayon",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -193,6 +225,26 @@ version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba"
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.27"
|
||||
|
||||
@ -5,3 +5,4 @@ edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
rand = "0.10.0"
|
||||
rayon = "1.11.0"
|
||||
|
||||
BIN
Code/ldpc/src/analyse/1_Clean_Waterfall.png
Normal file
BIN
Code/ldpc/src/analyse/1_Clean_Waterfall.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 92 KiB |
BIN
Code/ldpc/src/analyse/2_Clean_Bars.png
Normal file
BIN
Code/ldpc/src/analyse/2_Clean_Bars.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
Code/ldpc/src/analyse/3_Clean_Heatmap.png
Normal file
BIN
Code/ldpc/src/analyse/3_Clean_Heatmap.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 79 KiB |
91
Code/ldpc/src/analyse/ldpc_analysis_results.csv
Normal file
91
Code/ldpc/src/analyse/ldpc_analysis_results.csv
Normal file
@ -0,0 +1,91 @@
|
||||
k,n,wc,wr,rate,p,ber,fer,avg_iter
|
||||
50,100,3,6,0.5000,0.000000,0.00000000,0.00000000,0.00
|
||||
50,100,3,6,0.5000,0.008571,0.09586000,0.21200000,0.00
|
||||
50,100,3,6,0.5000,0.017143,0.20772000,0.44500000,0.00
|
||||
50,100,3,6,0.5000,0.025714,0.28084000,0.58700000,0.00
|
||||
50,100,3,6,0.5000,0.034286,0.35496000,0.74100000,0.00
|
||||
50,100,3,6,0.5000,0.042857,0.39766000,0.82200000,0.00
|
||||
50,100,3,6,0.5000,0.051429,0.42240000,0.87200000,0.00
|
||||
50,100,3,6,0.5000,0.060000,0.44045000,0.91000000,0.00
|
||||
50,100,3,6,0.5000,0.068571,0.45518000,0.93500000,0.00
|
||||
50,100,3,6,0.5000,0.077143,0.47826000,0.97400000,0.00
|
||||
50,100,3,6,0.5000,0.085714,0.48009000,0.98200000,0.00
|
||||
50,100,3,6,0.5000,0.094286,0.48391000,0.98600000,0.00
|
||||
50,100,3,6,0.5000,0.102857,0.48988000,0.99300000,0.00
|
||||
50,100,3,6,0.5000,0.111429,0.49456000,0.99500000,0.00
|
||||
50,100,3,6,0.5000,0.120000,0.49429000,0.99700000,0.00
|
||||
50,75,3,9,0.6667,0.000000,0.00000000,0.00000000,0.00
|
||||
50,75,3,9,0.6667,0.008571,0.07490667,0.14800000,0.00
|
||||
50,75,3,9,0.6667,0.017143,0.17278667,0.34600000,0.00
|
||||
50,75,3,9,0.6667,0.025714,0.27240000,0.54800000,0.00
|
||||
50,75,3,9,0.6667,0.034286,0.34341333,0.69300000,0.00
|
||||
50,75,3,9,0.6667,0.042857,0.39881333,0.81500000,0.00
|
||||
50,75,3,9,0.6667,0.051429,0.43321333,0.88400000,0.00
|
||||
50,75,3,9,0.6667,0.060000,0.45101333,0.91400000,0.00
|
||||
50,75,3,9,0.6667,0.068571,0.47332000,0.95300000,0.00
|
||||
50,75,3,9,0.6667,0.077143,0.46954667,0.96000000,0.00
|
||||
50,75,3,9,0.6667,0.085714,0.47985333,0.98400000,0.00
|
||||
50,75,3,9,0.6667,0.094286,0.48470667,0.98600000,0.00
|
||||
50,75,3,9,0.6667,0.102857,0.49201333,0.99400000,0.00
|
||||
50,75,3,9,0.6667,0.111429,0.49064000,0.99400000,0.00
|
||||
50,75,3,9,0.6667,0.120000,0.49248000,0.99800000,0.00
|
||||
200,400,3,6,0.5000,0.000000,0.00000000,0.00000000,0.00
|
||||
200,400,3,6,0.5000,0.008571,0.30167250,0.60100000,0.00
|
||||
200,400,3,6,0.5000,0.017143,0.36523750,0.73200000,0.00
|
||||
200,400,3,6,0.5000,0.025714,0.43035000,0.86000000,0.00
|
||||
200,400,3,6,0.5000,0.034286,0.46297500,0.92400000,0.00
|
||||
200,400,3,6,0.5000,0.042857,0.49018000,0.98000000,0.00
|
||||
200,400,3,6,0.5000,0.051429,0.49391000,0.98900000,0.00
|
||||
200,400,3,6,0.5000,0.060000,0.49773500,0.99700000,0.00
|
||||
200,400,3,6,0.5000,0.068571,0.49869750,0.99700000,0.00
|
||||
200,400,3,6,0.5000,0.077143,0.50014500,1.00000000,50.00
|
||||
200,400,3,6,0.5000,0.085714,0.49800500,1.00000000,50.00
|
||||
200,400,3,6,0.5000,0.094286,0.50103250,1.00000000,50.00
|
||||
200,400,3,6,0.5000,0.102857,0.50059000,1.00000000,50.00
|
||||
200,400,3,6,0.5000,0.111429,0.49997500,1.00000000,50.00
|
||||
200,400,3,6,0.5000,0.120000,0.49996000,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.000000,0.00000000,0.00000000,0.00
|
||||
200,300,3,9,0.6667,0.008571,0.27226333,0.54500000,0.00
|
||||
200,300,3,9,0.6667,0.017143,0.38370000,0.77100000,0.00
|
||||
200,300,3,9,0.6667,0.025714,0.45723000,0.91600000,0.00
|
||||
200,300,3,9,0.6667,0.034286,0.48475000,0.97000000,0.00
|
||||
200,300,3,9,0.6667,0.042857,0.49562667,0.99200000,0.00
|
||||
200,300,3,9,0.6667,0.051429,0.49894000,0.99800000,0.00
|
||||
200,300,3,9,0.6667,0.060000,0.50088333,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.068571,0.49815667,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.077143,0.50034000,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.085714,0.49923333,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.094286,0.50140000,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.102857,0.49978333,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.111429,0.50114333,1.00000000,50.00
|
||||
200,300,3,9,0.6667,0.120000,0.50025667,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.000000,0.00000000,0.00000000,0.00
|
||||
400,800,3,6,0.5000,0.008571,0.32761250,0.65400000,0.00
|
||||
400,800,3,6,0.5000,0.017143,0.41412625,0.82000000,0.00
|
||||
400,800,3,6,0.5000,0.025714,0.46907375,0.92900000,0.00
|
||||
400,800,3,6,0.5000,0.034286,0.48519375,0.96900000,0.00
|
||||
400,800,3,6,0.5000,0.042857,0.49841750,0.99300000,0.00
|
||||
400,800,3,6,0.5000,0.051429,0.50101500,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.060000,0.49914250,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.068571,0.49955625,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.077143,0.49976500,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.085714,0.50057750,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.094286,0.50094625,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.102857,0.50099250,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.111429,0.50017125,1.00000000,50.00
|
||||
400,800,3,6,0.5000,0.120000,0.49992750,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.000000,0.00000000,0.00000000,0.00
|
||||
400,600,3,9,0.6667,0.008571,0.35087667,0.70300000,0.00
|
||||
400,600,3,9,0.6667,0.017143,0.43971000,0.88200000,0.00
|
||||
400,600,3,9,0.6667,0.025714,0.48824167,0.97500000,0.00
|
||||
400,600,3,9,0.6667,0.034286,0.49763833,0.99600000,0.00
|
||||
400,600,3,9,0.6667,0.042857,0.49956833,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.051429,0.49943667,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.060000,0.50025667,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.068571,0.49899333,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.077143,0.49918333,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.085714,0.50041833,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.094286,0.49998167,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.102857,0.50129000,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.111429,0.49973500,1.00000000,50.00
|
||||
400,600,3,9,0.6667,0.120000,0.50078833,1.00000000,50.00
|
||||
|
138
Code/ldpc/src/analyse/trace.py
Normal file
138
Code/ldpc/src/analyse/trace.py
Normal file
@ -0,0 +1,138 @@
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
import seaborn as sns
|
||||
import numpy as np
|
||||
import sys
|
||||
from matplotlib.colors import LogNorm
|
||||
import matplotlib.ticker as ticker
|
||||
|
||||
sns.set_theme(style="whitegrid", context="talk")
|
||||
plt.rcParams['font.family'] = 'sans-serif'
|
||||
plt.rcParams['figure.dpi'] = 300
|
||||
|
||||
def load_data(filename):
|
||||
try:
|
||||
df = pd.read_csv(filename)
|
||||
|
||||
df['Label'] = (
|
||||
"k=" + df['k'].astype(str) +
|
||||
" | Wc=" + df['wc'].astype(str) +
|
||||
" | Wr=" + df['wr'].astype(str)
|
||||
)
|
||||
|
||||
df = df.sort_values(by=['k', 'wc', 'wr'])
|
||||
|
||||
return df
|
||||
except FileNotFoundError:
|
||||
print(f"Erreur : Le fichier '{filename}' est introuvable.")
|
||||
sys.exit(1)
|
||||
|
||||
def plot_1_waterfall_zoomed(df):
|
||||
print(" -> Génération du Waterfall...")
|
||||
plt.figure(figsize=(14, 9))
|
||||
|
||||
df_zoom = df[df['ber'] > 0].copy()
|
||||
|
||||
if df_zoom.empty:
|
||||
print(" Pas d'erreurs trouvées, impossible de tracer.")
|
||||
return
|
||||
|
||||
sns.lineplot(
|
||||
data=df_zoom,
|
||||
x='p',
|
||||
y='ber',
|
||||
hue='Label',
|
||||
style='Label',
|
||||
markers=True,
|
||||
dashes=False,
|
||||
linewidth=2.5,
|
||||
palette="turbo",
|
||||
markersize=9
|
||||
)
|
||||
|
||||
plt.yscale('log')
|
||||
ax = plt.gca()
|
||||
ax.yaxis.set_major_locator(ticker.LogLocator(base=10.0, numticks=12))
|
||||
|
||||
plt.title("Vue Globale : Performance des configurations", fontweight='bold', pad=20)
|
||||
plt.ylabel("BER [Log Scale]", labelpad=15)
|
||||
plt.xlabel("Bruit du Canal (p)", labelpad=15)
|
||||
plt.grid(True, which="both", ls="-", alpha=0.3)
|
||||
|
||||
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0, title="Configuration", fontsize='x-small')
|
||||
|
||||
plt.tight_layout()
|
||||
plt.savefig("Final_1_Waterfall.png")
|
||||
|
||||
def plot_2_ranking_bars(df):
|
||||
print(" -> Génération du Classement...")
|
||||
|
||||
means = df.groupby('p')['ber'].mean()
|
||||
target_p = means[means > 0.0001].first_valid_index()
|
||||
|
||||
if target_p is None:
|
||||
target_p = df['p'].max()
|
||||
|
||||
subset = df[df['p'] == target_p].sort_values('ber', ascending=True)
|
||||
|
||||
plt.figure(figsize=(12, max(6, len(subset)*0.4)))
|
||||
|
||||
barplot = sns.barplot(
|
||||
data=subset,
|
||||
y='Label',
|
||||
x='ber',
|
||||
palette="viridis",
|
||||
edgecolor=".2"
|
||||
)
|
||||
|
||||
plt.xscale('log')
|
||||
plt.title(f"Robustesse p={target_p:.3f} (Gauche = Meilleur)", fontweight='bold', pad=20)
|
||||
plt.xlabel("BER", labelpad=10)
|
||||
plt.ylabel("")
|
||||
|
||||
for i, container in enumerate(barplot.containers):
|
||||
barplot.bar_label(container, fmt='%.1e', padding=5, fontsize=11)
|
||||
|
||||
plt.grid(True, axis='x', which="both", ls="--", alpha=0.5)
|
||||
plt.tight_layout()
|
||||
plt.savefig("Final_2_Classement.png")
|
||||
|
||||
def plot_3_heatmap_gradient(df):
|
||||
print(" -> Génération de la Heatmap...")
|
||||
|
||||
pivot = df.pivot(index="Label", columns="p", values="ber")
|
||||
|
||||
pivot_log = pivot.replace(0, 1e-9)
|
||||
|
||||
plt.figure(figsize=(16, max(6, len(pivot)*0.5)))
|
||||
|
||||
ax = sns.heatmap(
|
||||
pivot_log,
|
||||
cmap="Spectral_r",
|
||||
norm=LogNorm(vmin=1e-5, vmax=1),
|
||||
cbar_kws={'label': 'BER (Log Scale)'},
|
||||
linewidths=0.5,
|
||||
linecolor='white'
|
||||
)
|
||||
|
||||
plt.title("Résistance (Bleu=Zone de Confort, Rouge=Zone d'Échec)", fontweight='bold', pad=20)
|
||||
plt.xlabel("Bruit du Canal (p)", labelpad=10)
|
||||
plt.ylabel("")
|
||||
|
||||
plt.xticks(rotation=45)
|
||||
plt.tight_layout()
|
||||
plt.savefig("Final_3_Heatmap.png")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Démarrage de l'analyse graphique finale...")
|
||||
|
||||
df = load_data("ldpc_analysis_results.csv")
|
||||
|
||||
plot_1_waterfall_zoomed(df)
|
||||
plot_2_ranking_bars(df)
|
||||
plot_3_heatmap_gradient(df)
|
||||
|
||||
print("\nTerminé ! Trois images générées :")
|
||||
print(" 1. Final_1_Waterfall.png (Courbes détaillées)")
|
||||
print(" 2. Final_2_Classement.png (Comparatif barres)")
|
||||
print(" 3. Final_3_Heatmap.png (Vision globale couleur)")
|
||||
@ -0,0 +1,208 @@
|
||||
use crate::channel::Channel;
|
||||
use crate::code::LdpcCode;
|
||||
use crate::construction::random::generate_random_h_for_k;
|
||||
use crate::decoder::bit_flip::BitFlipDecoder;
|
||||
use crate::encoder::dense::DenseEncoder;
|
||||
use rand::{Rng, RngExt};
|
||||
use rayon::prelude::*;
|
||||
use std::fs::File;
|
||||
use std::io::Write;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum DecoderAlgorithm {
|
||||
BitFlipping,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct AnalysisConfig {
|
||||
pub k_values: Vec<usize>,
|
||||
pub wc_values: Vec<usize>,
|
||||
pub wr_values: Vec<usize>,
|
||||
pub min_error_prob: f64,
|
||||
pub max_error_prob: f64,
|
||||
pub steps: usize,
|
||||
pub frames_per_step: usize,
|
||||
pub max_iter: usize,
|
||||
pub algorithm: DecoderAlgorithm,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct SimulationPoint {
|
||||
pub k_config: usize,
|
||||
pub n_real: usize,
|
||||
pub wc: usize,
|
||||
pub wr: usize,
|
||||
pub rate: f64,
|
||||
pub error_rate: f64,
|
||||
pub ber: f64,
|
||||
pub fer: f64,
|
||||
pub avg_iter: f64,
|
||||
}
|
||||
|
||||
pub struct Analyzer;
|
||||
|
||||
impl Analyzer {
|
||||
pub fn run_batch(config: AnalysisConfig) -> Vec<SimulationPoint> {
|
||||
let mut tasks = Vec::new();
|
||||
|
||||
for &k in &config.k_values {
|
||||
for &wc in &config.wc_values {
|
||||
for &wr in &config.wr_values {
|
||||
if wr <= wc {
|
||||
continue;
|
||||
}
|
||||
if (k * wr) % (wr - wc) != 0 {
|
||||
continue;
|
||||
}
|
||||
tasks.push((k, wc, wr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
println!("Configurations valides : {}", tasks.len());
|
||||
println!("Execution sur {} coeurs...", rayon::current_num_threads());
|
||||
|
||||
let results: Vec<SimulationPoint> = tasks
|
||||
.par_iter()
|
||||
.flat_map(|&(k_target, wc, wr)| {
|
||||
let h_matrix = generate_random_h_for_k(k_target, wc, wr);
|
||||
let ldpc = LdpcCode::new(h_matrix);
|
||||
let encoder = DenseEncoder::new(&ldpc);
|
||||
|
||||
let k_real = encoder.k;
|
||||
let n_real = encoder.n;
|
||||
let rate_theoretical = k_real as f64 / n_real as f64;
|
||||
|
||||
let step_size = if config.steps > 1 {
|
||||
(config.max_error_prob - config.min_error_prob) / (config.steps as f64 - 1.0)
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
||||
(0..config.steps)
|
||||
.into_par_iter()
|
||||
.map(|i| {
|
||||
let p = config.min_error_prob + (i as f64 * step_size);
|
||||
|
||||
let point = Self::simulate_point(
|
||||
&encoder,
|
||||
&ldpc,
|
||||
p,
|
||||
&config,
|
||||
k_real,
|
||||
k_target,
|
||||
n_real,
|
||||
wc,
|
||||
wr,
|
||||
rate_theoretical,
|
||||
);
|
||||
|
||||
println!(
|
||||
"Termine : k={} wc={} wr={} p={:.3} -> BER={:.5}",
|
||||
point.k_config, point.wc, point.wr, point.error_rate, point.ber
|
||||
);
|
||||
|
||||
point
|
||||
})
|
||||
.collect::<Vec<SimulationPoint>>()
|
||||
})
|
||||
.collect();
|
||||
|
||||
println!("Simulation terminee. {} points generes.", results.len());
|
||||
results
|
||||
}
|
||||
|
||||
fn simulate_point(
|
||||
encoder: &DenseEncoder,
|
||||
ldpc: &LdpcCode,
|
||||
p: f64,
|
||||
config: &AnalysisConfig,
|
||||
k_real: usize,
|
||||
k_orig: usize,
|
||||
n: usize,
|
||||
wc: usize,
|
||||
wr: usize,
|
||||
rate: f64,
|
||||
) -> SimulationPoint {
|
||||
let channel = Channel::new(p);
|
||||
let mut rng = rand::rng();
|
||||
|
||||
let mut total_bit_errors = 0;
|
||||
let mut total_frame_errors = 0;
|
||||
let mut total_iterations = 0;
|
||||
let mut converged_count = 0;
|
||||
|
||||
for _ in 0..config.frames_per_step {
|
||||
let message: Vec<u8> = (0..k_real).map(|_| rng.random_range(0..2)).collect();
|
||||
let codeword = encoder.encode(&message);
|
||||
let received = channel.add_noise(&codeword);
|
||||
|
||||
let (decoded, iters) = match config.algorithm {
|
||||
DecoderAlgorithm::BitFlipping => {
|
||||
let decoder = BitFlipDecoder::new(ldpc);
|
||||
let res = decoder.decode(&received, config.max_iter);
|
||||
(res, 0)
|
||||
}
|
||||
};
|
||||
|
||||
match decoded {
|
||||
Some(res_code) => {
|
||||
if res_code != codeword {
|
||||
total_frame_errors += 1;
|
||||
total_bit_errors += Channel::count_errors(&codeword, &res_code);
|
||||
} else {
|
||||
converged_count += 1;
|
||||
total_iterations += iters;
|
||||
}
|
||||
}
|
||||
None => {
|
||||
total_frame_errors += 1;
|
||||
total_bit_errors += Channel::count_errors(&codeword, &received);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let total_bits = (config.frames_per_step * n) as f64;
|
||||
let avg_iter = if converged_count > 0 {
|
||||
total_iterations as f64 / converged_count as f64
|
||||
} else {
|
||||
config.max_iter as f64
|
||||
};
|
||||
|
||||
SimulationPoint {
|
||||
k_config: k_orig,
|
||||
n_real: n,
|
||||
wc,
|
||||
wr,
|
||||
rate,
|
||||
error_rate: p,
|
||||
ber: total_bit_errors as f64 / total_bits,
|
||||
fer: total_frame_errors as f64 / config.frames_per_step as f64,
|
||||
avg_iter,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn save_csv(results: &[SimulationPoint], filename: &str) {
|
||||
let mut sorted_results = results.to_vec();
|
||||
sorted_results.sort_by(|a, b| {
|
||||
a.k_config
|
||||
.cmp(&b.k_config)
|
||||
.then(a.wc.cmp(&b.wc))
|
||||
.then(a.wr.cmp(&b.wr))
|
||||
.then(a.error_rate.partial_cmp(&b.error_rate).unwrap())
|
||||
});
|
||||
|
||||
let mut file = File::create(filename).expect("Erreur fichier");
|
||||
writeln!(file, "k,n,wc,wr,rate,p,ber,fer,avg_iter").unwrap();
|
||||
|
||||
for r in sorted_results {
|
||||
writeln!(
|
||||
file,
|
||||
"{},{},{},{},{:.4},{:.6},{:.8},{:.8},{:.2}",
|
||||
r.k_config, r.n_real, r.wc, r.wr, r.rate, r.error_rate, r.ber, r.fer, r.avg_iter
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
println!("Resultats sauvegardes dans '{}'", filename);
|
||||
}
|
||||
}
|
||||
|
||||
32
Code/ldpc/src/channel.rs
Normal file
32
Code/ldpc/src/channel.rs
Normal file
@ -0,0 +1,32 @@
|
||||
use std::usize;
|
||||
|
||||
use rand::{Rng, RngExt};
|
||||
|
||||
pub struct Channel {
|
||||
pub error_prob: f64,
|
||||
}
|
||||
|
||||
impl Channel {
|
||||
pub fn new(error_prob: f64) -> Self {
|
||||
assert!(error_prob >= 0.0 && error_prob <= 1.0, "0 <= p <= 1");
|
||||
Self { error_prob }
|
||||
}
|
||||
|
||||
pub fn add_noise(&self, input: &[u8]) -> Vec<u8> {
|
||||
let mut rng = rand::rng();
|
||||
let mut out = input.to_vec();
|
||||
|
||||
for b in out.iter_mut() {
|
||||
let r_v: f64 = rng.random_range(0.0..1.0);
|
||||
if r_v < self.error_prob {
|
||||
*b ^= 1;
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
pub fn count_errors(original: &[u8], other: &[u8]) -> usize {
|
||||
assert_eq!(original.len(), other.len(), "Slice pas de la même taille");
|
||||
original.iter().zip(other).filter(|(a, b)| a != b).count()
|
||||
}
|
||||
}
|
||||
@ -12,7 +12,9 @@ pub fn generate_random_h(rows: usize, cols: usize, wc: usize, wr: usize) -> Matr
|
||||
|
||||
for c in 0..cols {
|
||||
let mut ones_placed = 0;
|
||||
let mut avail_rows: Vec<usize> = (0..rows).filter(|&r| row_w[r] < wr).collect();
|
||||
let mut avail_rows: Vec<usize> = (0..rows)
|
||||
.filter(|&r| row_w[r] < wr && !creates_cycle_4(rows, cols, &data, r, c))
|
||||
.collect();
|
||||
|
||||
if avail_rows.len() < wc {
|
||||
// Les problèmes...
|
||||
@ -33,3 +35,43 @@ pub fn generate_random_h(rows: usize, cols: usize, wc: usize, wr: usize) -> Matr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn generate_random_h_for_k(k: usize, wc: usize, wr: usize) -> MatrixGF2 {
|
||||
assert!(wr > wc, "wr < wc ...");
|
||||
assert!((k * wr) % (wr - wc) == 0, "Colonnes non entieres");
|
||||
|
||||
let n = (k * wr) / (wr - wc);
|
||||
let m = n - k;
|
||||
|
||||
let max_attemps = 50;
|
||||
let mut best_h = generate_random_h(m, n, wc, wr);
|
||||
let mut max_rank = 0;
|
||||
|
||||
// On garde que les matrice de rang max
|
||||
for _ in 0..max_attemps {
|
||||
let h_cand = generate_random_h(m, n, wc, wr);
|
||||
let mut h_test = h_cand.clone();
|
||||
let (rank, _) = h_test.gauss_jordan_swap_cols();
|
||||
if rank == m {
|
||||
return h_cand;
|
||||
}
|
||||
if rank > max_rank {
|
||||
max_rank = rank;
|
||||
best_h = h_cand;
|
||||
}
|
||||
}
|
||||
best_h
|
||||
}
|
||||
|
||||
fn creates_cycle_4(rows: usize, cols: usize, data: &[u8], row: usize, col: usize) -> bool {
|
||||
for r2 in 0..rows {
|
||||
if r2 != row && data[r2 * cols + col] == 1 {
|
||||
for c2 in 0..col {
|
||||
if data[row * cols + c2] == 1 && data[r2 * cols + c2] == 1 {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
use rand::RngExt;
|
||||
|
||||
use crate::code::LdpcCode;
|
||||
|
||||
pub struct BitFlipDecoder<'a> {
|
||||
@ -9,8 +11,78 @@ impl<'a> BitFlipDecoder<'a> {
|
||||
Self { code }
|
||||
}
|
||||
|
||||
// TODO paraléliser (le calcul de chaque check-node)
|
||||
pub fn decode(&self, received: &[u8], max_iter: usize) -> Option<Vec<u8>> {
|
||||
let graph = &self.code.tanner_graph;
|
||||
unimplemented!("Algo de bit-flipp");
|
||||
let n = self.code.n;
|
||||
let m = self.code.h_matrix.rows;
|
||||
|
||||
let mut curr_bits = received.to_vec();
|
||||
|
||||
for iter in 0..max_iter {
|
||||
// Syndrome s = v * H^T
|
||||
let mut s = vec![0; m];
|
||||
let mut s_w = 0;
|
||||
|
||||
for (cnid, cb) in self.code.tanner_graph.check.iter().enumerate() {
|
||||
let mut sum = 0;
|
||||
// Calcul des equation de parité
|
||||
for &bid in cb {
|
||||
sum ^= curr_bits[bid];
|
||||
}
|
||||
s[cnid] = sum;
|
||||
|
||||
// Equation non vérifiée
|
||||
if sum == 1 {
|
||||
s_w += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// println!("poid syndome: {s_w}");
|
||||
// Aucune erreurs
|
||||
if s_w == 0 {
|
||||
return Some(curr_bits);
|
||||
}
|
||||
|
||||
// Calcul du nombre d'équations fausses le bit fait partie
|
||||
let mut cpt = vec![0; n];
|
||||
let mut max_cpt = 0;
|
||||
|
||||
for (cid, &sb) in s.iter().enumerate() {
|
||||
if sb == 1 {
|
||||
for &bid in &self.code.tanner_graph.check[cid] {
|
||||
cpt[bid] += 1;
|
||||
if cpt[bid] > max_cpt {
|
||||
max_cpt = cpt[bid];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if max_cpt == 0 {
|
||||
break;
|
||||
}
|
||||
|
||||
// Flip des bit qui causent le plus d'équations fausses
|
||||
for i in 0..n {
|
||||
if cpt[i] == max_cpt {
|
||||
curr_bits[i] ^= 1; // Bit flip
|
||||
}
|
||||
}
|
||||
// Seuil de 3
|
||||
// if max_cpt >= 3 {
|
||||
// for i in 0..n {
|
||||
// if cpt[i] == max_cpt {
|
||||
// curr_bits[i] ^= 1;
|
||||
// }
|
||||
// }
|
||||
// } else if max_cpt > 0 {
|
||||
// if let Some(idx) = cpt.iter().position(|&x| x == max_cpt) {
|
||||
// curr_bits[idx] ^= 1;
|
||||
// }
|
||||
// } else {
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ pub struct DenseEncoder {
|
||||
pub k: usize,
|
||||
pub n: usize,
|
||||
pub col_swaps: Vec<(usize, usize)>,
|
||||
pub rank: usize,
|
||||
}
|
||||
|
||||
impl DenseEncoder {
|
||||
@ -33,21 +34,12 @@ impl DenseEncoder {
|
||||
k,
|
||||
n,
|
||||
col_swaps,
|
||||
rank,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn encode(&self, message: &[u8]) -> Vec<u8> {
|
||||
assert_eq!(message.len(), self.k, "Taille du message non valide");
|
||||
// let mut codeword = vec![0; self.n];
|
||||
|
||||
// s = u * G
|
||||
// for c in 0..self.n {
|
||||
// let mut sum = 0;
|
||||
// for r in 0..self.k {
|
||||
// sum ^= message[r] & self.g_matrix.get(r, c);
|
||||
// }
|
||||
// codeword[c] = sum;
|
||||
// }
|
||||
|
||||
let mut codeword: Vec<u8> = (0..self.n)
|
||||
.map(|c| {
|
||||
@ -58,10 +50,25 @@ impl DenseEncoder {
|
||||
.collect();
|
||||
|
||||
// Reverse les changement de colonnes
|
||||
for &(c1, c2) in self.col_swaps.iter().rev() {
|
||||
codeword.swap(c1, c2);
|
||||
}
|
||||
// for &(c1, c2) in self.col_swaps.iter().rev() {
|
||||
// codeword.swap(c1, c2);
|
||||
// }
|
||||
self.g_matrix
|
||||
.apply_inverse_permutation(&mut codeword, &self.col_swaps);
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,70 +1,34 @@
|
||||
mod analysis;
|
||||
mod channel;
|
||||
mod code;
|
||||
mod construction;
|
||||
mod decoder;
|
||||
mod encoder;
|
||||
mod matrix;
|
||||
mod simulation;
|
||||
mod tanner;
|
||||
mod utils;
|
||||
|
||||
use code::LdpcCode;
|
||||
use construction::random::generate_random_h;
|
||||
use encoder::dense::DenseEncoder;
|
||||
use analysis::{AnalysisConfig, Analyzer, DecoderAlgorithm};
|
||||
|
||||
fn main() {
|
||||
// TODO : Changer la logique pour trouver k => calculer n selon la longueur du message k (en
|
||||
// rapport des poids) n = (k * w_r) / (w_r - w_c)
|
||||
println!("LDPC\n");
|
||||
// println!("Analyse des performences");
|
||||
|
||||
let n = 12;
|
||||
let m = 6;
|
||||
let wc = 2;
|
||||
let wr = 4;
|
||||
// let config = AnalysisConfig {
|
||||
// k_values: vec![50, 200, 400, 800, 1000],
|
||||
// wc_values: vec![3, 4, 5],
|
||||
// wr_values: vec![6, 8, 9, 12, 15, 16],
|
||||
// min_error_prob: 0.00,
|
||||
// max_error_prob: 0.12,
|
||||
// steps: 15,
|
||||
// frames_per_step: 1000,
|
||||
// max_iter: 50,
|
||||
// algorithm: DecoderAlgorithm::BitFlipping,
|
||||
// };
|
||||
//
|
||||
// let res = Analyzer::run_batch(config);
|
||||
// Analyzer::save_csv(&res, "ldpc_analysis_results.csv");
|
||||
|
||||
let mut h_matrix = generate_random_h(m, n, wc, wr);
|
||||
println!("H aléatoire {m}x{n} :");
|
||||
h_matrix.print();
|
||||
|
||||
let ldpc = LdpcCode::new(h_matrix.clone());
|
||||
println!("\nLDPC instancié");
|
||||
|
||||
println!("Extraction de G");
|
||||
let encoder = DenseEncoder::new(&ldpc);
|
||||
|
||||
println!("\n -> Matrcie H après Gauss-Jordan avec inversion de colonne de la forme [I | A]");
|
||||
encoder.h_reduced.print();
|
||||
|
||||
println!("G {}x{}", encoder.k, encoder.n);
|
||||
encoder.g_matrix.print();
|
||||
|
||||
let message = vec![1; encoder.k];
|
||||
let codeword = encoder.encode(&message);
|
||||
|
||||
println!("\nMessage u : {:?}", message);
|
||||
println!("\n Codeword s : {:?}", codeword);
|
||||
|
||||
// let mut is_valid = true;
|
||||
// for r in 0..m {
|
||||
// let mut sum = 0;
|
||||
// for c in 0..n {
|
||||
// sum ^= codeword[c] & h_matrix.get(r, c);
|
||||
// }
|
||||
// if sum != 0 {
|
||||
// is_valid = false;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
let is_valid = (0..m).all(|r| {
|
||||
let sum = codeword
|
||||
.iter()
|
||||
.enumerate()
|
||||
.fold(0, |acc, (c, &bit)| acc ^ (bit & h_matrix.get(r, c)));
|
||||
sum == 0
|
||||
});
|
||||
|
||||
println!("\n{}", if is_valid { "Vrai" } else { "Faux" });
|
||||
|
||||
// println!("\nGauss-Jordan sur H :");
|
||||
// h_matrix.gauss_jordan();
|
||||
// h_matrix.print();
|
||||
let message = "Je suis un test";
|
||||
simulation::run_simulation(message, 3, 6, 0.01);
|
||||
}
|
||||
|
||||
@ -130,4 +130,16 @@ impl MatrixGF2 {
|
||||
}
|
||||
(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
95
Code/ldpc/src/simulation.rs
Normal file
95
Code/ldpc/src/simulation.rs
Normal file
@ -0,0 +1,95 @@
|
||||
use core::panic::PanicMessage;
|
||||
use std::sync::mpsc::Receiver;
|
||||
|
||||
use crate::channel::Channel;
|
||||
use crate::code::{self, LdpcCode};
|
||||
use crate::construction::random::{generate_random_h, generate_random_h_for_k};
|
||||
use crate::decoder::bit_flip::BitFlipDecoder;
|
||||
use crate::encoder::dense::DenseEncoder;
|
||||
use crate::utils;
|
||||
use rand::{Rng, RngExt};
|
||||
|
||||
pub fn run_simulation(text: &str, wc: usize, wr: usize, error_prob: f64) {
|
||||
let mut message_bits = utils::string_to_bits(text);
|
||||
let k = message_bits.len();
|
||||
println!(
|
||||
"\nSimulation LDPC : k = {} bits, wc = {}, wr = {}, p = {:.2}, text : {}",
|
||||
k, wc, wr, error_prob, text
|
||||
);
|
||||
|
||||
println!("Construction");
|
||||
|
||||
let h_matrix = generate_random_h_for_k(k, wc, wr);
|
||||
let ldpc = LdpcCode::new(h_matrix);
|
||||
|
||||
let encoder = DenseEncoder::new(&ldpc);
|
||||
|
||||
let k = encoder.k;
|
||||
// if encoder.k != k {
|
||||
// println!("Erreur: la matrice donne k = {} != {}", encoder.k, k);
|
||||
// }
|
||||
|
||||
println!(
|
||||
" -> Code généré : n = {}, k = {}, k/n = {:.2}",
|
||||
encoder.n,
|
||||
encoder.k,
|
||||
(encoder.k as f64 / encoder.n as f64)
|
||||
);
|
||||
|
||||
println!("Encodage");
|
||||
|
||||
let mut rng = rand::rng();
|
||||
// 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);
|
||||
|
||||
// println!(" -> Message u ({:02} bits) : {:?}", k, message);
|
||||
// println!(" -> Codeword s ({:02} bits) : {:?}", encoder.n, codeword);
|
||||
|
||||
println!("\nCanal bruité (p = {})", error_prob);
|
||||
|
||||
let channel = Channel::new(error_prob);
|
||||
let received = channel.add_noise(&codeword);
|
||||
|
||||
let nb_errors = Channel::count_errors(&codeword, &received);
|
||||
if nb_errors == 0 {
|
||||
println!(" -> Aucune erreur.")
|
||||
} else {
|
||||
println!(" -> {} erreurs !", nb_errors);
|
||||
// println!(" -> Recu r ({:02} bits) : {:?}", received.len(), received);
|
||||
}
|
||||
|
||||
println!("\n Décodage (bit-flipping)");
|
||||
|
||||
if nb_errors == 0 {
|
||||
println!(" -> Pas besoin de correction");
|
||||
return;
|
||||
}
|
||||
|
||||
let decoder = BitFlipDecoder::new(&ldpc);
|
||||
let max_iter = 100;
|
||||
|
||||
match decoder.decode(&received, max_iter) {
|
||||
Some(decoded) => {
|
||||
let decoded_message_bits = encoder.extract_message(&decoded);
|
||||
let res_text = utils::bits_to_string(&decoded_message_bits);
|
||||
if decoded == codeword {
|
||||
println!(" -> Réussite");
|
||||
} else {
|
||||
println!(" -> Echec : le decoder a convergé vers un mauvais codeword");
|
||||
}
|
||||
println!(" -> Texte recu : {}", res_text);
|
||||
}
|
||||
None => {
|
||||
let rec_bits = encoder.extract_message(&received);
|
||||
let failed_text = utils::bits_to_string(&rec_bits);
|
||||
println!(
|
||||
" -> Echec : impossible decorriger après {} itérations",
|
||||
max_iter
|
||||
);
|
||||
println!(" -> Texte recu : {}", failed_text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -11,14 +11,15 @@ impl TannerGraph {
|
||||
let mut check = vec![vec![]; matrix.rows];
|
||||
let mut bits = vec![vec![]; matrix.cols];
|
||||
|
||||
for i in 0..matrix.rows {
|
||||
for j in 0..matrix.cols {
|
||||
for (i, row_check) in check.iter_mut().enumerate() {
|
||||
for (j, col_bits) in bits.iter_mut().enumerate() {
|
||||
if matrix.get(i, j) == 0 {
|
||||
check[i].push(j);
|
||||
bits[j].push(i);
|
||||
row_check.push(j);
|
||||
col_bits.push(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Self { check, bits }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
{"rustc_fingerprint":6955059790845437392,"outputs":{"12016735552878863467":{"success":true,"status":"","code":0,"stdout":"rustc 1.87.0 (17067e9ac 2025-05-09)\nbinary: rustc\ncommit-hash: 17067e9ac6d7ecb70e50f92c1944e545188d2359\ncommit-date: 2025-05-09\nhost: x86_64-unknown-linux-gnu\nrelease: 1.87.0\nLLVM version: 20.1.1\n","stderr":""},"13822592305234237280":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/zefad/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}
|
||||
@ -1,3 +0,0 @@
|
||||
Signature: 8a477f597d28d172789f06886806bc55
|
||||
# This file is a cache directory tag created by cargo.
|
||||
# For information about cache directory tags see https://bford.info/cachedir/
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
449395b8315c57b8
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":2241668132362809309,"path":4035053026656971091,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-ca1925c66a6c3d3e/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
5b53b67a13196311
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[\"rng\"]","declared_features":"[\"cipher\", \"default\", \"legacy\", \"rng\", \"xchacha\", \"zeroize\"]","target":5186012452570817782,"profile":9318172923473070351,"path":8216691501699566625,"deps":[[7667230146095136825,"cfg_if",false,13283186994572530500],[15529777797982113006,"rand_core",false,6997758203512154364],[16378603989457970572,"cpufeatures",false,13097977866850786625]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/chacha20-ba73b3355741f3b7/dep-lib-chacha20","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
41dd914d795dc5b5
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":7407970971831147067,"profile":13295673445137985655,"path":9454082240038408872,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cpufeatures-9ffb3887bc26449f/dep-lib-cpufeatures","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
c5c51713e8c3f49b
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[\"std\", \"sys_rng\"]","declared_features":"[\"std\", \"sys_rng\", \"wasm_js\"]","target":2835126046236718539,"profile":14646319430865968450,"path":3382059170738956057,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-1a272dcfc1ad1bc8/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
c2b1e091b8c07c26
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[2764386384280758697,"build_script_build",false,11237822371716384197]],"local":[{"RerunIfChanged":{"output":"debug/build/getrandom-276accaa19be069e/output","paths":["build.rs"]}}],"rustflags":[],"config":0,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
403347cf2a1a118b
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[\"std\", \"sys_rng\"]","declared_features":"[\"std\", \"sys_rng\", \"wasm_js\"]","target":5479159445871601843,"profile":1675109806303236742,"path":17489016984022900907,"deps":[[2764386384280758697,"build_script_build",false,2773303369507320258],[7667230146095136825,"cfg_if",false,13283186994572530500],[10635491994102256863,"libc",false,14746483844694500236],[15529777797982113006,"rand_core",false,6997758203512154364]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-94f3139d7013326a/dep-lib-getrandom","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
8909df34efa7ca80
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":3316208278650011218,"path":4942398508502643691,"deps":[[12595129211985828508,"rand",false,10775189634579942843]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-00cd1695bdd5ac16/dep-test-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
dcc11b19b5a67c82
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":17672942494452627365,"path":4942398508502643691,"deps":[[12595129211985828508,"rand",false,10775189634579942843]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-15ac6faf1f2e9880/dep-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
c1f106d49bfbb924
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":17672942494452627365,"path":4942398508502643691,"deps":[[12595129211985828508,"rand",false,10775189634579942843]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-200ae86d4d1b6d87/dep-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
30fe5706c139df18
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":3316208278650011218,"path":4942398508502643691,"deps":[[12595129211985828508,"rand",false,10775189634579942843]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-4e3139e1c1d60be0/dep-test-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
337f14642e0151b8
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":17672942494452627365,"path":4942398508502643691,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-6dc3ef13289416fe/dep-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
87df21f80941c364
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":3316208278650011218,"path":4942398508502643691,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-752405653894e9ea/dep-test-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
8e09316eebeb4b4c
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":3316208278650011218,"path":4942398508502643691,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-ac207a955fd4200d/dep-test-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
bd87e6b109dd312d
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":2879268224904887264,"profile":17672942494452627365,"path":4942398508502643691,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ldpc-e65964cdd5b34979/dep-bin-ldpc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
fb4895f5469c978b
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":5408242616063297496,"profile":1565149285177326037,"path":15202769474511483467,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-2e2dcdcfa7ee7c23/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
8c630d31ed08a6cc
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":17682796336736096309,"profile":15222631470922254920,"path":5840482219443486265,"deps":[[10635491994102256863,"build_script_build",false,9216864148508321614]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-3e3aceecd979b208/dep-lib-libc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
@ -1 +0,0 @@
|
||||
4e27df2a1ce1e87f
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[10635491994102256863,"build_script_build",false,10058680121337137403]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-edda3631204ef4cc/output","paths":["build.rs"]}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_FREEBSD_VERSION","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_MUSL_V1_2_3","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_GNU_TIME_BITS","val":null}}],"rustflags":[],"config":0,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
bbcd9b1ce2298995
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[\"alloc\", \"default\", \"std\", \"std_rng\", \"sys_rng\", \"thread_rng\"]","declared_features":"[\"alloc\", \"chacha\", \"default\", \"log\", \"serde\", \"simd_support\", \"std\", \"std_rng\", \"sys_rng\", \"thread_rng\", \"unbiased\"]","target":17444007749879458630,"profile":2241668132362809309,"path":12655442880386247481,"deps":[[2764386384280758697,"getrandom",false,10020819417044562752],[3484220520784136136,"chacha20",false,1252872692792972123],[15529777797982113006,"rand_core",false,6997758203512154364]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rand-de3b3f4ac7c2b2e8/dep-lib-rand","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
fce86aa802081d61
|
||||
@ -1 +0,0 @@
|
||||
{"rustc":15597765236515928571,"features":"[]","declared_features":"[]","target":8662763397516463860,"profile":1239367160364851460,"path":16830337747561814775,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rand_core-674d544887edc4de/dep-lib-rand_core","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||
Binary file not shown.
Binary file not shown.
@ -1,5 +0,0 @@
|
||||
/home/zefad/Documents/TIPE/Code/ldpc/target/debug/build/getrandom-1a272dcfc1ad1bc8/build_script_build-1a272dcfc1ad1bc8: /home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.4.1/build.rs
|
||||
|
||||
/home/zefad/Documents/TIPE/Code/ldpc/target/debug/build/getrandom-1a272dcfc1ad1bc8/build_script_build-1a272dcfc1ad1bc8.d: /home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.4.1/build.rs
|
||||
|
||||
/home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.4.1/build.rs:
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1 +0,0 @@
|
||||
cargo:rerun-if-changed=build.rs
|
||||
@ -1 +0,0 @@
|
||||
/home/zefad/Documents/TIPE/Code/ldpc/target/debug/build/getrandom-276accaa19be069e/out
|
||||
Binary file not shown.
Binary file not shown.
@ -1,5 +0,0 @@
|
||||
/home/zefad/Documents/TIPE/Code/ldpc/target/debug/build/libc-2e2dcdcfa7ee7c23/build_script_build-2e2dcdcfa7ee7c23: /home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.181/build.rs
|
||||
|
||||
/home/zefad/Documents/TIPE/Code/ldpc/target/debug/build/libc-2e2dcdcfa7ee7c23/build_script_build-2e2dcdcfa7ee7c23.d: /home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.181/build.rs
|
||||
|
||||
/home/zefad/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.181/build.rs:
|
||||
@ -1 +0,0 @@
|
||||
This file has an mtime of when this was started.
|
||||
@ -1,25 +0,0 @@
|
||||
cargo:rerun-if-changed=build.rs
|
||||
cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_FREEBSD_VERSION
|
||||
cargo:rustc-cfg=freebsd12
|
||||
cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_MUSL_V1_2_3
|
||||
cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64
|
||||
cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS
|
||||
cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_TIME_BITS
|
||||
cargo:rustc-check-cfg=cfg(emscripten_old_stat_abi)
|
||||
cargo:rustc-check-cfg=cfg(espidf_time32)
|
||||
cargo:rustc-check-cfg=cfg(freebsd10)
|
||||
cargo:rustc-check-cfg=cfg(freebsd11)
|
||||
cargo:rustc-check-cfg=cfg(freebsd12)
|
||||
cargo:rustc-check-cfg=cfg(freebsd13)
|
||||
cargo:rustc-check-cfg=cfg(freebsd14)
|
||||
cargo:rustc-check-cfg=cfg(freebsd15)
|
||||
cargo:rustc-check-cfg=cfg(gnu_file_offset_bits64)
|
||||
cargo:rustc-check-cfg=cfg(gnu_time_bits64)
|
||||
cargo:rustc-check-cfg=cfg(libc_deny_warnings)
|
||||
cargo:rustc-check-cfg=cfg(linux_time_bits64)
|
||||
cargo:rustc-check-cfg=cfg(musl_v1_2_3)
|
||||
cargo:rustc-check-cfg=cfg(musl32_time64)
|
||||
cargo:rustc-check-cfg=cfg(vxworks_lt_25_09)
|
||||
cargo:rustc-check-cfg=cfg(target_os,values("switch","aix","ohos","hurd","rtems","visionos","nuttx","cygwin","qurt"))
|
||||
cargo:rustc-check-cfg=cfg(target_env,values("illumos","wasi","aix","ohos","nto71_iosock","nto80"))
|
||||
cargo:rustc-check-cfg=cfg(target_arch,values("loongarch64","mips32r6","mips64r6","csky"))
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user