pub struct BitAxisFolder<F: BinaryField> { /* private fields */ }Expand description
A reusable folder over a fixed vector of bit-index scalars.
The one-shot function above rebuilds its lookup tables on every call. A caller folding several word-lists against the same scalar vector builds them once here, and reuses them across folds.
The word axis has a folder of its own, built the same way.
Implementations§
Source§impl<F: BinaryField> BitAxisFolder<F>
impl<F: BinaryField> BitAxisFolder<F>
Sourcepub fn new(vec: &[F]) -> Self
pub fn new(vec: &[F]) -> Self
Builds the folding transform for vec.
§Preconditions
veccontains exactly one scalar per bit of a word
Sourcepub fn fold<P, A>(&self, alloc: &A, words: &[Word]) -> FieldBuffer<P, A::Vec<P>>where
P: PackedField<Scalar = F>,
A: Allocator,
pub fn fold<P, A>(&self, alloc: &A, words: &[Word]) -> FieldBuffer<P, A::Vec<P>>where
P: PackedField<Scalar = F>,
A: Allocator,
Folds words, mapping each word to the inner product of its bits with the scalar vector.
The one-shot function at the top of this module states the exact contract.
Sourcepub fn fold_bitand_operands<P, A>(
&self,
alloc: &A,
a_words: &[Word],
b_words: &[Word],
) -> [FieldBuffer<P, A::Vec<P>>; 3]where
P: PackedField<Scalar = F>,
A: Allocator,
pub fn fold_bitand_operands<P, A>(
&self,
alloc: &A,
a_words: &[Word],
b_words: &[Word],
) -> [FieldBuffer<P, A::Vec<P>>; 3]where
P: PackedField<Scalar = F>,
A: Allocator,
Folds the two stored BitAnd operand columns and their derived AND column in one pass.
§Overview
The BitAnd zerocheck folds three columns of the constraint A & B = C.
On a satisfying witness the third column equals the AND of the first two.
So this fold reads only the two stored columns and derives the third in registers:
stream A ──┬──> fold ──> folded A
stream B ──┼──> fold ──> folded B
└──> A & B ──> fold ──> folded C (no third input stream)§Returns
Three folded buffers, in order:
- the first operand column, folded as a single column would be.
- the second operand column, folded the same way.
- the word-by-word AND of the two columns, folded the same way.
The AND column is derived in registers and never written to memory.
§Performance
- Two input streams instead of three.
- Two register ANDs per word pair replace one memory stream.
- The bytewise lookup tables stay hot across all three outputs.
§Preconditions
- The two word-lists have equal length.
Trait Implementations§
Auto Trait Implementations§
impl<F> Freeze for BitAxisFolder<F>
impl<F> RefUnwindSafe for BitAxisFolder<F>
impl<F> Send for BitAxisFolder<F>
impl<F> Sync for BitAxisFolder<F>
impl<F> Unpin for BitAxisFolder<F>
impl<F> UnsafeUnpin for BitAxisFolder<F>
impl<F> UnwindSafe for BitAxisFolder<F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more