From c6cf5cf130649c0e9740f08ef69ca84a6f0189c1 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 20 Aug 2021 09:55:49 +0200 Subject: [PATCH] Move PartitionWitness --- src/gadgets/arithmetic_extension.rs | 6 +- src/gadgets/range_check.rs | 6 +- src/gadgets/split_base.rs | 6 +- src/gadgets/split_join.rs | 8 +- src/gates/arithmetic.rs | 6 +- src/gates/base_sum.rs | 6 +- src/gates/constant.rs | 6 +- src/gates/exponentiation.rs | 6 +- src/gates/gmimc.rs | 6 +- src/gates/insertion.rs | 6 +- src/gates/interpolation.rs | 6 +- src/gates/random_access.rs | 6 +- src/gates/reducing.rs | 6 +- src/iop/generator.rs | 174 ++-------------------------- src/iop/witness.rs | 31 +++++ src/plonk/prover.rs | 6 +- 16 files changed, 82 insertions(+), 209 deletions(-) diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index 8ed0e934..b53f03a6 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -5,9 +5,9 @@ use crate::field::extension_field::FieldExtension; use crate::field::extension_field::{Extendable, OEF}; use crate::field::field_types::Field; use crate::gates::arithmetic::{ArithmeticExtensionGate, NUM_ARITHMETIC_OPS}; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::Target; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::util::bits_u64; @@ -447,7 +447,7 @@ impl, const D: usize> SimpleGenerator for QuotientGeneratorE deps } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let num = witness.get_extension_target(self.numerator); let dem = witness.get_extension_target(self.denominator); let quotient = num / dem; diff --git a/src/gadgets/range_check.rs b/src/gadgets/range_check.rs index c03dae7b..4be8f80e 100644 --- a/src/gadgets/range_check.rs +++ b/src/gadgets/range_check.rs @@ -1,9 +1,9 @@ use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::base_sum::BaseSumGate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; impl, const D: usize> CircuitBuilder { @@ -56,7 +56,7 @@ impl SimpleGenerator for LowHighGenerator { vec![self.integer] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let integer_value = witness.get_target(self.integer).to_canonical_u64(); let low = integer_value & ((1 << self.n_log) - 1); let high = integer_value >> self.n_log; diff --git a/src/gadgets/split_base.rs b/src/gadgets/split_base.rs index cca2a166..716472f5 100644 --- a/src/gadgets/split_base.rs +++ b/src/gadgets/split_base.rs @@ -3,9 +3,9 @@ use std::borrow::Borrow; use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::base_sum::BaseSumGate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; impl, const D: usize> CircuitBuilder { @@ -68,7 +68,7 @@ impl SimpleGenerator for BaseSumGenerator { self.limbs.iter().map(|b| b.target).collect() } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let sum = self .limbs .iter() diff --git a/src/gadgets/split_join.rs b/src/gadgets/split_join.rs index 875ead00..45c87de9 100644 --- a/src/gadgets/split_join.rs +++ b/src/gadgets/split_join.rs @@ -1,9 +1,9 @@ use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::base_sum::BaseSumGate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::util::ceil_div_usize; @@ -68,7 +68,7 @@ impl SimpleGenerator for SplitGenerator { vec![self.integer] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let mut integer_value = witness.get_target(self.integer).to_canonical_u64(); for &b in &self.bits { @@ -96,7 +96,7 @@ impl SimpleGenerator for WireSplitGenerator { vec![self.integer] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let mut integer_value = witness.get_target(self.integer).to_canonical_u64(); for &gate in &self.gates { diff --git a/src/gates/arithmetic.rs b/src/gates/arithmetic.rs index 159628e1..12be0bc2 100644 --- a/src/gates/arithmetic.rs +++ b/src/gates/arithmetic.rs @@ -4,9 +4,9 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::extension_field::FieldExtension; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -157,7 +157,7 @@ impl, const D: usize> SimpleGenerator for ArithmeticExtensio .collect() } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let extract_extension = |range: Range| -> F::Extension { let t = ExtensionTarget::from_range(self.gate_index, range); witness.get_extension_target(t) diff --git a/src/gates/base_sum.rs b/src/gates/base_sum.rs index c46bfee1..e53b72f6 100644 --- a/src/gates/base_sum.rs +++ b/src/gates/base_sum.rs @@ -4,9 +4,9 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::plonk_common::{reduce_with_powers, reduce_with_powers_ext_recursive}; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -132,7 +132,7 @@ impl SimpleGenerator for BaseSplitGenerator { vec![Target::wire(self.gate_index, BaseSumGate::::WIRE_SUM)] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let sum_value = witness .get_target(Target::wire(self.gate_index, BaseSumGate::::WIRE_SUM)) .to_canonical_u64() as usize; diff --git a/src/gates/constant.rs b/src/gates/constant.rs index 94d5fa03..eb4b5b12 100644 --- a/src/gates/constant.rs +++ b/src/gates/constant.rs @@ -2,10 +2,10 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -85,7 +85,7 @@ impl SimpleGenerator for ConstantGenerator { Vec::new() } - fn run_once(&self, _witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, _witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let wire = Wire { gate: self.gate_index, input: ConstantGate::WIRE_OUTPUT, diff --git a/src/gates/exponentiation.rs b/src/gates/exponentiation.rs index 69827907..e85c361e 100644 --- a/src/gates/exponentiation.rs +++ b/src/gates/exponentiation.rs @@ -4,10 +4,10 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::circuit_data::CircuitConfig; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -218,7 +218,7 @@ impl, const D: usize> SimpleGenerator for ExponentiationGene deps } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let local_wire = |input| Wire { gate: self.gate_index, input, diff --git a/src/gates/gmimc.rs b/src/gates/gmimc.rs index 2e0f652f..6bf868c0 100644 --- a/src/gates/gmimc.rs +++ b/src/gates/gmimc.rs @@ -5,10 +5,10 @@ use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gates::gate::Gate; use crate::hash::gmimc::gmimc_automatic_constants; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -264,7 +264,7 @@ impl, const D: usize, const R: usize> SimpleGenerator .collect() } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let mut state = (0..W) .map(|i| { witness.get_wire(Wire { diff --git a/src/gates/insertion.rs b/src/gates/insertion.rs index d1c2ea22..91d71d2e 100644 --- a/src/gates/insertion.rs +++ b/src/gates/insertion.rs @@ -6,10 +6,10 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::{Extendable, FieldExtension}; use crate::field::field_types::Field; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -261,7 +261,7 @@ impl, const D: usize> SimpleGenerator for InsertionGenerator deps } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let local_wire = |input| Wire { gate: self.gate_index, input, diff --git a/src/gates/interpolation.rs b/src/gates/interpolation.rs index a9cd7d38..4eabbe31 100644 --- a/src/gates/interpolation.rs +++ b/src/gates/interpolation.rs @@ -8,10 +8,10 @@ use crate::field::extension_field::{Extendable, FieldExtension}; use crate::field::interpolation::interpolant; use crate::gadgets::polynomial::PolynomialCoeffsExtAlgebraTarget; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::polynomial::polynomial::PolynomialCoeffs; @@ -240,7 +240,7 @@ impl, const D: usize> SimpleGenerator for InterpolationGener deps } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let n = self.gate.num_points; let local_wire = |input| Wire { diff --git a/src/gates/random_access.rs b/src/gates/random_access.rs index 561bfbfd..85da3eaf 100644 --- a/src/gates/random_access.rs +++ b/src/gates/random_access.rs @@ -5,10 +5,10 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::{Extendable, FieldExtension}; use crate::field::field_types::Field; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -208,7 +208,7 @@ impl, const D: usize> SimpleGenerator for RandomAccessGenera deps } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let local_wire = |input| Wire { gate: self.gate_index, input, diff --git a/src/gates/reducing.rs b/src/gates/reducing.rs index 64987e79..01c05306 100644 --- a/src/gates/reducing.rs +++ b/src/gates/reducing.rs @@ -4,9 +4,9 @@ use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::extension_field::FieldExtension; use crate::gates::gate::Gate; -use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator, Yo}; +use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGenerator}; use crate::iop::target::Target; -use crate::iop::witness::PartialWitness; +use crate::iop::witness::{PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; @@ -174,7 +174,7 @@ impl, const D: usize> SimpleGenerator for ReducingGenerator< .collect() } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let extract_extension = |range: Range| -> F::Extension { let t = ExtensionTarget::from_range(self.gate_index, range); witness.get_extension_target(t) diff --git a/src/iop/generator.rs b/src/iop/generator.rs index 62fe4d26..b6d89c5d 100644 --- a/src/iop/generator.rs +++ b/src/iop/generator.rs @@ -9,173 +9,15 @@ use crate::hash::hash_types::{HashOut, HashOutTarget, MerkleCapTarget}; use crate::hash::merkle_tree::MerkleCap; use crate::iop::target::{BoolTarget, Target}; use crate::iop::wire::Wire; -use crate::iop::witness::{MatrixWitness, PartialWitness, Witness}; +use crate::iop::witness::{MatrixWitness, PartialWitness, PartitionWitness, Witness}; use crate::plonk::permutation_argument::ForestNode; use crate::timed; use crate::util::timing::TimingTree; -pub struct Yo( - pub Vec>, - pub Box usize>, -); -impl Yo { - pub fn get_target(&self, target: Target) -> F { - self.0[self.0[self.1(target)].parent].value.unwrap() - } - - pub fn get_targets(&self, targets: &[Target]) -> Vec { - targets.iter().map(|&t| self.get_target(t)).collect() - } - - pub fn get_extension_target(&self, et: ExtensionTarget) -> F::Extension - where - F: Extendable, - { - F::Extension::from_basefield_array( - self.get_targets(&et.to_target_array()).try_into().unwrap(), - ) - } - - pub fn get_extension_targets( - &self, - ets: &[ExtensionTarget], - ) -> Vec - where - F: Extendable, - { - ets.iter() - .map(|&et| self.get_extension_target(et)) - .collect() - } - - pub fn get_bool_target(&self, target: BoolTarget) -> bool { - let value = self.get_target(target.target).to_canonical_u64(); - match value { - 0 => false, - 1 => true, - _ => panic!("not a bool"), - } - } - - pub fn get_hash_target(&self, ht: HashOutTarget) -> HashOut { - HashOut { - elements: self.get_targets(&ht.elements).try_into().unwrap(), - } - } - - pub fn try_get_target(&self, target: Target) -> Option { - self.0[self.0[self.1(target)].parent].value - } - - pub fn get_wire(&self, wire: Wire) -> F { - self.get_target(Target::Wire(wire)) - } - - pub fn try_get_wire(&self, wire: Wire) -> Option { - self.try_get_target(Target::Wire(wire)) - } - - pub fn contains(&self, target: Target) -> bool { - self.0[self.0[self.1(target)].parent].value.is_some() - } - - pub fn contains_all(&self, targets: &[Target]) -> bool { - targets.iter().all(|&t| self.contains(t)) - } - - pub fn set_target(&mut self, target: Target, value: F) { - let i = self.0[self.1(target)].parent; - self.0[i].value = Some(value); - } - - pub fn set_hash_target(&mut self, ht: HashOutTarget, value: HashOut) { - ht.elements - .iter() - .zip(value.elements) - .for_each(|(&t, x)| self.set_target(t, x)); - } - - pub fn set_cap_target(&mut self, ct: &MerkleCapTarget, value: &MerkleCap) { - for (ht, h) in ct.0.iter().zip(&value.0) { - self.set_hash_target(*ht, *h); - } - } - - pub fn set_extension_target( - &mut self, - et: ExtensionTarget, - value: F::Extension, - ) where - F: Extendable, - { - let limbs = value.to_basefield_array(); - (0..D).for_each(|i| { - self.set_target(et.0[i], limbs[i]); - }); - } - - pub fn set_extension_targets( - &mut self, - ets: &[ExtensionTarget], - values: &[F::Extension], - ) where - F: Extendable, - { - debug_assert_eq!(ets.len(), values.len()); - ets.iter() - .zip(values) - .for_each(|(&et, &v)| self.set_extension_target(et, v)); - } - - pub fn set_bool_target(&mut self, target: BoolTarget, value: bool) { - self.set_target(target.target, F::from_bool(value)) - } - - pub fn set_wire(&mut self, wire: Wire, value: F) { - self.set_target(Target::Wire(wire), value) - } - - pub fn set_wires(&mut self, wires: W, values: &[F]) - where - W: IntoIterator, - { - // If we used itertools, we could use zip_eq for extra safety. - for (wire, &value) in wires.into_iter().zip(values) { - self.set_wire(wire, value); - } - } - - pub fn set_ext_wires(&mut self, wires: W, value: F::Extension) - where - F: Extendable, - W: IntoIterator, - { - self.set_wires(wires, &value.to_basefield_array()); - } - - pub fn extend>(&mut self, pairs: I) { - for (t, v) in pairs { - self.set_target(t, v); - } - } - - pub fn full_witness(self, degree: usize, num_wires: usize) -> MatrixWitness { - let mut wire_values = vec![vec![F::ZERO; degree]; num_wires]; - // assert!(self.wire_values.len() <= degree); - for i in 0..degree { - for j in 0..num_wires { - let t = Target::Wire(Wire { gate: i, input: j }); - wire_values[j][i] = self.0[self.0[self.1(t)].parent].value.unwrap_or(F::ZERO); - } - } - MatrixWitness { wire_values } - } -} - /// Given a `PartialWitness` that has only inputs set, populates the rest of the witness using the /// given set of generators. pub(crate) fn generate_partial_witness( - witness: &mut Yo, + witness: &mut PartitionWitness, generators: &[Box>], num_wires: usize, degree: usize, @@ -271,7 +113,7 @@ pub trait WitnessGenerator: 'static + Send + Sync + Debug { /// Run this generator, returning a flag indicating whether the generator is finished. If the /// flag is true, the generator will never be run again, otherwise it will be queued for another /// run next time a target in its watch list is populated. - fn run(&self, witness: &Yo, out_buffer: &mut GeneratedValues) -> bool; + fn run(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) -> bool; } /// Values generated by a generator invocation. @@ -370,7 +212,7 @@ impl GeneratedValues { pub trait SimpleGenerator: 'static + Send + Sync + Debug { fn dependencies(&self) -> Vec; - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues); + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues); } impl> WitnessGenerator for SG { @@ -378,7 +220,7 @@ impl> WitnessGenerator for SG { self.dependencies() } - fn run(&self, witness: &Yo, out_buffer: &mut GeneratedValues) -> bool { + fn run(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) -> bool { if witness.contains_all(&self.dependencies()) { self.run_once(witness, out_buffer); true @@ -400,7 +242,7 @@ impl SimpleGenerator for CopyGenerator { vec![self.src] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let value = witness.get_target(self.src); out_buffer.set_target(self.dst, value); } @@ -417,7 +259,7 @@ impl SimpleGenerator for RandomValueGenerator { Vec::new() } - fn run_once(&self, _witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, _witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let random_value = F::rand(); out_buffer.set_target(self.target, random_value); @@ -436,7 +278,7 @@ impl SimpleGenerator for NonzeroTestGenerator { vec![self.to_test] } - fn run_once(&self, witness: &Yo, out_buffer: &mut GeneratedValues) { + fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) { let to_test_value = witness.get_target(self.to_test); let dummy_value = if to_test_value == F::ZERO { diff --git a/src/iop/witness.rs b/src/iop/witness.rs index 5d1441ff..e65f8c40 100644 --- a/src/iop/witness.rs +++ b/src/iop/witness.rs @@ -12,6 +12,7 @@ use crate::hash::merkle_tree::MerkleCap; use crate::iop::target::{BoolTarget, Target}; use crate::iop::wire::Wire; use crate::plonk::copy_constraint::CopyConstraint; +use crate::plonk::permutation_argument::ForestNode; pub trait Witness { fn try_get_target(&self, target: Target) -> Option; @@ -215,3 +216,33 @@ impl Witness for PartialWitness { self.set_targets.push((target, value)); } } + +pub struct PartitionWitness( + pub Vec>, + pub Box usize>, +); + +impl Witness for PartitionWitness { + fn try_get_target(&self, target: Target) -> Option { + self.0[self.0[self.1(target)].parent].value + } + + fn set_target(&mut self, target: Target, value: F) { + let i = self.0[self.1(target)].parent; + self.0[i].value = Some(value); + } +} + +impl PartitionWitness { + pub fn full_witness(self, degree: usize, num_wires: usize) -> MatrixWitness { + let mut wire_values = vec![vec![F::ZERO; degree]; num_wires]; + // assert!(self.wire_values.len() <= degree); + for i in 0..degree { + for j in 0..num_wires { + let t = Target::Wire(Wire { gate: i, input: j }); + wire_values[j][i] = self.0[self.0[self.1(t)].parent].value.unwrap_or(F::ZERO); + } + } + MatrixWitness { wire_values } + } +} diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index 49b93190..1f44547e 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -7,10 +7,10 @@ use crate::fri::commitment::PolynomialBatchCommitment; use crate::hash::hash_types::HashOut; use crate::hash::hashing::hash_n_to_hash; use crate::iop::challenger::Challenger; -use crate::iop::generator::{generate_partial_witness, Yo}; +use crate::iop::generator::generate_partial_witness; use crate::iop::target::Target; use crate::iop::wire::Wire; -use crate::iop::witness::{MatrixWitness, PartialWitness, Witness}; +use crate::iop::witness::{MatrixWitness, PartialWitness, PartitionWitness, Witness}; use crate::plonk::circuit_data::{CommonCircuitData, ProverOnlyCircuitData}; use crate::plonk::permutation_argument::ForestNode; use crate::plonk::plonk_common::PlonkPolynomials; @@ -79,7 +79,7 @@ pub(crate) fn prove, const D: usize>( // dbg!(t); // dbg!(partial_witness[t.parent]); // let mut partial_witness = inputs; - let mut partial_witness = Yo(partial_witness, Box::new(target_index)); + let mut partial_witness = PartitionWitness(partial_witness, Box::new(target_index)); timed!( timing, &format!("run {} generators", prover_data.generators.len()),