From bec189b5983dc03dc8ed09c2fbc642091e8417f3 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Fri, 9 Jul 2021 16:31:19 -0700 Subject: [PATCH] fixes --- src/gates/insertion.rs | 50 +++++++++++++++++++++++------------------- src/gates/mod.rs | 1 + 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/gates/insertion.rs b/src/gates/insertion.rs index 92e69311..81874a7e 100644 --- a/src/gates/insertion.rs +++ b/src/gates/insertion.rs @@ -1,3 +1,7 @@ +use std::convert::TryInto; +use std::ops::Range; +use std::marker::PhantomData; + use crate::circuit_builder::CircuitBuilder; use crate::field::extension_field::algebra::ExtensionAlgebra; use crate::field::extension_field::target::ExtensionTarget; @@ -17,7 +21,7 @@ pub(crate) struct InsertionGate, const D: usize> { pub _phantom: PhantomData, } -impl InsertionGate { +impl, const D: usize> InsertionGate { pub fn new(vec_size: usize) -> GateRef { let gate = Self { vec_size, @@ -40,7 +44,7 @@ impl InsertionGate { } fn start_of_output_wires(&self) -> usize { - (self::vec_size + 1) * D + 1 + (self.vec_size + 1) * D + 1 } pub fn wires_output_list_item(&self, i: usize) -> Range { @@ -53,19 +57,19 @@ impl InsertionGate { } /// The wires corresponding to the "equality_dummy" variable in the gadget (non-gate) insert function. - pub fn equality_dummy_for_round_r(r: usize) -> Range { - let start = start_of_intermediate_wires() + D * r; + pub fn equality_dummy_for_round_r(&self, r: usize) -> Range { + let start = self.start_of_intermediate_wires() + D * r; start..start + D } } -impl, const D: usize> Gate for InsertionGate { +impl, const D: usize> Gate for InsertionGate { fn id(&self) -> String { format!("{:?}", self, D) } fn eval_unfiltered(&self, vars: EvaluationVars) -> Vec { - let insertion_index = vars.get_local_ext_algebra(Self::wires_insertion_index()); + let insertion_index = vars.local_wires[Self::wires_insertion_index()]; let mut list_items = Vec::new(); for i in 0..self.vec_size { list_items.push(vars.get_local_ext_algebra(Self::wires_list_item(i))); @@ -75,30 +79,32 @@ impl, const D: usize> Gate for InsertionGate { let mut constraints = Vec::new(); - let mut already_inserted = F::zero(); + let mut already_inserted : ExtensionAlgebra = F::Extension::ZERO.into(); for r in 0..self.vec_size { let cur_index = F::Extension::from_canonical_usize(r); - let equality_dummy = vars.get_local_ext_algebra(Self::equality_dummy_for_round_r(r)); + let equality_dummy = vars.get_local_ext_algebra(self.equality_dummy_for_round_r(r)); let difference = cur_index - insertion_index; - let insert_here = if difference == F::ZERO { - F::ZERO + let insert_here : ExtensionAlgebra = if difference == F::Extension::ZERO { + F::Extension::ZERO.into() } else { - F::ONE + F::Extension::ONE.into() }; // The two equality constraints: - constraints.extend(difference * equality_dummy - insert_here); - constraints.extend((1 - insert_here) * difference); + let equality_dummy_constraint : ExtensionAlgebra = difference.into() * equality_dummy - insert_here; + constraints.extend(equality_dummy_constraint.to_basefield_array()); + let mul_to_zero_constraint : ExtensionAlgebra = (F::Extension::ONE.into() - insert_here) * difference; + constraints.extend(mul_to_zero_constraint.to_basefield_array()); let mut new_item = insert_here * element_to_insert + already_inserted; if r > 0 { - new_item += already_inserted * list_items[i - 1]; + new_item += already_inserted * list_items[r - 1]; } already_inserted += insert_here; - new_item += (F::ONE - already_inserted) * list_items[i]; + new_item += (F::Extension::ONE.into() - already_inserted) * list_items[r]; } constraints @@ -146,13 +152,13 @@ impl, const D: usize> Gate for InsertionGate { } #[derive(Debug)] -struct InsertionGenerator { +struct InsertionGenerator, const D: usize> { gate_index: usize, gate: InsertionGate, _phantom: PhantomData, } -impl SimpleGenerator for InsertionGenerator { +impl, const D: usize> SimpleGenerator for InsertionGenerator { fn dependencies(&self) -> Vec { let local_target = |input| { Target::Wire(Wire { @@ -164,17 +170,15 @@ impl SimpleGenerator for InsertionGenerator { let local_targets = |inputs: Range| inputs.map(local_target); let mut deps = Vec::new(); - deps.extend(local_targets(self.gate.wires_insertion_index())); - deps.extend(local_targets(self.gate.wires_element_to_insert())); + deps.push(local_target(InsertionGate::::wires_insertion_index())); + deps.extend(local_targets(InsertionGate::::wires_element_to_insert())); for i in 0..self.gate.vec_size { - deps.push(local_target(self.gate.wires_list_item(i))); + deps.extend(local_targets(InsertionGate::::wires_list_item(i))); } deps } - fn run_once(&self, _witness: &PartialWitness) -> PartialWitness { - let n = self.gate.num_points; - + fn run_once(&self, witness: &PartialWitness) -> PartialWitness { let local_wire = |input| Wire { gate: self.gate_index, input, diff --git a/src/gates/mod.rs b/src/gates/mod.rs index fa23b273..f09b5335 100644 --- a/src/gates/mod.rs +++ b/src/gates/mod.rs @@ -4,6 +4,7 @@ pub mod constant; pub(crate) mod gate; pub mod gate_tree; pub mod gmimc; +pub mod insertion; pub mod interpolation; pub(crate) mod noop;