From 66e4f7c3cf1261e8d44cd5f09f2f6c73499e4f0b Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Mon, 12 Jul 2021 12:14:14 -0700 Subject: [PATCH] added output constraint --- src/gates/insertion.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/gates/insertion.rs b/src/gates/insertion.rs index 81874a7e..5ddc9168 100644 --- a/src/gates/insertion.rs +++ b/src/gates/insertion.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; use crate::circuit_builder::CircuitBuilder; use crate::field::extension_field::algebra::ExtensionAlgebra; use crate::field::extension_field::target::ExtensionTarget; -use crate::field::extension_field::Extendable; +use crate::field::extension_field::{FieldExtension, Extendable}; use crate::field::field::Field; use crate::gates::gate::{Gate, GateRef}; use crate::generator::{SimpleGenerator, WitnessGenerator}; @@ -70,17 +70,25 @@ impl, const D: usize> Gate for InsertionGate { fn eval_unfiltered(&self, vars: EvaluationVars) -> Vec { 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))); } + let dummy_value : ExtensionAlgebra = F::Extension::ZERO.into(); // will never be reached + list_items.push(dummy_value); + + let mut output_list_items = Vec::new(); + for i in 0..self.vec_size+1 { + output_list_items.push(vars.get_local_ext_algebra(self.wires_output_list_item(i))); + } let element_to_insert = vars.get_local_ext_algebra(Self::wires_element_to_insert()); let mut constraints = Vec::new(); let mut already_inserted : ExtensionAlgebra = F::Extension::ZERO.into(); - for r in 0..self.vec_size { + for r in 0..self.vec_size + 1 { let cur_index = F::Extension::from_canonical_usize(r); let equality_dummy = vars.get_local_ext_algebra(self.equality_dummy_for_round_r(r)); @@ -93,7 +101,8 @@ impl, const D: usize> Gate for InsertionGate { }; // The two equality constraints: - let equality_dummy_constraint : ExtensionAlgebra = difference.into() * equality_dummy - insert_here; + let difference_algebra : ExtensionAlgebra = difference.into(); + let equality_dummy_constraint : ExtensionAlgebra = difference_algebra * 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()); @@ -105,6 +114,8 @@ impl, const D: usize> Gate for InsertionGate { already_inserted += insert_here; new_item += (F::Extension::ONE.into() - already_inserted) * list_items[r]; + + constraints.extend((new_item - output_list_items[r]).to_basefield_array()); } constraints