triton_constraint_circuit

Struct ConstraintCircuitMonad

Source
pub struct ConstraintCircuitMonad<II: InputIndicator> {
    pub circuit: Rc<RefCell<ConstraintCircuit<II>>>,
    pub builder: ConstraintCircuitBuilder<II>,
}
Expand description

ConstraintCircuit with extra context pertaining to the whole multicircuit.

This context is needed to ensure that two equal nodes (meaning: same expression) are not added to the multicircuit. It also enables a rudimentary check for node equivalence (commutation + constant folding), in which case the existing expression is used instead.

One can create new instances of ConstraintCircuitMonad by applying arithmetic operations to existing instances, e.g., let c = a * b;.

Fields§

§circuit: Rc<RefCell<ConstraintCircuit<II>>>§builder: ConstraintCircuitBuilder<II>

Implementations§

Source§

impl<II: InputIndicator> ConstraintCircuitMonad<II>

Source

pub fn consume(&self) -> ConstraintCircuit<II>

Unwrap a ConstraintCircuitMonad to reveal its inner ConstraintCircuit

Source

pub fn lower_to_degree( multicircuit: &mut [Self], info: DegreeLoweringInfo, ) -> (Vec<Self>, Vec<Self>)

Lower the degree of a given multicircuit to the target degree. This is achieved by introducing additional variables and constraints. The appropriate substitutions are applied to the given multicircuit. The target degree must be greater than 1.

The new constraints are returned as two vector of ConstraintCircuitMonads: the first corresponds to main columns and constraints, the second to auxiliary columns and constraints. The modifications are applied to the function argument in-place.

Each returned constraint is guaranteed to correspond to some CircuitExpression::BinaryOperation(BinOp::Sub, lhs, rhs) where

  • lhs is the new variable, and
  • rhs is the (sub)circuit replaced by lhs. These can then be used to construct new columns, as well as derivation rules for filling those new columns.

For example, starting with the constraint set {x^4}, we insert {y - x^2} and modify in-place (x^4) –> (y^2).

The highest index of main and auxiliary columns used by the multicircuit have to be provided. The uniqueness of the new columns’ indices depends on these provided values. Note that these indices are generally not equal to the number of used columns, especially when a tables’ constraints are built using the master table’s column indices.

Source

pub fn all_nodes_in_multicircuit( multicircuit: &[ConstraintCircuit<II>], ) -> Vec<ConstraintCircuit<II>>

Returns all nodes used in the multicircuit. This is distinct from ConstraintCircuitBuilder::all_nodes because it

  1. only considers nodes used in the given multicircuit, not all nodes in the builder,
  2. returns the nodes as ConstraintCircuits, not as ConstraintCircuitMonads, and
  3. keeps duplicates, allowing to count how often a node occurs.
Source

pub fn num_visible_nodes(constraints: &[Self]) -> usize

Counts the number of nodes in this multicircuit. Only counts nodes that are used; not nodes that have been forgotten.

Source

pub fn multicircuit_degree(multicircuit: &[ConstraintCircuitMonad<II>]) -> isize

Returns the maximum degree of all circuits in the multicircuit.

Trait Implementations§

Source§

impl<II: InputIndicator> Add for ConstraintCircuitMonad<II>

Source§

type Output = ConstraintCircuitMonad<II>

The resulting type after applying the + operator.
Source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
Source§

impl<'a, II: InputIndicator + Arbitrary<'a>> Arbitrary<'a> for ConstraintCircuitMonad<II>

Source§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>

Generate an arbitrary value of Self from the given unstructured data. Read more
Source§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>

Generate an arbitrary value of Self from the entirety of the given unstructured data. Read more
Source§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type needs to construct itself. Read more
Source§

fn try_size_hint( depth: usize, ) -> Result<(usize, Option<usize>), MaxRecursionReached>

Get a size hint for how many bytes out of an Unstructured this type needs to construct itself. Read more
Source§

impl<II: Clone + InputIndicator> Clone for ConstraintCircuitMonad<II>

Source§

fn clone(&self) -> ConstraintCircuitMonad<II>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<II: InputIndicator> Debug for ConstraintCircuitMonad<II>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl<II: InputIndicator> Display for ConstraintCircuitMonad<II>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult

Formats the value using the given formatter. Read more
Source§

impl<II: InputIndicator> Hash for ConstraintCircuitMonad<II>

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<II: InputIndicator> Mul for ConstraintCircuitMonad<II>

Source§

type Output = ConstraintCircuitMonad<II>

The resulting type after applying the * operator.
Source§

fn mul(self, rhs: Self) -> Self::Output

Performs the * operation. Read more
Source§

impl<II: InputIndicator> Neg for ConstraintCircuitMonad<II>

Source§

type Output = ConstraintCircuitMonad<II>

The resulting type after applying the - operator.
Source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
Source§

impl<II: InputIndicator> PartialEq for ConstraintCircuitMonad<II>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<II: InputIndicator> Sub for ConstraintCircuitMonad<II>

Source§

type Output = ConstraintCircuitMonad<II>

The resulting type after applying the - operator.
Source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
Source§

impl<II: InputIndicator> Sum for ConstraintCircuitMonad<II>

This will panic if the iterator is empty because the neutral element needs a unique ID, and we have no way of getting that here.

Source§

fn sum<I: Iterator<Item = Self>>(iter: I) -> Self

Takes an iterator and generates Self from the elements by “summing up” the items.
Source§

impl<II: InputIndicator> Eq for ConstraintCircuitMonad<II>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V