Skip to main content

zinc_uair/
collect_scalars.rs

1use std::{cell::RefCell, collections::HashSet};
2
3use crate::{
4    TraceRow, Uair, do_nothing_builder::DoNothingBuilder, dummy_semiring::DummySemiring,
5    ideal::ImpossibleIdeal,
6};
7
8/// Collect all the scalars appearing in a UAIR.
9/// Useful to store results of intermediate operations on scalars
10/// between protocol stages, e.g. field projections.
11pub fn collect_scalars<U: Uair>() -> HashSet<U::Scalar> {
12    let scalars = RefCell::new(HashSet::new());
13
14    let sig = U::signature();
15    let (up_dummy, down_dummy) = sig.dummy_rows(DummySemiring);
16    let up_row = TraceRow::from_slice_with_layout(&up_dummy, sig.total_cols().as_column_layout());
17    let down_row =
18        TraceRow::from_slice_with_layout(&down_dummy, sig.down_cols().as_column_layout());
19
20    U::constrain_general(
21        &mut DoNothingBuilder,
22        up_row,
23        down_row,
24        |x| {
25            scalars.borrow_mut().insert(x.clone());
26            DummySemiring
27        },
28        |_x, y| {
29            scalars.borrow_mut().insert(y.clone());
30            Some(DummySemiring)
31        },
32        |_| ImpossibleIdeal,
33    );
34
35    scalars.into_inner()
36}