pub struct GateLayer<F: Field> {
pub layer_id: LayerId,
pub num_dataparallel_vars: usize,
pub nonzero_gates: Vec<(u32, u32, u32)>,
pub lhs: DenseMle<F>,
pub rhs: DenseMle<F>,
pub phase_1_mles: Option<Vec<Vec<DenseMle<F>>>>,
pub phase_2_mles: Option<Vec<Vec<DenseMle<F>>>>,
pub gate_operation: BinaryOperation,
beta_g2_vec: Option<Vec<BetaValues<F>>>,
g_vec: Option<Vec<Vec<F>>>,
num_rounds_phase1: usize,
}Expand description
Generic gate struct – the binary operation performed by the gate is specified by
the gate_operation parameter. Additionally, the number of dataparallel variables
is specified by num_dataparallel_vars in order to account for batched and un-batched
gates.
Fields§
§layer_id: LayerIdThe layer id associated with this gate layer.
num_dataparallel_vars: usizeThe number of bits representing the number of “dataparallel” copies of the circuit.
nonzero_gates: Vec<(u32, u32, u32)>A vector of tuples representing the “nonzero” gates, especially useful in the sparse case the format is (z, x, y) where the gate at label z is the output of performing an operation on gates with labels x and y.
lhs: DenseMle<F>The left side of the expression, i.e. the mle that makes up the “x” variables.
rhs: DenseMle<F>The right side of the expression, i.e. the mle that makes up the “y” variables.
phase_1_mles: Option<Vec<Vec<DenseMle<F>>>>The mles that are constructed when initializing phase 1 (binding the x variables).
phase_2_mles: Option<Vec<Vec<DenseMle<F>>>>The mles that are constructed when initializing phase 2 (binding the y variables).
gate_operation: BinaryOperationThe gate operation representing the fan-in-two relationship.
beta_g2_vec: Option<Vec<BetaValues<F>>>the beta table which enumerates the incoming claim’s challenge points on the dataparallel vars of the MLE
g_vec: Option<Vec<Vec<F>>>The incoming claim’s challenge points.
num_rounds_phase1: usizethe number of rounds in phase 1
Implementations§
Source§impl<F: Field> GateLayer<F>
impl<F: Field> GateLayer<F>
Sourcepub fn new(
num_dataparallel_vars: Option<usize>,
nonzero_gates: Vec<(u32, u32, u32)>,
lhs: DenseMle<F>,
rhs: DenseMle<F>,
gate_operation: BinaryOperation,
layer_id: LayerId,
) -> Self
pub fn new( num_dataparallel_vars: Option<usize>, nonzero_gates: Vec<(u32, u32, u32)>, lhs: DenseMle<F>, rhs: DenseMle<F>, gate_operation: BinaryOperation, layer_id: LayerId, ) -> Self
Construct a new gate layer
§Arguments
num_dataparallel_vars: an optional representing the number of bits representing the circuit copy we are looking at.
None if this is not dataparallel, otherwise specify the number of bits
nonzero_gates: the gate wiring between single-copy circuit (as the wiring for each circuit remains the same)
x is the label on the batched mle lhs, y is the label on the batched mle rhs, and z is the label on the next layer, batched
lhs: the flattened mle representing the left side of the summationrhs: the flattened mle representing the right side of the summationgate_operation: which operation the gate is performing. right now, can either be an ‘add’ or ‘mul’ gatelayer_id: the id representing which current layer this is
§Returns
A Gate struct that can now prove and verify rounds
Sourcefn init_phase_1(&mut self, challenges: Vec<F>)
fn init_phase_1(&mut self, challenges: Vec<F>)
Initialize phase 1, or the necessary mles in order to bind the variables in the lhs of the
expression. Once this phase is initialized, the sumcheck rounds binding the “x” variables can
be performed.
fn init_phase_1_rlc(&mut self, challenges: &[&[F]], random_coefficients: &[F])
Sourcefn init_phase_2(&mut self, u_claim: &[F], f_at_u: F, g1_claim_points: &[F])
fn init_phase_2(&mut self, u_claim: &[F], f_at_u: F, g1_claim_points: &[F])
Initialize phase 2, or the necessary mles in order to bind the variables in the rhs of the
expression. Once this phase is initialized, the sumcheck rounds binding the “y” variables can
be performed.
fn init_phase_2_rlc( &mut self, u_claim: &[F], f_at_u: F, g1_claim_points: &[&[F]], random_coefficients: &[F], )
Trait Implementations§
Source§impl<'de, F> Deserialize<'de> for GateLayer<F>where
F: Field,
impl<'de, F> Deserialize<'de> for GateLayer<F>where
F: Field,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<F: Field> Layer<F> for GateLayer<F>
impl<F: Field> Layer<F> for GateLayer<F>
Source§fn prove(
&mut self,
claims: &[&RawClaim<F>],
transcript_writer: &mut impl ProverTranscript<F>,
) -> Result<()>
fn prove( &mut self, claims: &[&RawClaim<F>], transcript_writer: &mut impl ProverTranscript<F>, ) -> Result<()>
claims for this layer. There is only a single
aggregated claim if our
[shared_types::config::ClaimAggregationStrategy] is
[shared_types::config::ClaimAggregationStrategy::Interpolative],
otherwise we have several claims we take the random linear
combination over. Read moreSource§fn initialize(&mut self, claim_point: &[F]) -> Result<()>
fn initialize(&mut self, claim_point: &[F]) -> Result<()>
Source§fn initialize_rlc(
&mut self,
_random_coefficients: &[F],
claims: &[&RawClaim<F>],
)
fn initialize_rlc( &mut self, _random_coefficients: &[F], claims: &[&RawClaim<F>], )
Source§fn compute_round_sumcheck_message(
&mut self,
round_index: usize,
random_coefficients: &[F],
) -> Result<Vec<F>>
fn compute_round_sumcheck_message( &mut self, round_index: usize, random_coefficients: &[F], ) -> Result<Vec<F>>
Source§fn bind_round_variable(
&mut self,
round_index: usize,
challenge: F,
) -> Result<()>
fn bind_round_variable( &mut self, round_index: usize, challenge: F, ) -> Result<()>
challenge to the bit.
labeled with that round_index.Source§fn sumcheck_round_indices(&self) -> Vec<usize>
fn sumcheck_round_indices(&self) -> Vec<usize>
Source§fn max_degree(&self) -> usize
fn max_degree(&self) -> usize
Source§fn get_post_sumcheck_layer(
&self,
round_challenges: &[F],
claim_challenges: &[&[F]],
random_coefficients: &[F],
) -> PostSumcheckLayer<F, F>
fn get_post_sumcheck_layer( &self, round_challenges: &[F], claim_challenges: &[&[F]], random_coefficients: &[F], ) -> PostSumcheckLayer<F, F>
Auto Trait Implementations§
impl<F> Freeze for GateLayer<F>where
F: Freeze,
impl<F> RefUnwindSafe for GateLayer<F>where
F: RefUnwindSafe,
impl<F> Send for GateLayer<F>
impl<F> Sync for GateLayer<F>
impl<F> Unpin for GateLayer<F>where
F: Unpin,
impl<F> UnwindSafe for GateLayer<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.