Skip to main content

zinc_uair/
collect_scalars.rs

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