Skip to content

Commit 0879de1

Browse files
authored
feat: add methods to get air widths/interactions from vkey (openvm-org#79)
* feat: add fns for getting widths/interactions from vkey * feat(test): add test for vkey widths/interactions method * chore: fix clippy
1 parent 5806d0b commit 0879de1

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

crates/stark-backend/src/keygen/types.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,14 @@ impl<SC: StarkGenericConfig> MultiStarkVerifyingKey<SC> {
183183
pub fn num_challenges_per_phase(&self) -> Vec<usize> {
184184
self.full_view().num_challenges_per_phase()
185185
}
186+
187+
pub fn total_widths(&self) -> Vec<usize> {
188+
self.full_view().total_widths::<SC::Challenge>()
189+
}
190+
191+
pub fn num_interactions(&self) -> Vec<usize> {
192+
self.full_view().num_interactions()
193+
}
186194
}
187195

188196
/// Prover only data for preprocessed trace for a single AIR.

crates/stark-backend/src/keygen/view.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use itertools::Itertools;
2+
use p3_field::{ExtensionField, Field};
23

34
use crate::{
45
config::{Com, StarkGenericConfig, Val},
@@ -75,4 +76,29 @@ impl<Val, Com: Clone> MultiStarkVerifyingKeyView<'_, Val, Com> {
7576
.max()
7677
.unwrap_or_else(|| panic!("No challenges used in challenge phase {phase_idx}"))
7778
}
79+
80+
/// Returns the total width for each AIR.
81+
pub fn total_widths<E>(&self) -> Vec<usize>
82+
where
83+
Val: Field,
84+
E: ExtensionField<Val>,
85+
{
86+
self.per_air
87+
.iter()
88+
.map(|vk| {
89+
vk.params.width.preprocessed.unwrap_or(0)
90+
+ vk.params.width.cached_mains.iter().sum::<usize>()
91+
+ vk.params.width.common_main
92+
+ vk.params.width.after_challenge.iter().sum::<usize>() * E::D
93+
})
94+
.collect()
95+
}
96+
97+
/// Returns the number of interactions for each AIR.
98+
pub fn num_interactions(&self) -> Vec<usize> {
99+
self.per_air
100+
.iter()
101+
.map(|vk| vk.symbolic_constraints.interactions.len())
102+
.collect()
103+
}
78104
}

crates/stark-backend/tests/integration_test.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,45 @@ fn test_optional_air() {
226226
}
227227
}
228228

229+
#[test]
230+
fn test_vkey_methods() {
231+
use openvm_stark_backend::engine::StarkEngine;
232+
use openvm_stark_sdk::{
233+
config::{setup_tracing, FriParameters},
234+
dummy_airs::fib_air::air::FibonacciAir,
235+
};
236+
use p3_air::BaseAir;
237+
238+
setup_tracing();
239+
240+
let engine = BabyBearPoseidon2Engine::new(FriParameters::standard_fast());
241+
242+
let fib_chip = FibonacciChip::new(0, 1, 8);
243+
let send_chip = DummyInteractionChip::new_without_partition(1, true, 0);
244+
let recv_chip = DummyInteractionChip::new_without_partition(1, false, 0);
245+
246+
let mut keygen_builder = engine.keygen_builder();
247+
let _ = keygen_builder.add_air(fib_chip.air());
248+
let _ = keygen_builder.add_air(send_chip.air());
249+
let _ = keygen_builder.add_air(recv_chip.air());
250+
let pk = keygen_builder.generate_pk();
251+
252+
let vk = pk.get_vk();
253+
254+
let widths = vk.total_widths();
255+
assert_eq!(widths.len(), 3);
256+
assert_eq!(widths[0], BaseAir::<BabyBear>::width(&FibonacciAir));
257+
// 1 interaction -> 1 perm col + 1 cumsum col -> 8 cols in base field
258+
assert_eq!(widths[1], BaseAir::<BabyBear>::width(&send_chip.air) + 8);
259+
assert_eq!(widths[2], BaseAir::<BabyBear>::width(&recv_chip.air) + 8);
260+
261+
let interactions = vk.num_interactions();
262+
assert_eq!(interactions.len(), 3);
263+
assert_eq!(interactions[0], 0);
264+
assert_eq!(interactions[1], 1);
265+
assert_eq!(interactions[2], 1);
266+
}
267+
229268
fn get_fib_number(n: usize) -> u32 {
230269
let mut a = 0;
231270
let mut b = 1;

0 commit comments

Comments
 (0)