diff --git a/CHANGELOG.md b/CHANGELOG.md index cf20d327a..19549d087 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Support importing hierarchical modules (#507). - In Plonky3 codegen, use AirScriptAir and AirScriptBuilder traits, and generate aux constraints (#508). - In Plonky3 codegen, use MidenAir and MidenAirBuilder from 0xMiden's Plonky3 fork instead of AirScriptAir and AirScriptBuilder (#515). +- In Plonky3 codegen, use prove/verify workflow for tests (#523). ## 0.4.0 (2025-06-20) diff --git a/air-script/Cargo.toml b/air-script/Cargo.toml index 65813db4e..ed1709f76 100644 --- a/air-script/Cargo.toml +++ b/air-script/Cargo.toml @@ -28,28 +28,30 @@ log = { version = "0.4", default-features = false } miden-diagnostics = { workspace = true } mir = { package = "air-mir", path = "../mir", version = "0.5" } -[dev-dependencies] -expect-test = "1.4" - # 0xMiden Plonky3 Fork -p3-air = { package = "p3-air", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-challenger = { package = "p3-challenger", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-commit = { package = "p3-commit", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-dft = { package = "p3-dft", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-field = { package = "p3-field", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-fri = { package = "p3-fri", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-matrix = { package = "p3-matrix", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-merkle-tree = { package = "p3-merkle-tree", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-miden-air = { package = "miden-air", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-goldilocks = { package = "p3-goldilocks", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-sha256 = { package = "p3-sha256", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-symmetric = { package = "p3-symmetric", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } -p3-uni-stark = { package = "p3-uni-stark", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false } +p3-matrix = { package = "p3-matrix", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-field = { package = "p3-field", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-miden-air = { package = "miden-air", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } # MassaLabs fork miden-processor = { package = "miden-processor", git="https://github.com/massalabs/miden-vm", rev = "bc553af69a2543a0789830e8508b019694528181", default-features = false } miden-air = { package = "miden-air", git="https://github.com/massalabs/miden-vm", rev = "bc553af69a2543a0789830e8508b019694528181", default-features = false } +[dev-dependencies] +expect-test = "1.4" + +# 0xMiden Plonky3 Fork +p3-air = { package = "p3-air", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-challenger = { package = "p3-challenger", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-commit = { package = "p3-commit", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-dft = { package = "p3-dft", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-fri = { package = "p3-fri", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-merkle-tree = { package = "p3-merkle-tree", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-miden-prover = { package = "miden-prover", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-goldilocks = { package = "p3-goldilocks", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-sha256 = { package = "p3-sha256", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } +p3-symmetric = { package = "p3-symmetric", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false } + winter-air = { package = "winter-air", version = "0.12", default-features = false } winter-math = { package = "winter-math", version = "0.12", default-features = false } winter-utils = { package = "winter-utils", version = "0.12", default-features = false } diff --git a/air-script/src/lib.rs b/air-script/src/lib.rs index 67c255f21..d75247b94 100644 --- a/air-script/src/lib.rs +++ b/air-script/src/lib.rs @@ -2,6 +2,9 @@ pub use air_codegen_winter::CodeGenerator as WinterfellCodeGenerator; pub use air_ir::{Air, CompileError, compile}; pub use air_parser::{parse, parse_file, transforms}; +/// Miden VM auxiliary trace generator +pub mod miden_vm_aux_trace_generator; + #[cfg(test)] pub mod test_utils; #[cfg(test)] diff --git a/air-script/src/test_utils/miden_vm_aux_trace_generator.rs b/air-script/src/miden_vm_aux_trace_generator.rs similarity index 97% rename from air-script/src/test_utils/miden_vm_aux_trace_generator.rs rename to air-script/src/miden_vm_aux_trace_generator.rs index a6f9517c1..e233a970a 100644 --- a/air-script/src/test_utils/miden_vm_aux_trace_generator.rs +++ b/air-script/src/miden_vm_aux_trace_generator.rs @@ -59,7 +59,7 @@ pub fn build_aux_trace_with_miden_vm( main: &RowMajorMatrix, challenges: &[EF], module: MidenModule, -) -> RowMajorMatrix +) -> RowMajorMatrix where F: Field + PrimeField64, EF: ExtensionField, @@ -112,5 +112,6 @@ where } } - aux_trace + let aux_trace_f = aux_trace.flatten_to_base(); + aux_trace_f } diff --git a/air-script/src/test_utils/air_tester_macros.rs b/air-script/src/test_utils/air_tester_macros.rs index 53a64784e..7c5e305ee 100644 --- a/air-script/src/test_utils/air_tester_macros.rs +++ b/air-script/src/test_utils/air_tester_macros.rs @@ -53,7 +53,7 @@ macro_rules! generate_air_plonky3_test_with_airscript_traits { >; type Dft = p3_dft::Radix2DitParallel; type Pcs = p3_fri::TwoAdicFriPcs; - type MyConfig = p3_uni_stark::StarkConfig; + type MyConfig = p3_miden_prover::StarkConfig; let byte_hash = ByteHash {}; let field_hash = FieldHash::new(p3_sha256::Sha256); @@ -62,23 +62,35 @@ macro_rules! generate_air_plonky3_test_with_airscript_traits { let challenge_mmcs = ChallengeMmcs::new(val_mmcs.clone()); let challenger = Challenger::from_hasher(vec![], byte_hash); let dft = Dft::default(); - let fri_params = p3_fri::create_benchmark_fri_params(challenge_mmcs); + let mut fri_params = p3_fri::create_recursive_miden_fri_params(challenge_mmcs); let pcs = Pcs::new(dft, val_mmcs, fri_params); let config = MyConfig::new(pcs, challenger); + // Generate public inputs and convert them to Goldilocks field elements let inputs = generate_inputs(); - let inputs_goldilocks: Vec = inputs - .iter() - .map(|&x| ::from_u32(x)) - .collect(); + let inputs_goldilocks = crate::test_utils::pub_inputs_conversion_utils::convert_pub_inputs_to_goldilocks(&inputs); + + // Generate variable-length public inputs as a `Vec>>`. + // The outer `Vec` represents multiple tables (one for each bus in the AIR) + // The middle `Vec` represents the rows of each table + // The innermost `Vec` represents the tuple values contained by the bus, that will be combined with randomness into a single field element. + let var_len_pub_inputs = generate_var_len_pub_inputs(); + // Convert variable-length public inputs to Goldilocks field elements + let var_len_pub_inputs_goldilocks_vec = crate::test_utils::pub_inputs_conversion_utils::convert_var_len_pub_inputs_to_goldilocks(var_len_pub_inputs); + let var_len_pub_inputs_goldilocks_vec_slice = crate::test_utils::pub_inputs_conversion_utils::convert_inner_vec_to_slice(&var_len_pub_inputs_goldilocks_vec); + let var_len_pub_inputs_goldilocks = crate::test_utils::pub_inputs_conversion_utils::convert_mid_vec_to_slice(&var_len_pub_inputs_goldilocks_vec_slice); let trace = generate_trace_rows::(inputs); - check_constraints_with_airscript_traits::( + let proof = p3_miden_prover::prove(&config, &$air_name {}, &trace, &inputs_goldilocks); + p3_miden_prover::verify( + &config, &$air_name {}, - &trace, + &proof, &inputs_goldilocks, - ); + &var_len_pub_inputs_goldilocks, + ) + .expect("Verification failed"); } }; } diff --git a/air-script/src/test_utils/mod.rs b/air-script/src/test_utils/mod.rs index 601c64017..03ce65907 100644 --- a/air-script/src/test_utils/mod.rs +++ b/air-script/src/test_utils/mod.rs @@ -2,9 +2,7 @@ pub mod air_tester_macros; /// Code generation for tests/**/*.air files. pub mod codegen; -/// Miden VM auxiliary trace generator -pub mod miden_vm_aux_trace_generator; -/// Plonky3-specific Debug constraint builder implementation -pub mod plonky3_traits; +/// Conversion utilities for test inputs (both public inputs and variable-length public inputs). +pub mod pub_inputs_conversion_utils; /// Winterfell-specific traits pub mod winterfell_traits; diff --git a/air-script/src/test_utils/plonky3_traits.rs b/air-script/src/test_utils/plonky3_traits.rs deleted file mode 100644 index 1985d1558..000000000 --- a/air-script/src/test_utils/plonky3_traits.rs +++ /dev/null @@ -1,189 +0,0 @@ -use p3_field::{ExtensionField, Field}; -use p3_matrix::{ - Matrix, - dense::{DenseMatrix, RowMajorMatrix, RowMajorMatrixView}, - stack::VerticalPair, -}; -use p3_miden_air::{MidenAir, MidenAirBuilder, impl_p3_air_builder_traits}; - -/// A builder that runs constraint assertions during testing. -/// -/// Used in conjunction with [`check_constraints`] to simulate an execution trace -/// and verify that the AIR logic enforces all constraints. -#[derive(Debug)] -pub struct DebugConstraintBuilderWithAirScriptTraits<'a, F: Field, EF: ExtensionField> { - /// The index of the row currently being evaluated. - row_index: usize, - /// A view of the current and next main row as a vertical pair. - main: VerticalPair, RowMajorMatrixView<'a, F>>, - /// A view of the current and next preprocessed row as a vertical pair. - preprocessed: VerticalPair, RowMajorMatrixView<'a, F>>, - /// A view of the current and next aux row as a vertical pair. - aux: VerticalPair, RowMajorMatrixView<'a, EF>>, - /// The public values provided for constraint validation (e.g. inputs or outputs). - public_values: &'a [F], - /// A flag indicating whether this is the first row. - is_first_row: F, - /// A flag indicating whether this is the last row. - is_last_row: F, - /// A flag indicating whether this is a transition row (not the last row). - is_transition: F, - /// The periodic columns provided for constraint validation. - periodic_columns: Vec, - /// The permutation randomness in the extension field. - permutation_randomness: Vec, - /// The aux bus boundary values in the extension field. - aux_bus_boundary_values: Vec, -} - -impl<'a, F, EF> MidenAirBuilder for DebugConstraintBuilderWithAirScriptTraits<'a, F, EF> -where - F: Field, - EF: ExtensionField, -{ - type F = F; - type Expr = F; - type Var = F; - type M = VerticalPair, DenseMatrix>; - type PublicVar = F; - type PeriodicVal = EF; - type EF = EF; - type ExprEF = EF; - type VarEF = EF; - type MP = VerticalPair, DenseMatrix>; - type RandomVar = EF; - - fn main(&self) -> Self::M { - self.main - } - - fn is_first_row(&self) -> Self::Expr { - self.is_first_row - } - - fn is_last_row(&self) -> Self::Expr { - self.is_last_row - } - - fn is_transition_window(&self, size: usize) -> Self::Expr { - if size == 2 { - self.is_transition - } else { - panic!("only supports a window size of 2") - } - } - - fn assert_zero>(&mut self, x: I) { - assert_eq!(x.into(), F::ZERO, "constraints had nonzero value on row {}", self.row_index); - } - - fn public_values(&self) -> &[Self::PublicVar] { - self.public_values - } - - fn periodic_evals(&self) -> &[::PeriodicVal] { - self.periodic_columns.as_slice() - } - - fn preprocessed(&self) -> Self::M { - self.preprocessed - } - - fn assert_zero_ext(&mut self, x: I) - where - I: Into, - { - assert_eq!( - x.into(), - EF::ZERO, - "constraints on ext field had nonzero value on row {}", - self.row_index - ); - } - - fn permutation(&self) -> Self::MP { - self.aux - } - - fn permutation_randomness(&self) -> &[Self::RandomVar] { - self.permutation_randomness.as_slice() - } - - fn aux_bus_boundary_values(&self) -> &[::VarEF] { - self.aux_bus_boundary_values.as_slice() - } -} - -impl_p3_air_builder_traits!(DebugConstraintBuilderWithAirScriptTraits<'a, F, EF> where F: Field, EF: ExtensionField); - -pub(crate) fn check_constraints_with_airscript_traits( - air: &A, - main: &RowMajorMatrix, - public_values: &Vec, -) where - F: Field, - EF: ExtensionField, - A: MidenAir, -{ - let height = main.height(); - - let aux_bus_boundary_values: Vec<_> = (0..air.aux_width()).map(|_| EF::GENERATOR).collect(); - let alpha = EF::from_basis_coefficients_iter( - (0..EF::DIMENSION).map(|i| F::from_u64(123456789 * (i as u64 + 1))), - ) - .unwrap(); - let beta = EF::from_u64(987654321); - let beta_powers: Vec = (0..(air.num_randomness().saturating_sub(1))) - .map(|power| beta.exp_u64(power as u64)) - .collect(); - let mut permutation_randomness = Vec::with_capacity(air.num_randomness()); - permutation_randomness.push(alpha); - permutation_randomness.extend_from_slice(beta_powers.as_slice()); - - let aux_trace = air - .build_aux_trace(main, &permutation_randomness) - .unwrap_or(DenseMatrix::default(0, height)); - - (0..height).for_each(|i| { - let i_next = (i + 1) % height; - - let main_local = main.row_slice(i).unwrap(); // i < height so unwrap should never fail. - let main_next = main.row_slice(i_next).unwrap(); // i_next < height so unwrap should never fail. - let main = VerticalPair::new( - RowMajorMatrixView::new_row(&*main_local), - RowMajorMatrixView::new_row(&*main_next), - ); - let aux_local_ref = aux_trace.row_slice(i); - let aux_next_ref = aux_trace.row_slice(i_next); - let aux_local = aux_local_ref.as_deref().unwrap_or_default(); - let aux_next = aux_next_ref.as_deref().unwrap_or_default(); - let aux = VerticalPair::new( - RowMajorMatrixView::new_row(&*aux_local), - RowMajorMatrixView::new_row(&*aux_next), - ); - let preprocessed = VerticalPair::new::( - RowMajorMatrixView::new(&[], 0), - RowMajorMatrixView::new(&[], 0), - ); - - let periodic_columns_base: Vec<_> = - air.periodic_table().iter().map(|col| col[i % col.len()]).collect(); - let periodic_columns: Vec = - periodic_columns_base.iter().map(|&v| EF::from(v)).collect(); - - let mut builder = DebugConstraintBuilderWithAirScriptTraits { - row_index: i, - main, - preprocessed, - aux, - public_values, - is_first_row: F::from_bool(i == 0), - is_last_row: F::from_bool(i == height - 1), - is_transition: F::from_bool(i != height - 1), - periodic_columns, - permutation_randomness: permutation_randomness.clone(), - aux_bus_boundary_values: aux_bus_boundary_values.clone(), - }; - air.eval(&mut builder); - }); -} diff --git a/air-script/src/test_utils/pub_inputs_conversion_utils.rs b/air-script/src/test_utils/pub_inputs_conversion_utils.rs new file mode 100644 index 000000000..894ba75d6 --- /dev/null +++ b/air-script/src/test_utils/pub_inputs_conversion_utils.rs @@ -0,0 +1,46 @@ +type Val = p3_goldilocks::Goldilocks; + +/// Converts public inputs from u64 to Goldilocks field elements. +pub(crate) fn convert_pub_inputs_to_goldilocks(pub_inputs: &[u64]) -> Vec { + pub_inputs + .iter() + .map(|&x| ::from_u64(x)) + .collect() +} + +/// Converts variable-length public inputs from u64 to Goldilocks field elements. +/// The input should be a Vec of tables (Vec>) in a RowMajor format. +pub(crate) fn convert_var_len_pub_inputs_to_goldilocks( + var_len_pub_inputs: Vec>>, +) -> Vec>> { + let mut var_len_pub_inputs_goldilocks_vec: Vec>> = vec![]; + for arr in var_len_pub_inputs.iter() { + let mut goldilocks_arr: Vec> = vec![]; + for slice in arr.iter() { + let goldilocks_slice: Vec = slice + .iter() + .map(|&x| ::from_u64(x)) + .collect(); + goldilocks_arr.push(goldilocks_slice); + } + var_len_pub_inputs_goldilocks_vec.push(goldilocks_arr); + } + var_len_pub_inputs_goldilocks_vec +} + +/// Converts the innermost vectors of variable-length public inputs to slices. +pub(crate) fn convert_inner_vec_to_slice<'a>( + var_len_pub_inputs: &'a Vec>>, +) -> Vec> { + var_len_pub_inputs + .iter() + .map(|outer| outer.iter().map(|inner| inner.as_slice()).collect()) + .collect() +} + +/// Converts the middle vectors of variable-length public inputs to slices. +pub(crate) fn convert_mid_vec_to_slice<'a>( + var_len_pub_inputs: &'a Vec>, +) -> Vec<&'a [&'a [Val]]> { + var_len_pub_inputs.iter().map(|v| v.as_slice()).collect() +} diff --git a/air-script/src/tests/binary/binary_plonky3.rs b/air-script/src/tests/binary/binary_plonky3.rs index 0c514ea56..9f64d933c 100644 --- a/air-script/src/tests/binary/binary_plonky3.rs +++ b/air-script/src/tests/binary/binary_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 2; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for BinaryAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -37,8 +38,6 @@ impl MidenAir for BinaryAir { builder.assert_zero(main_current[0].clone().into() * main_current[0].clone().into() - main_current[0].clone().into()); builder.assert_zero(main_current[1].clone().into() * main_current[1].clone().into() - main_current[1].clone().into()); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/binary/test_air_plonky3.rs b/air-script/src/tests/binary/test_air_plonky3.rs index eced0b469..ba508f868 100644 --- a/air-script/src/tests/binary/test_air_plonky3.rs +++ b/air-script/src/tests/binary/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::binary::binary_plonky3::{BinaryAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -37,8 +36,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, BinaryAir); diff --git a/air-script/src/tests/bitwise/bitwise_plonky3.rs b/air-script/src/tests/bitwise/bitwise_plonky3.rs index bfded5b9b..9811db8cf 100644 --- a/air-script/src/tests/bitwise/bitwise_plonky3.rs +++ b/air-script/src/tests/bitwise/bitwise_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 14; pub const AUX_WIDTH: usize = 0; @@ -33,11 +33,12 @@ where F: Field, } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -66,8 +67,6 @@ where F: Field, builder.when_transition().assert_zero_ext(AB::ExprEF::from(periodic_values[1].clone().into()) * (AB::ExprEF::from(main_current[12].clone().into()) - AB::ExprEF::from(main_next[11].clone().into()))); builder.assert_zero((AB::Expr::ONE - main_current[0].clone().into()) * (main_current[12].clone().into() - (main_current[11].clone().into() * AB::Expr::from_u64(16) + main_current[3].clone().into() * main_current[7].clone().into() + main_current[4].clone().into().double() * main_current[8].clone().into() + AB::Expr::from_u64(4) * main_current[5].clone().into() * main_current[9].clone().into() + AB::Expr::from_u64(8) * main_current[6].clone().into() * main_current[10].clone().into())) + main_current[0].clone().into() * (main_current[12].clone().into() - (main_current[11].clone().into() * AB::Expr::from_u64(16) + main_current[3].clone().into() + main_current[7].clone().into() - main_current[3].clone().into().double() * main_current[7].clone().into() + (main_current[4].clone().into() + main_current[8].clone().into() - main_current[4].clone().into().double() * main_current[8].clone().into()).double() + AB::Expr::from_u64(4) * (main_current[5].clone().into() + main_current[9].clone().into() - main_current[5].clone().into().double() * main_current[9].clone().into()) + AB::Expr::from_u64(8) * (main_current[6].clone().into() + main_current[10].clone().into() - main_current[6].clone().into().double() * main_current[10].clone().into())))); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/bitwise/test_air_plonky3.rs b/air-script/src/tests/bitwise/test_air_plonky3.rs index d969cb1a6..91b2c0637 100644 --- a/air-script/src/tests/bitwise/test_air_plonky3.rs +++ b/air-script/src/tests/bitwise/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::bitwise::bitwise_plonky3::{BitwiseAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -75,8 +74,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, BitwiseAir); diff --git a/air-script/src/tests/buses/buses_complex_plonky3.rs b/air-script/src/tests/buses/buses_complex_plonky3.rs index 00d266cf9..2d038524d 100644 --- a/air-script/src/tests/buses/buses_complex_plonky3.rs +++ b/air-script/src/tests/buses/buses_complex_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 7; pub const AUX_WIDTH: usize = 2; @@ -29,7 +29,14 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + BusType::Logup, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +73,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -96,12 +105,6 @@ where F: Field, builder.assert_zero(main_current[2].clone().into() * main_current[2].clone().into() - main_current[2].clone().into()); builder.assert_zero(main_current[3].clone().into() * main_current[3].clone().into() - main_current[3].clone().into()); - // Aux boundary constraints - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - // Aux integrity/transition constraints builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into() + (AB::ExprEF::from_u64(3) + AB::ExprEF::from(main_current[1].clone().into())) * beta_challenges[1].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[2].into()) * AB::ExprEF::from(main_current[2].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[2].clone().into())) * ((alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[1].into()) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[2].clone().into())) + AB::ExprEF::from(main_current[2].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into() + (AB::ExprEF::from_u64(3) + AB::ExprEF::from(main_current[1].clone().into())) * beta_challenges[1].into() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[2].into()) * AB::ExprEF::from(main_current[3].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[3].clone().into())) * ((alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[3].clone().into())) + AB::ExprEF::from(main_current[3].clone().into())) * AB::ExprEF::from(aux_next[0].clone().into())); builder.when_transition().assert_zero_ext((alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[4].clone().into()) + (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[5].clone().into()) - ((alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[1].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[6].clone().into()))); diff --git a/air-script/src/tests/buses/buses_simple_plonky3.rs b/air-script/src/tests/buses/buses_simple_plonky3.rs index 1ee51d533..65efcf8fb 100644 --- a/air-script/src/tests/buses/buses_simple_plonky3.rs +++ b/air-script/src/tests/buses/buses_simple_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 1; pub const AUX_WIDTH: usize = 2; @@ -29,7 +29,14 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + BusType::Logup, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +73,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -93,11 +102,6 @@ where F: Field, // Main integrity/transition constraints - // Aux boundary constraints - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - // Aux integrity/transition constraints builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into()) * AB::ExprEF::from(main_current[0].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into()) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) + AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(aux_next[0].clone().into())); builder.when_transition().assert_zero_ext((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()).double())); diff --git a/air-script/src/tests/buses/buses_varlen_boundary_both_plonky3.rs b/air-script/src/tests/buses/buses_varlen_boundary_both_plonky3.rs index 13ed74cc7..b32d738e1 100644 --- a/air-script/src/tests/buses/buses_varlen_boundary_both_plonky3.rs +++ b/air-script/src/tests/buses/buses_varlen_boundary_both_plonky3.rs @@ -2,13 +2,13 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 1; pub const AUX_WIDTH: usize = 2; pub const NUM_PERIODIC_VALUES: usize = 0; pub const PERIOD: usize = 0; -pub const NUM_PUBLIC_VALUES: usize = 6; +pub const NUM_PUBLIC_VALUES: usize = 0; pub const MAX_BETA_CHALLENGE_POWER: usize = 2; pub struct BusesAir; @@ -29,7 +29,14 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + BusType::Logup, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +73,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -93,11 +102,6 @@ where F: Field, // Main integrity/transition constraints - // Aux boundary constraints - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - aux_bus_boundary_values[0].into()); - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into()) - aux_bus_boundary_values[1].into()); - // Aux integrity/transition constraints builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into()) * AB::ExprEF::from(main_current[0].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into()) * (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE) + AB::ExprEF::ONE - (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE)) * AB::ExprEF::from(aux_next[0].clone().into())); builder.when_transition().assert_zero_ext((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()).double())); diff --git a/air-script/src/tests/buses/buses_varlen_boundary_first_plonky3.rs b/air-script/src/tests/buses/buses_varlen_boundary_first_plonky3.rs index 7a8c42bda..b32d738e1 100644 --- a/air-script/src/tests/buses/buses_varlen_boundary_first_plonky3.rs +++ b/air-script/src/tests/buses/buses_varlen_boundary_first_plonky3.rs @@ -2,13 +2,13 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 1; pub const AUX_WIDTH: usize = 2; pub const NUM_PERIODIC_VALUES: usize = 0; pub const PERIOD: usize = 0; -pub const NUM_PUBLIC_VALUES: usize = 2; +pub const NUM_PUBLIC_VALUES: usize = 0; pub const MAX_BETA_CHALLENGE_POWER: usize = 2; pub struct BusesAir; @@ -29,7 +29,14 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + BusType::Logup, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +73,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -93,12 +102,6 @@ where F: Field, // Main integrity/transition constraints - // Aux boundary constraints - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - aux_bus_boundary_values[0].into()); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into()) - aux_bus_boundary_values[1].into()); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - // Aux integrity/transition constraints builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into()) * AB::ExprEF::from(main_current[0].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into()) * (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE) + AB::ExprEF::ONE - (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE)) * AB::ExprEF::from(aux_next[0].clone().into())); builder.when_transition().assert_zero_ext((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()).double())); diff --git a/air-script/src/tests/buses/buses_varlen_boundary_last.air b/air-script/src/tests/buses/buses_varlen_boundary_last.air index 9819cbc21..39e48144a 100644 --- a/air-script/src/tests/buses/buses_varlen_boundary_last.air +++ b/air-script/src/tests/buses/buses_varlen_boundary_last.air @@ -1,7 +1,7 @@ def BusesAir trace_columns { - main: [a], + main: [a, sp_insert, sp_remove, sq_insert_twice, sq_remove], } buses { @@ -10,20 +10,21 @@ buses { } public_inputs { - outputs: [[2]], + outputs_p: [[2]], + outputs_q: [[2]], } boundary_constraints { enf p.first = null; enf q.first = null; - enf p.last = outputs; - enf q.last = outputs; + enf p.last = outputs_p; + enf q.last = outputs_q; } integrity_constraints { - p.insert(1) when a; - p.remove(1) when (a - 1); - q.insert(1, 2) when a; - q.insert(1, 2) when a; - q.remove(1, 2) with 2; + p.insert(a) when sp_insert; + p.remove(a) when sp_remove; + q.insert(2, a) when sq_insert_twice; + q.insert(2, a) when sq_insert_twice; + q.remove(2, a) with sq_remove; } diff --git a/air-script/src/tests/buses/buses_varlen_boundary_last.rs b/air-script/src/tests/buses/buses_varlen_boundary_last.rs index 686604e08..65dbbda92 100644 --- a/air-script/src/tests/buses/buses_varlen_boundary_last.rs +++ b/air-script/src/tests/buses/buses_varlen_boundary_last.rs @@ -4,32 +4,36 @@ use winter_math::{ExtensionOf, FieldElement, ToElements}; use winter_utils::{ByteWriter, Serializable}; pub struct PublicInputs { - outputs: Vec<[Felt; 2]>, + outputs_p: Vec<[Felt; 2]>, + outputs_q: Vec<[Felt; 2]>, } impl PublicInputs { - pub fn new(outputs: Vec<[Felt; 2]>) -> Self { - Self { outputs } + pub fn new(outputs_p: Vec<[Felt; 2]>, outputs_q: Vec<[Felt; 2]>) -> Self { + Self { outputs_p, outputs_q } } } impl Serializable for PublicInputs { fn write_into(&self, target: &mut W) { - self.outputs.write_into(target); + self.outputs_p.write_into(target); + self.outputs_q.write_into(target); } } impl ToElements for PublicInputs { fn to_elements(&self) -> Vec { let mut elements = Vec::new(); - self.outputs.iter().for_each(|row| elements.extend_from_slice(row)); + self.outputs_p.iter().for_each(|row| elements.extend_from_slice(row)); + self.outputs_q.iter().for_each(|row| elements.extend_from_slice(row)); elements } } pub struct BusesAir { context: AirContext, - outputs: Vec<[Felt; 2]>, + outputs_p: Vec<[Felt; 2]>, + outputs_q: Vec<[Felt; 2]>, } impl BusesAir { @@ -75,7 +79,7 @@ impl Air for BusesAir { fn new(trace_info: TraceInfo, public_inputs: PublicInputs, options: WinterProofOptions) -> Self { let main_degrees = vec![]; - let aux_degrees = vec![TransitionConstraintDegree::new(2), TransitionConstraintDegree::new(1)]; + let aux_degrees = vec![TransitionConstraintDegree::new(3), TransitionConstraintDegree::new(4)]; let num_main_assertions = 0; let num_aux_assertions = 4; @@ -88,7 +92,7 @@ impl Air for BusesAir { options, ) .set_num_transition_exemptions(2); - Self { context, outputs: public_inputs.outputs } + Self { context, outputs_p: public_inputs.outputs_p, outputs_q: public_inputs.outputs_q } } fn get_periodic_column_values(&self) -> Vec> { @@ -102,12 +106,12 @@ impl Air for BusesAir { fn get_aux_assertions>(&self, aux_rand_elements: &AuxRandElements) -> Vec> { let mut result = Vec::new(); - let reduced_outputs_multiset = Self::bus_multiset_boundary_varlen(aux_rand_elements, &self.outputs); - let reduced_outputs_logup = Self::bus_logup_boundary_varlen(aux_rand_elements, &self.outputs); + let reduced_outputs_p_multiset = Self::bus_multiset_boundary_varlen(aux_rand_elements, &self.outputs_p); + let reduced_outputs_q_logup = Self::bus_logup_boundary_varlen(aux_rand_elements, &self.outputs_q); result.push(Assertion::single(0, 0, E::ONE)); - result.push(Assertion::single(0, self.last_step(), reduced_outputs_multiset)); + result.push(Assertion::single(0, self.last_step(), reduced_outputs_p_multiset)); result.push(Assertion::single(1, 0, E::ZERO)); - result.push(Assertion::single(1, self.last_step(), reduced_outputs_logup)); + result.push(Assertion::single(1, self.last_step(), reduced_outputs_q_logup)); result } @@ -124,7 +128,7 @@ impl Air for BusesAir { let main_next = main_frame.next(); let aux_current = aux_frame.current(); let aux_next = aux_frame.next(); - result[0] = ((aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1]) * E::from(main_current[0]) + E::ONE - E::from(main_current[0])) * aux_current[0] - ((aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1]) * (E::from(main_current[0]) - E::ONE) + E::ONE - (E::from(main_current[0]) - E::ONE)) * aux_next[0]; - result[1] = (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * aux_current[1] + (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * E::from(main_current[0]) + (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * E::from(main_current[0]) - ((aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * aux_next[1] + (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + aux_rand_elements.rand_elements()[1] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[2]) * E::from(Felt::new(2_u64))); + result[0] = ((aux_rand_elements.rand_elements()[0] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[1]) * E::from(main_current[1]) + E::ONE - E::from(main_current[1])) * aux_current[0] - ((aux_rand_elements.rand_elements()[0] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[1]) * E::from(main_current[2]) + E::ONE - E::from(main_current[2])) * aux_next[0]; + result[1] = (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * aux_current[1] + (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * E::from(main_current[3]) + (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * E::from(main_current[3]) - ((aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * aux_next[1] + (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * (aux_rand_elements.rand_elements()[0] + E::from(Felt::new(2_u64)) * aux_rand_elements.rand_elements()[1] + E::from(main_current[0]) * aux_rand_elements.rand_elements()[2]) * E::from(main_current[4])); } } \ No newline at end of file diff --git a/air-script/src/tests/buses/buses_varlen_boundary_last_plonky3.rs b/air-script/src/tests/buses/buses_varlen_boundary_last_plonky3.rs index fa895389e..dba927c11 100644 --- a/air-script/src/tests/buses/buses_varlen_boundary_last_plonky3.rs +++ b/air-script/src/tests/buses/buses_varlen_boundary_last_plonky3.rs @@ -2,13 +2,13 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; -pub const MAIN_WIDTH: usize = 1; +pub const MAIN_WIDTH: usize = 5; pub const AUX_WIDTH: usize = 2; pub const NUM_PERIODIC_VALUES: usize = 0; pub const PERIOD: usize = 0; -pub const NUM_PUBLIC_VALUES: usize = 2; +pub const NUM_PUBLIC_VALUES: usize = 0; pub const MAX_BETA_CHALLENGE_POWER: usize = 2; pub struct BusesAir; @@ -29,7 +29,14 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + BusType::Logup, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +73,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -93,15 +102,9 @@ where F: Field, // Main integrity/transition constraints - // Aux boundary constraints - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - aux_bus_boundary_values[0].into()); - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into())); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[1].clone().into()) - aux_bus_boundary_values[1].into()); - // Aux integrity/transition constraints - builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into()) * AB::ExprEF::from(main_current[0].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into()) * (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE) + AB::ExprEF::ONE - (AB::ExprEF::from(main_current[0].clone().into()) - AB::ExprEF::ONE)) * AB::ExprEF::from(aux_next[0].clone().into())); - builder.when_transition().assert_zero_ext((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) - ((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()).double())); + builder.when_transition().assert_zero_ext(((alpha.into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[0].into()) * AB::ExprEF::from(main_current[1].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[1].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[0].into()) * AB::ExprEF::from(main_current[2].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[2].clone().into())) * AB::ExprEF::from(aux_next[0].clone().into())); + builder.when_transition().assert_zero_ext((alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(aux_current[1].clone().into()) + (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[3].clone().into()) + (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[3].clone().into()) - ((alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(aux_next[1].clone().into()) + (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * (alpha.into() + beta_challenges[0].into().double() + AB::ExprEF::from(main_current[0].clone().into()) * beta_challenges[1].into()) * AB::ExprEF::from(main_current[4].clone().into()))); } } @@ -128,8 +131,8 @@ impl BusesAir { let beta_challenges: [_; MAX_BETA_CHALLENGE_POWER] = beta_challenges.try_into().expect("Wrong number of randomness"); let periodic_values: [_; NUM_PERIODIC_VALUES] = periodic_evals.try_into().expect("Wrong number of periodic values"); vec![ - (((alpha + beta_challenges[0]) * EF::from(main_current[0].clone()) + EF::ONE - EF::from(main_current[0].clone())) * EF::from(aux_current[0].clone())) * ((alpha + beta_challenges[0]) * (EF::from(main_current[0].clone()) - EF::ONE) + EF::ONE - (EF::from(main_current[0].clone()) - EF::ONE)).inverse(), - ((alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()) * EF::from(aux_current[1].clone()) + (alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()) * EF::from(main_current[0].clone()) + (alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()) * EF::from(main_current[0].clone()) - (alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()).double()) * ((alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double()) * (alpha + beta_challenges[0] + beta_challenges[1].double())).inverse(), + (((alpha + EF::from(main_current[0].clone()) * beta_challenges[0]) * EF::from(main_current[1].clone()) + EF::ONE - EF::from(main_current[1].clone())) * EF::from(aux_current[0].clone())) * ((alpha + EF::from(main_current[0].clone()) * beta_challenges[0]) * EF::from(main_current[2].clone()) + EF::ONE - EF::from(main_current[2].clone())).inverse(), + ((alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * EF::from(aux_current[1].clone()) + (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * EF::from(main_current[3].clone()) + (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * EF::from(main_current[3].clone()) - (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * EF::from(main_current[4].clone())) * ((alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1]) * (alpha + beta_challenges[0].double() + EF::from(main_current[0].clone()) * beta_challenges[1])).inverse(), ] } } \ No newline at end of file diff --git a/air-script/src/tests/buses/mod.rs b/air-script/src/tests/buses/mod.rs index 95eeeb07b..5c0ca958c 100644 --- a/air-script/src/tests/buses/mod.rs +++ b/air-script/src/tests/buses/mod.rs @@ -36,4 +36,5 @@ mod buses_varlen_boundary_first_plonky3; mod buses_varlen_boundary_last_plonky3; mod test_air_plonky3; +mod test_air_plonky3_varlen_boundary_last; mod test_air_winterfell; diff --git a/air-script/src/tests/buses/test_air_plonky3.rs b/air-script/src/tests/buses/test_air_plonky3.rs index 20919a31e..676d87701 100644 --- a/air-script/src/tests/buses/test_air_plonky3.rs +++ b/air-script/src/tests/buses/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::buses::buses_complex_plonky3::{BusesAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -52,8 +51,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 2] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![vec![], vec![], vec![]] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, BusesAir); diff --git a/air-script/src/tests/buses/test_air_plonky3_varlen_boundary_last.rs b/air-script/src/tests/buses/test_air_plonky3_varlen_boundary_last.rs new file mode 100644 index 000000000..6415f669e --- /dev/null +++ b/air-script/src/tests/buses/test_air_plonky3_varlen_boundary_last.rs @@ -0,0 +1,64 @@ +use p3_field::PrimeField64; +use p3_miden_air::RowMajorMatrix; + +use crate::{ + generate_air_plonky3_test_with_airscript_traits, + tests::buses::buses_varlen_boundary_last_plonky3::{BusesAir, MAIN_WIDTH}, +}; + +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; + let trace_length = num_rows * MAIN_WIDTH; + + let mut long_trace = F::zero_vec(trace_length); + + let mut trace = RowMajorMatrix::new(long_trace, MAIN_WIDTH); + + let (prefix, rows, suffix) = unsafe { trace.values.align_to_mut::<[F; MAIN_WIDTH]>() }; + assert!(prefix.is_empty(), "Alignment should match"); + assert!(suffix.is_empty(), "Alignment should match"); + assert_eq!(rows.len(), num_rows); + + // Initialize first row + rows[0][0] = F::ONE; + rows[0][1] = F::ZERO; + rows[0][2] = F::ZERO; + rows[0][3] = F::ZERO; + rows[0][4] = F::ZERO; + + // Fill subsequent rows using direct access to the rows array + for i in 1..num_rows { + let a_prev = rows[i - 1][0]; + let b_prev = rows[i - 1][1]; + let c_prev = rows[i - 1][2]; + let d_prev = rows[i - 1][3]; + let e_prev = rows[i - 1][4]; + + // Update current row based on previous values + rows[i][0] = F::ONE; + rows[i][1] = if i > 3 && i < 8 { F::ONE } else { F::ZERO }; // sp_insert is true 4 times + rows[i][2] = if i > 3 && i < 7 { F::ONE } else { F::ZERO }; // sp_remove is true 3 times + rows[i][3] = if i > 4 && i < 10 { F::ONE } else { F::ZERO }; // sq_insert_twice is true 5 times + rows[i][4] = if i > 5 && i < 10 { + F::from_canonical_checked(2).unwrap() + } else { + F::ZERO + }; // sq_remove has value "2" 4 times + } + + trace +} + +fn generate_inputs() -> Vec { + vec![] +} + +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + // At the end, the bus p will have the tuple (a) (that equals (1)) inserted once + let var_len_p = vec![vec![1]]; + // At the end, the bus q will have the tuple (2, a) (that equals (2, 1)) inserted twice + let var_len_q = vec![vec![2, 1], vec![2, 1]]; + vec![var_len_p, var_len_q] +} + +generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, BusesAir); diff --git a/air-script/src/tests/computed_indices/computed_indices_complex_plonky3.rs b/air-script/src/tests/computed_indices/computed_indices_complex_plonky3.rs index ae3ee2903..6b87e196b 100644 --- a/air-script/src/tests/computed_indices/computed_indices_complex_plonky3.rs +++ b/air-script/src/tests/computed_indices/computed_indices_complex_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ComputedIndicesAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -36,8 +37,6 @@ impl MidenAir for ComputedIndicesAir { // Main integrity/transition constraints builder.assert_zero(main_current[2].clone().into() * AB::Expr::from_u64(3) + main_current[3].clone().into() * AB::Expr::from_u64(4)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/computed_indices/computed_indices_simple_plonky3.rs b/air-script/src/tests/computed_indices/computed_indices_simple_plonky3.rs index 40c374ad3..1ab566b59 100644 --- a/air-script/src/tests/computed_indices/computed_indices_simple_plonky3.rs +++ b/air-script/src/tests/computed_indices/computed_indices_simple_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 8; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ComputedIndicesAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -43,8 +44,6 @@ impl MidenAir for ComputedIndicesAir { builder.when_transition().assert_zero(main_next[6].clone().into() - AB::Expr::from_u64(6) * main_current[6].clone().into()); builder.when_transition().assert_zero(main_next[7].clone().into() - AB::Expr::from_u64(12) * main_current[7].clone().into()); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/computed_indices/test_air_plonky3.rs b/air-script/src/tests/computed_indices/test_air_plonky3.rs index 5f02cc466..0ebed55a3 100644 --- a/air-script/src/tests/computed_indices/test_air_plonky3.rs +++ b/air-script/src/tests/computed_indices/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::computed_indices::computed_indices_simple_plonky3::{ComputedIndicesAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -55,8 +54,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ComputedIndicesAir); diff --git a/air-script/src/tests/constant_in_range/constant_in_range_plonky3.rs b/air-script/src/tests/constant_in_range/constant_in_range_plonky3.rs index b1238f7cc..134d141eb 100644 --- a/air-script/src/tests/constant_in_range/constant_in_range_plonky3.rs +++ b/air-script/src/tests/constant_in_range/constant_in_range_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 12; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ConstantInRangeAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -36,8 +37,6 @@ impl MidenAir for ConstantInRangeAir { // Main integrity/transition constraints builder.assert_zero(main_current[0].clone().into() - (main_current[1].clone().into() - main_current[4].clone().into() - main_current[8].clone().into() + AB::Expr::ONE + main_current[2].clone().into() - main_current[5].clone().into() - main_current[9].clone().into() + AB::Expr::from_u64(2) + main_current[3].clone().into() - main_current[6].clone().into() - main_current[10].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/constant_in_range/test_air_plonky3.rs b/air-script/src/tests/constant_in_range/test_air_plonky3.rs index 9dd399e1c..e1959450e 100644 --- a/air-script/src/tests/constant_in_range/test_air_plonky3.rs +++ b/air-script/src/tests/constant_in_range/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::constant_in_range::constant_in_range_plonky3::{ConstantInRangeAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -56,8 +55,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ConstantInRangeAir); diff --git a/air-script/src/tests/constants/constants_plonky3.rs b/air-script/src/tests/constants/constants_plonky3.rs index 632331aab..72218cfbb 100644 --- a/air-script/src/tests/constants/constants_plonky3.rs +++ b/air-script/src/tests/constants/constants_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 7; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ConstantsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -45,8 +46,6 @@ impl MidenAir for ConstantsAir { builder.when_transition().assert_zero(main_next[5].clone().into() - (main_current[5].clone().into() + AB::Expr::ONE)); builder.assert_zero(main_current[4].clone().into() - AB::Expr::ONE); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/constants/test_air_plonky3.rs b/air-script/src/tests/constants/test_air_plonky3.rs index cf2c54ebd..5c906ff3b 100644 --- a/air-script/src/tests/constants/test_air_plonky3.rs +++ b/air-script/src/tests/constants/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::constants::constants_plonky3::{ConstantsAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -52,8 +51,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 32] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ConstantsAir); diff --git a/air-script/src/tests/constraint_comprehension/constraint_comprehension_plonky3.rs b/air-script/src/tests/constraint_comprehension/constraint_comprehension_plonky3.rs index e333b9626..b34c6181b 100644 --- a/air-script/src/tests/constraint_comprehension/constraint_comprehension_plonky3.rs +++ b/air-script/src/tests/constraint_comprehension/constraint_comprehension_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 14; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ConstraintComprehensionAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -39,8 +40,6 @@ impl MidenAir for ConstraintComprehensionAir { builder.assert_zero(main_current[8].clone().into() - main_current[12].clone().into()); builder.assert_zero(main_current[9].clone().into() - main_current[13].clone().into()); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/constraint_comprehension/test_air_plonky3.rs b/air-script/src/tests/constraint_comprehension/test_air_plonky3.rs index f9fa0d39c..09f942eb3 100644 --- a/air-script/src/tests/constraint_comprehension/test_air_plonky3.rs +++ b/air-script/src/tests/constraint_comprehension/test_air_plonky3.rs @@ -3,14 +3,13 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::constraint_comprehension::constraint_comprehension_plonky3::{ ConstraintComprehensionAir, MAIN_WIDTH, }, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -39,8 +38,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ConstraintComprehensionAir); diff --git a/air-script/src/tests/evaluators/evaluators_nested_slice_call_plonky3.rs b/air-script/src/tests/evaluators/evaluators_nested_slice_call_plonky3.rs index 8dfd1d4bf..45e132b6c 100644 --- a/air-script/src/tests/evaluators/evaluators_nested_slice_call_plonky3.rs +++ b/air-script/src/tests/evaluators/evaluators_nested_slice_call_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 20; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for EvaluatorsSliceAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -59,8 +60,6 @@ impl MidenAir for EvaluatorsSliceAir { builder.assert_zero(main_current[5].clone().into() * main_current[6].clone().into() * main_current[7].clone().into() * (main_current[8].clone().into() * main_current[8].clone().into() - main_current[8].clone().into())); builder.assert_zero(main_current[5].clone().into() * main_current[6].clone().into() * main_current[7].clone().into() * main_current[8].clone().into() * (main_current[9].clone().into() * main_current[9].clone().into() - main_current[9].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/evaluators/evaluators_plonky3.rs b/air-script/src/tests/evaluators/evaluators_plonky3.rs index 07f19ea21..5c0ad3895 100644 --- a/air-script/src/tests/evaluators/evaluators_plonky3.rs +++ b/air-script/src/tests/evaluators/evaluators_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 7; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for EvaluatorsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -45,8 +46,6 @@ impl MidenAir for EvaluatorsAir { builder.assert_zero(main_current[5].clone().into() - AB::Expr::ONE); builder.assert_zero(main_current[6].clone().into() - AB::Expr::from_u64(4)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/evaluators/evaluators_slice_plonky3.rs b/air-script/src/tests/evaluators/evaluators_slice_plonky3.rs index 62f822ede..cd19cef43 100644 --- a/air-script/src/tests/evaluators/evaluators_slice_plonky3.rs +++ b/air-script/src/tests/evaluators/evaluators_slice_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 20; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for EvaluatorsSliceAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -59,8 +60,6 @@ impl MidenAir for EvaluatorsSliceAir { builder.assert_zero(main_current[0].clone().into() * main_current[1].clone().into() * main_current[2].clone().into() * (main_current[3].clone().into() * main_current[3].clone().into() - main_current[3].clone().into())); builder.assert_zero(main_current[0].clone().into() * main_current[1].clone().into() * main_current[2].clone().into() * main_current[3].clone().into() * (main_current[4].clone().into() * main_current[4].clone().into() - main_current[4].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/evaluators/test_air_plonky3.rs b/air-script/src/tests/evaluators/test_air_plonky3.rs index 050ba860a..1d70dcb45 100644 --- a/air-script/src/tests/evaluators/test_air_plonky3.rs +++ b/air-script/src/tests/evaluators/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::evaluators::evaluators_plonky3::{EvaluatorsAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -52,8 +51,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, EvaluatorsAir); diff --git a/air-script/src/tests/fibonacci/fibonacci_plonky3.rs b/air-script/src/tests/fibonacci/fibonacci_plonky3.rs index b5476e071..15e40b79d 100644 --- a/air-script/src/tests/fibonacci/fibonacci_plonky3.rs +++ b/air-script/src/tests/fibonacci/fibonacci_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 2; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for FibonacciAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -39,8 +40,6 @@ impl MidenAir for FibonacciAir { builder.when_transition().assert_zero(main_next[1].clone().into() - (main_current[0].clone().into() + main_current[1].clone().into())); builder.when_transition().assert_zero(main_next[0].clone().into() - main_current[1].clone().into()); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/fibonacci/test_air_plonky3.rs b/air-script/src/tests/fibonacci/test_air_plonky3.rs index 1d76e60d2..e41da1047 100644 --- a/air-script/src/tests/fibonacci/test_air_plonky3.rs +++ b/air-script/src/tests/fibonacci/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::fibonacci::fibonacci_plonky3::{FibonacciAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 31; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -37,10 +36,44 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { + let zero = 0; let one = 1; - let last = 2178309; // 32nd Fibonacci number - vec![one, one, last] + let last = fibonacci_field::(512).as_canonical_u64(); // 512nd Fibonacci number in Goldilock's field + vec![zero, one, last] +} + +fn fibonacci_field(n: i32) -> F { + if n < 0 { + panic!("{} is negative!", n); + } else if n == 0 { + return F::ZERO; + } else if n == 1 { + return F::ONE; + } + + let mut sum = F::ZERO; + let mut last = F::ZERO; + let mut curr = F::ONE; + for _i in 1..n { + sum = last + curr; + last = curr; + curr = sum; + } + sum +} + +#[test] +fn test_goldilocks_fibonacci_computation() { + type F = p3_goldilocks::Goldilocks; + let f_32 = fibonacci_field::(32); + let f_512 = fibonacci_field::(512); + assert_eq!(f_32, F::new(2178309)); + assert_eq!(f_512, F::new(12556846397060607923)); +} + +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] } generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, FibonacciAir); diff --git a/air-script/src/tests/functions/functions_complex.air b/air-script/src/tests/functions/functions_complex.air index 2b512e262..e427b5b93 100644 --- a/air-script/src/tests/functions/functions_complex.air +++ b/air-script/src/tests/functions/functions_complex.air @@ -29,7 +29,7 @@ boundary_constraints { integrity_constraints { let f = get_multiplicity_flags(s0, s1); - let z = v^7 * f[3] + v^2 * f[2] + v * f[1] + f[0]; + let z = v^5 * f[3] + v^2 * f[2] + v * f[1] + f[0]; enf b_range' = b_range * (z * t - t + 1); let y = fold_scalar_and_vec(v, b); enf v' = y; diff --git a/air-script/src/tests/functions/functions_complex.rs b/air-script/src/tests/functions/functions_complex.rs index f165c2d0e..9a438bb07 100644 --- a/air-script/src/tests/functions/functions_complex.rs +++ b/air-script/src/tests/functions/functions_complex.rs @@ -47,7 +47,7 @@ impl Air for FunctionsAir { } fn new(trace_info: TraceInfo, public_inputs: PublicInputs, options: WinterProofOptions) -> Self { - let main_degrees = vec![TransitionConstraintDegree::new(11), TransitionConstraintDegree::new(1)]; + let main_degrees = vec![TransitionConstraintDegree::new(9), TransitionConstraintDegree::new(1)]; let aux_degrees = vec![]; let num_main_assertions = 1; let num_aux_assertions = 0; @@ -82,7 +82,7 @@ impl Air for FunctionsAir { fn evaluate_transition>(&self, frame: &EvaluationFrame, periodic_values: &[E], result: &mut [E]) { let main_current = frame.current(); let main_next = frame.next(); - result[0] = main_next[16] - main_current[16] * ((main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[1] * main_current[2] + main_current[3] * main_current[3] * (E::ONE - main_current[1]) * main_current[2] + main_current[3] * main_current[1] * (E::ONE - main_current[2]) + (E::ONE - main_current[1]) * (E::ONE - main_current[2])) * main_current[0] - main_current[0] + E::ONE); + result[0] = main_next[16] - main_current[16] * ((main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[3] * main_current[1] * main_current[2] + main_current[3] * main_current[3] * (E::ONE - main_current[1]) * main_current[2] + main_current[3] * main_current[1] * (E::ONE - main_current[2]) + (E::ONE - main_current[1]) * (E::ONE - main_current[2])) * main_current[0] - main_current[0] + E::ONE); result[1] = main_next[3] - (main_current[4] + main_current[5] + main_current[6] + main_current[7] + main_current[8] + main_current[9] + main_current[10] + main_current[11] + main_current[12] + main_current[13] + main_current[14] + main_current[15] + E::ONE) * E::from(Felt::new(2_u64)); } diff --git a/air-script/src/tests/functions/functions_complex_plonky3.rs b/air-script/src/tests/functions/functions_complex_plonky3.rs index b42205283..238cc3741 100644 --- a/air-script/src/tests/functions/functions_complex_plonky3.rs +++ b/air-script/src/tests/functions/functions_complex_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 17; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for FunctionsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -34,11 +35,9 @@ impl MidenAir for FunctionsAir { builder.when_first_row().assert_zero(main_current[3].clone().into()); // Main integrity/transition constraints - builder.when_transition().assert_zero(main_next[16].clone().into() - main_current[16].clone().into() * ((main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[1].clone().into() * main_current[2].clone().into() + main_current[3].clone().into() * main_current[3].clone().into() * (AB::Expr::ONE - main_current[1].clone().into()) * main_current[2].clone().into() + main_current[3].clone().into() * main_current[1].clone().into() * (AB::Expr::ONE - main_current[2].clone().into()) + (AB::Expr::ONE - main_current[1].clone().into()) * (AB::Expr::ONE - main_current[2].clone().into())) * main_current[0].clone().into() - main_current[0].clone().into() + AB::Expr::ONE)); + builder.when_transition().assert_zero(main_next[16].clone().into() - main_current[16].clone().into() * ((main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[3].clone().into() * main_current[1].clone().into() * main_current[2].clone().into() + main_current[3].clone().into() * main_current[3].clone().into() * (AB::Expr::ONE - main_current[1].clone().into()) * main_current[2].clone().into() + main_current[3].clone().into() * main_current[1].clone().into() * (AB::Expr::ONE - main_current[2].clone().into()) + (AB::Expr::ONE - main_current[1].clone().into()) * (AB::Expr::ONE - main_current[2].clone().into())) * main_current[0].clone().into() - main_current[0].clone().into() + AB::Expr::ONE)); builder.when_transition().assert_zero(main_next[3].clone().into() - (main_current[4].clone().into() + main_current[5].clone().into() + main_current[6].clone().into() + main_current[7].clone().into() + main_current[8].clone().into() + main_current[9].clone().into() + main_current[10].clone().into() + main_current[11].clone().into() + main_current[12].clone().into() + main_current[13].clone().into() + main_current[14].clone().into() + main_current[15].clone().into() + AB::Expr::ONE).double()); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/functions/functions_simple_plonky3.rs b/air-script/src/tests/functions/functions_simple_plonky3.rs index c5b131f49..1b72a7dfb 100644 --- a/air-script/src/tests/functions/functions_simple_plonky3.rs +++ b/air-script/src/tests/functions/functions_simple_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 9; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for FunctionsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -43,8 +44,6 @@ impl MidenAir for FunctionsAir { builder.assert_zero(main_current[4].clone().into() + main_current[5].clone().into() + main_current[6].clone().into() + main_current[7].clone().into() - AB::Expr::ONE); builder.assert_zero((main_current[4].clone().into() + main_current[5].clone().into() + main_current[6].clone().into() + main_current[7].clone().into()) * AB::Expr::from_u64(4) - AB::Expr::ONE); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/functions/test_air_plonky3.rs b/air-script/src/tests/functions/test_air_plonky3.rs index f52390339..d9f6c39d6 100644 --- a/air-script/src/tests/functions/test_air_plonky3.rs +++ b/air-script/src/tests/functions/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::functions::functions_complex_plonky3::{FunctionsAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -82,8 +81,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, FunctionsAir); diff --git a/air-script/src/tests/indexed_trace_access/indexed_trace_access_plonky3.rs b/air-script/src/tests/indexed_trace_access/indexed_trace_access_plonky3.rs index d1f6eb420..9b1bea28c 100644 --- a/air-script/src/tests/indexed_trace_access/indexed_trace_access_plonky3.rs +++ b/air-script/src/tests/indexed_trace_access/indexed_trace_access_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for TraceAccessAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -36,8 +37,6 @@ impl MidenAir for TraceAccessAir { // Main integrity/transition constraints builder.when_transition().assert_zero(main_next[0].clone().into() - (main_current[1].clone().into() + AB::Expr::ONE)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/indexed_trace_access/test_air_plonky3.rs b/air-script/src/tests/indexed_trace_access/test_air_plonky3.rs index 4b0a31c39..74d0b60d4 100644 --- a/air-script/src/tests/indexed_trace_access/test_air_plonky3.rs +++ b/air-script/src/tests/indexed_trace_access/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::indexed_trace_access::indexed_trace_access_plonky3::{MAIN_WIDTH, TraceAccessAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -39,8 +38,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, TraceAccessAir); diff --git a/air-script/src/tests/list_comprehension/list_comprehension_nested_plonky3.rs b/air-script/src/tests/list_comprehension/list_comprehension_nested_plonky3.rs index 734706746..5525f2068 100644 --- a/air-script/src/tests/list_comprehension/list_comprehension_nested_plonky3.rs +++ b/air-script/src/tests/list_comprehension/list_comprehension_nested_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 2; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ListComprehensionAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -38,8 +39,6 @@ impl MidenAir for ListComprehensionAir { builder.assert_zero(main_current[0].clone().into().double() + main_current[1].clone().into() * AB::Expr::from_u64(3) - AB::Expr::from_u64(5)); builder.assert_zero(main_current[0].clone().into() * AB::Expr::from_u64(3) + main_current[1].clone().into() * AB::Expr::from_u64(4) - AB::Expr::from_u64(7)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/list_comprehension/list_comprehension_plonky3.rs b/air-script/src/tests/list_comprehension/list_comprehension_plonky3.rs index 727cc9cc0..9d13e2e8b 100644 --- a/air-script/src/tests/list_comprehension/list_comprehension_plonky3.rs +++ b/air-script/src/tests/list_comprehension/list_comprehension_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 16; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ListComprehensionAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -41,8 +42,6 @@ impl MidenAir for ListComprehensionAir { builder.assert_zero(main_current[1].clone().into() - (main_current[5].clone().into() - main_current[8].clone().into() - main_current[12].clone().into() + AB::Expr::from_u64(10) + main_current[6].clone().into() - main_current[9].clone().into() - main_current[13].clone().into() + AB::Expr::from_u64(20) + main_current[7].clone().into() - main_current[10].clone().into() - main_current[14].clone().into())); builder.assert_zero(main_current[14].clone().into() - AB::Expr::from_u64(10)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/list_comprehension/test_air_plonky3.rs b/air-script/src/tests/list_comprehension/test_air_plonky3.rs index a99c57065..42080ad1f 100644 --- a/air-script/src/tests/list_comprehension/test_air_plonky3.rs +++ b/air-script/src/tests/list_comprehension/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::list_comprehension::list_comprehension_plonky3::{ListComprehensionAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -79,8 +78,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ListComprehensionAir); diff --git a/air-script/src/tests/list_folding/list_folding_plonky3.rs b/air-script/src/tests/list_folding/list_folding_plonky3.rs index 1a455fdd9..44f4753a3 100644 --- a/air-script/src/tests/list_folding/list_folding_plonky3.rs +++ b/air-script/src/tests/list_folding/list_folding_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 17; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for ListFoldingAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -39,8 +40,6 @@ impl MidenAir for ListFoldingAir { builder.when_transition().assert_zero(main_next[7].clone().into() - (main_current[9].clone().into() * main_current[13].clone().into() + main_current[10].clone().into() * main_current[14].clone().into() + main_current[11].clone().into() * main_current[15].clone().into() + main_current[12].clone().into() * main_current[16].clone().into() + (main_current[9].clone().into() + main_current[13].clone().into()) * (main_current[10].clone().into() + main_current[14].clone().into()) * (main_current[11].clone().into() + main_current[15].clone().into()) * (main_current[12].clone().into() + main_current[16].clone().into()))); builder.when_transition().assert_zero(main_next[8].clone().into() - (main_current[1].clone().into() + main_current[9].clone().into() * main_current[13].clone().into() + main_current[10].clone().into() * main_current[14].clone().into() + main_current[11].clone().into() * main_current[15].clone().into() + main_current[12].clone().into() * main_current[16].clone().into() + main_current[9].clone().into() * main_current[13].clone().into() + main_current[10].clone().into() * main_current[14].clone().into() + main_current[11].clone().into() * main_current[15].clone().into() + main_current[12].clone().into() * main_current[16].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/list_folding/test_air_plonky3.rs b/air-script/src/tests/list_folding/test_air_plonky3.rs index a87dae25b..144e4f27b 100644 --- a/air-script/src/tests/list_folding/test_air_plonky3.rs +++ b/air-script/src/tests/list_folding/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::list_folding::list_folding_plonky3::{ListFoldingAir, MAIN_WIDTH}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -82,8 +81,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, ListFoldingAir); diff --git a/air-script/src/tests/periodic_columns/periodic_columns_plonky3.rs b/air-script/src/tests/periodic_columns/periodic_columns_plonky3.rs index 22acad484..df36acbd7 100644 --- a/air-script/src/tests/periodic_columns/periodic_columns_plonky3.rs +++ b/air-script/src/tests/periodic_columns/periodic_columns_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 3; pub const AUX_WIDTH: usize = 0; @@ -33,11 +33,12 @@ where F: Field, } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -51,8 +52,6 @@ where F: Field, builder.assert_zero_ext(AB::ExprEF::from(periodic_values[0].clone().into()) * (AB::ExprEF::from(main_current[1].clone().into()) + AB::ExprEF::from(main_current[2].clone().into()))); builder.when_transition().assert_zero_ext(AB::ExprEF::from(periodic_values[1].clone().into()) * (AB::ExprEF::from(main_next[0].clone().into()) - AB::ExprEF::from(main_current[0].clone().into()))); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/periodic_columns/test_air_plonky3.rs b/air-script/src/tests/periodic_columns/test_air_plonky3.rs index 42091fa46..d732ffbed 100644 --- a/air-script/src/tests/periodic_columns/test_air_plonky3.rs +++ b/air-script/src/tests/periodic_columns/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::periodic_columns::periodic_columns_plonky3::{MAIN_WIDTH, PeriodicColumnsAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -40,8 +39,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, PeriodicColumnsAir); diff --git a/air-script/src/tests/pub_inputs/pub_inputs_plonky3.rs b/air-script/src/tests/pub_inputs/pub_inputs_plonky3.rs index bbdef9bf9..4cc281a74 100644 --- a/air-script/src/tests/pub_inputs/pub_inputs_plonky3.rs +++ b/air-script/src/tests/pub_inputs/pub_inputs_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for PubInputsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -43,8 +44,6 @@ impl MidenAir for PubInputsAir { // Main integrity/transition constraints builder.when_transition().assert_zero(main_next[0].clone().into() - (main_current[1].clone().into() + main_current[2].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/pub_inputs/test_air_plonky3.rs b/air-script/src/tests/pub_inputs/test_air_plonky3.rs index 8595358b4..2a7ad24d0 100644 --- a/air-script/src/tests/pub_inputs/test_air_plonky3.rs +++ b/air-script/src/tests/pub_inputs/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::pub_inputs::pub_inputs_plonky3::{MAIN_WIDTH, PubInputsAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -43,8 +42,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![0; 32] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, PubInputsAir); diff --git a/air-script/src/tests/selectors/selectors_combine_complex_plonky3.rs b/air-script/src/tests/selectors/selectors_combine_complex_plonky3.rs index 7714372f2..a89f39d38 100644 --- a/air-script/src/tests/selectors/selectors_combine_complex_plonky3.rs +++ b/air-script/src/tests/selectors/selectors_combine_complex_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 6; pub const AUX_WIDTH: usize = 1; @@ -29,7 +29,13 @@ where F: Field, AUX_WIDTH } - fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { + fn bus_types(&self) -> Vec { + vec![ + BusType::Multiset, + ] + } + + fn build_aux_trace(&self, _main: &RowMajorMatrix, _challenges: &[EF]) -> Option> { // Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders. let num_rows = _main.height(); @@ -66,15 +72,17 @@ where F: Field, rows[i+1][j] = next_row[j]; } } - Some(trace) + let trace_f = trace.flatten_to_base(); + Some(trace_f) } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -97,10 +105,6 @@ where F: Field, builder.assert_zero((AB::Expr::ONE - main_current[0].clone().into()) * (main_current[5].clone().into() - AB::Expr::from_u64(5)) + main_current[0].clone().into() * (main_current[4].clone().into() - AB::Expr::from_u64(4))); builder.assert_zero(main_current[0].clone().into() * (main_current[5].clone().into() - AB::Expr::from_u64(20)) + (AB::Expr::ONE - main_current[0].clone().into()) * main_current[1].clone().into() * (main_current[4].clone().into() - AB::Expr::from_u64(31))); - // Aux boundary constraints - builder.when_first_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - builder.when_last_row().assert_zero_ext(AB::ExprEF::from(aux_current[0].clone().into()) - AB::ExprEF::ONE); - // Aux integrity/transition constraints builder.when_transition().assert_zero_ext(((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * AB::ExprEF::from(main_current[0].clone().into()) * AB::ExprEF::from(main_current[5].clone().into()) + AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into()) * AB::ExprEF::from(main_current[5].clone().into())) * ((alpha.into() + beta_challenges[0].into() + beta_challenges[1].into().double()) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(main_current[1].clone().into()) * AB::ExprEF::from(main_current[5].clone().into()) + AB::ExprEF::ONE - (AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * AB::ExprEF::from(main_current[1].clone().into()) * AB::ExprEF::from(main_current[5].clone().into())) * AB::ExprEF::from(aux_current[0].clone().into()) - ((alpha.into() + AB::ExprEF::from_u64(3) * beta_challenges[0].into() + AB::ExprEF::from_u64(4) * beta_challenges[1].into()) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[1].clone().into())) * AB::ExprEF::from(main_current[4].clone().into()) + AB::ExprEF::ONE - (AB::ExprEF::ONE - AB::ExprEF::from(main_current[0].clone().into())) * (AB::ExprEF::ONE - AB::ExprEF::from(main_current[1].clone().into())) * AB::ExprEF::from(main_current[4].clone().into())) * AB::ExprEF::from(aux_next[0].clone().into())); } diff --git a/air-script/src/tests/selectors/selectors_combine_simple_plonky3.rs b/air-script/src/tests/selectors/selectors_combine_simple_plonky3.rs index df958a51e..ed223440f 100644 --- a/air-script/src/tests/selectors/selectors_combine_simple_plonky3.rs +++ b/air-script/src/tests/selectors/selectors_combine_simple_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for SelectorsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -37,8 +38,6 @@ impl MidenAir for SelectorsAir { builder.when_transition().assert_zero(main_next[1].clone().into() - main_current[2].clone().into()); builder.when_transition().assert_zero(main_current[3].clone().into() * (main_next[0].clone().into() - (main_current[0].clone().into() + main_current[1].clone().into())) + (AB::Expr::ONE - main_current[3].clone().into()) * (main_next[0].clone().into() - main_current[0].clone().into() * main_current[1].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/selectors/selectors_combine_with_list_comprehensions_plonky3.rs b/air-script/src/tests/selectors/selectors_combine_with_list_comprehensions_plonky3.rs index c7c4e3940..d482f2c9d 100644 --- a/air-script/src/tests/selectors/selectors_combine_with_list_comprehensions_plonky3.rs +++ b/air-script/src/tests/selectors/selectors_combine_with_list_comprehensions_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 6; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for SelectorsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -38,8 +39,6 @@ impl MidenAir for SelectorsAir { builder.assert_zero((AB::Expr::ONE - main_current[0].clone().into()) * (main_current[5].clone().into() - AB::Expr::from_u64(8)) + main_current[0].clone().into() * (main_current[4].clone().into() - AB::Expr::from_u64(2))); builder.assert_zero(main_current[0].clone().into() * (main_current[5].clone().into() - AB::Expr::from_u64(4)) + (AB::Expr::ONE - main_current[0].clone().into()) * main_current[1].clone().into() * (main_current[4].clone().into() - AB::Expr::from_u64(6))); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/selectors/selectors_plonky3.rs b/air-script/src/tests/selectors/selectors_plonky3.rs index 51f70004b..e16eb2f28 100644 --- a/air-script/src/tests/selectors/selectors_plonky3.rs +++ b/air-script/src/tests/selectors/selectors_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for SelectorsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -37,8 +38,6 @@ impl MidenAir for SelectorsAir { builder.when_transition().assert_zero(main_current[0].clone().into() * (AB::Expr::ONE - main_current[1].clone().into()) * main_next[3].clone().into()); builder.when_transition().assert_zero(main_current[0].clone().into() * main_current[1].clone().into() * main_current[2].clone().into() * (main_next[3].clone().into() - main_current[3].clone().into()) + (AB::Expr::ONE - main_current[1].clone().into()) * (AB::Expr::ONE - main_current[2].clone().into()) * (main_next[3].clone().into() - AB::Expr::ONE)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/selectors/selectors_with_evaluators_plonky3.rs b/air-script/src/tests/selectors/selectors_with_evaluators_plonky3.rs index 1dde4fecf..42affcf13 100644 --- a/air-script/src/tests/selectors/selectors_with_evaluators_plonky3.rs +++ b/air-script/src/tests/selectors/selectors_with_evaluators_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for SelectorsAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -37,8 +38,6 @@ impl MidenAir for SelectorsAir { builder.when_transition().assert_zero(main_current[0].clone().into() * (AB::Expr::ONE - main_current[1].clone().into()) * main_next[3].clone().into()); builder.when_transition().assert_zero(main_current[1].clone().into() * main_current[2].clone().into() * main_current[0].clone().into() * (main_next[3].clone().into() - main_current[3].clone().into()) + (AB::Expr::ONE - main_current[1].clone().into()) * (AB::Expr::ONE - main_current[2].clone().into()) * (main_next[3].clone().into() - AB::Expr::ONE)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/selectors/test_air_plonky3.rs b/air-script/src/tests/selectors/test_air_plonky3.rs index ef3c01f81..c8cfbffa2 100644 --- a/air-script/src/tests/selectors/test_air_plonky3.rs +++ b/air-script/src/tests/selectors/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::selectors::selectors_with_evaluators_plonky3::{MAIN_WIDTH, SelectorsAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -43,8 +42,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, SelectorsAir); diff --git a/air-script/src/tests/system/system_plonky3.rs b/air-script/src/tests/system/system_plonky3.rs index 574bccd9b..acc5e98be 100644 --- a/air-script/src/tests/system/system_plonky3.rs +++ b/air-script/src/tests/system/system_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 3; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for SystemAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -36,8 +37,6 @@ impl MidenAir for SystemAir { // Main integrity/transition constraints builder.when_transition().assert_zero(main_next[0].clone().into() - (main_current[0].clone().into() + AB::Expr::ONE)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/system/test_air_plonky3.rs b/air-script/src/tests/system/test_air_plonky3.rs index 404ea03d7..952a7412f 100644 --- a/air-script/src/tests/system/test_air_plonky3.rs +++ b/air-script/src/tests/system/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::system::system_plonky3::{MAIN_WIDTH, SystemAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -40,8 +39,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, SystemAir); diff --git a/air-script/src/tests/trace_col_groups/test_air_plonky3.rs b/air-script/src/tests/trace_col_groups/test_air_plonky3.rs index 1b4522ecf..920a7f3db 100644 --- a/air-script/src/tests/trace_col_groups/test_air_plonky3.rs +++ b/air-script/src/tests/trace_col_groups/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::trace_col_groups::trace_col_groups_plonky3::{MAIN_WIDTH, TraceColGroupAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -58,8 +57,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 16] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, TraceColGroupAir); diff --git a/air-script/src/tests/trace_col_groups/trace_col_groups_plonky3.rs b/air-script/src/tests/trace_col_groups/trace_col_groups_plonky3.rs index 026304e2d..5a0b38979 100644 --- a/air-script/src/tests/trace_col_groups/trace_col_groups_plonky3.rs +++ b/air-script/src/tests/trace_col_groups/trace_col_groups_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 9; pub const AUX_WIDTH: usize = 0; @@ -19,11 +19,12 @@ impl MidenAir for TraceColGroupAir { } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -37,8 +38,6 @@ impl MidenAir for TraceColGroupAir { builder.when_transition().assert_zero(main_next[2].clone().into() - (main_current[2].clone().into() + AB::Expr::ONE)); builder.when_transition().assert_zero(main_next[1].clone().into() - (main_current[1].clone().into() - AB::Expr::ONE)); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/air-script/src/tests/variables/test_air_plonky3.rs b/air-script/src/tests/variables/test_air_plonky3.rs index b8d2d88ef..356a4d9fb 100644 --- a/air-script/src/tests/variables/test_air_plonky3.rs +++ b/air-script/src/tests/variables/test_air_plonky3.rs @@ -3,12 +3,11 @@ use p3_miden_air::RowMajorMatrix; use crate::{ generate_air_plonky3_test_with_airscript_traits, - test_utils::plonky3_traits::check_constraints_with_airscript_traits, tests::variables::variables_plonky3::{MAIN_WIDTH, VariablesAir}, }; -pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { - let num_rows = 32; +pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix { + let num_rows = 512; let trace_length = num_rows * MAIN_WIDTH; let mut long_trace = F::zero_vec(trace_length); @@ -43,8 +42,12 @@ pub fn generate_trace_rows(inputs: Vec) -> RowMajorMatrix< trace } -fn generate_inputs() -> Vec { +fn generate_inputs() -> Vec { vec![1; 32] } +fn generate_var_len_pub_inputs<'a>() -> Vec>> { + vec![] +} + generate_air_plonky3_test_with_airscript_traits!(test_air_plonky3, VariablesAir); diff --git a/air-script/src/tests/variables/variables_plonky3.rs b/air-script/src/tests/variables/variables_plonky3.rs index bfe0da908..57cbc460d 100644 --- a/air-script/src/tests/variables/variables_plonky3.rs +++ b/air-script/src/tests/variables/variables_plonky3.rs @@ -2,7 +2,7 @@ use p3_field::{ExtensionField, Field, PrimeCharacteristicRing}; use p3_matrix::Matrix; use p3_matrix::dense::RowMajorMatrixView; use p3_matrix::stack::VerticalPair; -use p3_miden_air::{MidenAir, MidenAirBuilder, RowMajorMatrix}; +use p3_miden_air::{BusType, MidenAir, MidenAirBuilder, RowMajorMatrix}; pub const MAIN_WIDTH: usize = 4; pub const AUX_WIDTH: usize = 0; @@ -32,11 +32,12 @@ where F: Field, } fn eval(&self, builder: &mut AB) - where AB: MidenAirBuilder, + where AB: MidenAirBuilder, { let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect("Wrong number of public values"); let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect("Wrong number of periodic values"); - let preprocessed = builder.preprocessed(); + // Note: for now, we do not have any preprocessed values + // let preprocessed = builder.preprocessed(); let main = builder.main(); let (main_current, main_next) = ( main.row_slice(0).unwrap(), @@ -53,8 +54,6 @@ where F: Field, builder.assert_zero((AB::Expr::ONE - main_current[0].clone().into()) * (main_current[3].clone().into() - main_current[1].clone().into() - main_current[2].clone().into()) - (AB::Expr::from_u64(6) - (AB::Expr::from_u64(7) - main_current[0].clone().into()))); builder.when_transition().assert_zero(main_current[0].clone().into() * (main_current[3].clone().into() - main_current[1].clone().into() * main_current[2].clone().into()) - (AB::Expr::ONE - main_next[0].clone().into())); - // Aux boundary constraints - // Aux integrity/transition constraints } } \ No newline at end of file diff --git a/codegen/plonky3/src/air/boundary_constraints.rs b/codegen/plonky3/src/air/boundary_constraints.rs index aba2206b0..79a4f4f7a 100644 --- a/codegen/plonky3/src/air/boundary_constraints.rs +++ b/codegen/plonky3/src/air/boundary_constraints.rs @@ -13,6 +13,7 @@ pub(super) fn add_main_boundary_constraints(eval_func: &mut Function, ir: &Air) } } +#[allow(dead_code)] /// Adds the aux boundary constraints to the generated code. pub(super) fn add_aux_boundary_constraints(eval_func: &mut Function, ir: &Air) { eval_func.line(""); diff --git a/codegen/plonky3/src/air/mod.rs b/codegen/plonky3/src/air/mod.rs index 98b881f70..32a585ce9 100644 --- a/codegen/plonky3/src/air/mod.rs +++ b/codegen/plonky3/src/air/mod.rs @@ -6,7 +6,7 @@ use air_ir::Air; use super::Scope; use crate::air::{ - boundary_constraints::{add_aux_boundary_constraints, add_main_boundary_constraints}, + boundary_constraints::add_main_boundary_constraints, graph::Codegen, integrity_constraints::{add_aux_integrity_constraints, add_main_integrity_constraints}, }; @@ -45,8 +45,13 @@ fn add_constants(scope: &mut Scope, ir: &Air) { let aux_width = ir.trace_segment_widths.get(1).cloned().unwrap_or(0); let num_periodic_values = ir.periodic_columns().count(); let period = ir.periodic_columns().map(|col| col.period()).max().unwrap_or(0); - let num_public_values = - ir.public_inputs().map(|public_input| public_input.size()).sum::(); + let num_public_values = ir + .public_inputs() + .map(|public_input| match public_input { + air_ir::PublicInput::Vector { size, .. } => size, + air_ir::PublicInput::Table { .. } => &0, + }) + .sum::(); let max_beta_challenge_power = ir.num_random_values.saturating_sub(1); let constants = [ @@ -112,6 +117,17 @@ fn add_air_struct(scope: &mut Scope, ir: &Air, name: &str) { .line("1 + MAX_BETA_CHALLENGE_POWER"); miden_air_impl.new_fn("aux_width").arg_ref_self().ret("usize").line("AUX_WIDTH"); + + let bus_types_fn = miden_air_impl.new_fn("bus_types").arg_ref_self().ret("Vec"); + bus_types_fn.line("vec!["); + for (_id, bus) in &ir.buses { + let bus_type_str = match bus.bus_type { + air_ir::BusType::Multiset => "BusType::Multiset", + air_ir::BusType::Logup => "BusType::Logup", + }; + bus_types_fn.line(format!(" {bus_type_str},")); + } + bus_types_fn.line("]"); } // add the build_aux_trace function if needed @@ -121,7 +137,7 @@ fn add_air_struct(scope: &mut Scope, ir: &Air, name: &str) { .arg_ref_self() .arg("_main", "&RowMajorMatrix") .arg("_challenges", "&[EF]") - .ret("Option>"); + .ret("Option>"); build_aux_trace_func.line("// Note: consider using Some(build_aux_trace_with_miden_vm::(_main, _challenges, module)) if you want to build the aux trace using Miden VM aux trace builders."); build_aux_trace_func.line(""); build_aux_trace_func.line("let num_rows = _main.height();"); @@ -158,19 +174,22 @@ fn add_air_struct(scope: &mut Scope, ir: &Air, name: &str) { build_aux_trace_func.line(" rows[i+1][j] = next_row[j];"); build_aux_trace_func.line(" }"); build_aux_trace_func.line("}"); - build_aux_trace_func.line("Some(trace)"); + build_aux_trace_func.line("let trace_f = trace.flatten_to_base();"); + build_aux_trace_func.line("Some(trace_f)"); } // add the eval function let eval_func = miden_air_impl .new_fn("eval") .generic("AB") - .bound("AB", "MidenAirBuilder") + .bound("AB", "MidenAirBuilder") .arg_ref_self() .arg("builder", "&mut AB"); eval_func.line("let public_values: [_; NUM_PUBLIC_VALUES] = builder.public_values().try_into().expect(\"Wrong number of public values\");"); eval_func.line("let periodic_values: [_; NUM_PERIODIC_VALUES] = builder.periodic_evals().try_into().expect(\"Wrong number of periodic values\");"); - eval_func.line("let preprocessed = builder.preprocessed();"); + + eval_func.line("// Note: for now, we do not have any preprocessed values"); + eval_func.line("// let preprocessed = builder.preprocessed();"); eval_func.line("let main = builder.main();"); eval_func.line("let (main_current, main_next) = ("); @@ -194,7 +213,8 @@ fn add_air_struct(scope: &mut Scope, ir: &Air, name: &str) { add_main_integrity_constraints(eval_func, ir); - add_aux_boundary_constraints(eval_func, ir); + // Note: Plonky3 automatically adds aux boundary constraints + //add_aux_boundary_constraints(eval_func, ir); add_aux_integrity_constraints(eval_func, ir); } diff --git a/codegen/plonky3/src/imports.rs b/codegen/plonky3/src/imports.rs index 8655c7161..d96c0dd40 100644 --- a/codegen/plonky3/src/imports.rs +++ b/codegen/plonky3/src/imports.rs @@ -9,6 +9,7 @@ pub(super) fn add_imports(scope: &mut Scope) { scope.import("p3_matrix", "Matrix"); scope.import("p3_matrix::dense", "RowMajorMatrixView"); scope.import("p3_matrix::stack", "VerticalPair"); + scope.import("p3_miden_air", "BusType"); scope.import("p3_miden_air", "MidenAir"); scope.import("p3_miden_air", "MidenAirBuilder"); scope.import("p3_miden_air", "RowMajorMatrix"); diff --git a/parser/src/ast/module.rs b/parser/src/ast/module.rs index 323eaf417..9ffbb41ae 100644 --- a/parser/src/ast/module.rs +++ b/parser/src/ast/module.rs @@ -435,9 +435,6 @@ impl Module { conflicting_declaration(diagnostics, "function", prev.span(), function.name.span()); return Err(SemanticAnalysisError::NameConflict(function.name.span())); } - - println!("Declared function: {:?}", function.name); - self.functions.insert(function.name, function); Ok(())