Skip to main content

openvm_stark_sdk/
utils.rs

1use itertools::Itertools;
2use p3_field::PrimeCharacteristicRing;
3use rand::{rngs::StdRng, Rng, SeedableRng};
4use tracing::Level;
5use tracing_forest::ForestLayer;
6use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry};
7
8pub fn setup_tracing() {
9    setup_tracing_with_log_level(Level::INFO);
10}
11
12pub fn setup_tracing_with_log_level(level: Level) {
13    // Set up tracing:
14    let env_filter = EnvFilter::try_from_default_env()
15        .unwrap_or_else(|_| EnvFilter::new(format!("{},p3_=warn", level)));
16    let _ = Registry::default()
17        .with(env_filter)
18        .with(ForestLayer::default())
19        .try_init();
20}
21
22/// Deterministic seeded RNG, for testing use
23pub fn create_seeded_rng() -> StdRng {
24    let seed = [42; 32];
25    StdRng::from_seed(seed)
26}
27
28pub fn create_seeded_rng_with_seed(seed: u64) -> StdRng {
29    let seed_be = seed.to_be_bytes();
30    let mut seed = [0u8; 32];
31    seed[24..32].copy_from_slice(&seed_be);
32    StdRng::from_seed(seed)
33}
34
35// Returns row major matrix
36pub fn generate_random_matrix<F: PrimeCharacteristicRing>(
37    mut rng: impl Rng,
38    height: usize,
39    width: usize,
40) -> Vec<Vec<F>> {
41    (0..height)
42        .map(|_| (0..width).map(|_| F::from_u32(rng.random())).collect_vec())
43        .collect_vec()
44}
45
46pub fn to_field_vec<F: PrimeCharacteristicRing>(v: Vec<u32>) -> Vec<F> {
47    v.into_iter().map(F::from_u32).collect()
48}