p3-circle 0.5.3

A STARK proof system built around the unit circle of a finite field, based on the Circle STARKs paper.
Documentation
use core::hint::black_box;
use std::time::{Duration, Instant};

use p3_baby_bear::BabyBear;
use p3_circle::{CircleDomain, CircleEvaluations};
use p3_dft::{Radix2DitParallel, TwoAdicSubgroupDft};
use p3_field::Field;
use p3_matrix::Matrix;
use p3_matrix::dense::RowMajorMatrix;
use p3_mersenne_31::Mersenne31;
use rand::SeedableRng;
use rand::rngs::SmallRng;
use tracing_forest::ForestLayer;
use tracing_forest::util::LevelFilter;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, Registry};

type F = Mersenne31;

fn go<M: Matrix<F>>(evals: CircleEvaluations<F, M>, log_n: usize) -> CircleEvaluations<F> {
    evals.extrapolate(CircleDomain::standard(log_n))
}

fn main() {
    let env_filter = EnvFilter::builder()
        .with_default_directive(LevelFilter::INFO.into())
        .from_env_lossy();

    let mut args = std::env::args().skip(1);
    let log_n = args.next().map(|s| s.parse().unwrap()).unwrap_or(16);
    let log_w = args.next().map(|s| s.parse().unwrap()).unwrap_or(8);
    println!("log_n={log_n}, log_w={log_w}");

    let mut rng = SmallRng::seed_from_u64(1);
    let m = RowMajorMatrix::<F>::rand(&mut rng, 1 << log_n, 1 << log_w);
    let evals = CircleEvaluations::from_natural_order(CircleDomain::standard(log_n), m);

    println!("warming up for 1s...");
    let t0 = Instant::now();
    while Instant::now().duration_since(t0) < Duration::from_secs(1) {
        black_box(go(black_box(evals.clone()), log_n + 1));
    }

    Registry::default()
        .with(env_filter)
        .with(ForestLayer::default())
        .init();

    black_box(go(black_box(evals), log_n + 1));

    let m = RowMajorMatrix::<BabyBear>::rand(&mut rng, 1 << log_n, 1 << log_w);
    black_box(Radix2DitParallel::default().coset_lde_batch(black_box(m), 1, BabyBear::GENERATOR));
}