added output constraint

This commit is contained in:
Nicholas Ward 2021-07-12 12:14:14 -07:00
parent bec189b598
commit 66e4f7c3cf

View File

@ -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<F: Extendable<D>, const D: usize> Gate<F, D> for InsertionGate<F, D> {
fn eval_unfiltered(&self, vars: EvaluationVars<F, D>) -> Vec<F::Extension> {
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, D> = 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, D> = 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<F: Extendable<D>, const D: usize> Gate<F, D> for InsertionGate<F, D> {
};
// The two equality constraints:
let equality_dummy_constraint : ExtensionAlgebra<F::Extension, D> = difference.into() * equality_dummy - insert_here;
let difference_algebra : ExtensionAlgebra<F::Extension, D> = difference.into();
let equality_dummy_constraint : ExtensionAlgebra<F::Extension, D> = difference_algebra * equality_dummy - insert_here;
constraints.extend(equality_dummy_constraint.to_basefield_array());
let mul_to_zero_constraint : ExtensionAlgebra<F::Extension, D> = (F::Extension::ONE.into() - insert_here) * difference;
constraints.extend(mul_to_zero_constraint.to_basefield_array());
@ -105,6 +114,8 @@ impl<F: Extendable<D>, const D: usize> Gate<F, D> for InsertionGate<F, D> {
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