pub struct SelectorMlecheckProver<'b, P: PackedField, B: Bitwise, Data: BufferData<P> = Vec<P>> { /* private fields */ }Expand description
A SumcheckProver implementation that proves an mlecheck over many compositions of the
form selected * selector + (1 - selector), where selected is the shared large field
multilinear and selector comes from the set of 1-bit multilinears. Unlike other multi mlecheck
provers however the evaluation point is not shared but is specified per selector.
The set of 1-bit multilinears is represented by a power-of-two long slice of bitmasks, and the multilinear set is constructed by arranging the bitmasks as a 2D matrix in row-major order and taking vertical slices. This representation is very compact and has no embedding overhead.
To combat memory blowup issues arising from folding 1-bit multilinears, this prover introduces
switchover. See BinarySwitchover for more in-depth explanation of the mechanism. Also note
that the need to expand the equality indicator for each multilinear still results in some
blowup.
Implementations§
Source§impl<'b, F: Field, P: PackedField<Scalar = F>, B: Bitwise, Data: BufferData<P>> SelectorMlecheckProver<'b, P, B, Data>
impl<'b, F: Field, P: PackedField<Scalar = F>, B: Bitwise, Data: BufferData<P>> SelectorMlecheckProver<'b, P, B, Data>
Sourcepub fn new(
selected: FieldBuffer<P, Data>,
claims: Vec<Claim<F>>,
bitmasks: &'b [B],
weights: Vec<F>,
switchover: usize,
) -> Self
pub fn new( selected: FieldBuffer<P, Data>, claims: Vec<Claim<F>>, bitmasks: &'b [B], weights: Vec<F>, switchover: usize, ) -> Self
Constructs a prover, given bitmasks as representation of 1-bit columns, selected being
the shared large field multilinear, individual claims per selector, weights to combine
the per-selector round polynomials into one (one weight per claim), and switchover as the
round at which 1-bit columns should be folded.
The prover exposes a single claim — the weights-combination Σ_i weights[i] · C_i of the
per-selector claims. Supplying the equality-indicator tensor eq_k(γ, ·) as the weights
batches the claims with eq_k(γ, i).
Trait Implementations§
Source§impl<'b, F, P, B, Data> SumcheckProver<F> for SelectorMlecheckProver<'b, P, B, Data>
impl<'b, F, P, B, Data> SumcheckProver<F> for SelectorMlecheckProver<'b, P, B, Data>
Source§fn n_vars(&self) -> usize
fn n_vars(&self) -> usize
Source§fn execute(&mut self) -> Vec<RoundCoeffs<F>>
fn execute(&mut self) -> Vec<RoundCoeffs<F>>
Auto Trait Implementations§
impl<'b, P, B, Data> Freeze for SelectorMlecheckProver<'b, P, B, Data>where
Data: Freeze,
impl<'b, P, B, Data> RefUnwindSafe for SelectorMlecheckProver<'b, P, B, Data>where
Data: RefUnwindSafe,
<P as FieldOps>::Scalar: RefUnwindSafe,
B: RefUnwindSafe,
P: RefUnwindSafe,
impl<'b, P, B, Data> Send for SelectorMlecheckProver<'b, P, B, Data>where
Data: Send,
impl<'b, P, B, Data> Sync for SelectorMlecheckProver<'b, P, B, Data>where
Data: Sync,
impl<'b, P, B, Data> Unpin for SelectorMlecheckProver<'b, P, B, Data>
impl<'b, P, B, Data> UnsafeUnpin for SelectorMlecheckProver<'b, P, B, Data>where
Data: UnsafeUnpin,
impl<'b, P, B, Data> UnwindSafe for SelectorMlecheckProver<'b, P, B, Data>
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