|
|
@ -0,0 +1,74 @@ |
|
|
|
use crate::String;
|
|
|
|
use algebra::Field;
|
|
|
|
use r1cs_core::{ConstraintSystem, Index, LinearCombination, SynthesisError, Variable};
|
|
|
|
|
|
|
|
/// Constraint counter for testing purposes.
|
|
|
|
pub struct TestConstraintCounter {
|
|
|
|
pub num_inputs: usize,
|
|
|
|
pub num_aux: usize,
|
|
|
|
pub num_constraints: usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl TestConstraintCounter {
|
|
|
|
pub fn new() -> TestConstraintCounter {
|
|
|
|
TestConstraintCounter {
|
|
|
|
num_aux: 0,
|
|
|
|
num_inputs: 0,
|
|
|
|
num_constraints: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<ConstraintF: Field> ConstraintSystem<ConstraintF> for TestConstraintCounter {
|
|
|
|
type Root = Self;
|
|
|
|
|
|
|
|
fn alloc<F, A, AR>(&mut self, _: A, _: F) -> Result<Variable, SynthesisError>
|
|
|
|
where
|
|
|
|
F: FnOnce() -> Result<ConstraintF, SynthesisError>,
|
|
|
|
A: FnOnce() -> AR,
|
|
|
|
AR: Into<String>,
|
|
|
|
{
|
|
|
|
let var = Variable::new_unchecked(Index::Aux(self.num_aux));
|
|
|
|
self.num_aux += 1;
|
|
|
|
Ok(var)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn alloc_input<F, A, AR>(&mut self, _: A, _: F) -> Result<Variable, SynthesisError>
|
|
|
|
where
|
|
|
|
F: FnOnce() -> Result<ConstraintF, SynthesisError>,
|
|
|
|
A: FnOnce() -> AR,
|
|
|
|
AR: Into<String>,
|
|
|
|
{
|
|
|
|
let var = Variable::new_unchecked(Index::Input(self.num_inputs));
|
|
|
|
self.num_inputs += 1;
|
|
|
|
|
|
|
|
Ok(var)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn enforce<A, AR, LA, LB, LC>(&mut self, _: A, _: LA, _: LB, _: LC)
|
|
|
|
where
|
|
|
|
A: FnOnce() -> AR,
|
|
|
|
AR: Into<String>,
|
|
|
|
LA: FnOnce(LinearCombination<ConstraintF>) -> LinearCombination<ConstraintF>,
|
|
|
|
LB: FnOnce(LinearCombination<ConstraintF>) -> LinearCombination<ConstraintF>,
|
|
|
|
LC: FnOnce(LinearCombination<ConstraintF>) -> LinearCombination<ConstraintF>,
|
|
|
|
{
|
|
|
|
self.num_constraints += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
fn push_namespace<NR, N>(&mut self, _: N)
|
|
|
|
where
|
|
|
|
NR: Into<String>,
|
|
|
|
N: FnOnce() -> NR,
|
|
|
|
{}
|
|
|
|
|
|
|
|
fn pop_namespace(&mut self) { }
|
|
|
|
|
|
|
|
fn get_root(&mut self) -> &mut Self::Root {
|
|
|
|
self
|
|
|
|
}
|
|
|
|
|
|
|
|
fn num_constraints(&self) -> usize {
|
|
|
|
self.num_constraints
|
|
|
|
}
|
|
|
|
}
|