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