Implement rs encode rows test

Fix related bugs
Refactored API
This commit is contained in:
Daniel Sanchez Quiros 2024-04-15 19:57:23 +02:00
parent 3a89597f8d
commit 76bc6a4a6c
3 changed files with 35 additions and 7 deletions

View File

@ -78,6 +78,10 @@ impl ChunksMatrix {
pub fn transposed(&self) -> Self { pub fn transposed(&self) -> Self {
Self(self.columns().map(|c| Row(c.0)).collect()) Self(self.columns().map(|c| Row(c.0)).collect())
} }
pub fn iter(&self) -> impl Iterator<Item = &Row> {
self.0.iter()
}
} }
impl FromIterator<Row> for ChunksMatrix { impl FromIterator<Row> for ChunksMatrix {

View File

@ -31,7 +31,7 @@ pub struct EncodedData {
aggregated_column_proofs: Vec<Proof>, aggregated_column_proofs: Vec<Proof>,
} }
struct DaEncoder { pub struct DaEncoder {
params: DaEncoderParams, params: DaEncoderParams,
} }
@ -77,7 +77,7 @@ impl DaEncoder {
} }
fn rs_encode_row(evaluations: &Evaluations, row: &Polynomial) -> Evaluations { fn rs_encode_row(evaluations: &Evaluations, row: &Polynomial) -> Evaluations {
encode(row, evaluations, 2, &DOMAIN) encode(row, evaluations, 2, *DOMAIN)
} }
fn rs_encode_rows(rows: &[(Evaluations, Polynomial)]) -> Vec<Evaluations> { fn rs_encode_rows(rows: &[(Evaluations, Polynomial)]) -> Vec<Evaluations> {
@ -196,7 +196,9 @@ impl DaEncoder {
#[cfg(test)] #[cfg(test)]
pub mod test { pub mod test {
use crate::encoder::{DaEncoder, DaEncoderParams}; use crate::encoder::{DaEncoder, DaEncoderParams};
use kzgrs::BYTES_PER_FIELD_ELEMENT; use crate::global::DOMAIN;
use kzgrs::common::bytes_to_polynomial_unchecked;
use kzgrs::{decode, BYTES_PER_FIELD_ELEMENT};
use rand::RngCore; use rand::RngCore;
use std::ops::Div; use std::ops::Div;
@ -230,4 +232,26 @@ pub mod test {
let commitments_data = DaEncoder::compute_kzg_row_commitments(&matrix).unwrap(); let commitments_data = DaEncoder::compute_kzg_row_commitments(&matrix).unwrap();
assert_eq!(commitments_data.len(), matrix.len()); assert_eq!(commitments_data.len(), matrix.len());
} }
#[test]
fn test_rs_encode_rows() {
let data = rand_data(32);
let matrix = ENCODER.chunkify(data.as_ref());
let (poly_data, _): (Vec<_>, Vec<_>) = DaEncoder::compute_kzg_row_commitments(&matrix)
.unwrap()
.into_iter()
.unzip();
let extended_rows = DaEncoder::rs_encode_rows(&poly_data);
let extended_matrix = DaEncoder::evals_to_chunk_matrix(&extended_rows);
for ((r1, r2), evals) in matrix.iter().zip(extended_matrix.iter()).zip(extended_rows) {
assert_eq!(r1.len(), r2.len().div(2));
let points: Vec<_> = evals.evals.iter().cloned().map(Some).collect();
let poly_2 = decode(r1.len(), &points, *DOMAIN);
let (poly_1, _) = bytes_to_polynomial_unchecked::<BYTES_PER_FIELD_ELEMENT>(
r1.as_bytes().as_ref(),
*DOMAIN,
);
assert_eq!(poly_1, poly_2);
}
}
} }

View File

@ -14,14 +14,14 @@ pub fn encode(
polynomial: &DensePolynomial<Fr>, polynomial: &DensePolynomial<Fr>,
evaluations: &Evaluations<Fr>, evaluations: &Evaluations<Fr>,
factor: usize, factor: usize,
domain: &GeneralEvaluationDomain<Fr>, domain: GeneralEvaluationDomain<Fr>,
) -> Evaluations<Fr> { ) -> Evaluations<Fr> {
assert!(factor > 1); assert!(factor > 1);
Evaluations::from_vec_and_domain( Evaluations::from_vec_and_domain(
(0..evaluations.evals.len() * factor) (0..evaluations.evals.len() * factor)
.map(|i| polynomial.evaluate(&domain.element(i))) .map(|i| polynomial.evaluate(&domain.element(i)))
.collect(), .collect(),
*domain, domain,
) )
} }
@ -31,7 +31,7 @@ pub fn encode(
pub fn decode( pub fn decode(
original_chunks_len: usize, original_chunks_len: usize,
points: &[Option<Fr>], points: &[Option<Fr>],
domain: &GeneralEvaluationDomain<Fr>, domain: GeneralEvaluationDomain<Fr>,
) -> Evaluations<Fr> { ) -> Evaluations<Fr> {
let (points, roots_of_unity): (Vec<Fr>, Vec<Fr>) = points let (points, roots_of_unity): (Vec<Fr>, Vec<Fr>) = points
.iter() .iter()
@ -49,7 +49,7 @@ pub fn decode(
(0..original_chunks_len) (0..original_chunks_len)
.map(|i| coeffs.evaluate(&domain.element(i))) .map(|i| coeffs.evaluate(&domain.element(i)))
.collect(), .collect(),
*domain, domain,
) )
} }