pub struct Phase1SumcheckProver<'alloc, A: Allocator, P: PackedField> { /* private fields */ }Expand description
A sumcheck prover for the product of a sparse row list and a dense weight table, both spanning one shift slot and the bit position.
The row list is zero outside the rows a constraint system’s shifts name, dense within a named row. So this prover changes strategy halfway through:
- While the row index has unbound variables, each round reads only the stored rows, at a cost that follows how many shifts the constraint system names, not the whole row space.
- Once the row index is bound, both multilinears are one dense row, and a shared dense-product prover takes over.
Every round message matches what a fully dense prover would send.
§Performance
Both the sampled evaluations and the fold are linear in the sparse row list, so each stored row contributes independently, walking whole packed rows rather than individual scalar points.
Implementations§
Source§impl<'alloc, A: Allocator, F: Field, P: PackedField<Scalar = F>> Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A: Allocator, F: Field, P: PackedField<Scalar = F>> Phase1SumcheckProver<'alloc, A, P>
Sourcepub fn new(
g: SparseShiftRows<P>,
h: FieldVec<P, A>,
sum: F,
alloc: &'alloc A,
) -> Self
pub fn new( g: SparseShiftRows<P>, h: FieldVec<P, A>, sum: F, alloc: &'alloc A, ) -> Self
Creates a prover for the claim that the two multilinears’ product sums to the given value over the hypercube.
The outer shift slot is already bound by the time this runs, so the dense multilinear is the weight table over the weights those rounds left behind, and the row list’s remaining row index is the inner slot.
§Panics
Panics unless both multilinears span exactly one shift slot and the bit position.
Trait Implementations§
Source§impl<A: Allocator, F: Field, P: PackedField<Scalar = F>> SumcheckProver<F> for Phase1SumcheckProver<'_, A, P>
impl<A: Allocator, F: Field, P: PackedField<Scalar = F>> SumcheckProver<F> for Phase1SumcheckProver<'_, A, P>
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<'alloc, A, P> Freeze for Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A, P> RefUnwindSafe for Phase1SumcheckProver<'alloc, A, P>where
A: RefUnwindSafe,
<P as FieldOps>::Scalar: RefUnwindSafe,
<A as Allocator>::Vec<P>: RefUnwindSafe,
P: RefUnwindSafe,
impl<'alloc, A, P> Send for Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A, P> Sync for Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A, P> Unpin for Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A, P> UnsafeUnpin for Phase1SumcheckProver<'alloc, A, P>
impl<'alloc, A, P> UnwindSafe for Phase1SumcheckProver<'alloc, A, P>where
A: RefUnwindSafe,
<P as FieldOps>::Scalar: UnwindSafe,
<A as Allocator>::Vec<P>: UnwindSafe,
P: UnwindSafe + RefUnwindSafe,
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