mirror of
https://github.com/arnaucube/hyperplonk.git
synced 2026-01-10 16:11:29 +01:00
arc
This commit is contained in:
@@ -4,19 +4,19 @@ use ark_poly::MultilinearExtension;
|
||||
use ark_std::{end_timer, rand::RngCore, start_timer};
|
||||
#[cfg(feature = "parallel")]
|
||||
use rayon::prelude::{IndexedParallelIterator, IntoParallelRefMutIterator, ParallelIterator};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub use ark_poly::DenseMultilinearExtension;
|
||||
|
||||
/// Sample a random list of multilinear polynomials.
|
||||
/// Returns
|
||||
/// - the list of polynomials,
|
||||
/// - its sum of polynomial evaluations over the boolean hypercube.
|
||||
/// - its sum of polynomial evaluations over the boolean hypeArcube.
|
||||
pub fn random_mle_list<F: PrimeField, R: RngCore>(
|
||||
nv: usize,
|
||||
degree: usize,
|
||||
rng: &mut R,
|
||||
) -> (Vec<Rc<DenseMultilinearExtension<F>>>, F) {
|
||||
) -> (Vec<Arc<DenseMultilinearExtension<F>>>, F) {
|
||||
let start = start_timer!(|| "sample random mle list");
|
||||
let mut multiplicands = Vec::with_capacity(degree);
|
||||
for _ in 0..degree {
|
||||
@@ -37,7 +37,7 @@ pub fn random_mle_list<F: PrimeField, R: RngCore>(
|
||||
|
||||
let list = multiplicands
|
||||
.into_iter()
|
||||
.map(|x| Rc::new(DenseMultilinearExtension::from_evaluations_vec(nv, x)))
|
||||
.map(|x| Arc::new(DenseMultilinearExtension::from_evaluations_vec(nv, x)))
|
||||
.collect();
|
||||
|
||||
end_timer!(start);
|
||||
@@ -49,7 +49,7 @@ pub fn random_zero_mle_list<F: PrimeField, R: RngCore>(
|
||||
nv: usize,
|
||||
degree: usize,
|
||||
rng: &mut R,
|
||||
) -> Vec<Rc<DenseMultilinearExtension<F>>> {
|
||||
) -> Vec<Arc<DenseMultilinearExtension<F>>> {
|
||||
let start = start_timer!(|| "sample random zero mle list");
|
||||
|
||||
let mut multiplicands = Vec::with_capacity(degree);
|
||||
@@ -65,7 +65,7 @@ pub fn random_zero_mle_list<F: PrimeField, R: RngCore>(
|
||||
|
||||
let list = multiplicands
|
||||
.into_iter()
|
||||
.map(|x| Rc::new(DenseMultilinearExtension::from_evaluations_vec(nv, x)))
|
||||
.map(|x| Arc::new(DenseMultilinearExtension::from_evaluations_vec(nv, x)))
|
||||
.collect();
|
||||
|
||||
end_timer!(start);
|
||||
@@ -81,12 +81,12 @@ pub fn identity_permutation<F: PrimeField>(num_vars: usize, num_chunks: usize) -
|
||||
pub fn identity_permutation_mles<F: PrimeField>(
|
||||
num_vars: usize,
|
||||
num_chunks: usize,
|
||||
) -> Vec<Rc<DenseMultilinearExtension<F>>> {
|
||||
) -> Vec<Arc<DenseMultilinearExtension<F>>> {
|
||||
let mut res = vec![];
|
||||
for i in 0..num_chunks {
|
||||
let shift = (i * (1 << num_vars)) as u64;
|
||||
let s_id_vec = (shift..shift + (1u64 << num_vars)).map(F::from).collect();
|
||||
res.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
res.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars, s_id_vec,
|
||||
)));
|
||||
}
|
||||
@@ -113,12 +113,12 @@ pub fn random_permutation_mles<F: PrimeField, R: RngCore>(
|
||||
num_vars: usize,
|
||||
num_chunks: usize,
|
||||
rng: &mut R,
|
||||
) -> Vec<Rc<DenseMultilinearExtension<F>>> {
|
||||
) -> Vec<Arc<DenseMultilinearExtension<F>>> {
|
||||
let s_perm_vec = random_permutation(num_vars, num_chunks, rng);
|
||||
let mut res = vec![];
|
||||
let n = 1 << num_vars;
|
||||
for i in 0..num_chunks {
|
||||
res.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
res.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars,
|
||||
s_perm_vec[i * n..i * n + n].to_vec(),
|
||||
)));
|
||||
@@ -203,8 +203,8 @@ fn fix_variables_no_par<F: Field>(
|
||||
/// merge a set of polynomials. Returns an error if the
|
||||
/// polynomials do not share a same number of nvs.
|
||||
pub fn merge_polynomials<F: PrimeField>(
|
||||
polynomials: &[Rc<DenseMultilinearExtension<F>>],
|
||||
) -> Result<Rc<DenseMultilinearExtension<F>>, ArithErrors> {
|
||||
polynomials: &[Arc<DenseMultilinearExtension<F>>],
|
||||
) -> Result<Arc<DenseMultilinearExtension<F>>, ArithErrors> {
|
||||
let nv = polynomials[0].num_vars();
|
||||
for poly in polynomials.iter() {
|
||||
if nv != poly.num_vars() {
|
||||
@@ -220,7 +220,7 @@ pub fn merge_polynomials<F: PrimeField>(
|
||||
scalars.extend_from_slice(poly.to_evaluations().as_slice());
|
||||
}
|
||||
scalars.extend_from_slice(vec![F::zero(); (1 << merged_nv) - scalars.len()].as_ref());
|
||||
Ok(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
Ok(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
merged_nv, scalars,
|
||||
)))
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ use ark_std::{
|
||||
start_timer,
|
||||
};
|
||||
use rayon::prelude::*;
|
||||
use std::{cmp::max, collections::HashMap, marker::PhantomData, ops::Add, rc::Rc};
|
||||
use std::{cmp::max, collections::HashMap, marker::PhantomData, ops::Add, sync::Arc};
|
||||
|
||||
#[rustfmt::skip]
|
||||
/// A virtual polynomial is a sum of products of multilinear polynomials;
|
||||
@@ -48,7 +48,7 @@ pub struct VirtualPolynomial<F: PrimeField> {
|
||||
pub products: Vec<(F, Vec<usize>)>,
|
||||
/// Stores multilinear extensions in which product multiplicand can refer
|
||||
/// to.
|
||||
pub flattened_ml_extensions: Vec<Rc<DenseMultilinearExtension<F>>>,
|
||||
pub flattened_ml_extensions: Vec<Arc<DenseMultilinearExtension<F>>>,
|
||||
/// Pointers to the above poly extensions
|
||||
raw_pointers_lookup_table: HashMap<*const DenseMultilinearExtension<F>, usize>,
|
||||
}
|
||||
@@ -71,7 +71,7 @@ impl<F: PrimeField> Add for &VirtualPolynomial<F> {
|
||||
let start = start_timer!(|| "virtual poly add");
|
||||
let mut res = self.clone();
|
||||
for products in other.products.iter() {
|
||||
let cur: Vec<Rc<DenseMultilinearExtension<F>>> = products
|
||||
let cur: Vec<Arc<DenseMultilinearExtension<F>>> = products
|
||||
.1
|
||||
.iter()
|
||||
.map(|&x| other.flattened_ml_extensions[x].clone())
|
||||
@@ -102,8 +102,8 @@ impl<F: PrimeField> VirtualPolynomial<F> {
|
||||
}
|
||||
|
||||
/// Creates an new virtual polynomial from a MLE and its coefficient.
|
||||
pub fn new_from_mle(mle: &Rc<DenseMultilinearExtension<F>>, coefficient: F) -> Self {
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Rc::as_ptr(mle);
|
||||
pub fn new_from_mle(mle: &Arc<DenseMultilinearExtension<F>>, coefficient: F) -> Self {
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Arc::as_ptr(mle);
|
||||
let mut hm = HashMap::new();
|
||||
hm.insert(mle_ptr, 0);
|
||||
|
||||
@@ -129,10 +129,10 @@ impl<F: PrimeField> VirtualPolynomial<F> {
|
||||
/// `coefficient`.
|
||||
pub fn add_mle_list(
|
||||
&mut self,
|
||||
mle_list: impl IntoIterator<Item = Rc<DenseMultilinearExtension<F>>>,
|
||||
mle_list: impl IntoIterator<Item = Arc<DenseMultilinearExtension<F>>>,
|
||||
coefficient: F,
|
||||
) -> Result<(), ArithErrors> {
|
||||
let mle_list: Vec<Rc<DenseMultilinearExtension<F>>> = mle_list.into_iter().collect();
|
||||
let mle_list: Vec<Arc<DenseMultilinearExtension<F>>> = mle_list.into_iter().collect();
|
||||
let mut indexed_product = Vec::with_capacity(mle_list.len());
|
||||
|
||||
if mle_list.is_empty() {
|
||||
@@ -151,7 +151,7 @@ impl<F: PrimeField> VirtualPolynomial<F> {
|
||||
)));
|
||||
}
|
||||
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Rc::as_ptr(&mle);
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Arc::as_ptr(&mle);
|
||||
if let Some(index) = self.raw_pointers_lookup_table.get(&mle_ptr) {
|
||||
indexed_product.push(*index)
|
||||
} else {
|
||||
@@ -171,7 +171,7 @@ impl<F: PrimeField> VirtualPolynomial<F> {
|
||||
/// Returns an error if the MLE has a different `num_vars` from self.
|
||||
pub fn mul_by_mle(
|
||||
&mut self,
|
||||
mle: Rc<DenseMultilinearExtension<F>>,
|
||||
mle: Arc<DenseMultilinearExtension<F>>,
|
||||
coefficient: F,
|
||||
) -> Result<(), ArithErrors> {
|
||||
let start = start_timer!(|| "mul by mle");
|
||||
@@ -183,7 +183,7 @@ impl<F: PrimeField> VirtualPolynomial<F> {
|
||||
)));
|
||||
}
|
||||
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Rc::as_ptr(&mle);
|
||||
let mle_ptr: *const DenseMultilinearExtension<F> = Arc::as_ptr(&mle);
|
||||
|
||||
// check if this mle already exists in the virtual polynomial
|
||||
let mle_index = match self.raw_pointers_lookup_table.get(&mle_ptr) {
|
||||
@@ -350,11 +350,11 @@ pub fn eq_eval<F: PrimeField>(x: &[F], y: &[F]) -> Result<F, ArithErrors> {
|
||||
/// eq(x,y) = \prod_i=1^num_var (x_i * r_i + (1-x_i)*(1-r_i))
|
||||
pub fn build_eq_x_r<F: PrimeField>(
|
||||
r: &[F],
|
||||
) -> Result<Rc<DenseMultilinearExtension<F>>, ArithErrors> {
|
||||
) -> Result<Arc<DenseMultilinearExtension<F>>, ArithErrors> {
|
||||
let evals = build_eq_x_r_vec(r)?;
|
||||
let mle = DenseMultilinearExtension::from_evaluations_vec(r.len(), evals);
|
||||
|
||||
Ok(Rc::new(mle))
|
||||
Ok(Arc::new(mle))
|
||||
}
|
||||
/// This function build the eq(x, r) polynomial for any given r, and output the
|
||||
/// evaluation of eq(x, r) in its vector form.
|
||||
@@ -511,7 +511,7 @@ mod test {
|
||||
// eq(x,y) = \prod_i=1^num_var (x_i * y_i + (1-x_i)*(1-y_i))
|
||||
// over r, which is
|
||||
// eq(x,y) = \prod_i=1^num_var (x_i * r_i + (1-x_i)*(1-r_i))
|
||||
fn build_eq_x_r_for_test<F: PrimeField>(r: &[F]) -> Rc<DenseMultilinearExtension<F>> {
|
||||
fn build_eq_x_r_for_test<F: PrimeField>(r: &[F]) -> Arc<DenseMultilinearExtension<F>> {
|
||||
let start = start_timer!(|| "zero check naive build eq_x_r");
|
||||
|
||||
// we build eq(x,r) from its evaluations
|
||||
@@ -545,7 +545,7 @@ mod test {
|
||||
|
||||
let mle = DenseMultilinearExtension::from_evaluations_vec(num_var, eval);
|
||||
|
||||
let res = Rc::new(mle);
|
||||
let res = Arc::new(mle);
|
||||
end_timer!(start);
|
||||
res
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user