diff --git a/src/bin/bench_recursion.rs b/src/bin/bench_recursion.rs index 4a535d20..3b71c6f4 100644 --- a/src/bin/bench_recursion.rs +++ b/src/bin/bench_recursion.rs @@ -34,7 +34,7 @@ fn bench_prove, const D: usize>() -> Result<()> { }, }; - let inputs = PartialWitness::new(1 << 14, config.num_wires, 1000); + let inputs = PartialWitness::new(config.num_wires); 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 15f1de9b..29b759fb 100644 --- a/src/gadgets/arithmetic_extension.rs +++ b/src/gadgets/arithmetic_extension.rs @@ -603,7 +603,7 @@ mod tests { let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let mut pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let vs = FF::rand_vec(3); @@ -640,7 +640,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let x = FF::rand(); diff --git a/src/gadgets/insert.rs b/src/gadgets/insert.rs index bc91a013..bdc8bde7 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(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); 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 bba3befe..8ed5346a 100644 --- a/src/gadgets/interpolation.rs +++ b/src/gadgets/interpolation.rs @@ -70,7 +70,7 @@ mod tests { type F = CrandallField; type FF = QuarticCrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let len = 4; @@ -110,7 +110,7 @@ mod tests { type F = CrandallField; type FF = QuarticCrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let len = 2; diff --git a/src/gadgets/random_access.rs b/src/gadgets/random_access.rs index 36b15e5b..395d920e 100644 --- a/src/gadgets/random_access.rs +++ b/src/gadgets/random_access.rs @@ -50,7 +50,7 @@ mod tests { type FF = QuarticCrandallField; let len = 1 << len_log; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); 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 ce9eed58..58de09c6 100644 --- a/src/gadgets/select.rs +++ b/src/gadgets/select.rs @@ -48,7 +48,7 @@ mod tests { type F = CrandallField; type FF = QuarticCrandallField; let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let mut pw = PartialWitness::new(config.num_wires); 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 af67d99c..ff420ba0 100644 --- a/src/gadgets/split_base.rs +++ b/src/gadgets/split_base.rs @@ -99,7 +99,7 @@ mod tests { fn test_split_base() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let x = F::from_canonical_usize(0b110100000); // 416 = 1532 in base 6. let xt = builder.constant(x); @@ -125,7 +125,7 @@ mod tests { fn test_base_sum() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); 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 00632d49..66bed775 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(1 << 14, config.num_wires, 1000); + let mut pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let wires_t = builder.add_virtual_extension_targets(wires.len()); diff --git a/src/gates/gmimc.rs b/src/gates/gmimc.rs index 46c7b975..03fdef56 100644 --- a/src/gates/gmimc.rs +++ b/src/gates/gmimc.rs @@ -345,7 +345,7 @@ mod tests { let permutation_inputs = (0..W).map(F::from_canonical_usize).collect::>(); - let mut witness = PartialWitness::new(1 << 14, 126, 1000); + let mut witness = PartialWitness::new(126); witness.set_wire( Wire { gate: 0, diff --git a/src/hash/merkle_proofs.rs b/src/hash/merkle_proofs.rs index 139ab0bc..088ffc5a 100644 --- a/src/hash/merkle_proofs.rs +++ b/src/hash/merkle_proofs.rs @@ -154,7 +154,7 @@ mod tests { fn test_recursive_merkle_proof() -> Result<()> { type F = CrandallField; let config = CircuitConfig::large_config(); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let mut pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let log_n = 8; diff --git a/src/iop/challenger.rs b/src/iop/challenger.rs index 4c13692f..1e41ecea 100644 --- a/src/iop/challenger.rs +++ b/src/iop/challenger.rs @@ -399,7 +399,7 @@ mod tests { num_routed_wires: 27, ..CircuitConfig::default() }; - let mut witness = PartialWitness::new(1 << 14, config.num_wires, 1000); + let mut witness = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config.clone()); let mut recursive_challenger = RecursiveChallenger::new(&mut builder); let mut recursive_outputs_per_round: Vec> = Vec::new(); diff --git a/src/iop/witness.rs b/src/iop/witness.rs index 1eabad4b..da7ee73f 100644 --- a/src/iop/witness.rs +++ b/src/iop/witness.rs @@ -31,10 +31,10 @@ pub struct PartialWitness { } impl PartialWitness { - pub fn new(degree: usize, num_wires: usize, max_virtual_target: usize) -> Self { + pub fn new(num_wires: usize) -> Self { PartialWitness { - wire_values: vec![vec![None; num_wires]; degree], - virtual_target_values: vec![None; max_virtual_target], + wire_values: vec![vec![None; num_wires]], + virtual_target_values: vec![], } } @@ -93,8 +93,13 @@ impl PartialWitness { pub fn contains(&self, target: Target) -> bool { match target { - Target::Wire(Wire { gate, input }) => self.wire_values[gate][input].is_some(), - Target::VirtualTarget { index } => self.virtual_target_values[index].is_some(), + Target::Wire(Wire { gate, input }) => { + self.wire_values.len() > gate && self.wire_values[gate][input].is_some() + } + Target::VirtualTarget { index } => { + self.virtual_target_values.len() > index + && self.virtual_target_values[index].is_some() + } } } @@ -105,6 +110,10 @@ impl PartialWitness { pub 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, @@ -116,6 +125,9 @@ impl PartialWitness { } } 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, @@ -192,7 +204,7 @@ impl PartialWitness { pub fn full_witness(self, degree: usize, num_wires: usize) -> Witness { let mut wire_values = vec![vec![F::ZERO; degree]; num_wires]; - for i in 0..degree { + for i in 0..self.wire_values.len().min(degree) { for j in 0..num_wires { wire_values[j][i] = self.wire_values[i][j].unwrap_or(F::ZERO); } @@ -237,9 +249,3 @@ impl PartialWitness { Ok(()) } } - -impl Default for PartialWitness { - fn default() -> Self { - Self::new(0, 0, 0) - } -} diff --git a/src/plonk/recursive_verifier.rs b/src/plonk/recursive_verifier.rs index 64175a20..ee5f82b9 100644 --- a/src/plonk/recursive_verifier.rs +++ b/src/plonk/recursive_verifier.rs @@ -383,7 +383,7 @@ mod tests { } let data = builder.build(); ( - data.prove(PartialWitness::new(1 << 14, config.num_wires, 1000))?, + data.prove(PartialWitness::new(config.num_wires))?, data.verifier_only, data.common, ) @@ -391,7 +391,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let mut pw = PartialWitness::new(config.num_wires); let pt = proof_to_proof_target(&proof_with_pis, &mut builder); set_proof_target(&proof_with_pis, &pt, &mut pw); @@ -438,7 +438,7 @@ mod tests { } let data = builder.build(); ( - data.prove(PartialWitness::new(1 << 14, config.num_wires, 1000))?, + data.prove(PartialWitness::new(config.num_wires))?, data.verifier_only, data.common, ) @@ -446,7 +446,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 100000); + let mut pw = PartialWitness::new(config.num_wires); let pt = proof_to_proof_target(&proof_with_pis, &mut builder); set_proof_target(&proof_with_pis, &pt, &mut pw); @@ -464,7 +464,7 @@ mod tests { verify(proof_with_pis.clone(), &vd, &cd)?; let mut builder = CircuitBuilder::::new(config.clone()); - let mut pw = PartialWitness::new(1 << 14, config.num_wires, 100000); + let mut pw = PartialWitness::new(config.num_wires); 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 47386e75..ce6827ba 100644 --- a/src/util/reducing.rs +++ b/src/util/reducing.rs @@ -249,7 +249,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let alpha = FF::rand(); @@ -277,7 +277,7 @@ mod tests { let config = CircuitConfig::large_config(); - let pw = PartialWitness::new(1 << 14, config.num_wires, 1000); + let pw = PartialWitness::new(config.num_wires); let mut builder = CircuitBuilder::::new(config); let alpha = FF::rand();