Skip to main content

DenseMultilinearExtension

Struct DenseMultilinearExtension 

Source
pub struct DenseMultilinearExtension<F: Field> {
    pub evaluations: Vec<F>,
    pub num_vars: usize,
}
Expand description

Stores a multilinear polynomial in dense evaluation form.

Fields§

§evaluations: Vec<F>

The evaluation over {0,1}^num_vars

§num_vars: usize

Number of variables

Implementations§

Source§

impl<F: Field> DenseMultilinearExtension<F>

Source

pub fn from_evaluations_slice(num_vars: usize, evaluations: &[F]) -> Self

Construct a new polynomial from a list of evaluations where the index represents a point in {0,1}^num_vars in little endian form. For example, 0b1011 represents P(1,1,0,1)

Source

pub fn from_evaluations_vec(num_vars: usize, evaluations: Vec<F>) -> Self

Construct a new polynomial from a list of evaluations where the index represents a point in {0,1}^num_vars in little endian form. For example, 0b1011 represents P(1,1,0,1).

§Example
use ark_test_curves::bls12_381::Fr;
use ark_poly::{MultilinearExtension, Polynomial, DenseMultilinearExtension};

// Construct a 2-variate MLE, which takes value 1 at (x_0, x_1) = (0, 1)
// (i.e. 0b01, or index 2 in little endian)
// f1(x_0, x_1) = x_1*(1-x_0)
let mle = DenseMultilinearExtension::from_evaluations_vec(
    2, vec![0, 0, 1, 0].iter().map(|x| Fr::from(*x as u64)).collect()
);
let eval = mle.evaluate(&vec![Fr::from(-2), Fr::from(17)]); // point = (x_0, x_1)
assert_eq!(eval, Fr::from(51));
Source

pub fn relabel_in_place(&mut self, a: usize, b: usize, k: usize)

Relabel the point in place by switching k scalars from position a to position b, and from position b to position a in vector.

This function turns P(x_1,...,x_a,...,x_{a+k - 1},...,x_b,...,x_{b+k - 1},...,x_n) to P(x_1,...,x_b,...,x_{b+k - 1},...,x_a,...,x_{a+k - 1},...,x_n)

Source

pub fn iter(&self) -> Iter<'_, F>

Returns an iterator that iterates over the evaluations over {0,1}^num_vars

Source

pub fn iter_mut(&mut self) -> IterMut<'_, F>

Returns a mutable iterator that iterates over the evaluations over {0,1}^num_vars

Source

pub fn concat(polys: impl IntoIterator<Item = impl AsRef<Self>> + Clone) -> Self

Concatenate the evaluation tables of multiple polynomials. If the combined table size is not a power of two, pad the table with zeros.

§Example
use ark_test_curves::bls12_381::Fr;
use ark_poly::{MultilinearExtension, Polynomial, DenseMultilinearExtension};
use ark_ff::One;

// Construct a 2-variate multilinear polynomial f1
// f1(x_0, x_1) = 2*(1-x_1)*(1-x_0) + 3*(1-x_1)*x_0 + 2*x_1*(1-x_0) + 6*x_1*x_0
let mle_1 = DenseMultilinearExtension::from_evaluations_vec(
    2, vec![2, 3, 2, 6].iter().map(|x| Fr::from(*x as u64)).collect()
);
// Construct another 2-variate MLE f2
// f2(x_0, x_1) = 1*x_1*x_0
let mle_2 = DenseMultilinearExtension::from_evaluations_vec(
  2, vec![0, 0, 0, 1].iter().map(|x| Fr::from(*x as u64)).collect()
);
let mle = DenseMultilinearExtension::concat(&[&mle_1, &mle_2]);
// The resulting polynomial is 3-variate:
// f3(x_0, x_1, x_2) = (1 - x_2)*f1(x_0, x_1) + x_2*f2(x_0, x_1)
// Evaluate it at a random point (1, 17, 3)
let point = vec![Fr::one(), Fr::from(17), Fr::from(3)];
let eval_1 = mle_1.evaluate(&point[..2].to_vec());
let eval_2 = mle_2.evaluate(&point[..2].to_vec());
let eval_combined = mle.evaluate(&point);

assert_eq!(eval_combined, (Fr::one() - point[2]) * eval_1 + point[2] * eval_2);

Trait Implementations§

Source§

impl<'a, F: Field> Add<&'a DenseMultilinearExtension<F>> for &DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the + operator.
Source§

fn add(self, rhs: &'a DenseMultilinearExtension<F>) -> Self::Output

Performs the + operation. Read more
Source§

impl<F: Field> Add for DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the + operator.
Source§

fn add(self, other: Self) -> Self

Performs the + operation. Read more
Source§

impl<'a, F: Field> AddAssign<&'a DenseMultilinearExtension<F>> for DenseMultilinearExtension<F>

Source§

fn add_assign(&mut self, other: &'a Self)

Performs the += operation. Read more
Source§

impl<'a, F: Field> AddAssign<(F, &'a DenseMultilinearExtension<F>)> for DenseMultilinearExtension<F>

Source§

fn add_assign(&mut self, (f, other): (F, &'a Self))

Performs the += operation. Read more
Source§

impl<F: Field> AddAssign for DenseMultilinearExtension<F>

Source§

fn add_assign(&mut self, other: Self)

Performs the += operation. Read more
Source§

impl<F: Field> AsRef<DenseMultilinearExtension<F>> for DenseMultilinearExtension<F>

Source§

fn as_ref(&self) -> &Self

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<F: Field> CanonicalDeserialize for DenseMultilinearExtension<F>

Source§

fn deserialize_with_mode<R: Read>( reader: R, compress: Compress, validate: Validate, ) -> Result<Self, SerializationError>

The general deserialize method that takes in customization flags.
Source§

fn deserialize_compressed<R>(reader: R) -> Result<Self, SerializationError>
where R: Read,

Reads Self from reader using the compressed form if applicable. Performs validation if applicable.
Source§

fn deserialize_compressed_unchecked<R>( reader: R, ) -> Result<Self, SerializationError>
where R: Read,

Reads Self from reader using the compressed form if applicable, without validating the deserialized value. Read more
Source§

fn deserialize_uncompressed<R>(reader: R) -> Result<Self, SerializationError>
where R: Read,

Reads Self from reader using the uncompressed form. Performs validation if applicable.
Source§

fn deserialize_uncompressed_unchecked<R>( reader: R, ) -> Result<Self, SerializationError>
where R: Read,

Reads Self from reader using the uncompressed form, without validating the deserialized value. Read more
Source§

impl<F: Field> CanonicalSerialize for DenseMultilinearExtension<F>

Source§

fn serialize_with_mode<W: Write>( &self, writer: W, compress: Compress, ) -> Result<(), SerializationError>

The general serialize method that takes in customization flags.
Source§

fn serialized_size(&self, compress: Compress) -> usize

Returns the size in bytes of the serialized version of self with the given compression mode.
Source§

fn serialize_compressed<W>(&self, writer: W) -> Result<(), SerializationError>
where W: Write,

Serializes self into writer using the compressed form if applicable.
Source§

fn compressed_size(&self) -> usize

Returns the size in bytes of the compressed serialized version of self.
Source§

fn serialize_uncompressed<W>(&self, writer: W) -> Result<(), SerializationError>
where W: Write,

Serializes self into writer using the uncompressed form.
Source§

fn uncompressed_size(&self) -> usize

Returns the size in bytes of the uncompressed serialized version of self.
Source§

impl<F: Clone + Field> Clone for DenseMultilinearExtension<F>

Source§

fn clone(&self) -> DenseMultilinearExtension<F>

Returns a duplicate 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<F: Field> Debug for DenseMultilinearExtension<F>

Source§

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

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

impl<F: Default + Field> Default for DenseMultilinearExtension<F>

Source§

fn default() -> DenseMultilinearExtension<F>

Returns the “default value” for a type. Read more
Source§

impl<F: Hash + Field> Hash for DenseMultilinearExtension<F>

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<F: Field> Index<usize> for DenseMultilinearExtension<F>

Source§

fn index(&self, index: usize) -> &Self::Output

Returns the evaluation of the polynomial at a point represented by index.

Index represents a vector in {0,1}^num_vars in little endian form. For example, 0b1011 represents P(1,1,0,1)

For dense multilinear polynomial, index takes constant time.

Source§

type Output = F

The returned type after indexing.
Source§

impl<'a, F: Field> IntoIterator for &'a DenseMultilinearExtension<F>

Source§

type IntoIter = Iter<'a, F>

Which kind of iterator are we turning this into?
Source§

type Item = &'a F

The type of the elements being iterated over.
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl<'a, F: Field> IntoIterator for &'a mut DenseMultilinearExtension<F>

Source§

type IntoIter = IterMut<'a, F>

Which kind of iterator are we turning this into?
Source§

type Item = &'a mut F

The type of the elements being iterated over.
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl<'a, F: Field> Mul<&'a F> for &DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the * operator.
Source§

fn mul(self, scalar: &'a F) -> Self::Output

Performs the * operation. Read more
Source§

impl<F: Field> Mul<F> for DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the * operator.
Source§

fn mul(self, scalar: F) -> Self::Output

Performs the * operation. Read more
Source§

impl<'a, F: Field> MulAssign<&'a F> for DenseMultilinearExtension<F>

Source§

fn mul_assign(&mut self, scalar: &'a F)

Performs the *= operation. Read more
Source§

impl<F: Field> MulAssign<F> for DenseMultilinearExtension<F>

Source§

fn mul_assign(&mut self, scalar: F)

Performs the *= operation. Read more
Source§

impl<F: Field> MultilinearExtension<F> for DenseMultilinearExtension<F>

Source§

fn fix_variables(&self, partial_point: &[F]) -> Self

Return the MLE resulting from binding the first variables of self to the values in partial_point (from left to right).

Note: this method can be used in combination with relabel or relabel_in_place to bind variables at arbitrary positions.

use ark_test_curves::bls12_381::Fr;

// Constructing the two-variate multilinear polynomial x_0 + 2 * x_1 + 3 * x_0 * x_1
// by specifying its evaluations at [00, 10, 01, 11]
let mle = DenseMultilinearExtension::from_evaluations_vec(
    2, vec![0, 1, 2, 6].iter().map(|x| Fr::from(*x as u64)).collect()
);

// Bind the first variable of the MLE, x_0, to the value 5, resulting in
// a new polynomial in one variable: 5 + 17 * x
let bound = mle.fix_variables(&[Fr::from(5)]);

assert_eq!(bound.to_evaluations(), vec![Fr::from(5), Fr::from(22)]);

}

Source§

fn num_vars(&self) -> usize

Returns the number of variables in self
Source§

fn rand<R: Rng>(num_vars: usize, rng: &mut R) -> Self

Outputs an l-variate multilinear extension where value of evaluations are sampled uniformly at random.
Source§

fn relabel(&self, a: usize, b: usize, k: usize) -> Self

Relabel the point by swapping k scalars from positions a..a+k to positions b..b+k, and from position b..b+k to position a..a+k in vector. Read more
Source§

fn to_evaluations(&self) -> Vec<F>

Returns a list of evaluations over the domain, which is the boolean hypercube. The evaluations are in little-endian order.
Source§

impl<F: Field> Neg for DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the - operator.
Source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
Source§

impl<F: PartialEq + Field> PartialEq for DenseMultilinearExtension<F>

Source§

fn eq(&self, other: &DenseMultilinearExtension<F>) -> 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<F: Field> Polynomial<F> for DenseMultilinearExtension<F>

Source§

fn evaluate(&self, point: &Self::Point) -> F

Evaluate the dense MLE at the given point

§Example
use ark_test_curves::bls12_381::Fr;

// The two-variate polynomial p = x_0 + 3 * x_0 * x_1 + 2 evaluates to [2, 3, 2, 6]
// in the two-dimensional hypercube with points [00, 10, 01, 11]:
// p(x_0, x_1) = 2*(1-x_1)*(1-x_0) + 3*(1-x_1)*x_0 + 2*x_1*(1-x_0) + 6*x_1*x_0
let mle = DenseMultilinearExtension::from_evaluations_vec(
    2, vec![2, 3, 2, 6].iter().map(|x| Fr::from(*x as u64)).collect()
);

// By the uniqueness of MLEs, `mle` is precisely the above polynomial, which
// takes the value 54 at the point (x_0, x_1) = (1, 17)
let eval = mle.evaluate(&[Fr::one(), Fr::from(17)].into());
assert_eq!(eval, Fr::from(54));
Source§

type Point = Vec<F>

The type of evaluation points for this polynomial.
Source§

fn degree(&self) -> usize

Returns the total degree of the polynomial
Source§

impl<'a, F: Field> Sub<&'a DenseMultilinearExtension<F>> for &DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the - operator.
Source§

fn sub(self, rhs: &'a DenseMultilinearExtension<F>) -> Self::Output

Performs the - operation. Read more
Source§

impl<F: Field> Sub for DenseMultilinearExtension<F>

Source§

type Output = DenseMultilinearExtension<F>

The resulting type after applying the - operator.
Source§

fn sub(self, other: Self) -> Self

Performs the - operation. Read more
Source§

impl<'a, F: Field> SubAssign<&'a DenseMultilinearExtension<F>> for DenseMultilinearExtension<F>

Source§

fn sub_assign(&mut self, other: &'a Self)

Performs the -= operation. Read more
Source§

impl<F: Field> SubAssign for DenseMultilinearExtension<F>

Source§

fn sub_assign(&mut self, other: Self)

Performs the -= operation. Read more
Source§

impl<F: Field> Valid for DenseMultilinearExtension<F>

Source§

const TRIVIAL_CHECK: bool

Whether the check method is trivial (i.e. always returns Ok(())). If this is true, the batch_check method will skip all checks and return Ok(()). This should be set to true for types where check is trivial, e.g. integers, field elements, etc. This is false by default. This is primarily an optimization to skip unnecessary checks in batch_check.
Source§

fn check(&self) -> Result<(), SerializationError>

Checks whether self is valid. If self is valid, returns Ok(()). Otherwise, returns an error describing the failure. This method is called by deserialize_with_mode if validate is Validate::Yes.
Source§

fn batch_check<'a>( batch: impl Iterator<Item = &'a Self> + Send, ) -> Result<(), SerializationError>
where Self: 'a,

Checks whether all items in batch are valid. If all items are valid, returns Ok(()). Otherwise, returns an error describing the first failure.
Source§

impl<F: Field> Zero for DenseMultilinearExtension<F>

Source§

fn zero() -> Self

Returns the additive identity element of Self, 0. Read more
Source§

fn is_zero(&self) -> bool

Returns true if self is equal to the additive identity.
Source§

fn set_zero(&mut self)

Sets self to the additive identity element of Self, 0.
Source§

impl<F: Eq + Field> Eq for DenseMultilinearExtension<F>

Source§

impl<F: Field> StructuralPartialEq for DenseMultilinearExtension<F>

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> CanonicalSerializeHashExt for T

Source§

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

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

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. 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> 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, 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