mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-06 15:53:10 +00:00
* Most gates support packed evaluation * ComparisonGate * Minor: outdated todo marker * Revert superfluous change * Post-merge fixes * Daniel comments * Minor: Markdown in comments
40 lines
1.7 KiB
Rust
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
|
|
}
|
|
}
|