pub struct ClaimGroup<F: Field> {
pub claims: Vec<RawClaim<F>>,
claim_points_matrix: Vec<Vec<F>>,
claim_points_transpose: Vec<Vec<F>>,
result_vector: Vec<F>,
}Expand description
Stores a collection of claims and provides an API running claim aggregation algorithms on them. The current implementation introduces up to 3x memory redundancy in order to achieve faster access times. Invariant: All claims are on the same number of variables.
Fields§
§claims: Vec<RawClaim<F>>A vector of raw claims in F^n.
claim_points_matrix: Vec<Vec<F>>A 2D matrix with the claim’s points as its rows.
claim_points_transpose: Vec<Vec<F>>The points in claims is effectively a matrix of elements in F. We also
store the transpose of this matrix for convenient access.
result_vector: Vec<F>A vector of self.get_num_claims() elements. For each claim i,
result_vector[i] stores the expected result of the i-th claim.
Implementations§
Source§impl<F: Field> ClaimGroup<F>
impl<F: Field> ClaimGroup<F>
Sourcepub fn new(claims: Vec<Claim<F>>) -> Result<Self>
pub fn new(claims: Vec<Claim<F>>) -> Result<Self>
Generates a ClaimGroup from a collection of Claims.
All claims agree on the Claim::to_layer_id field and returns
ClaimError::LayerIdMismatch otherwise. Returns
ClaimError::NumVarsMismatch if the collection of claims do not all
agree on the number of variables.
Sourcepub fn new_from_raw_claims(claims: Vec<RawClaim<F>>) -> Result<Self>
pub fn new_from_raw_claims(claims: Vec<RawClaim<F>>) -> Result<Self>
Generates a new ClaimGroup from a collection of RawClaims. Returns ClaimError::NumVarsMismatch if the collection of claims do not all agree on the number of variables.
Sourcepub fn get_num_claims(&self) -> usize
pub fn get_num_claims(&self) -> usize
Returns the number of claims stored in this group.
Sourcepub fn get_num_vars(&self) -> usize
pub fn get_num_vars(&self) -> usize
Returns the number of indices of the claims stored. Panics if no claims present.
Sourcepub fn get_points_column(&self, i: usize) -> &Vec<F>
pub fn get_points_column(&self, i: usize) -> &Vec<F>
Returns a reference to a vector of self.get_num_claims() elements, the
j-th entry of which is the i-th coordinate of the j-th claim’s point. In
other words, it returns the i-th column of the matrix containing the
claim points as its rows.
§Panics
When i is not in the range: 0 <= i < self.get_num_vars().
Sourcepub fn get_claim_points_matrix(&self) -> &Vec<Vec<F>>
pub fn get_claim_points_matrix(&self) -> &Vec<Vec<F>>
Returns a reference to an “m x n” matrix where n = self.get_num_vars()
and m = self.get_num_claims() with the claim points as its rows.
Sourcepub fn get_results(&self) -> &Vec<F>
pub fn get_results(&self) -> &Vec<F>
Returns a reference to a vector with m = self.get_num_claims()
elements containing the results of all claims.
Sourcepub fn get_raw_claim(&self, i: usize) -> &RawClaim<F>
pub fn get_raw_claim(&self, i: usize) -> &RawClaim<F>
Returns a reference to the i-th claim.
Sourcepub fn get_raw_claims(&self) -> &[RawClaim<F>]
pub fn get_raw_claims(&self) -> &[RawClaim<F>]
Returns a reference to a vector of claims contained in this group.
Sourcefn preprocess_claims(claims: Vec<Claim<F>>) -> Vec<Claim<F>>
fn preprocess_claims(claims: Vec<Claim<F>>) -> Vec<Claim<F>>
Returns claims sorted by from_layer_id to prepare them for grouping.
Also performs claim de-duplication by eliminating copies of claims
on the same point.
Sourcepub fn form_claim_groups(claims: Vec<Claim<F>>) -> Vec<Self>
pub fn form_claim_groups(claims: Vec<Claim<F>>) -> Vec<Self>
Partition claims into groups to be aggregated together.
Sourcefn compute_aggregated_challenges(&self, r_star: F) -> Result<Vec<F>>
fn compute_aggregated_challenges(&self, r_star: F) -> Result<Vec<F>>
Computes the aggregated challenge point by interpolating a polynomial
passing through all the points in the claim group and then evaluating
it at r_star.
More precicely, if self.claims contains m points [u_0, u_1, ..., u_{m-1}] where each u_i \in F^n, it computes a univariate polynomial
vector l : F -> F^n such that l(0) = u_0, l(1) = u_1, ..., l(m-1) = u_{m-1} using Lagrange interpolation, then evaluates l on r_star
and returns it.
§Requires
self.claims_points should be non-empty, otherwise a
ClaimError::ClaimAggroError is returned.
Using the ClaimGroup abstraction here is not ideal since we are only
operating on the points and not on the results. However, the ClaimGroup API
is convenient for accessing columns and makes the implementation more
readable. We should consider alternative designs.
Sourcepub fn prover_aggregate(
&self,
layer_mles: &[DenseMle<F>],
transcript_writer: &mut impl ProverTranscript<F>,
) -> Result<RawClaim<F>>
pub fn prover_aggregate( &self, layer_mles: &[DenseMle<F>], transcript_writer: &mut impl ProverTranscript<F>, ) -> Result<RawClaim<F>>
Performs claim aggregation on the prover side for this claim group in a single stage – this is the standard “Thaler13” claim aggregation without any heuristic optimizations.
§Parameters
layer_mles: the compiled bookkeeping tables from this layer, which when aggregated appropriately with their prefix bits, make up the layerwise bookkeeping table.layer: the layer whose output MLE is being made a claim on. Each of the claims are aggregated into one claim, whose validity is reduced to the validity of a claim in a future layer throught he sumcheck protocol.transcript_writer: is used to post wlx evaluations and generate challenges.
§Returns
If successful, returns a single aggregated claim.
Sourcepub fn verifier_aggregate(
&self,
transcript_reader: &mut impl VerifierTranscript<F>,
) -> Result<RawClaim<F>>
pub fn verifier_aggregate( &self, transcript_reader: &mut impl VerifierTranscript<F>, ) -> Result<RawClaim<F>>
Performs claim aggregation on the verifier side for this claim group in a single stage – this is the standard “Thaler13” claim aggregation without any heuristic optimizations.
§Parameters
transcript_reader: is used to retrieve wlx evaluations and generate challenges.
§Returns
If successful, returns a single aggregated claim.
Trait Implementations§
Source§impl<F: Clone + Field> Clone for ClaimGroup<F>
impl<F: Clone + Field> Clone for ClaimGroup<F>
Source§fn clone(&self) -> ClaimGroup<F>
fn clone(&self) -> ClaimGroup<F>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<F> Freeze for ClaimGroup<F>
impl<F> RefUnwindSafe for ClaimGroup<F>where
F: RefUnwindSafe,
impl<F> Send for ClaimGroup<F>
impl<F> Sync for ClaimGroup<F>
impl<F> Unpin for ClaimGroup<F>where
F: Unpin,
impl<F> UnwindSafe for ClaimGroup<F>where
F: UnwindSafe,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§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§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.