use crate::commitment_scheme::{CommitKey, Commitment};
use crate::error::Error;
use crate::fft::{EvaluationDomain, Polynomial};
use crate::plonkup::{LookupTable, MultiSet};
#[derive(Clone, Eq, PartialEq, Debug)]
pub struct PreprocessedLookupTable {
pub n: u32,
pub(crate) t_1: (MultiSet, Commitment, Polynomial),
pub(crate) t_2: (MultiSet, Commitment, Polynomial),
pub(crate) t_3: (MultiSet, Commitment, Polynomial),
pub(crate) t_4: (MultiSet, Commitment, Polynomial),
}
impl PreprocessedLookupTable {
pub fn preprocess(
table: &LookupTable,
commit_key: &CommitKey,
n: u32,
) -> Result<Self, Error> {
let domain: EvaluationDomain =
EvaluationDomain::new(n as usize).unwrap();
let columned_table = table.vec_to_multiset();
let mut t_1 = columned_table.0;
let mut t_2 = columned_table.1;
let mut t_3 = columned_table.2;
let mut t_4 = columned_table.3;
t_1.pad(n);
t_2.pad(n);
t_3.pad(n);
t_4.pad(n);
let t_1_poly = t_1.to_polynomial(&domain);
let t_2_poly = t_2.to_polynomial(&domain);
let t_3_poly = t_3.to_polynomial(&domain);
let t_4_poly = t_4.to_polynomial(&domain);
let t_1_commit = commit_key.commit(&t_1_poly)?;
let t_2_commit = commit_key.commit(&t_2_poly)?;
let t_3_commit = commit_key.commit(&t_3_poly)?;
let t_4_commit = commit_key.commit(&t_4_poly)?;
Ok(PreprocessedLookupTable {
n,
t_1: (t_1, t_1_commit, t_1_poly),
t_2: (t_2, t_2_commit, t_2_poly),
t_3: (t_3, t_3_commit, t_3_poly),
t_4: (t_4, t_4_commit, t_4_poly),
})
}
}