plonky2/src/gates/packed_util.rs
Jakub Nabaglo d4a0a8661e
Packed evaluation for most gates (#395)
* Most gates support packed evaluation

* ComparisonGate

* Minor: outdated todo marker

* Revert superfluous change

* Post-merge fixes

* Daniel comments

* Minor: Markdown in comments
2021-12-20 15:08:07 -08:00

40 lines
1.7 KiB
Rust

use crate::field::extension_field::Extendable;
use crate::field::packable::Packable;
use crate::field::packed_field::PackedField;
use crate::gates::gate::Gate;
use crate::gates::util::StridedConstraintConsumer;
use crate::plonk::vars::{EvaluationVarsBaseBatch, EvaluationVarsBasePacked};
pub trait PackedEvaluableBase<F: Extendable<D>, const D: usize>: Gate<F, D> {
fn eval_unfiltered_base_packed<P: PackedField<Scalar = F>>(
&self,
vars_base: EvaluationVarsBasePacked<P>,
yield_constr: StridedConstraintConsumer<P>,
);
/// Evaluates entire batch of points. Returns a matrix of constraints. Constraint `j` for point
/// `i` is at `index j * batch_size + i`.
fn eval_unfiltered_base_batch_packed(&self, vars_batch: EvaluationVarsBaseBatch<F>) -> Vec<F> {
let mut res = vec![F::ZERO; vars_batch.len() * self.num_constraints()];
let (vars_packed_iter, vars_leftovers_iter) = vars_batch.pack::<<F as Packable>::Packing>();
let leftovers_start = vars_batch.len() - vars_leftovers_iter.len();
for (i, vars_packed) in vars_packed_iter.enumerate() {
self.eval_unfiltered_base_packed(
vars_packed,
StridedConstraintConsumer::new(
&mut res[..],
vars_batch.len(),
<F as Packable>::Packing::WIDTH * i,
),
);
}
for (i, vars_leftovers) in vars_leftovers_iter.enumerate() {
self.eval_unfiltered_base_packed(
vars_leftovers,
StridedConstraintConsumer::new(&mut res[..], vars_batch.len(), leftovers_start + i),
);
}
res
}
}