openvm_native_recursion/fri/
types.rs

1use openvm_native_compiler::prelude::*;
2
3use crate::{digest::DigestVariable, fri::TwoAdicMultiplicativeCosetVariable, vars::HintSlice};
4
5#[derive(Clone)]
6pub struct FriConfigVariable<C: Config> {
7    pub log_blowup: usize,
8    pub blowup: usize,
9    pub log_final_poly_len: usize,
10    pub num_queries: usize,
11    pub commit_proof_of_work_bits: usize,
12    pub query_proof_of_work_bits: usize,
13    pub generators: Array<C, Felt<C::F>>,
14    pub subgroups: Array<C, TwoAdicMultiplicativeCosetVariable<C>>,
15}
16
17impl<C: Config> FriConfigVariable<C> {
18    pub fn get_subgroup(
19        &self,
20        builder: &mut Builder<C>,
21        log_degree: impl Into<RVar<C::N>>,
22    ) -> TwoAdicMultiplicativeCosetVariable<C> {
23        builder.get(&self.subgroups, log_degree)
24    }
25
26    pub fn get_two_adic_generator(
27        &self,
28        builder: &mut Builder<C>,
29        bits: impl Into<RVar<C::N>>,
30    ) -> Felt<C::F> {
31        builder.get(&self.generators, bits)
32    }
33}
34
35#[derive(DslVariable, Clone)]
36pub struct FriProofVariable<C: Config> {
37    pub commit_phase_commits: Array<C, DigestVariable<C>>,
38    pub query_proofs: Array<C, FriQueryProofVariable<C>>,
39    pub final_poly: Array<C, Ext<C::F, C::EF>>,
40    pub commit_pow_witnesses: Array<C, Felt<C::F>>,
41    pub query_pow_witness: Felt<C::F>,
42}
43
44#[derive(DslVariable, Clone)]
45pub struct FriQueryProofVariable<C: Config> {
46    pub input_proof: Array<C, BatchOpeningVariable<C>>,
47    pub commit_phase_openings: Array<C, FriCommitPhaseProofStepVariable<C>>,
48}
49
50#[derive(DslVariable, Clone)]
51pub struct FriCommitPhaseProofStepVariable<C: Config> {
52    pub sibling_value: Ext<C::F, C::EF>,
53    pub opening_proof: HintSlice<C>,
54}
55
56#[derive(DslVariable, Clone)]
57pub struct FriChallengesVariable<C: Config> {
58    pub query_indices: Array<C, Array<C, Var<C::N>>>,
59    pub betas: Array<C, Ext<C::F, C::EF>>,
60}
61
62#[derive(DslVariable, Clone)]
63pub struct DimensionsVariable<C: Config> {
64    pub log_height: Usize<C::N>,
65}
66
67#[derive(DslVariable, Clone)]
68pub struct BatchOpeningVariable<C: Config> {
69    pub opened_values: HintSlice<C>,
70    pub opening_proof: HintSlice<C>,
71}
72
73#[derive(DslVariable, Clone)]
74pub struct TwoAdicPcsRoundVariable<C: Config> {
75    pub batch_commit: DigestVariable<C>,
76    pub mats: Array<C, TwoAdicPcsMatsVariable<C>>,
77    /// Optional. `permutation` could be empty if `mats` is already sorted. Otherwise, it's a
78    /// permutation of indexes of mats which domains are sorted by degree in descending order.
79    pub permutation: Array<C, Usize<C::N>>,
80}
81
82#[derive(DslVariable, Clone)]
83pub struct TwoAdicPcsMatsVariable<C: Config> {
84    pub domain: TwoAdicMultiplicativeCosetVariable<C>,
85    pub points: Array<C, Ext<C::F, C::EF>>,
86    #[allow(clippy::type_complexity)]
87    pub values: Array<C, Array<C, Ext<C::F, C::EF>>>,
88}