diff --git a/src/generator.rs b/src/generator.rs index a2b35a53..130ca0d0 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -130,3 +130,38 @@ impl SimpleGenerator for RandomValueGenerator { PartialWitness::singleton_target(self.target, random_value) } } + + +/// A generator for including a random value +pub(crate) struct EqualityGenerator { + pub(crate) x: Target, + pub(crate) m: Target, + pub(crate) y: Target, +} + +impl SimpleGenerator for EqualityGenerator { + fn dependencies(&self) -> Vec { + vec![self.x] + } + + fn run_once(&self, witness: &PartialWitness) -> PartialWitness { + let x_value = witness.get_target(self.x); + + let y_value = if x_value == F::ZERO { + F::ZERO + } else { + F::ONE + }; + + let m_value = if x_value == F::ZERO { + F::ONE + } else { + x_value.inverse() + }; + + let mut witness = PartialWitness::new(); + witness.set_target(self.m, m_value); + witness.set_target(self.y, y_value); + witness + } +}