pub mod turbo;
pub mod anemoi;
use ark_ff::PrimeField;
use crate::errors::ZkpError;
#[doc(hidden)]
pub use turbo::TurboCS;
use self::turbo::N_WIRE_SELECTORS;
pub type VarIndex = usize;
pub type CsIndex = usize;
pub trait ConstraintSystem<F: PrimeField>: Sized {
fn size(&self) -> usize;
fn num_vars(&self) -> usize;
fn wiring(&self) -> &[Vec<usize>];
fn quot_eval_dom_size(&self) -> usize;
fn n_wires_per_gate() -> usize;
fn num_selectors() -> usize;
fn num_wire_selectors() -> usize;
fn get_edwards_a(&self) -> F;
fn compute_permutation(&self) -> Vec<usize> {
let n = self.size();
let n_wires_per_gate = Self::n_wires_per_gate();
let mut perm = vec![0usize; n_wires_per_gate * n];
let mut marked = vec![false; self.num_vars()];
let mut v = Vec::with_capacity(n_wires_per_gate * n);
for wire_slice in self.wiring().iter() {
v.extend_from_slice(wire_slice);
}
for (i, value) in v.iter().enumerate() {
if marked[*value] {
continue;
}
let first = i;
let mut prev = i;
for (j, current_value) in v[i + 1..].iter().enumerate() {
if current_value == value {
perm[prev] = i + 1 + j; prev = i + 1 + j;
}
}
perm[prev] = first;
marked[*value] = true
}
perm
}
fn public_vars_constraint_indices(&self) -> &[usize];
fn public_vars_witness_indices(&self) -> &[usize];
fn boolean_constraint_indices(&self) -> &[CsIndex];
fn compute_anemoi_jive_selectors(&self) -> [Vec<F>; 4];
fn extend_witness(&self, witness: &[F]) -> Vec<F> {
let mut extended = Vec::with_capacity(Self::n_wires_per_gate() * self.size());
for wire_slice in self.wiring().iter() {
for index in wire_slice.iter() {
extended.push(witness[*index].clone());
}
}
extended
}
fn compute_witness_selectors(&self) -> [Vec<F>; N_WIRE_SELECTORS];
fn selector(&self, index: usize) -> Result<&[F], ZkpError>;
fn eval_gate_func(wire_vals: &[&F], sel_vals: &[&F], pub_input: &F) -> Result<F, ZkpError>;
fn eval_selector_multipliers(wire_vals: &[&F]) -> Result<Vec<F>, ZkpError>;
fn is_verifier_only(&self) -> bool {
false
}
fn shrink_to_verifier_only(&self) -> Self;
fn get_anemoi_parameters(&self) -> (F, F);
fn get_hiding_degree(&self, idx: usize) -> usize;
}