Skip to main content

zinc_uair/
constraint_counter.rs

1use crate::{
2    ConstraintBuilder, TraceRow, Uair, dummy_semiring::DummySemiring, ideal::ImpossibleIdeal,
3};
4
5/// Get the number of polynomial constraints in a `Uair`.
6pub fn count_constraints<U: Uair>() -> usize {
7    let mut cc = ConstraintCounter::new();
8
9    let sig = U::signature();
10    let (up_dummy, down_dummy) = sig.dummy_rows(DummySemiring);
11    let up_row = TraceRow::from_slice_with_layout(&up_dummy, sig.total_cols().as_column_layout());
12    let down_row =
13        TraceRow::from_slice_with_layout(&down_dummy, sig.down_cols().as_column_layout());
14
15    U::constrain(&mut cc, up_row, down_row);
16
17    cc.0
18}
19
20#[derive(Clone, Copy, Debug)]
21pub(crate) struct ConstraintCounter(usize);
22
23impl ConstraintCounter {
24    pub fn new() -> Self {
25        Self(0)
26    }
27}
28
29impl ConstraintBuilder for ConstraintCounter {
30    type Expr = DummySemiring;
31    type Ideal = ImpossibleIdeal;
32
33    #[allow(clippy::arithmetic_side_effects)]
34    #[inline(always)]
35    fn assert_in_ideal(&mut self, _expr: Self::Expr, _ideal_generator: &Self::Ideal) {
36        self.0 += 1;
37    }
38
39    #[allow(clippy::arithmetic_side_effects)]
40    #[inline(always)]
41    fn assert_zero(&mut self, _expr: Self::Expr) {
42        self.0 += 1;
43    }
44}