From a90ea6ec7950333470ee17f51d54d218aa804fc7 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 20 Aug 2021 11:56:57 +0200 Subject: [PATCH] PartialWitness back to HashMap --- src/bin/bench_recursion.rs | 2 +- src/gadgets/arithmetic_extension.rs | 6 +-- src/gadgets/insert.rs | 2 +- src/gadgets/interpolation.rs | 2 +- src/gadgets/random_access.rs | 2 +- src/gadgets/select.rs | 2 +- src/gadgets/split_base.rs | 4 +- src/gates/gate_testing.rs | 2 +- src/hash/merkle_proofs.rs | 2 +- src/iop/witness.rs | 70 ++++++++--------------------- src/plonk/circuit_data.rs | 1 - src/plonk/prover.rs | 2 +- src/plonk/recursive_verifier.rs | 10 ++--- src/util/reducing.rs | 4 +- 14 files changed, 38 insertions(+), 73 deletions(-) diff --git a/src/bin/bench_recursion.rs b/src/bin/bench_recursion.rs index 5222bbfe..7d1b6c57 100644 --- a/src/bin/bench_recursion.rs +++ b/src/bin/bench_recursion.rs @@ -35,7 +35,7 @@ fn bench_prove, const D: usize>() -> Result<()> { }, }; - let inputs = PartialWitness::new(config.num_wires); + let inputs = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let zero = builder.zero(); diff --git a/src/gadgets/arithmetic_extension.rs b/src/gadgets/arithmetic_extension.rs index 394975cb..e63b520a 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -517,7 +517,7 @@ mod tests { let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let vs = FF::rand_vec(3); @@ -552,7 +552,7 @@ mod tests { let config = CircuitConfig::large_zk_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let x = FF::rand(); @@ -580,7 +580,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let x = FF::rand_vec(4); diff --git a/src/gadgets/insert.rs b/src/gadgets/insert.rs index bdc8bde7..4018644d 100644 --- a/src/gadgets/insert.rs +++ b/src/gadgets/insert.rs @@ -64,7 +64,7 @@ mod tests { type FF = QuarticCrandallField; let len = 1 << len_log; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let v = (0..len - 1) .map(|_| builder.constant_extension(FF::rand())) diff --git a/src/gadgets/interpolation.rs b/src/gadgets/interpolation.rs index 8901b9f8..2175d0ce 100644 --- a/src/gadgets/interpolation.rs +++ b/src/gadgets/interpolation.rs @@ -49,7 +49,7 @@ mod tests { type F = CrandallField; type FF = QuarticCrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let len = 4; diff --git a/src/gadgets/random_access.rs b/src/gadgets/random_access.rs index 6c34c0be..0e57c666 100644 --- a/src/gadgets/random_access.rs +++ b/src/gadgets/random_access.rs @@ -66,7 +66,7 @@ mod tests { type FF = QuarticCrandallField; let len = 1 << len_log; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let vec = FF::rand_vec(len); let v: Vec<_> = vec.iter().map(|x| builder.constant_extension(*x)).collect(); diff --git a/src/gadgets/select.rs b/src/gadgets/select.rs index 3f0e001d..a888d105 100644 --- a/src/gadgets/select.rs +++ b/src/gadgets/select.rs @@ -53,7 +53,7 @@ mod tests { type F = CrandallField; type FF = QuarticCrandallField; let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let (x, y) = (FF::rand(), FF::rand()); diff --git a/src/gadgets/split_base.rs b/src/gadgets/split_base.rs index 20bd50a2..453a8c7e 100644 --- a/src/gadgets/split_base.rs +++ b/src/gadgets/split_base.rs @@ -101,7 +101,7 @@ mod tests { fn test_split_base() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let x = F::from_canonical_usize(0b110100000); // 416 = 1532 in base 6. let xt = builder.constant(x); @@ -127,7 +127,7 @@ mod tests { fn test_base_sum() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let n = thread_rng().gen_range(0..(1 << 10)); diff --git a/src/gates/gate_testing.rs b/src/gates/gate_testing.rs index 0e773aa0..b45cb745 100644 --- a/src/gates/gate_testing.rs +++ b/src/gates/gate_testing.rs @@ -124,7 +124,7 @@ pub(crate) fn test_eval_fns, G: Gate, const D: usize>( let constants = F::Extension::rand_vec(gate.num_constants()); let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let wires_t = builder.add_virtual_extension_targets(wires.len()); diff --git a/src/hash/merkle_proofs.rs b/src/hash/merkle_proofs.rs index 5f333f4e..c0fc3afa 100644 --- a/src/hash/merkle_proofs.rs +++ b/src/hash/merkle_proofs.rs @@ -234,7 +234,7 @@ mod tests { fn test_recursive_merkle_proof() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let log_n = 8; diff --git a/src/iop/witness.rs b/src/iop/witness.rs index daab0df6..b1d69610 100644 --- a/src/iop/witness.rs +++ b/src/iop/witness.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::convert::TryInto; use crate::field::extension_field::target::ExtensionTarget; @@ -154,62 +155,33 @@ impl MatrixWitness { #[derive(Clone, Debug)] pub struct PartialWitness { - pub(crate) wire_values: Vec>>, - pub(crate) virtual_target_values: Vec>, - pub(crate) set_targets: Vec<(Target, F)>, + // pub(crate) wire_values: Vec>>, + // pub(crate) virtual_target_values: Vec>, + pub(crate) target_values: HashMap, } impl PartialWitness { - pub fn new(num_wires: usize) -> Self { + pub fn new() -> Self { PartialWitness { - wire_values: vec![vec![None; num_wires]], - virtual_target_values: vec![], - set_targets: vec![], + target_values: HashMap::new(), } } } impl Witness for PartialWitness { fn try_get_target(&self, target: Target) -> Option { - match target { - Target::Wire(Wire { gate, input }) => *self.wire_values.get(gate)?.get(input)?, - Target::VirtualTarget { index } => *self.virtual_target_values.get(index)?, - } + self.target_values.get(&target).copied() } fn set_target(&mut self, target: Target, value: F) { - match target { - Target::Wire(Wire { gate, input }) => { - if gate >= self.wire_values.len() { - self.wire_values - .resize(gate + 1, vec![None; self.wire_values[0].len()]); - } - if let Some(old_value) = self.wire_values[gate][input] { - assert_eq!( - old_value, value, - "Target was set twice with different values: {:?}", - target - ); - } else { - self.wire_values[gate][input] = Some(value); - } - } - Target::VirtualTarget { index } => { - if index >= self.virtual_target_values.len() { - self.virtual_target_values.resize(index + 1, None); - } - if let Some(old_value) = self.virtual_target_values[index] { - assert_eq!( - old_value, value, - "Target was set twice with different values: {:?}", - target - ); - } else { - self.virtual_target_values[index] = Some(value); - } - } + let opt_old_value = self.target_values.insert(target, value); + if let Some(old_value) = opt_old_value { + assert_eq!( + old_value, value, + "Target {:?} was set twice with different values", + target + ); } - self.set_targets.push((target, value)); } } @@ -241,19 +213,13 @@ impl PartitionWitness { } pub fn full_witness(self) -> MatrixWitness { - let mut wire_values = vec![vec![]; self.num_wires]; - for j in 0..self.num_wires { - wire_values[j].reserve_exact(self.degree); - unsafe { - // After .reserve_exact(l), wire_values[i] will have capacity at least l. Hence, set_len - // will not cause the buffer to overrun. - wire_values[j].set_len(self.degree); - } - } + let mut wire_values = vec![vec![F::ZERO; self.degree]; self.num_wires]; for i in 0..self.degree { for j in 0..self.num_wires { let t = Target::Wire(Wire { gate: i, input: j }); - wire_values[j][i] = self.try_get_target(t).unwrap_or(F::ZERO); + if let Some(x) = self.try_get_target(t) { + wire_values[j][i] = x; + } } } diff --git a/src/plonk/circuit_data.rs b/src/plonk/circuit_data.rs index 869b91b5..bbc08c0d 100644 --- a/src/plonk/circuit_data.rs +++ b/src/plonk/circuit_data.rs @@ -12,7 +12,6 @@ use crate::hash::merkle_tree::MerkleCap; use crate::iop::generator::WitnessGenerator; use crate::iop::target::Target; use crate::iop::witness::{PartialWitness, PartitionWitness}; -use crate::plonk::copy_constraint::CopyConstraint; use crate::plonk::proof::ProofWithPublicInputs; use crate::plonk::prover::prove; use crate::plonk::verifier::verify; diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index c292295c..f310259c 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -36,7 +36,7 @@ pub(crate) fn prove, const D: usize>( timed!( timing, "fill partition", - for &(t, v) in &inputs.set_targets { + for (t, v) in inputs.target_values.into_iter() { partition_witness.set_target(t, v); } ); diff --git a/src/plonk/recursive_verifier.rs b/src/plonk/recursive_verifier.rs index 97ebd84c..14a60df3 100644 --- a/src/plonk/recursive_verifier.rs +++ b/src/plonk/recursive_verifier.rs @@ -386,7 +386,7 @@ mod tests { } let data = builder.build(); ( - data.prove(PartialWitness::new(config.num_wires))?, + data.prove(PartialWitness::new())?, data.verifier_only, data.common, ) @@ -394,7 +394,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let pt = proof_to_proof_target(&proof_with_pis, &mut builder); set_proof_target(&proof_with_pis, &pt, &mut pw); @@ -442,7 +442,7 @@ mod tests { } let data = builder.build(); ( - data.prove(PartialWitness::new(config.num_wires))?, + data.prove(PartialWitness::new())?, data.verifier_only, data.common, ) @@ -450,7 +450,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let pt = proof_to_proof_target(&proof_with_pis, &mut builder); set_proof_target(&proof_with_pis, &pt, &mut pw); @@ -468,7 +468,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(config.num_wires); + let mut pw = PartialWitness::new(); let pt = proof_to_proof_target(&proof_with_pis, &mut builder); set_proof_target(&proof_with_pis, &pt, &mut pw); diff --git a/src/util/reducing.rs b/src/util/reducing.rs index ca0dd9e8..0c11f467 100644 --- a/src/util/reducing.rs +++ b/src/util/reducing.rs @@ -220,7 +220,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let alpha = FF::rand(); @@ -248,7 +248,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(config.num_wires); + let pw = PartialWitness::new(); let mut builder = CircuitBuilder::::new(config); let alpha = FF::rand();