From 4bac34646c218dae875e19557c4cdc0f0493713f Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Mon, 12 Jul 2021 16:38:05 -0700 Subject: [PATCH] generator --- src/gates/insertion.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/gates/insertion.rs b/src/gates/insertion.rs index 8697946e..2329c101 100644 --- a/src/gates/insertion.rs +++ b/src/gates/insertion.rs @@ -99,9 +99,8 @@ impl, const D: usize> Gate for InsertionGate { let insert_here = vars.local_wires[self.insert_here_for_round_r(r)]; // The two equality constraints. - let difference_algebra: ExtensionAlgebra = difference.into(); let equality_dummy_constraint: ExtensionAlgebra = - difference_algebra * equality_dummy.into() - insert_here.into(); + (difference * equality_dummy - insert_here).into(); constraints.extend(equality_dummy_constraint.to_basefield_array()); let mul_to_zero_constraint: ExtensionAlgebra = ((F::Extension::ONE - insert_here) * difference).into(); @@ -207,7 +206,24 @@ impl, const D: usize> SimpleGenerator for InsertionGenerator }; // Compute the new vector and the values for equality_dummy and insert_here - todo!() + let n = self.gate.vec_size; + let orig_vec = (0..n).map(|i| get_local_ext(InsertionGate::::wires_list_item(i))).collect::>(); + let to_insert = get_local_ext(InsertionGate::::wires_element_to_insert()); + let insertion_index_f = get_local_wire(InsertionGate::::wires_insertion_index()); + + let insertion_index = insertion_index_f.to_canonical_u64() as usize; + let mut new_vec = Vec::new(); + new_vec.extend(&orig_vec[..insertion_index]); + new_vec.push(to_insert); + new_vec.extend(&orig_vec[insertion_index..]); + + let mut result = PartialWitness::::new(); + for i in 0..=n { + let output_wires = self.gate.wires_output_list_item(i).map(local_wire); + result.set_ext_wires(output_wires, new_vec[i]); + } + + result } }