use alloc::vec::Vec;
use p3_matrix::dense::RowMajorMatrixView;
use p3_matrix::stack::ViewPair;
use p3_miden_air::MidenAirBuilder;
use crate::{PackedChallenge, PackedVal, StarkGenericConfig, Val};
#[derive(Debug)]
pub struct ProverConstraintFolder<'a, SC: StarkGenericConfig> {
pub main: RowMajorMatrixView<'a, PackedVal<SC>>,
pub aux: RowMajorMatrixView<'a, PackedChallenge<SC>>,
pub packed_randomness: Vec<PackedChallenge<SC>>,
pub aux_bus_boundary_values: &'a [PackedChallenge<SC>],
pub preprocessed: Option<RowMajorMatrixView<'a, PackedVal<SC>>>,
pub public_values: &'a [Val<SC>],
pub periodic_values: &'a [PackedChallenge<SC>],
pub is_first_row: PackedVal<SC>,
pub is_last_row: PackedVal<SC>,
pub is_transition: PackedVal<SC>,
pub alpha_powers: &'a [SC::Challenge],
pub decomposed_alpha_powers: &'a [Vec<Val<SC>>],
pub accumulator: PackedChallenge<SC>,
pub constraint_index: usize,
}
impl<'a, SC: StarkGenericConfig> MidenAirBuilder for ProverConstraintFolder<'a, SC> {
type F = Val<SC>;
type Expr = PackedVal<SC>;
type Var = PackedVal<SC>;
type M = RowMajorMatrixView<'a, PackedVal<SC>>;
type PublicVar = Val<SC>;
type EF = SC::Challenge;
type ExprEF = PackedChallenge<SC>;
type VarEF = PackedChallenge<SC>;
type MP = RowMajorMatrixView<'a, PackedChallenge<SC>>;
type RandomVar = PackedChallenge<SC>;
type PeriodicVal = PackedChallenge<SC>;
#[inline]
fn main(&self) -> Self::M {
self.main
}
#[inline]
fn is_first_row(&self) -> Self::Expr {
self.is_first_row
}
#[inline]
fn is_last_row(&self) -> Self::Expr {
self.is_last_row
}
#[inline]
fn is_transition_window(&self, size: usize) -> Self::Expr {
if size == 2 {
self.is_transition
} else {
panic!("miden-prover only supports a window size of 2")
}
}
#[inline]
fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
let alpha_power = self.alpha_powers[self.constraint_index];
self.accumulator += Into::<PackedChallenge<SC>>::into(alpha_power) * x.into();
self.constraint_index += 1;
}
#[inline]
fn public_values(&self) -> &[Self::PublicVar] {
self.public_values
}
#[inline]
fn preprocessed(&self) -> Self::M {
self.preprocessed
.expect("Air does not provide preprocessed columns, hence can not be consumed")
}
#[inline]
fn assert_zero_ext<I>(&mut self, x: I)
where
I: Into<Self::ExprEF>,
{
let alpha_power = self.alpha_powers[self.constraint_index];
self.accumulator += Into::<PackedChallenge<SC>>::into(alpha_power) * x.into();
self.constraint_index += 1;
}
#[inline]
fn permutation(&self) -> Self::MP {
self.aux
}
#[inline]
fn permutation_randomness(&self) -> &[Self::RandomVar] {
self.packed_randomness.as_slice()
}
fn aux_bus_boundary_values(&self) -> &[Self::VarEF] {
self.aux_bus_boundary_values
}
fn periodic_evals(&self) -> &[Self::PeriodicVal] {
self.periodic_values
}
}
#[derive(Debug)]
pub struct VerifierConstraintFolder<'a, SC: StarkGenericConfig> {
pub main: ViewPair<'a, SC::Challenge>,
pub aux: ViewPair<'a, SC::Challenge>,
pub randomness: &'a [SC::Challenge],
pub aux_bus_boundary_values: &'a [SC::Challenge],
pub preprocessed: Option<ViewPair<'a, SC::Challenge>>,
pub public_values: &'a [Val<SC>],
pub periodic_values: &'a [SC::Challenge],
pub is_first_row: SC::Challenge,
pub is_last_row: SC::Challenge,
pub is_transition: SC::Challenge,
pub alpha: SC::Challenge,
pub accumulator: SC::Challenge,
}
impl<'a, SC: StarkGenericConfig> MidenAirBuilder for VerifierConstraintFolder<'a, SC> {
type F = Val<SC>;
type Expr = SC::Challenge;
type Var = SC::Challenge;
type M = ViewPair<'a, SC::Challenge>;
type PublicVar = Val<SC>;
type EF = SC::Challenge;
type ExprEF = SC::Challenge;
type VarEF = SC::Challenge;
type MP = ViewPair<'a, SC::Challenge>;
type RandomVar = SC::Challenge;
type PeriodicVal = SC::Challenge;
#[inline]
fn main(&self) -> Self::M {
self.main
}
#[inline]
fn is_first_row(&self) -> Self::Expr {
self.is_first_row
}
#[inline]
fn is_last_row(&self) -> Self::Expr {
self.is_last_row
}
#[inline]
fn is_transition_window(&self, size: usize) -> Self::Expr {
if size == 2 {
self.is_transition
} else {
panic!("miden-prover only supports a window size of 2")
}
}
#[inline]
fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
self.accumulator = self.accumulator * self.alpha + x.into();
}
#[inline]
fn public_values(&self) -> &[Self::PublicVar] {
self.public_values
}
#[inline]
fn preprocessed(&self) -> Self::M {
self.preprocessed
.expect("Air does not provide preprocessed columns, hence can not be consumed")
}
#[inline]
fn assert_zero_ext<I>(&mut self, x: I)
where
I: Into<Self::ExprEF>,
{
self.accumulator = self.accumulator * self.alpha + x.into();
}
#[inline]
fn permutation(&self) -> Self::MP {
self.aux
}
#[inline]
fn permutation_randomness(&self) -> &[Self::RandomVar] {
self.randomness
}
fn aux_bus_boundary_values(&self) -> &[Self::VarEF] {
self.aux_bus_boundary_values
}
fn periodic_evals(&self) -> &[Self::PeriodicVal] {
self.periodic_values
}
}