Struct halo2_frontend::plonk::circuit::constraint_system::ConstraintSystem
source · pub struct ConstraintSystem<F: Field> { /* private fields */ }
Expand description
This is a description of the circuit environment, such as the gate, column and permutation arrangements.
Implementations§
source§impl<F: Field> ConstraintSystem<F>
impl<F: Field> ConstraintSystem<F>
sourcepub fn enable_constant(&mut self, column: Column<Fixed>)
pub fn enable_constant(&mut self, column: Column<Fixed>)
Enables this fixed column to be used for global constant assignments.
§Side-effects
The column will be equality-enabled.
sourcepub fn enable_equality<C: Into<Column<Any>>>(&mut self, column: C)
pub fn enable_equality<C: Into<Column<Any>>>(&mut self, column: C)
Enable the ability to enforce equality over cells in this column
sourcepub fn lookup<S: AsRef<str>>(
&mut self,
name: S,
table_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, TableColumn)>
) -> usize
pub fn lookup<S: AsRef<str>>( &mut self, name: S, table_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, TableColumn)> ) -> usize
Add a lookup argument for some input expressions and table columns.
table_map
returns a map between input expressions and the table columns
they need to match.
sourcepub fn lookup_any<S: AsRef<str>>(
&mut self,
name: S,
table_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, Expression<F>)>
) -> usize
pub fn lookup_any<S: AsRef<str>>( &mut self, name: S, table_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, Expression<F>)> ) -> usize
Add a lookup argument for some input expressions and table expressions.
table_map
returns a map between input expressions and the table expressions
they need to match.
NOTE:
We should use extra Fixed
column or Selector
for tagging the table rows.
Also, it is needed to include a pair of tagging expressions([lookup_activator, table_activator]
) in the table_map
.
Otherwise, we have soundness error.(See here)
For correct use, please reference
here
and here.
sourcepub fn shuffle<S: AsRef<str>>(
&mut self,
name: S,
shuffle_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, Expression<F>)>
) -> usize
pub fn shuffle<S: AsRef<str>>( &mut self, name: S, shuffle_map: impl FnOnce(&mut VirtualCells<'_, F>) -> Vec<(Expression<F>, Expression<F>)> ) -> usize
Add a shuffle argument for some input expressions and table expressions.
pub fn get_any_query_index(&self, column: Column<Any>, at: Rotation) -> usize
sourcepub fn set_minimum_degree(&mut self, degree: usize)
pub fn set_minimum_degree(&mut self, degree: usize)
Sets the minimum degree required by the circuit, which can be set to a larger amount than actually needed. This can be used, for example, to force the permutation argument to involve more columns in the same set.
sourcepub fn create_gate<C: Into<Constraint<F>>, Iter: IntoIterator<Item = C>, S: AsRef<str>>(
&mut self,
name: S,
constraints: impl FnOnce(&mut VirtualCells<'_, F>) -> Iter
)
pub fn create_gate<C: Into<Constraint<F>>, Iter: IntoIterator<Item = C>, S: AsRef<str>>( &mut self, name: S, constraints: impl FnOnce(&mut VirtualCells<'_, F>) -> Iter )
Creates a new gate.
§Panics
A gate is required to contain polynomial constraints. This method will panic if
constraints
returns an empty iterator.
sourcepub fn compress_selectors(
self,
selectors: Vec<Vec<bool>>
) -> (Self, Vec<Vec<F>>)
pub fn compress_selectors( self, selectors: Vec<Vec<bool>> ) -> (Self, Vec<Vec<F>>)
This will compress selectors together depending on their provided
assignments. This ConstraintSystem
will then be modified to add new
fixed columns (representing the actual selectors) and will return the
polynomials for those columns. Finally, an internal map is updated to
find which fixed column corresponds with a given Selector
.
Do not call this twice. Yes, this should be a builder pattern instead.
sourcepub fn directly_convert_selectors_to_fixed(
self,
selectors: Vec<Vec<bool>>
) -> (Self, Vec<Vec<F>>)
pub fn directly_convert_selectors_to_fixed( self, selectors: Vec<Vec<bool>> ) -> (Self, Vec<Vec<F>>)
Does not combine selectors and directly replaces them everywhere with fixed columns.
sourcepub fn selector(&mut self) -> Selector
pub fn selector(&mut self) -> Selector
Allocate a new (simple) selector. Simple selectors cannot be added to expressions nor multiplied by other expressions containing simple selectors. Also, simple selectors may not appear in lookup argument inputs.
sourcepub fn complex_selector(&mut self) -> Selector
pub fn complex_selector(&mut self) -> Selector
Allocate a new complex selector that can appear anywhere within expressions.
sourcepub fn lookup_table_column(&mut self) -> TableColumn
pub fn lookup_table_column(&mut self) -> TableColumn
Allocates a new fixed column that can be used in a lookup table.
sourcepub fn annotate_lookup_column<A, AR>(
&mut self,
column: TableColumn,
annotation: A
)
pub fn annotate_lookup_column<A, AR>( &mut self, column: TableColumn, annotation: A )
Annotate a Lookup column.
sourcepub fn annotate_lookup_any_column<A, AR, T>(&mut self, column: T, annotation: A)
pub fn annotate_lookup_any_column<A, AR, T>(&mut self, column: T, annotation: A)
Annotate an Instance column.
sourcepub fn annotate_column<A, AR, T>(&mut self, column: T, annotation: A)
pub fn annotate_column<A, AR, T>(&mut self, column: T, annotation: A)
Annotate a column.
sourcepub fn fixed_column(&mut self) -> Column<Fixed>
pub fn fixed_column(&mut self) -> Column<Fixed>
Allocate a new fixed column
sourcepub fn unblinded_advice_column(&mut self) -> Column<Advice>
pub fn unblinded_advice_column(&mut self) -> Column<Advice>
Allocate a new unblinded advice column at FirstPhase
sourcepub fn advice_column(&mut self) -> Column<Advice>
pub fn advice_column(&mut self) -> Column<Advice>
Allocate a new advice column at FirstPhase
sourcepub fn unblinded_advice_column_in<P: Phase>(
&mut self,
phase: P
) -> Column<Advice>
pub fn unblinded_advice_column_in<P: Phase>( &mut self, phase: P ) -> Column<Advice>
Allocate a new unblinded advice column in given phase. This allows for the generation of deterministic commitments to advice columns which can be used to split large circuits into smaller ones, whose proofs can then be “joined” together by their common witness commitments.
sourcepub fn advice_column_in<P: Phase>(&mut self, phase: P) -> Column<Advice>
pub fn advice_column_in<P: Phase>(&mut self, phase: P) -> Column<Advice>
Allocate a new advice column in given phase
§Panics
It panics if previous phase before the given one doesn’t have advice column allocated.
sourcepub fn instance_column(&mut self) -> Column<Instance>
pub fn instance_column(&mut self) -> Column<Instance>
Allocate a new instance column
sourcepub fn challenge_usable_after<P: Phase>(&mut self, phase: P) -> Challenge
pub fn challenge_usable_after<P: Phase>(&mut self, phase: P) -> Challenge
Requests a challenge that is usable after the given phase.
§Panics
It panics if the given phase doesn’t have advice column allocated.
sourcepub fn degree(&self) -> usize
pub fn degree(&self) -> usize
Compute the degree of the constraint system (the maximum degree of all constraints).
sourcepub fn blinding_factors(&self) -> usize
pub fn blinding_factors(&self) -> usize
Compute the number of blinding factors necessary to perfectly blind each of the prover’s witness polynomials.
sourcepub fn minimum_rows(&self) -> usize
pub fn minimum_rows(&self) -> usize
Returns the minimum necessary rows that need to exist in order to account for e.g. blinding factors.
sourcepub fn num_fixed_columns(&self) -> usize
pub fn num_fixed_columns(&self) -> usize
Returns number of fixed columns
sourcepub fn num_advice_columns(&self) -> usize
pub fn num_advice_columns(&self) -> usize
Returns number of advice columns
sourcepub fn num_instance_columns(&self) -> usize
pub fn num_instance_columns(&self) -> usize
Returns number of instance columns
sourcepub fn num_selectors(&self) -> usize
pub fn num_selectors(&self) -> usize
Returns number of selectors
sourcepub fn num_challenges(&self) -> usize
pub fn num_challenges(&self) -> usize
Returns number of challenges
sourcepub fn advice_column_phase(&self) -> Vec<u8>
pub fn advice_column_phase(&self) -> Vec<u8>
Returns phase of advice columns
sourcepub fn challenge_phase(&self) -> Vec<u8>
pub fn challenge_phase(&self) -> Vec<u8>
Returns phase of challenges
sourcepub fn general_column_annotations(&self) -> &HashMap<ColumnMid, String>
pub fn general_column_annotations(&self) -> &HashMap<ColumnMid, String>
Returns general column annotations
sourcepub fn permutation(&self) -> &Argument
pub fn permutation(&self) -> &Argument
Returns permutation argument
Trait Implementations§
source§impl<F: Clone + Field> Clone for ConstraintSystem<F>
impl<F: Clone + Field> Clone for ConstraintSystem<F>
source§fn clone(&self) -> ConstraintSystem<F>
fn clone(&self) -> ConstraintSystem<F>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<F: Debug + Field> Debug for ConstraintSystem<F>
impl<F: Debug + Field> Debug for ConstraintSystem<F>
source§impl<F: Field> Default for ConstraintSystem<F>
impl<F: Field> Default for ConstraintSystem<F>
source§fn default() -> ConstraintSystem<F>
fn default() -> ConstraintSystem<F>
source§impl<F: Field> From<ConstraintSystem<F>> for ConstraintSystemMid<F>
impl<F: Field> From<ConstraintSystem<F>> for ConstraintSystemMid<F>
source§fn from(cs: ConstraintSystem<F>) -> Self
fn from(cs: ConstraintSystem<F>) -> Self
Auto Trait Implementations§
impl<F> Freeze for ConstraintSystem<F>
impl<F> RefUnwindSafe for ConstraintSystem<F>where
F: RefUnwindSafe,
impl<F> Send for ConstraintSystem<F>
impl<F> Sync for ConstraintSystem<F>
impl<F> Unpin for ConstraintSystem<F>where
F: Unpin,
impl<F> UnwindSafe for ConstraintSystem<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
§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.