mirror of
https://github.com/arnaucube/hyperplonk.git
synced 2026-01-12 00:51:27 +01:00
arc
This commit is contained in:
@@ -8,7 +8,7 @@ use crate::{
|
||||
use ark_ec::PairingEngine;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
use transcript::IOPTranscript;
|
||||
|
||||
/// A permutation subclaim consists of
|
||||
@@ -95,7 +95,7 @@ where
|
||||
impl<E, PCS> PermutationCheck<E, PCS> for PolyIOP<E::Fr>
|
||||
where
|
||||
E: PairingEngine,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
|
||||
{
|
||||
type PermutationCheckSubClaim = PermutationCheckSubClaim<E, PCS, Self>;
|
||||
type PermutationProof = Self::ProductCheckProof;
|
||||
@@ -192,19 +192,19 @@ mod test {
|
||||
use ark_ec::PairingEngine;
|
||||
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
|
||||
use ark_std::test_rng;
|
||||
use std::{marker::PhantomData, rc::Rc};
|
||||
use std::{marker::PhantomData, sync::Arc};
|
||||
|
||||
type KZG = MultilinearKzgPCS<Bls12_381>;
|
||||
|
||||
fn test_permutation_check_helper<E, PCS>(
|
||||
pcs_param: &PCS::ProverParam,
|
||||
fxs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
gxs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
perms: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
fxs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
gxs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
perms: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
) -> Result<(), PolyIOPErrors>
|
||||
where
|
||||
E: PairingEngine,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
|
||||
{
|
||||
let nv = fxs[0].num_vars;
|
||||
// what's AuxInfo used for?
|
||||
@@ -257,8 +257,8 @@ mod test {
|
||||
// good path: (w1, w2) is a permutation of (w1, w2) itself under the identify
|
||||
// map
|
||||
let ws = vec![
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
];
|
||||
// perms is the identity map
|
||||
test_permutation_check_helper::<Bls12_381, KZG>(&pcs_param, &ws, &ws, &id_perms)?;
|
||||
@@ -267,8 +267,8 @@ mod test {
|
||||
{
|
||||
// good path: f = (w1, w2) is a permutation of g = (w2, w1) itself under a map
|
||||
let mut fs = vec![
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
];
|
||||
let gs = fs.clone();
|
||||
fs.reverse();
|
||||
@@ -281,8 +281,8 @@ mod test {
|
||||
{
|
||||
// bad path 1: w is a not permutation of w itself under a random map
|
||||
let ws = vec![
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
];
|
||||
// perms is a random map
|
||||
let perms = random_permutation_mles(nv, 2, &mut rng);
|
||||
@@ -296,12 +296,12 @@ mod test {
|
||||
{
|
||||
// bad path 2: f is a not permutation of g under a identity map
|
||||
let fs = vec![
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
];
|
||||
let gs = vec![
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
|
||||
];
|
||||
// s_perm is the identity map
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use arithmetic::identity_permutation_mles;
|
||||
use ark_ff::PrimeField;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
/// Returns the evaluations of two list of MLEs:
|
||||
/// - numerators = (a1, ..., ak)
|
||||
@@ -24,13 +24,13 @@ use std::rc::Rc;
|
||||
pub(super) fn computer_nums_and_denoms<F: PrimeField>(
|
||||
beta: &F,
|
||||
gamma: &F,
|
||||
fxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
perms: &[Rc<DenseMultilinearExtension<F>>],
|
||||
fxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
perms: &[Arc<DenseMultilinearExtension<F>>],
|
||||
) -> Result<
|
||||
(
|
||||
Vec<Rc<DenseMultilinearExtension<F>>>,
|
||||
Vec<Rc<DenseMultilinearExtension<F>>>,
|
||||
Vec<Arc<DenseMultilinearExtension<F>>>,
|
||||
Vec<Arc<DenseMultilinearExtension<F>>>,
|
||||
),
|
||||
PolyIOPErrors,
|
||||
> {
|
||||
@@ -54,11 +54,11 @@ pub(super) fn computer_nums_and_denoms<F: PrimeField>(
|
||||
numerator_evals.push(numerator);
|
||||
denominator_evals.push(denominator);
|
||||
}
|
||||
numerators.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
numerators.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars,
|
||||
numerator_evals,
|
||||
)));
|
||||
denominators.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
denominators.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars,
|
||||
denominator_evals,
|
||||
)));
|
||||
|
||||
@@ -14,7 +14,7 @@ use ark_ec::PairingEngine;
|
||||
use ark_ff::{One, PrimeField, Zero};
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
use transcript::IOPTranscript;
|
||||
|
||||
mod util;
|
||||
@@ -142,7 +142,7 @@ pub struct ProductCheckProof<
|
||||
impl<E, PCS> ProductCheck<E, PCS> for PolyIOP<E::Fr>
|
||||
where
|
||||
E: PairingEngine,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
|
||||
{
|
||||
type ProductCheckSubClaim = ProductCheckSubClaim<E::Fr, Self>;
|
||||
type ProductCheckProof = ProductCheckProof<E, PCS, Self>;
|
||||
@@ -257,12 +257,12 @@ mod test {
|
||||
use ark_ec::PairingEngine;
|
||||
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
|
||||
use ark_std::test_rng;
|
||||
use std::{marker::PhantomData, rc::Rc};
|
||||
use std::{marker::PhantomData, sync::Arc};
|
||||
|
||||
fn check_frac_poly<E>(
|
||||
frac_poly: &Rc<DenseMultilinearExtension<E::Fr>>,
|
||||
fs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
gs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
frac_poly: &Arc<DenseMultilinearExtension<E::Fr>>,
|
||||
fs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
gs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
) where
|
||||
E: PairingEngine,
|
||||
{
|
||||
@@ -285,14 +285,14 @@ mod test {
|
||||
// fs and gs are guaranteed to have the same product
|
||||
// fs and hs doesn't have the same product
|
||||
fn test_product_check_helper<E, PCS>(
|
||||
fs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
gs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
hs: &[Rc<DenseMultilinearExtension<E::Fr>>],
|
||||
fs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
gs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
hs: &[Arc<DenseMultilinearExtension<E::Fr>>],
|
||||
pcs_param: &PCS::ProverParam,
|
||||
) -> Result<(), PolyIOPErrors>
|
||||
where
|
||||
E: PairingEngine,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
|
||||
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
|
||||
{
|
||||
let mut transcript = <PolyIOP<E::Fr> as ProductCheck<E, PCS>>::init_transcript();
|
||||
transcript.append_message(b"testing", b"initializing transcript for testing")?;
|
||||
@@ -352,11 +352,11 @@ mod test {
|
||||
let f2: DenseMultilinearExtension<Fr> = DenseMultilinearExtension::rand(nv, &mut rng);
|
||||
let mut g2 = f2.clone();
|
||||
g2.evaluations.reverse();
|
||||
let fs = vec![Rc::new(f1), Rc::new(f2)];
|
||||
let gs = vec![Rc::new(g2), Rc::new(g1)];
|
||||
let fs = vec![Arc::new(f1), Arc::new(f2)];
|
||||
let gs = vec![Arc::new(g2), Arc::new(g1)];
|
||||
let mut hs = vec![];
|
||||
for _ in 0..fs.len() {
|
||||
hs.push(Rc::new(DenseMultilinearExtension::rand(
|
||||
hs.push(Arc::new(DenseMultilinearExtension::rand(
|
||||
fs[0].num_vars,
|
||||
&mut rng,
|
||||
)));
|
||||
|
||||
@@ -5,7 +5,7 @@ use arithmetic::{get_index, VirtualPolynomial};
|
||||
use ark_ff::PrimeField;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
use transcript::IOPTranscript;
|
||||
|
||||
/// Compute multilinear fractional polynomial s.t. frac(x) = f1(x) * ... * fk(x)
|
||||
@@ -14,9 +14,9 @@ use transcript::IOPTranscript;
|
||||
/// The caller needs to sanity-check that the number of polynomials and
|
||||
/// variables match in fxs and gxs; and gi(x) has no zero entries.
|
||||
pub(super) fn compute_frac_poly<F: PrimeField>(
|
||||
fxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
) -> Result<Rc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
|
||||
fxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
) -> Result<Arc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
|
||||
let start = start_timer!(|| "compute frac(x)");
|
||||
|
||||
let mut f_evals = vec![F::one(); 1 << fxs[0].num_vars];
|
||||
@@ -41,7 +41,7 @@ pub(super) fn compute_frac_poly<F: PrimeField>(
|
||||
}
|
||||
|
||||
end_timer!(start);
|
||||
Ok(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
Ok(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
fxs[0].num_vars,
|
||||
f_evals,
|
||||
)))
|
||||
@@ -55,8 +55,8 @@ pub(super) fn compute_frac_poly<F: PrimeField>(
|
||||
/// The caller needs to check num_vars matches in f and g
|
||||
/// Cost: linear in N.
|
||||
pub(super) fn compute_product_poly<F: PrimeField>(
|
||||
frac_poly: &Rc<DenseMultilinearExtension<F>>,
|
||||
) -> Result<Rc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
|
||||
frac_poly: &Arc<DenseMultilinearExtension<F>>,
|
||||
) -> Result<Arc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
|
||||
let start = start_timer!(|| "compute evaluations of prod polynomial");
|
||||
let num_vars = frac_poly.num_vars;
|
||||
let frac_evals = &frac_poly.evaluations;
|
||||
@@ -96,7 +96,7 @@ pub(super) fn compute_product_poly<F: PrimeField>(
|
||||
prod_x_evals.push(F::zero());
|
||||
end_timer!(start);
|
||||
|
||||
Ok(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
Ok(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars,
|
||||
prod_x_evals,
|
||||
)))
|
||||
@@ -111,10 +111,10 @@ pub(super) fn compute_product_poly<F: PrimeField>(
|
||||
///
|
||||
/// Cost: O(N)
|
||||
pub(super) fn prove_zero_check<F: PrimeField>(
|
||||
fxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Rc<DenseMultilinearExtension<F>>],
|
||||
frac_poly: &Rc<DenseMultilinearExtension<F>>,
|
||||
prod_x: &Rc<DenseMultilinearExtension<F>>,
|
||||
fxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
gxs: &[Arc<DenseMultilinearExtension<F>>],
|
||||
frac_poly: &Arc<DenseMultilinearExtension<F>>,
|
||||
prod_x: &Arc<DenseMultilinearExtension<F>>,
|
||||
alpha: &F,
|
||||
transcript: &mut IOPTranscript<F>,
|
||||
) -> Result<(IOPProof<F>, VirtualPolynomial<F>), PolyIOPErrors> {
|
||||
@@ -135,10 +135,10 @@ pub(super) fn prove_zero_check<F: PrimeField>(
|
||||
p2_evals[x] = prod_x.evaluations[x1];
|
||||
}
|
||||
}
|
||||
let p1 = Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
let p1 = Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars, p1_evals,
|
||||
));
|
||||
let p2 = Rc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
let p2 = Arc::new(DenseMultilinearExtension::from_evaluations_vec(
|
||||
num_vars, p2_evals,
|
||||
));
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ use arithmetic::{VPAuxInfo, VirtualPolynomial};
|
||||
use ark_ff::PrimeField;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer};
|
||||
use std::{fmt::Debug, rc::Rc};
|
||||
use std::{fmt::Debug, sync::Arc};
|
||||
use transcript::IOPTranscript;
|
||||
|
||||
mod prover;
|
||||
@@ -127,7 +127,7 @@ impl<F: PrimeField> SumCheck<F> for PolyIOP<F> {
|
||||
type SumCheckProof = IOPProof<F>;
|
||||
type VirtualPolynomial = VirtualPolynomial<F>;
|
||||
type VPAuxInfo = VPAuxInfo<F>;
|
||||
type MultilinearExtension = Rc<DenseMultilinearExtension<F>>;
|
||||
type MultilinearExtension = Arc<DenseMultilinearExtension<F>>;
|
||||
type SumCheckSubClaim = SumCheckSubClaim<F>;
|
||||
type Transcript = IOPTranscript<F>;
|
||||
|
||||
@@ -210,7 +210,7 @@ mod test {
|
||||
use ark_ff::UniformRand;
|
||||
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
|
||||
use ark_std::test_rng;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
fn test_sumcheck(
|
||||
nv: usize,
|
||||
@@ -326,7 +326,7 @@ mod test {
|
||||
fn test_shared_reference() -> Result<(), PolyIOPErrors> {
|
||||
let mut rng = test_rng();
|
||||
let ml_extensions: Vec<_> = (0..5)
|
||||
.map(|_| Rc::new(DenseMultilinearExtension::<Fr>::rand(8, &mut rng)))
|
||||
.map(|_| Arc::new(DenseMultilinearExtension::<Fr>::rand(8, &mut rng)))
|
||||
.collect();
|
||||
let mut poly = VirtualPolynomial::new(8);
|
||||
poly.add_mle_list(
|
||||
|
||||
@@ -10,7 +10,7 @@ use ark_ff::PrimeField;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::{end_timer, start_timer, vec::Vec};
|
||||
use rayon::prelude::IntoParallelIterator;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[cfg(feature = "parallel")]
|
||||
use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
|
||||
@@ -138,7 +138,7 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
|
||||
}
|
||||
} else {
|
||||
for (t, e) in products_sum.iter_mut().enumerate() {
|
||||
let t = F::from(t as u64);
|
||||
let t = F::from(t as u128);
|
||||
let products = (0..1 << (self.poly.aux_info.num_variables - self.round))
|
||||
.into_par_iter()
|
||||
.map(|b| {
|
||||
@@ -149,6 +149,9 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
|
||||
let mut product = *coefficient;
|
||||
for &f in products.iter().take(num_mles) {
|
||||
let table = &flattened_ml_extensions[f]; // f's range is checked in init
|
||||
// TODO: Could be done faster by cashing the results from the
|
||||
// previous t and adding the diff
|
||||
// Also possible to use Karatsuba multiplication
|
||||
product *=
|
||||
table[b << 1] + (table[(b << 1) + 1] - table[b << 1]) * t;
|
||||
}
|
||||
@@ -188,7 +191,7 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
|
||||
// update prover's state to the partial evaluated polynomial
|
||||
self.poly.flattened_ml_extensions = flattened_ml_extensions
|
||||
.iter()
|
||||
.map(|x| Rc::new(x.clone()))
|
||||
.map(|x| Arc::new(x.clone()))
|
||||
.collect();
|
||||
|
||||
// end_timer!(compute_sum);
|
||||
|
||||
Reference in New Issue
Block a user