diff --git a/crates/prover/src/core/air/air_ext.rs b/crates/prover/src/core/air/air_ext.rs index ddf1bcb4c..9c49beb58 100644 --- a/crates/prover/src/core/air/air_ext.rs +++ b/crates/prover/src/core/air/air_ext.rs @@ -1,17 +1,19 @@ +use std::collections::BTreeSet; use std::iter::zip; -use itertools::Itertools; +use itertools::{zip_eq, Itertools}; use super::accumulation::{DomainEvaluationAccumulator, PointEvaluationAccumulator}; use super::{Air, AirProver, ComponentTrace}; use crate::core::backend::Backend; +use crate::core::channel::{Blake2sChannel, Channel}; use crate::core::circle::CirclePoint; use crate::core::fields::m31::BaseField; use crate::core::fields::qm31::SecureField; use crate::core::poly::circle::{CanonicCoset, CircleEvaluation, CirclePoly, SecureCirclePoly}; use crate::core::poly::BitReversedOrder; use crate::core::prover::LOG_BLOWUP_FACTOR; -use crate::core::ComponentVec; +use crate::core::{ComponentVec, InteractionElements}; pub trait AirExt: Air { fn composition_log_degree_bound(&self) -> u32 { @@ -41,6 +43,15 @@ pub trait AirExt: Air { component_points } + fn interaction_elements(&self, channel: &mut Blake2sChannel) -> InteractionElements { + let mut ids = BTreeSet::new(); + for component in self.components() { + ids.extend(component.interaction_element_ids()); + } + let elements = channel.draw_felts(ids.len()).into_iter().map(|e| e.0 .0); + InteractionElements(zip_eq(ids, elements).collect_vec()) + } + fn eval_composition_polynomial_at_point( &self, point: CirclePoint, diff --git a/crates/prover/src/core/air/mod.rs b/crates/prover/src/core/air/mod.rs index 0911cc12e..659a40a71 100644 --- a/crates/prover/src/core/air/mod.rs +++ b/crates/prover/src/core/air/mod.rs @@ -41,6 +41,9 @@ pub trait Component { point: CirclePoint, ) -> ColumnVec>>; + /// Returns the ids of the interaction elements used by the component. + fn interaction_element_ids(&self) -> Vec; + /// Evaluates the constraint quotients combination of the component, given the mask values. fn evaluate_constraint_quotients_at_point( &self, diff --git a/crates/prover/src/core/mod.rs b/crates/prover/src/core/mod.rs index 7b886f941..a3314ed9d 100644 --- a/crates/prover/src/core/mod.rs +++ b/crates/prover/src/core/mod.rs @@ -1,5 +1,7 @@ use std::ops::{Deref, DerefMut}; +use self::fields::m31::BaseField; + pub mod air; pub mod backend; pub mod channel; @@ -57,3 +59,5 @@ impl DerefMut for ComponentVec { &mut self.0 } } + +pub struct InteractionElements(Vec<(String, BaseField)>); diff --git a/crates/prover/src/core/prover/mod.rs b/crates/prover/src/core/prover/mod.rs index 3d0505832..ba4b34fb1 100644 --- a/crates/prover/src/core/prover/mod.rs +++ b/crates/prover/src/core/prover/mod.rs @@ -321,6 +321,10 @@ mod tests { vec![vec![point]] } + fn interaction_element_ids(&self) -> Vec { + vec![] + } + fn evaluate_constraint_quotients_at_point( &self, _point: CirclePoint, diff --git a/crates/prover/src/examples/fibonacci/component.rs b/crates/prover/src/examples/fibonacci/component.rs index 6cdd280f9..c1e1f71d4 100644 --- a/crates/prover/src/examples/fibonacci/component.rs +++ b/crates/prover/src/examples/fibonacci/component.rs @@ -94,6 +94,10 @@ impl Component for FibonacciComponent { ) } + fn interaction_element_ids(&self) -> Vec { + vec![] + } + fn evaluate_constraint_quotients_at_point( &self, point: CirclePoint, diff --git a/crates/prover/src/examples/wide_fibonacci/component.rs b/crates/prover/src/examples/wide_fibonacci/component.rs index 62e5dc263..b8c9b97c5 100644 --- a/crates/prover/src/examples/wide_fibonacci/component.rs +++ b/crates/prover/src/examples/wide_fibonacci/component.rs @@ -67,6 +67,13 @@ impl Component for WideFibComponent { fixed_mask_points(&vec![vec![0_usize]; self.n_columns()], point) } + fn interaction_element_ids(&self) -> Vec { + vec![ + "wide_fibonacci_alpha".to_string(), + "wide_fibonacci_z".to_string(), + ] + } + fn evaluate_constraint_quotients_at_point( &self, point: CirclePoint,