arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
hyperplonk/hyperplonk/src/selectors.rs
hyperplonk/src/selectors.rsRaw
 1use crate::errors::HyperPlonkErrors;
 2use ark_ff::PrimeField;
 3use ark_poly::DenseMultilinearExtension;
 4use ark_std::log2;
 5
 6/// A column of selectors of length `#constraints`
 7#[derive(Debug, Clone)]
 8pub struct SelectorColumn<F: PrimeField>(pub(crate) Vec<F>);
 9
10impl<F: PrimeField> SelectorColumn<F> {
11    /// the number of variables for MLE to present a column.
12    pub fn get_nv(&self) -> usize {
13        log2(self.0.len()) as usize
14    }
15
16    /// Build selector columns from rows
17    pub fn from_selector_rows(
18        selector_rows: &[SelectorColumn<F>],
19    ) -> Result<Vec<Self>, HyperPlonkErrors> {
20        if selector_rows.is_empty() {
21            return Err(HyperPlonkErrors::InvalidParameters(
22                "empty witness rows".to_string(),
23            ));
24        }
25
26        let mut res = Vec::with_capacity(selector_rows.len());
27        let num_wires = selector_rows[0].0.len();
28
29        for i in 0..num_wires {
30            let mut cur_column = Vec::new();
31            for row in selector_rows.iter() {
32                cur_column.push(row.0[i])
33            }
34            res.push(Self(cur_column))
35        }
36
37        Ok(res)
38    }
39}
40
41impl<F: PrimeField> From<&SelectorColumn<F>> for DenseMultilinearExtension<F> {
42    fn from(witness: &SelectorColumn<F>) -> Self {
43        let nv = witness.get_nv();
44        Self::from_evaluations_slice(nv, witness.0.as_ref())
45    }
46}