From 8f18089aac2dc01094d1db893e5d33ec2ec56135 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 23 Jul 2021 18:06:14 +0200 Subject: [PATCH] Implement `eval_unfiltered_recursively` for `ReducingGate` --- src/field/extension_field/target.rs | 7 +++++++ src/gates/reducing.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/field/extension_field/target.rs b/src/field/extension_field/target.rs index 6083e2c4..97576ac6 100644 --- a/src/field/extension_field/target.rs +++ b/src/field/extension_field/target.rs @@ -115,6 +115,13 @@ impl, const D: usize> CircuitBuilder { arr[0] = t; ExtensionTarget(arr) } + + pub fn convert_to_ext_algebra(&mut self, et: ExtensionTarget) -> ExtensionAlgebraTarget { + let zero = self.zero_extension(); + let mut arr = [zero; D]; + arr[0] = et; + ExtensionAlgebraTarget(arr) + } } /// Flatten the slice by sending every extension target to its D-sized canonical representation. diff --git a/src/gates/reducing.rs b/src/gates/reducing.rs index ebcd5cac..4c750bb9 100644 --- a/src/gates/reducing.rs +++ b/src/gates/reducing.rs @@ -82,7 +82,33 @@ impl, const D: usize> Gate for ReducingGate { builder: &mut CircuitBuilder, vars: EvaluationTargets, ) -> Vec> { - todo!() + let output = vars.get_local_ext_algebra(Self::wires_output()); + let alpha = vars.get_local_ext_algebra(Self::wires_alpha()); + let old_acc = vars.get_local_ext_algebra(Self::wires_old_acc()); + let coeffs = self + .wires_coeffs() + .map(|i| vars.local_wires[i]) + .collect::>(); + let accs = (0..self.num_coeffs) + .map(|i| vars.get_local_ext_algebra(self.wires_accs(i))) + .collect::>(); + + let mut constraints = Vec::new(); + let mut acc = old_acc; + for i in 0..self.num_coeffs { + let mut tmp = builder.mul_ext_algebra(acc, alpha); + let coeff = builder.convert_to_ext_algebra(coeffs[i]); + tmp = builder.add_ext_algebra(tmp, coeff); + tmp = builder.sub_ext_algebra(tmp, accs[i]); + constraints.push(tmp); + acc = accs[i]; + } + + constraints.push(builder.sub_ext_algebra(output, acc)); + constraints + .into_iter() + .flat_map(|alg| alg.to_ext_target_array()) + .collect() } fn generators(