Skip to main content

proof_stream/viz/
sumcheck.rs

1//! Helpers for converting sumcheck round polynomials to `ProofEvent` types.
2
3use crate::events::{RoundPolyDeg3Viz, RoundPolyViz, SecureFieldMirror};
4
5/// Convert a raw `[u32; 4]` (the four limbs of a QM31/SecureField) to our
6/// mirror type. The layout follows STWO's QM31: `(a + bi) + (c + di)j` where
7/// each letter is an M31 stored as a u32.
8pub fn sf_mirror(a: u32, b: u32, c: u32, d: u32) -> SecureFieldMirror {
9    SecureFieldMirror { a, b, c, d }
10}
11
12/// Build a `RoundPolyViz` from six raw u32 limbs (three QM31 coefficients).
13pub fn round_poly_viz(
14    c0: [u32; 4],
15    c1: [u32; 4],
16    c2: [u32; 4],
17) -> RoundPolyViz {
18    RoundPolyViz {
19        c0: sf_mirror(c0[0], c0[1], c0[2], c0[3]),
20        c1: sf_mirror(c1[0], c1[1], c1[2], c1[3]),
21        c2: sf_mirror(c2[0], c2[1], c2[2], c2[3]),
22    }
23}
24
25/// Build a `RoundPolyDeg3Viz` from four raw u32 limbs (four QM31 coefficients).
26pub fn round_poly_deg3_viz(
27    c0: [u32; 4],
28    c1: [u32; 4],
29    c2: [u32; 4],
30    c3: [u32; 4],
31) -> RoundPolyDeg3Viz {
32    RoundPolyDeg3Viz {
33        c0: sf_mirror(c0[0], c0[1], c0[2], c0[3]),
34        c1: sf_mirror(c1[0], c1[1], c1[2], c1[3]),
35        c2: sf_mirror(c2[0], c2[1], c2[2], c2[3]),
36        c3: sf_mirror(c3[0], c3[1], c3[2], c3[3]),
37    }
38}
39
40/// Normalize a raw QM31 `.a` limb to [0,1] for claim value approximation.
41pub fn claim_approx(qm31_a_limb: u32) -> f32 {
42    qm31_a_limb as f32 / (0x7fff_ffff_u32 as f32)
43}
44