diff --git a/plonky2/src/gates/arithmetic_u32.rs b/plonky2/src/gates/arithmetic_u32.rs index 088c1af4..97180f6b 100644 --- a/plonky2/src/gates/arithmetic_u32.rs +++ b/plonky2/src/gates/arithmetic_u32.rs @@ -125,17 +125,17 @@ impl, const D: usize> Gate for U32ArithmeticG constraints } - fn eval_unfiltered_base_one( - &self, - _vars: EvaluationVarsBase, - _yield_constr: StridedConstraintConsumer, - ) { - panic!("use eval_unfiltered_base_packed instead"); - } - - fn eval_unfiltered_base_batch(&self, vars_base: EvaluationVarsBaseBatch) -> Vec { - self.eval_unfiltered_base_batch_packed(vars_base) - } + // fn eval_unfiltered_base_one( + // &self, + // _vars: EvaluationVarsBase, + // _yield_constr: StridedConstraintConsumer, + // ) { + // panic!("use eval_unfiltered_base_packed instead"); + // } + // + // fn eval_unfiltered_base_batch(&self, vars_base: EvaluationVarsBaseBatch) -> Vec { + // self.eval_unfiltered_base_batch_packed(vars_base) + // } fn eval_unfiltered_recursively( &self, diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index 0803d3ae..d871d830 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -84,12 +84,13 @@ pub trait Gate, const D: usize>: 'static + Send + S fn eval_filtered( &self, mut vars: EvaluationVars, + gate_index: usize, selector_index: usize, - combination_num: usize, + combination_range: (usize, usize), ) -> Vec { let filter = compute_filter( - selector_index, - combination_num, + gate_index, + combination_range, vars.local_constants[selector_index], ); vars.selector_index = selector_index; @@ -104,15 +105,16 @@ pub trait Gate, const D: usize>: 'static + Send + S fn eval_filtered_base_batch( &self, mut vars_batch: EvaluationVarsBaseBatch, + gate_index: usize, selector_index: usize, - combination_num: usize, + combination_range: (usize, usize), ) -> Vec { let filters: Vec<_> = vars_batch .iter() .map(|vars| { compute_filter( - selector_index, - combination_num, + gate_index, + combination_range, vars.local_constants[selector_index], ) }) @@ -131,13 +133,13 @@ pub trait Gate, const D: usize>: 'static + Send + S builder: &mut CircuitBuilder, mut vars: EvaluationTargets, selector_index: usize, - combination_num: usize, + combination_range: (usize, usize), combined_gate_constraints: &mut [ExtensionTarget], ) { let filter = compute_filter_recursively( builder, selector_index, - combination_num, + combination_range, vars.local_constants[selector_index], ); vars.selector_index = selector_index; @@ -236,9 +238,13 @@ impl, const D: usize> PrefixedGate { /// A gate's filter is computed as `prod b_i*c_i + (1-b_i)*(1-c_i)`, with `(b_i)` the prefix and /// `(c_i)` the local constants, which is one if the prefix of `constants` matches `prefix`. -fn compute_filter<'a, K: Field>(selector_index: usize, combination_num: usize, constant: K) -> K { - (0..combination_num) - .filter(|&i| i != selector_index) +fn compute_filter<'a, K: Field>( + gate_index: usize, + combination_range: (usize, usize), + constant: K, +) -> K { + (combination_range.0..combination_range.1) + .filter(|&i| i != gate_index) .map(|i| K::from_canonical_usize(i) - constant) .product() } @@ -246,10 +252,10 @@ fn compute_filter<'a, K: Field>(selector_index: usize, combination_num: usize, c fn compute_filter_recursively, const D: usize>( builder: &mut CircuitBuilder, selector_index: usize, - combination_num: usize, + combination_range: (usize, usize), constant: ExtensionTarget, ) -> ExtensionTarget { - let v = (0..combination_num) + let v = (combination_range.0..combination_range.1) .filter(|&i| i != selector_index) .map(|i| builder.constant_extension(F::Extension::from_canonical_usize(i))) .collect::>(); diff --git a/plonky2/src/gates/public_input.rs b/plonky2/src/gates/public_input.rs index 20fc59c8..e827cc9b 100644 --- a/plonky2/src/gates/public_input.rs +++ b/plonky2/src/gates/public_input.rs @@ -36,17 +36,17 @@ impl, const D: usize> Gate for PublicInputGat .collect() } - fn eval_unfiltered_base_one( - &self, - _vars: EvaluationVarsBase, - _yield_constr: StridedConstraintConsumer, - ) { - panic!("use eval_unfiltered_base_packed instead"); - } - - fn eval_unfiltered_base_batch(&self, vars_base: EvaluationVarsBaseBatch) -> Vec { - self.eval_unfiltered_base_batch_packed(vars_base) - } + // fn eval_unfiltered_base_one( + // &self, + // _vars: EvaluationVarsBase, + // _yield_constr: StridedConstraintConsumer, + // ) { + // panic!("use eval_unfiltered_base_packed instead"); + // } + // + // fn eval_unfiltered_base_batch(&self, vars_base: EvaluationVarsBaseBatch) -> Vec { + // self.eval_unfiltered_base_batch_packed(vars_base) + // } fn eval_unfiltered_recursively( &self, diff --git a/plonky2/src/gates/selectors.rs b/plonky2/src/gates/selectors.rs index 23db1256..c1461c09 100644 --- a/plonky2/src/gates/selectors.rs +++ b/plonky2/src/gates/selectors.rs @@ -8,7 +8,7 @@ pub(crate) fn compute_selectors, const D: usize>( mut gates: Vec>, instances: &[GateInstance], max_degree: usize, -) -> (Vec>, Vec, Vec) { +) -> (Vec>, Vec, Vec<(usize, usize)>) { let n = instances.len(); let mut combinations = Vec::new(); @@ -29,15 +29,20 @@ pub(crate) fn compute_selectors, const D: usize>( vec![PolynomialValues::zero(n); combinations.len() + num_constants_polynomials]; let index = |id| gates.iter().position(|g| g.0.id() == id).unwrap(); - let combination = |i| combinations.iter().position(|&(a, _)| a <= i).unwrap(); + let combination = |i| { + combinations + .iter() + .position(|&(a, b)| a <= i && i < b) + .unwrap() + }; let selector_indices = gates .iter() .map(|g| combination(index(g.0.id()))) .collect::>(); - let combination_nums = selector_indices + let combination_ranges = selector_indices .iter() - .map(|&i| combinations[i].1 - combinations[i].0) + .map(|&i| (combinations[i].0, combinations[i].1)) .collect(); for (j, g) in instances.iter().enumerate() { @@ -47,7 +52,7 @@ pub(crate) fn compute_selectors, const D: usize>( } = g; let i = index(gate_ref.0.id()); let comb = combination(i); - polynomials[comb].values[j] = F::from_canonical_usize(i - combinations[comb].0); + polynomials[comb].values[j] = F::from_canonical_usize(i); let mut k = 0; let mut constant_ind = 0; while k < constants.len() { @@ -60,5 +65,5 @@ pub(crate) fn compute_selectors, const D: usize>( } } } - (polynomials, selector_indices, combination_nums) + (polynomials, selector_indices, combination_ranges) } diff --git a/plonky2/src/plonk/circuit_builder.rs b/plonky2/src/plonk/circuit_builder.rs index 0eaccc0c..ffa253c1 100644 --- a/plonky2/src/plonk/circuit_builder.rs +++ b/plonky2/src/plonk/circuit_builder.rs @@ -804,7 +804,7 @@ impl, const D: usize> CircuitBuilder { degree_bits, gates, selector_indices, - combination_nums, + combination_ranges, quotient_degree_factor, num_gate_constraints, num_constants, diff --git a/plonky2/src/plonk/circuit_data.rs b/plonky2/src/plonk/circuit_data.rs index c0bf2251..4ce51b3a 100644 --- a/plonky2/src/plonk/circuit_data.rs +++ b/plonky2/src/plonk/circuit_data.rs @@ -249,7 +249,7 @@ pub struct CommonCircuitData< pub(crate) gates: Vec>, pub(crate) selector_indices: Vec, - pub(crate) combination_nums: Vec, + pub(crate) combination_ranges: Vec<(usize, usize)>, /// The degree of the PLONK quotient polynomial. pub(crate) quotient_degree_factor: usize, diff --git a/plonky2/src/plonk/vanishing_poly.rs b/plonky2/src/plonk/vanishing_poly.rs index 2ad1bf70..3ba968af 100644 --- a/plonky2/src/plonk/vanishing_poly.rs +++ b/plonky2/src/plonk/vanishing_poly.rs @@ -219,8 +219,9 @@ pub fn evaluate_gate_constraints< for (i, gate) in common_data.gates.iter().enumerate() { let gate_constraints = gate.0.eval_filtered( vars.clone(), + i, common_data.selector_indices[i], - common_data.combination_nums[i], + common_data.combination_ranges[i], ); for (i, c) in gate_constraints.into_iter().enumerate() { debug_assert!( @@ -250,8 +251,9 @@ pub fn evaluate_gate_constraints_base_batch< for (i, gate) in common_data.gates.iter().enumerate() { let gate_constraints_batch = gate.0.eval_filtered_base_batch( vars_batch.clone(), + i, common_data.selector_indices[i], - common_data.combination_nums[i], + common_data.combination_ranges[i], ); debug_assert!( gate_constraints_batch.len() <= constraints_batch.len(), @@ -284,7 +286,7 @@ pub fn evaluate_gate_constraints_recursively< builder, vars.clone(), common_data.selector_indices[i], - common_data.combination_nums[i], + common_data.combination_ranges[i], &mut all_gate_constraints ) );