From 9556ca655bc7a78cf4e3d3691190113be43bc15a Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Fri, 7 Jun 2024 11:49:40 +0200
Subject: [PATCH 1/5] add "long full recoding" test

---
 src/fec.rs | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/fec.rs b/src/fec.rs
index a1fd2da6..4678af50 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -441,6 +441,36 @@ mod tests {
         }
     }
 
+    fn long_full_end_to_end_with_recoding_template<F: PrimeField>(
+        data: &[u8],
+        k: usize,
+        n: usize,
+        nb_steps: usize,
+    ) {
+        let mut rng = ark_std::test_rng();
+        let test_case = format!("TEST | data: {} bytes, k: {}, n: {}", data.len(), k, n,);
+
+        let mut shards = encode::<F>(data, &Matrix::random(k, n, &mut rng))
+            .unwrap_or_else(|_| panic!("could not encode {test_case}"));
+
+        for _ in 0..nb_steps {
+            shards.push(recode_random(&shards, &mut rng).unwrap().unwrap());
+        }
+
+        try_all_decoding_combinations(data, &shards, k, n, &test_case, Some(100), vec![]);
+    }
+
+    #[test]
+    fn long_full_end_to_end_with_recoding() {
+        let bytes = bytes();
+
+        for (k, n) in [(3, 5), (5, 5), (8, 10)] {
+            for nb_steps in [10, 20, 100] {
+                long_full_end_to_end_with_recoding_template::<Fr>(&bytes, k, n, nb_steps);
+            }
+        }
+    }
+
     fn create_fake_shard<F: PrimeField>(linear_combination: &[F], bytes: &[u8]) -> Shard<F> {
         Shard {
             k: 2,
-- 
GitLab


From a4a4b533f1218d7be2451d6247b52183f3566ccf Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Fri, 7 Jun 2024 12:32:14 +0200
Subject: [PATCH 2/5] recode k shards together k times at each step

---
 src/fec.rs | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/fec.rs b/src/fec.rs
index 4678af50..8da5aa8c 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -452,9 +452,12 @@ mod tests {
 
         let mut shards = encode::<F>(data, &Matrix::random(k, n, &mut rng))
             .unwrap_or_else(|_| panic!("could not encode {test_case}"));
+        shards.truncate(k);
 
         for _ in 0..nb_steps {
-            shards.push(recode_random(&shards, &mut rng).unwrap().unwrap());
+            shards = (0..k)
+                .map(|_| recode_random(&shards, &mut rng).unwrap().unwrap())
+                .collect();
         }
 
         try_all_decoding_combinations(data, &shards, k, n, &test_case, Some(100), vec![]);
-- 
GitLab


From e1749662c2697784e798faf215ac76079261bdb3 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Fri, 7 Jun 2024 12:38:35 +0200
Subject: [PATCH 3/5] add diagram to explain test

---
 src/fec.rs | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/fec.rs b/src/fec.rs
index 8da5aa8c..b7c46ff4 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -441,6 +441,14 @@ mod tests {
         }
     }
 
+    //   (encode) | (select k) |     (recode)    | (decode)
+    //            *
+    // *          *            *     * ... *     * \
+    // *  ------> * ---------> * --> * ... * --> *  |--> ?
+    // *          *            *     * ... *     * /
+    //            *                  \__(#steps)_/
+    //
+    // k          n            k     k     k     k
     fn long_full_end_to_end_with_recoding_template<F: PrimeField>(
         data: &[u8],
         k: usize,
-- 
GitLab


From 4c2b55f91460a17739c0d6a58cdd96420533ce99 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Fri, 7 Jun 2024 12:39:33 +0200
Subject: [PATCH 4/5] shuffle the shards before selecting k

---
 src/fec.rs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/fec.rs b/src/fec.rs
index b7c46ff4..684b9022 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -206,6 +206,7 @@ mod tests {
     };
 
     use itertools::Itertools;
+    use rand::seq::SliceRandom;
 
     use super::recode_with_coeffs;
 
@@ -460,6 +461,7 @@ mod tests {
 
         let mut shards = encode::<F>(data, &Matrix::random(k, n, &mut rng))
             .unwrap_or_else(|_| panic!("could not encode {test_case}"));
+        shards.shuffle(&mut rng);
         shards.truncate(k);
 
         for _ in 0..nb_steps {
-- 
GitLab


From 5b8c0c1fd8fdc4515c6cf2f9297a8b86423a5ba8 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Fri, 7 Jun 2024 12:41:49 +0200
Subject: [PATCH 5/5] only test single k-combination at the end

---
 src/fec.rs | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/fec.rs b/src/fec.rs
index 684b9022..cbbae67b 100644
--- a/src/fec.rs
+++ b/src/fec.rs
@@ -470,7 +470,8 @@ mod tests {
                 .collect();
         }
 
-        try_all_decoding_combinations(data, &shards, k, n, &test_case, Some(100), vec![]);
+        let actual = decode::<F>(shards).unwrap_or_else(|_| panic!("could not decode {test_case}"));
+        assert_eq!(data, actual, "bad decoded data with {test_case}",);
     }
 
     #[test]
-- 
GitLab