From cc327586eeece7f8f1f3cecfc1c169e8b4126bce Mon Sep 17 00:00:00 2001 From: dante <45801863+alexander-camuto@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:00:42 +0000 Subject: [PATCH 1/6] chore: bump revm / snark-verifier deps (#671) --------- Co-authored-by: Ethan --- Cargo.lock | 115 +++++++++++--------- examples/notebooks/data_attest.ipynb | 1 - examples/notebooks/data_attest_hashed.ipynb | 5 +- examples/notebooks/world_rotation.ipynb | 1 - src/commands.rs | 6 - src/execute.rs | 41 ++----- src/pfsys/evm/mod.rs | 4 - src/pfsys/evm/single.rs | 53 --------- src/python.rs | 21 +--- tests/integration_tests.rs | 2 - 10 files changed, 82 insertions(+), 167 deletions(-) delete mode 100644 src/pfsys/evm/single.rs diff --git a/Cargo.lock b/Cargo.lock index 5420926af..199f0ebf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -60,17 +60,52 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "alloy-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "ruint", + "tiny-keccak", +] + [[package]] name = "alloy-rlp" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc0fac0fc16baf1f63f78b47c3d24718f3619b0714076f6a02957d808d52cbef" dependencies = [ + "alloy-rlp-derive", "arrayvec 0.7.4", "bytes", "smol_str", ] +[[package]] +name = "alloy-rlp-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -913,6 +948,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.2" @@ -2314,19 +2362,14 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash 0.8.3", + "allocator-api2", ] -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - [[package]] name = "hashers" version = "1.0.1" @@ -4120,9 +4163,9 @@ dependencies = [ [[package]] name = "revm" -version = "3.3.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f293f351c4c203d321744e54ed7eed3d2b6eef4c140228910dde3ac9a5ea8031" +checksum = "68f4ca8ae0345104523b4af1a8a7ea97cfa1865cdb7a7c25d23c1a18d9b48598" dependencies = [ "auto_impl", "revm-interpreter", @@ -4131,52 +4174,42 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "1.1.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53980a26f9b5a66d13511c35074d4b53631e157850a1d7cf1af4efc2c2b72c9" +checksum = "f959cafdf64a7f89b014fa73dc2325001cf654b3d9400260b212d19a2ebe3da0" dependencies = [ - "derive_more", - "enumn", "revm-primitives", - "sha3 0.10.8", ] [[package]] name = "revm-precompile" -version = "2.0.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41320af3bd6a65153d38eb1d3638ba89104cc9513c7feedb2d8510e8307dab29" +checksum = "4d360a88223d85709d2e95d4609eb1e19c649c47e28954bfabae5e92bb37e83e" dependencies = [ "k256", "num", "once_cell", "revm-primitives", "ripemd", - "secp256k1", "sha2 0.10.7", - "sha3 0.10.8", "substrate-bn", ] [[package]] name = "revm-primitives" -version = "1.1.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304d998f466ffef72d76c7f20b05bf08a96801736a6fb1fdef47d49a292618df" +checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" dependencies = [ + "alloy-primitives", + "alloy-rlp", "auto_impl", + "bitflags 2.4.0", "bitvec 1.0.1", - "bytes", - "derive_more", "enumn", - "fixed-hash", - "hashbrown 0.13.2", + "hashbrown 0.14.0", "hex", - "hex-literal", - "primitive-types", - "rlp", - "ruint", - "sha3 0.10.8", ] [[package]] @@ -4441,24 +4474,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.9.1" @@ -4719,8 +4734,8 @@ dependencies = [ [[package]] name = "snark-verifier" -version = "0.1.0" -source = "git+https://github.com/zkonduit/snark-verifier?branch=ac/chunked-mv-lookup#a1ac764143960023551e99da000157682ff4d970" +version = "0.1.1" +source = "git+https://github.com/zkonduit/snark-verifier?branch=ac/chunked-mv-lookup#22ee76bee1a24f3732e994b72b10ec09939348de" dependencies = [ "ecc", "halo2_proofs", diff --git a/examples/notebooks/data_attest.ipynb b/examples/notebooks/data_attest.ipynb index 0d023e2ea..20d2cd6f0 100644 --- a/examples/notebooks/data_attest.ipynb +++ b/examples/notebooks/data_attest.ipynb @@ -512,7 +512,6 @@ "\n", "res = ezkl.create_evm_data_attestation(\n", " input_path,\n", - " vk_path,\n", " settings_path,\n", " sol_code_path,\n", " abi_path,\n", diff --git a/examples/notebooks/data_attest_hashed.ipynb b/examples/notebooks/data_attest_hashed.ipynb index 84557e03a..69ff305bb 100644 --- a/examples/notebooks/data_attest_hashed.ipynb +++ b/examples/notebooks/data_attest_hashed.ipynb @@ -274,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -568,7 +568,6 @@ "\n", "res = ezkl.create_evm_data_attestation(\n", " input_path,\n", - " vk_path,\n", " settings_path,\n", " sol_code_path,\n", " abi_path,\n", @@ -649,7 +648,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.9.13" }, "orig_nbformat": 4 }, diff --git a/examples/notebooks/world_rotation.ipynb b/examples/notebooks/world_rotation.ipynb index 336049c51..2643b4e9e 100644 --- a/examples/notebooks/world_rotation.ipynb +++ b/examples/notebooks/world_rotation.ipynb @@ -387,7 +387,6 @@ "\n", "res = ezkl.create_evm_data_attestation(\n", " input_path,\n", - " vk_path,\n", " settings_path,\n", " sol_code_path,\n", " abi_path,\n", diff --git a/src/commands.rs b/src/commands.rs index e0efdcdb5..a66c73a42 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -569,15 +569,9 @@ pub enum Commands { /// Creates an EVM verifier that attests to on-chain inputs for a single proof #[command(name = "create-evm-da")] CreateEVMDataAttestation { - /// The path to SRS, if None will use $EZKL_REPO_PATH/srs/kzg{logrows}.srs - #[arg(long)] - srs_path: Option, /// The path to load circuit settings .json file from (generated using the gen-settings command) #[arg(short = 'S', long, default_value = DEFAULT_SETTINGS)] settings_path: PathBuf, - /// The path to load the desired verification key file - #[arg(long, default_value = DEFAULT_VK)] - vk_path: PathBuf, /// The path to output the Solidity code #[arg(long, default_value = DEFAULT_SOL_CODE_DA)] sol_code_path: PathBuf, diff --git a/src/execute.rs b/src/execute.rs index 046c22116..e9cd59e2e 100644 --- a/src/execute.rs +++ b/src/execute.rs @@ -5,6 +5,7 @@ use crate::commands::Commands; #[cfg(not(target_arch = "wasm32"))] use crate::eth::{deploy_da_verifier_via_solidity, deploy_verifier_via_solidity}; #[cfg(not(target_arch = "wasm32"))] +#[allow(unused_imports)] use crate::eth::{fix_da_sol, get_contract_artifacts, verify_proof_via_solidity}; use crate::graph::input::GraphData; use crate::graph::{GraphCircuit, GraphSettings, GraphWitness, Model}; @@ -12,7 +13,6 @@ use crate::graph::{GraphCircuit, GraphSettings, GraphWitness, Model}; use crate::graph::{TestDataSource, TestSources}; use crate::pfsys::evm::aggregation::AggregationCircuit; #[cfg(not(target_arch = "wasm32"))] -use crate::pfsys::evm::{single::gen_evm_verifier, YulCode}; use crate::pfsys::{ create_keys, load_pk, load_vk, save_params, save_pk, swap_proof_commitments_kzg, Snark, StrategyType, TranscriptType, @@ -189,20 +189,11 @@ pub async fn run(command: Commands) -> Result> { } => create_evm_verifier(vk_path, srs_path, settings_path, sol_code_path, abi_path), #[cfg(not(target_arch = "wasm32"))] Commands::CreateEVMDataAttestation { - vk_path, - srs_path, settings_path, sol_code_path, abi_path, data, - } => create_evm_data_attestation( - vk_path, - srs_path, - settings_path, - sol_code_path, - abi_path, - data, - ), + } => create_evm_data_attestation(settings_path, sol_code_path, abi_path, data), #[cfg(not(target_arch = "wasm32"))] Commands::CreateEVMVerifierAggr { vk_path, @@ -1030,33 +1021,21 @@ pub(crate) fn create_evm_verifier( #[cfg(not(target_arch = "wasm32"))] pub(crate) fn create_evm_data_attestation( - vk_path: PathBuf, - srs_path: Option, settings_path: PathBuf, - sol_code_path: PathBuf, - abi_path: PathBuf, - input: PathBuf, + _sol_code_path: PathBuf, + _abi_path: PathBuf, + _input: PathBuf, ) -> Result> { + #[allow(unused_imports)] use crate::graph::{DataSource, VarVisibility}; check_solc_requirement(); let settings = GraphSettings::load(&settings_path)?; - let params = load_params_cmd(srs_path, settings.run_args.logrows)?; let visibility = VarVisibility::from_args(&settings.run_args)?; - - let num_instance = settings.total_instances(); - let num_instance: usize = num_instance.iter().sum::(); - - let vk = load_vk::, Fr, GraphCircuit>(vk_path, settings.clone())?; trace!("params computed"); - let yul_code: YulCode = gen_evm_verifier(¶ms, &vk, num_instance)?; - - let mut f = File::create(sol_code_path.clone())?; - let _ = f.write(yul_code.as_bytes()); - - let data = GraphData::from_path(input)?; + let data = GraphData::from_path(_input)?; let output_data = if let Some(DataSource::OnChain(source)) = data.output_data { if visibility.output.is_private() { @@ -1086,12 +1065,12 @@ pub(crate) fn create_evm_data_attestation( if input_data.is_some() || output_data.is_some() { let output = fix_da_sol(input_data, output_data)?; - let mut f = File::create(sol_code_path.clone())?; + let mut f = File::create(_sol_code_path.clone())?; let _ = f.write(output.as_bytes()); // fetch abi of the contract - let (abi, _, _) = get_contract_artifacts(sol_code_path, "DataAttestation", 0)?; + let (abi, _, _) = get_contract_artifacts(_sol_code_path, "DataAttestation", 0)?; // save abi to file - serde_json::to_writer(std::fs::File::create(abi_path)?, &abi)?; + serde_json::to_writer(std::fs::File::create(_abi_path)?, &abi)?; } else { return Err( "Neither input or output data source is on-chain. Atleast one must be on chain.".into(), diff --git a/src/pfsys/evm/mod.rs b/src/pfsys/evm/mod.rs index 3d3d91651..06da47759 100644 --- a/src/pfsys/evm/mod.rs +++ b/src/pfsys/evm/mod.rs @@ -2,8 +2,6 @@ use thiserror::Error; /// Aggregate proof generation for EVM pub mod aggregation; -/// Simple (single) proof generation for EVM -pub mod single; #[derive(Error, Debug)] /// Errors related to evm verification @@ -27,5 +25,3 @@ pub enum EvmVerificationError { #[error("Invalid visibility")] InvalidVisibility, } -/// YulCode type which is just an alias of string -pub type YulCode = String; diff --git a/src/pfsys/evm/single.rs b/src/pfsys/evm/single.rs deleted file mode 100644 index 2b71b5f01..000000000 --- a/src/pfsys/evm/single.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::pfsys::evm::YulCode; -use halo2_proofs::poly::commitment::ParamsProver; -use halo2_proofs::{plonk::VerifyingKey, poly::kzg::commitment::ParamsKZG}; -use halo2curves::bn256::{Bn256, Fq, Fr, G1Affine}; -use snark_verifier::{ - loader::evm::EvmLoader, - pcs::kzg::{Gwc19, KzgAs}, - system::halo2::{compile, transcript::evm::EvmTranscript, Config}, - verifier::{self, SnarkVerifier}, -}; -use std::rc::Rc; -use thiserror::Error; - -type PlonkVerifier = verifier::plonk::PlonkVerifier>; - -#[derive(Error, Debug)] -/// Errors related to simple evm verifier generation -pub enum SimpleError { - /// proof read errors - #[error("Failed to read proof")] - ProofRead, - /// proof verification errors - #[error("Failed to verify proof")] - ProofVerify, -} - -/// Create EVM verifier yulcode -pub fn gen_evm_verifier( - params: &ParamsKZG, - vk: &VerifyingKey, - num_instance: usize, -) -> Result { - let protocol = compile( - params, - vk, - Config::kzg().with_num_instance(vec![num_instance]), - ); - let vk = (params.get_g()[0], params.g2(), params.s_g2()).into(); - - let loader = EvmLoader::new::(); - let protocol = protocol.loaded(&loader); - let mut transcript = EvmTranscript::<_, Rc, _, _>::new(&loader); - - let instances = transcript.load_instances(vec![num_instance]); - let proof = PlonkVerifier::read_proof(&vk, &protocol, &instances, &mut transcript) - .map_err(|_| SimpleError::ProofRead)?; - PlonkVerifier::verify(&vk, &protocol, &instances, &proof) - .map_err(|_| SimpleError::ProofVerify)?; - - let yul_code = &loader.yul_code(); - - Ok(yul_code.clone()) -} diff --git a/src/python.rs b/src/python.rs index 61beedcd2..055c9895c 100644 --- a/src/python.rs +++ b/src/python.rs @@ -803,32 +803,21 @@ fn create_evm_verifier( // creates an EVM compatible data attestation verifier, you will need solc installed in your environment to run this #[pyfunction(signature = ( input_data=PathBuf::from(DEFAULT_DATA), - vk_path=PathBuf::from(DEFAULT_VK), settings_path=PathBuf::from(DEFAULT_SETTINGS), sol_code_path=PathBuf::from(DEFAULT_SOL_CODE_DA), abi_path=PathBuf::from(DEFAULT_VERIFIER_DA_ABI), - srs_path=None, ))] fn create_evm_data_attestation( input_data: PathBuf, - vk_path: PathBuf, settings_path: PathBuf, sol_code_path: PathBuf, abi_path: PathBuf, - srs_path: Option, ) -> Result { - crate::execute::create_evm_data_attestation( - vk_path, - srs_path, - settings_path, - sol_code_path, - abi_path, - input_data, - ) - .map_err(|e| { - let err_str = format!("Failed to run create_evm_data_attestation: {}", e); - PyRuntimeError::new_err(err_str) - })?; + crate::execute::create_evm_data_attestation(settings_path, sol_code_path, abi_path, input_data) + .map_err(|e| { + let err_str = format!("Failed to run create_evm_data_attestation: {}", e); + PyRuntimeError::new_err(err_str) + })?; Ok(true) } diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 906f7268d..0507618a0 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -1997,8 +1997,6 @@ mod native_tests { &settings_arg, "--sol-code-path", sol_arg.as_str(), - "--vk-path", - &vk_arg, "-D", test_on_chain_data_path.as_str(), ]) From dc9357f805b01fc7a2b725c8530326e8d3e7d528 Mon Sep 17 00:00:00 2001 From: dante <45801863+alexander-camuto@users.noreply.github.com> Date: Fri, 22 Dec 2023 02:57:47 +0000 Subject: [PATCH 2/6] fix: forcefully assign symbolic values in large graphs for tract (#673) --- examples/onnx/mean_as_constrain/input.json | 31 ------------------- examples/onnx/mean_as_constrain/network.onnx | Bin 837 -> 0 bytes src/commands.rs | 4 +-- src/graph/model.rs | 5 +-- src/graph/node.rs | 17 ++-------- src/graph/utilities.rs | 14 ++++----- 6 files changed, 13 insertions(+), 58 deletions(-) delete mode 100644 examples/onnx/mean_as_constrain/input.json delete mode 100644 examples/onnx/mean_as_constrain/network.onnx diff --git a/examples/onnx/mean_as_constrain/input.json b/examples/onnx/mean_as_constrain/input.json deleted file mode 100644 index 0ebe3218e..000000000 --- a/examples/onnx/mean_as_constrain/input.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "input_data": [ - [ - 33.0, 75.0, 38.0, 38.0, 70.0, 44.0, 34.0, 67.0, 54.0, 78.0, 80.0, 21.0, - 41.0, 47.0, 57.0, 50.0, 65.0, 43.0, 51.0, 54.0, 62.0, 68.0, 45.0, 39.0, - 51.0, 48.0, 48.0, 42.0, 37.0, 75.0, 40.0, 48.0, 65.0, 26.0, 42.0, 53.0, - 51.0, 56.0, 74.0, 54.0, 55.0, 15.0, 58.0, 46.0, 64.0, 59.0, 39.0, 36.0, - 62.0, 39.0, 72.0, 32.0, 82.0, 76.0, 88.0, 51.0, 44.0, 35.0, 18.0, 53.0, - 52.0, 45.0, 64.0, 31.0, 32.0, 61.0, 66.0, 59.0, 50.0, 69.0, 44.0, 22.0, - 45.0, 45.0, 46.0, 42.0, 83.0, 53.0, 53.0, 69.0, 53.0, 33.0, 48.0, 49.0, - 34.0, 66.0, 29.0, 66.0, 52.0, 45.0, 83.0, 54.0, 53.0, 31.0, 71.0, 60.0, - 30.0, 33.0, 43.0, 26.0, 55.0, 56.0, 56.0, 54.0, 57.0, 68.0, 58.0, 61.0, - 62.0, 38.0, 52.0, 74.0, 76.0, 37.0, 42.0, 54.0, 38.0, 38.0, 30.0, 31.0, - 52.0, 41.0, 69.0, 40.0, 46.0, 69.0, 29.0, 28.0, 66.0, 41.0, 40.0, 36.0, - 52.0, 58.0, 46.0, 42.0, 85.0, 45.0, 70.0, 49.0, 48.0, 34.0, 18.0, 39.0, - 64.0, 46.0, 54.0, 42.0, 45.0, 64.0, 46.0, 68.0, 46.0, 54.0, 47.0, 41.0, - 69.0, 27.0, 61.0, 37.0, 25.0, 66.0, 30.0, 59.0, 67.0, 34.0, 36.0, 40.0, - 55.0, 58.0, 74.0, 55.0, 66.0, 55.0, 72.0, 40.0, 27.0, 38.0, 74.0, 52.0, - 45.0, 40.0, 35.0, 46.0, 64.0, 41.0, 50.0, 45.0, 42.0, 22.0, 25.0, 55.0, - 39.0, 58.0, 56.0, 62.0, 55.0, 65.0, 57.0, 34.0, 44.0, 47.0, 70.0, 60.0, - 34.0, 50.0, 43.0, 60.0, 66.0, 46.0, 58.0, 76.0, 40.0, 49.0, 64.0, 45.0, - 22.0, 50.0, 34.0, 44.0, 76.0, 63.0, 59.0, 36.0, 59.0, 47.0, 70.0, 64.0, - 44.0, 55.0, 50.0, 48.0, 66.0, 40.0, 76.0, 48.0, 75.0, 73.0, 55.0, 41.0, - 43.0, 50.0, 34.0, 57.0, 50.0, 53.0, 28.0, 35.0, 52.0, 52.0, 49.0, 67.0, - 41.0, 41.0, 61.0, 24.0, 43.0, 51.0, 40.0, 52.0, 44.0, 25.0, 81.0, 54.0, - 64.0, 76.0, 37.0, 45.0, 48.0, 46.0, 43.0, 67.0, 28.0, 35.0, 25.0, 71.0, - 50.0, 31.0, 43.0, 54.0, 40.0, 51.0, 40.0, 49.0, 34.0, 26.0, 46.0, 62.0, - 40.0, 25.0, 61.0, 58.0, 56.0, 39.0, 46.0, 53.0, 21.0, 57.0, 42.0, 80.0 - ] - ] -} diff --git a/examples/onnx/mean_as_constrain/network.onnx b/examples/onnx/mean_as_constrain/network.onnx deleted file mode 100644 index 608ec1f70ba7927e5fb0633650fe2627948665b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmZuvO;3YB5baW++iA6AHL6&8ZS-Q}#S2;5jSyQ(%Hr3r@dx;S zJo`^vN(-pvFv+}mGjHaxSR||paR?lN0&qwGfK(#3j9YUYzKrdv;x{Zgqx|*c4ECZauBER8xgY56cZn0mc zv@8ScN@}qtspoD~q{@_*Wsr`qX6`z6PN@~pg6peu*Rg@RDtv97CXQb(-gn_-(wLrI zkkV5iJ^fg&Uffmw%fzLePW1HswKVI7M-f$%2%Cwaihb0oT@QF5eDUVkHpTOVz=-*Q z^EhFlXVwhVMlW6U>ie?&u${fl4OqvBtU;ZC%S7LEBLAI(f)SMQr{Wqg6DB&SxJpWH O9i-qiL!{JJ4EO, Box>>()?; + let out_dims = node_output_shapes(n, symbol_values)?; let mut output_scales = BTreeMap::new(); diff --git a/src/graph/node.rs b/src/graph/node.rs index d10e92754..1f2d82337 100644 --- a/src/graph/node.rs +++ b/src/graph/node.rs @@ -630,20 +630,9 @@ impl Node { out_scale = opkind.out_scale(in_scales)?; // get the output shape - let mut out_dims = { - let output_shapes = match node_output_shapes(&node) { - Ok(s) => Some(s), - _ => None, - }; - - if let Some([Some(v)]) = output_shapes.as_deref() { - v.to_vec() - } else if let Some([Some(v), Some(_)]) = output_shapes.as_deref() { - v.to_vec() - } else { - return Err("could not get output shape for node".into()); - } - }; + let out_dims = node_output_shapes(&node, symbol_values)?; + // nodes vs subgraphs always have a single output + let mut out_dims = out_dims[0].clone(); if out_dims.is_empty() { out_dims = vec![1]; diff --git a/src/graph/utilities.rs b/src/graph/utilities.rs index 05abda57d..bcfc37630 100644 --- a/src/graph/utilities.rs +++ b/src/graph/utilities.rs @@ -88,11 +88,14 @@ pub fn multiplier_to_scale(mult: f64) -> crate::Scale { #[cfg(not(target_arch = "wasm32"))] pub fn node_output_shapes( node: &OnnxNode>, -) -> Result>>, Box> { + symbol_values: &SymbolValues, +) -> Result>, Box> { let mut shapes = Vec::new(); let outputs = node.outputs.to_vec(); for output in outputs { - let mv = output.fact.shape.clone().as_concrete().map(|x| x.to_vec()); + let shape = output.fact.shape; + let shape = shape.eval_to_usize(symbol_values)?; + let mv = shape.to_vec(); shapes.push(mv) } Ok(shapes) @@ -1356,11 +1359,8 @@ pub fn new_op_from_onnx( } "RmAxis" | "Reshape" | "AddAxis" => { // Extract the slope layer hyperparams - let shapes = node_output_shapes(&node)?; - let mut output_shape = shapes[0] - .as_ref() - .ok_or(GraphError::InvalidDims(idx, "reshape".to_string()))? - .clone(); + let shapes = node_output_shapes(&node, symbol_values)?; + let mut output_shape = shapes[0].clone(); if output_shape.is_empty() { output_shape = vec![1]; } From bb76d97d29bfc48dc3f587ea1c32d537ffe667e3 Mon Sep 17 00:00:00 2001 From: dante <45801863+alexander-camuto@users.noreply.github.com> Date: Fri, 22 Dec 2023 22:56:03 -0500 Subject: [PATCH 3/6] refactor: move rayon to maybe_rayon (#675) --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/circuit/modules/poseidon.rs | 6 +++--- src/circuit/ops/layouts.rs | 2 +- src/circuit/table.rs | 2 +- src/execute.rs | 4 ++-- src/graph/mod.rs | 2 +- src/graph/utilities.rs | 2 +- src/tensor/mod.rs | 10 +++++----- src/tensor/ops.rs | 2 +- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 199f0ebf7..02689f04f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1860,6 +1860,7 @@ dependencies = [ "itertools 0.10.5", "lazy_static", "log", + "maybe-rayon", "mnist", "num", "openssl", @@ -1870,7 +1871,6 @@ dependencies = [ "pyo3-asyncio", "pyo3-log", "rand 0.8.5", - "rayon", "regex", "reqwest", "seq-macro", diff --git a/Cargo.toml b/Cargo.toml index 61c17aef4..305c2b339 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ hex = { version = "0.4.3", default_features = false } halo2_wrong_ecc = { git = "https://github.com/zkonduit/halo2wrong", branch = "ac/chunked-mv-lookup", package = "ecc" } snark-verifier = { git = "https://github.com/zkonduit/snark-verifier", branch = "ac/chunked-mv-lookup", features=["derive_serde"]} halo2_solidity_verifier = { git = "https://github.com/alexander-camuto/halo2-solidity-verifier", branch= "ac/lookup-modularity" } -rayon = { version = "1.7.0", default_features = false } +maybe-rayon = { version = "0.1.1", default_features = false } bincode = { version = "1.3.3", default_features = false } ark-std = { version = "^0.3.0", default-features = false } unzip-n = "0.1.2" diff --git a/src/circuit/modules/poseidon.rs b/src/circuit/modules/poseidon.rs index ca7caba79..47a1e5a84 100644 --- a/src/circuit/modules/poseidon.rs +++ b/src/circuit/modules/poseidon.rs @@ -12,9 +12,9 @@ use halo2_gadgets::poseidon::{primitives::*, Hash, Pow5Chip, Pow5Config}; use halo2_proofs::arithmetic::Field; use halo2_proofs::halo2curves::bn256::Fr as Fp; use halo2_proofs::{circuit::*, plonk::*}; -// use rayon::prelude::{IndexedParallelIterator, IntoParallelRefIterator}; -use rayon::prelude::ParallelIterator; -use rayon::slice::ParallelSlice; +// use maybe_rayon::prelude::{IndexedParallelIterator, IntoParallelRefIterator}; +use maybe_rayon::prelude::ParallelIterator; +use maybe_rayon::slice::ParallelSlice; use std::marker::PhantomData; diff --git a/src/circuit/ops/layouts.rs b/src/circuit/ops/layouts.rs index 6ab898524..9c4ca314c 100644 --- a/src/circuit/ops/layouts.rs +++ b/src/circuit/ops/layouts.rs @@ -8,7 +8,7 @@ use halo2_proofs::circuit::Value; use halo2curves::ff::PrimeField; use itertools::Itertools; use log::{error, trace}; -use rayon::{ +use maybe_rayon::{ prelude::{IndexedParallelIterator, IntoParallelIterator, ParallelIterator}, slice::ParallelSliceMut, }; diff --git a/src/circuit/table.rs b/src/circuit/table.rs index 6527fc53a..6310bbb3d 100644 --- a/src/circuit/table.rs +++ b/src/circuit/table.rs @@ -7,7 +7,7 @@ use halo2_proofs::{ plonk::{ConstraintSystem, Expression, TableColumn}, }; use log::warn; -use rayon::prelude::{IntoParallelIterator, ParallelIterator}; +use maybe_rayon::prelude::{IntoParallelIterator, ParallelIterator}; use crate::{ circuit::CircuitError, diff --git a/src/execute.rs b/src/execute.rs index e9cd59e2e..54de669bf 100644 --- a/src/execute.rs +++ b/src/execute.rs @@ -44,12 +44,12 @@ use itertools::Itertools; #[cfg(not(target_arch = "wasm32"))] use log::debug; use log::{info, trace, warn}; +#[cfg(not(target_arch = "wasm32"))] +use maybe_rayon::prelude::{IntoParallelIterator, ParallelIterator}; #[cfg(feature = "render")] use plotters::prelude::*; #[cfg(not(target_arch = "wasm32"))] use rand::Rng; -#[cfg(not(target_arch = "wasm32"))] -use rayon::prelude::{IntoParallelIterator, ParallelIterator}; use std::error::Error; use std::fs::File; #[cfg(not(target_arch = "wasm32"))] diff --git a/src/graph/mod.rs b/src/graph/mod.rs index dc5d02fee..bab56e6eb 100644 --- a/src/graph/mod.rs +++ b/src/graph/mod.rs @@ -35,6 +35,7 @@ use halo2_proofs::{ use halo2curves::bn256::{self, Bn256, Fr as Fp, G1Affine}; use halo2curves::ff::PrimeField; use log::{debug, error, info, trace, warn}; +use maybe_rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; pub use model::*; pub use node::*; #[cfg(feature = "python-bindings")] @@ -43,7 +44,6 @@ use pyo3::prelude::*; use pyo3::types::PyDict; #[cfg(feature = "python-bindings")] use pyo3::ToPyObject; -use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; use serde::{Deserialize, Serialize}; use std::io::{Read, Write}; use std::ops::Deref; diff --git a/src/graph/utilities.rs b/src/graph/utilities.rs index bcfc37630..8266aa38e 100644 --- a/src/graph/utilities.rs +++ b/src/graph/utilities.rs @@ -107,7 +107,7 @@ fn extract_tensor_value( input: Arc, symbol_values: &SymbolValues, ) -> Result, Box> { - use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; + use maybe_rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; let dt = input.datum_type(); let dims = input.shape().to_vec(); diff --git a/src/tensor/mod.rs b/src/tensor/mod.rs index fa1a40058..79f713b15 100644 --- a/src/tensor/mod.rs +++ b/src/tensor/mod.rs @@ -6,7 +6,7 @@ pub mod val; pub mod var; use halo2curves::ff::PrimeField; -use rayon::{ +use maybe_rayon::{ prelude::{ IndexedParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator, @@ -432,9 +432,9 @@ impl From> for Tensor> } impl - rayon::iter::IntoParallelIterator for Tensor + maybe_rayon::iter::IntoParallelIterator for Tensor { - type Iter = rayon::vec::IntoIter; + type Iter = maybe_rayon::vec::IntoIter; type Item = T; fn into_par_iter(self) -> Self::Iter { self.inner.into_par_iter() @@ -442,9 +442,9 @@ impl } impl<'data, T: Clone + TensorType + std::marker::Send + std::marker::Sync> - rayon::iter::IntoParallelRefMutIterator<'data> for Tensor + maybe_rayon::iter::IntoParallelRefMutIterator<'data> for Tensor { - type Iter = rayon::slice::IterMut<'data, T>; + type Iter = maybe_rayon::slice::IterMut<'data, T>; type Item = &'data mut T; fn par_iter_mut(&'data mut self) -> Self::Iter { self.inner.par_iter_mut() diff --git a/src/tensor/ops.rs b/src/tensor/ops.rs index f77a99a4c..67cf28ee2 100644 --- a/src/tensor/ops.rs +++ b/src/tensor/ops.rs @@ -1,7 +1,7 @@ use super::TensorError; use crate::tensor::{Tensor, TensorType}; use itertools::Itertools; -use rayon::{ +use maybe_rayon::{ iter::IndexedParallelIterator, iter::IntoParallelRefMutIterator, iter::ParallelIterator, prelude::IntoParallelRefIterator, }; From 9e68cb80c6e371e862968dc5e8824ac0c39a7e66 Mon Sep 17 00:00:00 2001 From: mmagician Date: Wed, 3 Jan 2024 01:29:55 +0100 Subject: [PATCH 4/6] fix: more verbose `DimError` messages (#676) --- src/circuit/ops/layouts.rs | 9 +++++--- src/circuit/ops/poly.rs | 4 +++- src/tensor/mod.rs | 43 ++++++++++++++++++++++++++++++-------- src/tensor/ops.rs | 14 ++++++------- src/tensor/val.rs | 5 ++++- 5 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/circuit/ops/layouts.rs b/src/circuit/ops/layouts.rs index 9c4ca314c..5bee3a1f4 100644 --- a/src/circuit/ops/layouts.rs +++ b/src/circuit/ops/layouts.rs @@ -749,7 +749,8 @@ pub fn gather( } if !assigned_len.is_empty() { - region.increment(*assigned_len.iter().max().ok_or(TensorError::DimError)?); + // safe to unwrap since we've just checked it has at least one element + region.increment(*assigned_len.iter().max().unwrap()); } // Calculate the output tensor size @@ -901,7 +902,8 @@ pub fn scatter_elements( } if !assigned_len.is_empty() { - region.increment(*assigned_len.iter().max().ok_or(TensorError::DimError)?); + // safe to unwrap since we've just checked it has at least one element + region.increment(*assigned_len.iter().max().unwrap()); } // Calculate the output tensor size @@ -1935,7 +1937,8 @@ pub fn conv Deserialize< PolyOp::Reshape(d) | PolyOp::Flatten(d) => layouts::reshape(values[..].try_into()?, d)?, PolyOp::Pad(p) => { if values.len() != 1 { - return Err(Box::new(TensorError::DimError)); + return Err(Box::new(TensorError::DimError( + "Pad operation requires a single input".to_string(), + ))); } let mut input = values[0].clone(); input.pad(*p)?; diff --git a/src/tensor/mod.rs b/src/tensor/mod.rs index 79f713b15..1d4816851 100644 --- a/src/tensor/mod.rs +++ b/src/tensor/mod.rs @@ -43,8 +43,8 @@ pub enum TensorError { #[error("dimension mismatch in tensor op: {0}")] DimMismatch(String), /// Shape when instantiating - #[error("dimensionality error when manipulating a tensor")] - DimError, + #[error("dimensionality error when manipulating a tensor: {0}")] + DimError(String), /// wrong method was called on a tensor-like struct #[error("wrong method called")] WrongMethod, @@ -57,6 +57,9 @@ pub enum TensorError { /// Table lookup error #[error("Table lookup error")] TableLookupError, + /// Unsupported operation + #[error("Unsupported operation on a tensor type")] + Unsupported, } /// The (inner) type of tensor elements. @@ -464,7 +467,11 @@ impl Tensor { match values { Some(v) => { if total_dims != v.len() { - return Err(TensorError::DimError); + return Err(TensorError::DimError(format!( + "Cannot create tensor of length {} with dims {:?}", + v.len(), + dims + ))); } Ok(Tensor { inner: Vec::from(v), @@ -631,7 +638,10 @@ impl Tensor { return Ok(self.clone()); } if self.dims.len() < indices.len() { - return Err(TensorError::DimError); + return Err(TensorError::DimError(format!( + "The dimensionality of the slice {:?} is greater than the tensor's {:?}", + indices, self.dims + ))); } else if indices.iter().map(|x| x.end - x.start).collect::>() == self.dims { // else if slice is the same as dims, return self return Ok(self.clone()); @@ -802,7 +812,9 @@ impl Tensor { // in onnx parlance this corresponds to converting a tensor to a single element if new_dims.is_empty() { if !(self.len() == 1 || self.is_empty()) { - return Err(TensorError::DimError); + return Err(TensorError::DimError( + "Cannot reshape to empty tensor".to_string(), + )); } self.dims = vec![]; } else { @@ -812,7 +824,11 @@ impl Tensor { 0 }; if self.len() != product { - return Err(TensorError::DimError); + return Err(TensorError::DimError(format!( + "Cannot reshape tensor of length {} to {:?}", + self.len(), + new_dims + ))); } self.dims = Vec::from(new_dims); } @@ -882,7 +898,9 @@ impl Tensor { } else if i > destination && source > destination { old_coord[i - 1] = *c; } else { - return Err(TensorError::DimError); + return Err(TensorError::DimError( + "Unknown condition for moving the axis".to_string(), + )); } } output.set(&coord, self.get(&old_coord)); @@ -964,7 +982,11 @@ impl Tensor { /// ``` pub fn expand(&self, shape: &[usize]) -> Result { if self.dims().len() > shape.len() { - return Err(TensorError::DimError); + return Err(TensorError::DimError(format!( + "Cannot expand {:?} to the smaller shape {:?}", + self.dims(), + shape + ))); } if shape == self.dims() { @@ -973,7 +995,10 @@ impl Tensor { for d in self.dims() { if !(shape.contains(d) || *d == 1) { - return Err(TensorError::DimError); + return Err(TensorError::DimError(format!( + "The current dimension {} must be contained in the new shape {:?} or be 1", + d, shape + ))); } } diff --git a/src/tensor/ops.rs b/src/tensor/ops.rs index 67cf28ee2..765eedc24 100644 --- a/src/tensor/ops.rs +++ b/src/tensor/ops.rs @@ -56,7 +56,7 @@ pub fn iff< let masked_a = (mask.clone() * a.clone())?; - let masked_b = ((Tensor::from(vec![T::one().ok_or(TensorError::DimError)?].into_iter()) + let masked_b = ((Tensor::from(vec![T::one().ok_or(TensorError::Unsupported)?].into_iter()) - mask.clone())? * b.clone())?; @@ -305,10 +305,10 @@ pub fn greater< ) -> Result<(Tensor, Vec>), TensorError> { let mask_inter = (a.clone() - b.clone())?; let mask = mask_inter.map(|x| { - if x > T::zero().ok_or(TensorError::DimError).unwrap() { - T::one().ok_or(TensorError::DimError).unwrap() + if x > T::zero().ok_or(TensorError::Unsupported).unwrap() { + T::one().ok_or(TensorError::Unsupported).unwrap() } else { - T::zero().ok_or(TensorError::DimError).unwrap() + T::zero().ok_or(TensorError::Unsupported).unwrap() } }); Ok((mask, vec![mask_inter])) @@ -348,10 +348,10 @@ pub fn greater_equal< ) -> Result<(Tensor, Vec>), TensorError> { let mask_inter = (a.clone() - b.clone())?; let mask = mask_inter.map(|x| { - if x >= T::zero().ok_or(TensorError::DimError).unwrap() { - T::one().ok_or(TensorError::DimError).unwrap() + if x >= T::zero().ok_or(TensorError::Unsupported).unwrap() { + T::one().ok_or(TensorError::Unsupported).unwrap() } else { - T::zero().ok_or(TensorError::DimError).unwrap() + T::zero().ok_or(TensorError::Unsupported).unwrap() } }); Ok((mask, vec![mask_inter])) diff --git a/src/tensor/val.rs b/src/tensor/val.rs index e375d6169..c768ac324 100644 --- a/src/tensor/val.rs +++ b/src/tensor/val.rs @@ -586,7 +586,10 @@ impl ValTensor { } ValTensor::Instance { dims: d, idx, .. } => { if d[*idx].iter().product::() != new_dims.iter().product::() { - return Err(Box::new(TensorError::DimError)); + return Err(Box::new(TensorError::DimError(format!( + "Cannot reshape {:?} to {:?} as they have number of elements", + d[*idx], new_dims + )))); } d[*idx] = new_dims.to_vec(); } From de48ae18faec291cc0e6bd1d5e14fde557858639 Mon Sep 17 00:00:00 2001 From: dante <45801863+alexander-camuto@users.noreply.github.com> Date: Wed, 3 Jan 2024 16:10:58 +0000 Subject: [PATCH 5/6] refactor: lookup safety during cal should be selectable (#678) --- examples/notebooks/ezkl_demo.ipynb | 1 - examples/notebooks/svm.ipynb | 2 +- examples/onnx/1l_topk/gen.py | 10 +- examples/onnx/1l_topk/input.json | 2 +- examples/onnx/1l_topk/network.onnx | Bin 266 -> 572 bytes src/circuit/ops/hybrid.rs | 13 +- src/circuit/ops/layouts.rs | 12 +- src/circuit/ops/lookup.rs | 15 +- src/circuit/ops/poly.rs | 5 +- src/commands.rs | 5 + src/execute.rs | 16 +- src/graph/mod.rs | 27 +- src/graph/model.rs | 3 +- src/graph/node.rs | 36 +- src/graph/utilities.rs | 18 +- src/python.rs | 13 +- src/tensor/ops.rs | 21 +- tests/python/binding_tests.py | 2 +- tests/wasm/model.compiled | Bin 1658 -> 1658 bytes tests/wasm/proof.json | 7334 +--------------------------- tests/wasm/settings.json | 2 +- 21 files changed, 142 insertions(+), 7395 deletions(-) diff --git a/examples/notebooks/ezkl_demo.ipynb b/examples/notebooks/ezkl_demo.ipynb index 79bff5fcf..98b4907e3 100644 --- a/examples/notebooks/ezkl_demo.ipynb +++ b/examples/notebooks/ezkl_demo.ipynb @@ -589,7 +589,6 @@ " proof_path,\n", " settings_path,\n", " vk_path,\n", - " \n", " )\n", "\n", "assert res == True\n", diff --git a/examples/notebooks/svm.ipynb b/examples/notebooks/svm.ipynb index 977c87cd3..b733138d0 100644 --- a/examples/notebooks/svm.ipynb +++ b/examples/notebooks/svm.ipynb @@ -220,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "b1c561a8", "metadata": {}, "outputs": [], diff --git a/examples/onnx/1l_topk/gen.py b/examples/onnx/1l_topk/gen.py index cabc83698..7e6d79d0b 100644 --- a/examples/onnx/1l_topk/gen.py +++ b/examples/onnx/1l_topk/gen.py @@ -8,9 +8,11 @@ def __init__(self): super(MyModel, self).__init__() def forward(self, x): - topk = torch.topk(x, 4) - print(topk) - return [topk.values] + topk_largest = torch.topk(x, 4) + topk_smallest = torch.topk(x, 4, largest=False) + print(topk_largest) + print(topk_smallest) + return topk_largest.values + topk_smallest.values circuit = MyModel() @@ -21,7 +23,7 @@ def forward(self, x): torch.onnx.export(circuit, x, "network.onnx", export_params=True, # store the trained parameter weights inside the model file - opset_version=10, # the ONNX version to export the model to + opset_version=14, # the ONNX version to export the model to do_constant_folding=True, # whether to execute constant folding for optimization input_names=['input'], # the model's input names output_names=['output'], # the model's output names diff --git a/examples/onnx/1l_topk/input.json b/examples/onnx/1l_topk/input.json index 654f20300..56dae35a1 100644 --- a/examples/onnx/1l_topk/input.json +++ b/examples/onnx/1l_topk/input.json @@ -1 +1 @@ -{"input_data": [[2, 1, 5, 3, 3, 7]], "output_data": [[7, 5, 3, 3]]} \ No newline at end of file +{"input_data": [[2, 1, 5, 4, 8, 2]], "output_data": [[9, 7, 6, 6]]} \ No newline at end of file diff --git a/examples/onnx/1l_topk/network.onnx b/examples/onnx/1l_topk/network.onnx index 546c9bab287396704a281dfc72246c9e83fc1dda..1f4875554c24ac1a01d733b056a56e459acb3e15 100644 GIT binary patch literal 572 zcmd;J7h*4{EXglQ&X8g?(lgXEuv*N*;M1& diff --git a/src/circuit/ops/hybrid.rs b/src/circuit/ops/hybrid.rs index 06602306a..be3a35977 100644 --- a/src/circuit/ops/hybrid.rs +++ b/src/circuit/ops/hybrid.rs @@ -53,6 +53,7 @@ pub enum HybridOp { TopK { dim: usize, k: usize, + largest: bool, }, OneHot { dim: usize, @@ -151,8 +152,8 @@ impl Op for HybridOp { let res = tensor::ops::one_hot(&x, *num_classes, *dim)?; (res.clone(), inter_equals) } - HybridOp::TopK { dim, k } => { - let res = tensor::ops::topk_axes(&x, *k, *dim)?; + HybridOp::TopK { dim, k, largest } => { + let res = tensor::ops::topk_axes(&x, *k, *dim, *largest)?; let mut inter_equals = x .clone() @@ -302,7 +303,9 @@ impl Op for HybridOp { HybridOp::LessEqual => "LESSEQUAL".into(), HybridOp::Equals => "EQUALS".into(), HybridOp::Gather { dim, .. } => format!("GATHER (dim={})", dim), - HybridOp::TopK { k, dim } => format!("TOPK (k={}, dim={})", k, dim), + HybridOp::TopK { k, dim, largest } => { + format!("TOPK (k={}, dim={}, largest={})", k, dim, largest) + } HybridOp::GatherElements { dim, .. } => format!("GATHERELEMENTS (dim={})", dim), HybridOp::ScatterElements { dim, .. } => format!("SCATTERELEMENTS (dim={})", dim), HybridOp::OneHot { dim, num_classes } => { @@ -400,8 +403,8 @@ impl Op for HybridOp { HybridOp::Less => layouts::less(config, region, values[..].try_into()?)?, HybridOp::LessEqual => layouts::less_equal(config, region, values[..].try_into()?)?, HybridOp::Equals => layouts::equals(config, region, values[..].try_into()?)?, - HybridOp::TopK { dim, k } => { - layouts::topk_axes(config, region, values[..].try_into()?, *k, *dim)? + HybridOp::TopK { dim, k, largest } => { + layouts::topk_axes(config, region, values[..].try_into()?, *k, *dim, *largest)? } HybridOp::OneHot { dim, num_classes } => { layouts::one_hot_axis(config, region, values[..].try_into()?, *num_classes, *dim)? diff --git a/src/circuit/ops/layouts.rs b/src/circuit/ops/layouts.rs index 5bee3a1f4..d349c9e78 100644 --- a/src/circuit/ops/layouts.rs +++ b/src/circuit/ops/layouts.rs @@ -478,7 +478,7 @@ fn _sort_ascending( .get_int_evals()? .iter() .sorted_by(|a, b| a.cmp(b)) - .map(|x| Ok(Value::known(input.get_felt_evals()?.get(&[*x as usize])))) + .map(|x| Ok(Value::known(i128_to_felt(*x)))) .collect::>, Box>>()? } else { Tensor::new( @@ -544,8 +544,13 @@ fn _select_topk( region: &mut RegionCtx, values: &[ValTensor; 1], k: usize, + largest: bool, ) -> Result, Box> { - let sorted = _sort_descending(config, region, values)?.get_slice(&[0..k])?; + let sorted = if largest { + _sort_descending(config, region, values)?.get_slice(&[0..k])? + } else { + _sort_ascending(config, region, values)?.get_slice(&[0..k])? + }; Ok(sorted) } @@ -556,12 +561,13 @@ pub fn topk_axes( values: &[ValTensor; 1], k: usize, dim: usize, + largest: bool, ) -> Result, Box> { let topk_at_k = move |config: &BaseConfig, region: &mut RegionCtx, values: &[ValTensor; 1]| -> Result, Box> { - _select_topk(config, region, values, k) + _select_topk(config, region, values, k, largest) }; let output: ValTensor = multi_dim_axes_op(config, region, values, &[dim], topk_at_k)?; diff --git a/src/circuit/ops/lookup.rs b/src/circuit/ops/lookup.rs index 64be20165..c111f8b95 100644 --- a/src/circuit/ops/lookup.rs +++ b/src/circuit/ops/lookup.rs @@ -18,6 +18,7 @@ use halo2curves::ff::PrimeField; pub enum LookupOp { Abs, Div { denom: utils::F32 }, + Cast { scale: utils::F32 }, ReLU, Max { scale: utils::F32, a: utils::F32 }, Min { scale: utils::F32, a: utils::F32 }, @@ -115,6 +116,10 @@ impl Op for LookupOp { &x, f32::from(*denom).into(), )), + LookupOp::Cast { scale } => Ok(tensor::ops::nonlinearities::const_div( + &x, + f32::from(*scale).into(), + )), LookupOp::Recip { scale } => Ok(tensor::ops::nonlinearities::recip(&x, scale.into())), LookupOp::ReLU => Ok(tensor::ops::nonlinearities::leakyrelu(&x, 0_f64)), @@ -170,6 +175,7 @@ impl Op for LookupOp { LookupOp::LessThanEqual { .. } => "LESS_THAN_EQUAL".into(), LookupOp::Recip { scale, .. } => format!("RECIP(scale={})", scale), LookupOp::Div { denom, .. } => format!("DIV(denom={})", denom), + LookupOp::Cast { scale } => format!("CAST(scale={})", scale), LookupOp::Ln { scale } => format!("LN(scale={})", scale), LookupOp::ReLU => "RELU".to_string(), LookupOp::LeakyReLU { slope: a } => format!("L_RELU(slope={})", a), @@ -210,12 +216,9 @@ impl Op for LookupOp { /// Returns the scale of the output of the operation. fn out_scale(&self, inputs_scale: Vec) -> Result> { let scale = match self { - LookupOp::Div { denom } => { - let mut scale = inputs_scale[0]; - if scale == 0 { - scale += multiplier_to_scale(1. / denom.0 as f64); - } - scale + LookupOp::Cast { scale } => { + let in_scale = inputs_scale[0]; + in_scale + multiplier_to_scale(1. / scale.0 as f64) } LookupOp::Recip { scale } => { let mut out_scale = inputs_scale[0]; diff --git a/src/circuit/ops/poly.rs b/src/circuit/ops/poly.rs index c1b0a0313..69b2c7aee 100644 --- a/src/circuit/ops/poly.rs +++ b/src/circuit/ops/poly.rs @@ -406,7 +406,10 @@ impl Deserialize< } fn requires_homogenous_input_scales(&self) -> Vec { - if matches!(self, PolyOp::Add { .. } | PolyOp::Sub) { + if matches!( + self, + PolyOp::Add { .. } | PolyOp::Sub | PolyOp::Concat { .. } + ) { vec![0, 1] } else if matches!(self, PolyOp::Iff) { vec![1, 2] diff --git a/src/commands.rs b/src/commands.rs index a8844dcfd..ad26134de 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -71,6 +71,8 @@ pub const DEFAULT_OPTIMIZER_RUNS: &str = "1"; pub const DEFAULT_FUZZ_RUNS: &str = "10"; /// Default calibration file pub const DEFAULT_CALIBRATION_FILE: &str = "calibration.json"; +/// Default lookup safety margin +pub const DEFAULT_LOOKUP_SAFETY_MARGIN: &str = "2"; impl std::fmt::Display for TranscriptType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -303,6 +305,9 @@ pub enum Commands { #[arg(long = "target", default_value = DEFAULT_CALIBRATION_TARGET)] /// Target for calibration. Set to "resources" to optimize for computational resource. Otherwise, set to "accuracy" to optimize for accuracy. target: CalibrationTarget, + /// the lookup safety margin to use for calibration. if the max lookup is 2^k, then the max lookup will be 2^k * lookup_safety_margin. larger = safer but slower + #[arg(long, default_value = DEFAULT_LOOKUP_SAFETY_MARGIN)] + lookup_safety_margin: i128, /// Optional scales to specifically try for calibration. Example, --scales 0,4 #[arg(long, value_delimiter = ',', allow_hyphen_values = true)] scales: Option>, diff --git a/src/execute.rs b/src/execute.rs index 54de669bf..9aa65d8a4 100644 --- a/src/execute.rs +++ b/src/execute.rs @@ -165,10 +165,19 @@ pub async fn run(command: Commands) -> Result> { settings_path, data, target, + lookup_safety_margin, scales, max_logrows, - } => calibrate(model, data, settings_path, target, scales, max_logrows) - .map(|e| serde_json::to_string(&e).unwrap()), + } => calibrate( + model, + data, + settings_path, + target, + lookup_safety_margin, + scales, + max_logrows, + ) + .map(|e| serde_json::to_string(&e).unwrap()), Commands::GenWitness { data, compiled_circuit, @@ -624,6 +633,7 @@ pub(crate) fn calibrate( data: PathBuf, settings_path: PathBuf, target: CalibrationTarget, + lookup_safety_margin: i128, scales: Option>, max_logrows: Option, ) -> Result> { @@ -748,7 +758,7 @@ pub(crate) fn calibrate( .map_err(|e| format!("failed to load circuit inputs: {}", e))?; circuit - .calibrate(&data, max_logrows) + .calibrate(&data, max_logrows, lookup_safety_margin) .map_err(|e| format!("failed to calibrate: {}", e))?; let settings = circuit.settings().clone(); diff --git a/src/graph/mod.rs b/src/graph/mod.rs index bab56e6eb..eec3d0e63 100644 --- a/src/graph/mod.rs +++ b/src/graph/mod.rs @@ -942,11 +942,16 @@ impl GraphCircuit { (ASSUMED_BLINDING_FACTORS + RESERVED_BLINDING_ROWS_PAD) as f64 } - fn calc_safe_range(res: &GraphWitness) -> (i128, i128) { - ( - RANGE_MULTIPLIER * res.min_lookup_inputs, - RANGE_MULTIPLIER * res.max_lookup_inputs, - ) + fn calc_safe_lookup_range(res: &GraphWitness, lookup_safety_margin: i128) -> (i128, i128) { + let mut margin = ( + lookup_safety_margin * res.min_lookup_inputs, + lookup_safety_margin * res.max_lookup_inputs, + ); + if lookup_safety_margin == 1 { + margin.0 -= 1; + margin.1 += 1; + } + margin } fn calc_num_cols(safe_range: (i128, i128), max_logrows: u32) -> usize { @@ -961,6 +966,7 @@ impl GraphCircuit { &mut self, res: &GraphWitness, max_logrows: Option, + lookup_safety_margin: i128, ) -> Result<(), Box> { // load the max logrows let max_logrows = max_logrows.unwrap_or(MAX_PUBLIC_SRS); @@ -969,14 +975,15 @@ impl GraphCircuit { let reserved_blinding_rows = Self::reserved_blinding_rows(); // check if has overflowed max lookup input - if res.max_lookup_inputs > MAX_LOOKUP_ABS / RANGE_MULTIPLIER - || res.min_lookup_inputs < -MAX_LOOKUP_ABS / RANGE_MULTIPLIER + if res.max_lookup_inputs > MAX_LOOKUP_ABS / lookup_safety_margin + || res.min_lookup_inputs < -MAX_LOOKUP_ABS / lookup_safety_margin { let err_string = format!("max lookup input ({}) is too large", res.max_lookup_inputs); + error!("{}", err_string); return Err(err_string.into()); } - let safe_range = Self::calc_safe_range(res); + let safe_range = Self::calc_safe_lookup_range(res, lookup_safety_margin); let mut min_logrows = MIN_LOGROWS; // degrade the max logrows until the extended k is small enough while min_logrows < max_logrows @@ -995,6 +1002,7 @@ impl GraphCircuit { "extended k is too large to accommodate the quotient polynomial with logrows {}", min_logrows ); + error!("{}", err_string); return Err(err_string.into()); } @@ -1100,9 +1108,10 @@ impl GraphCircuit { &mut self, input: &[Tensor], max_logrows: Option, + lookup_safety_margin: i128, ) -> Result<(), Box> { let res = self.forward(&mut input.to_vec(), None, None)?; - self.calc_min_logrows(&res, max_logrows) + self.calc_min_logrows(&res, max_logrows, lookup_safety_margin) } /// Runs the forward pass of the model / graph of computations and any associated hashing. diff --git a/src/graph/model.rs b/src/graph/model.rs index a29a334b0..1d6c69589 100644 --- a/src/graph/model.rs +++ b/src/graph/model.rs @@ -607,7 +607,7 @@ impl Model { debug!("intermediate min lookup inputs: {}", min); } debug!( - "------------ output node int {}: {} \n ------------ float: {} \n ------------ max: {} \n ------------ min: {}", + "------------ output node int {}: {} \n ------------ float: {} \n ------------ max: {} \n ------------ min: {} ------------ scale: {}", idx, res.output.map(crate::fieldutils::felt_to_i32).show(), res.output @@ -616,6 +616,7 @@ impl Model { .show(), res.output.clone().into_iter().map(crate::fieldutils::felt_to_i128).max().unwrap_or(0), res.output.clone().into_iter().map(crate::fieldutils::felt_to_i128).min().unwrap_or(0), + n.out_scale ); results.insert(idx, vec![res.output]); } diff --git a/src/graph/node.rs b/src/graph/node.rs index 1f2d82337..42c46bb4a 100644 --- a/src/graph/node.rs +++ b/src/graph/node.rs @@ -528,6 +528,8 @@ impl Node { idx: usize, symbol_values: &SymbolValues, ) -> Result> { + use log::warn; + trace!("Create {:?}", node); trace!("Create op {:?}", node.op); @@ -603,21 +605,25 @@ impl Node { .into_iter() .filter(|i| !deleted_indices.contains(i)) { - let input_node = other_nodes - .get_mut(&inputs[input].idx()) - .ok_or("input not found")?; - let input_opkind = &mut input_node.opkind(); - if let Some(constant) = input_opkind.get_mutable_constant() { - rescale_const_with_single_use( - constant, - in_scales.clone(), - param_visibility, - input_node.num_uses(), - )?; - input_node.replace_opkind(constant.clone_dyn().into()); - let out_scale = input_opkind.out_scale(vec![])?; - input_node.bump_scale(out_scale); - in_scales[input] = out_scale; + if inputs.len() > input { + let input_node = other_nodes + .get_mut(&inputs[input].idx()) + .ok_or("input not found")?; + let input_opkind = &mut input_node.opkind(); + if let Some(constant) = input_opkind.get_mutable_constant() { + rescale_const_with_single_use( + constant, + in_scales.clone(), + param_visibility, + input_node.num_uses(), + )?; + input_node.replace_opkind(constant.clone_dyn().into()); + let out_scale = input_opkind.out_scale(vec![])?; + input_node.bump_scale(out_scale); + in_scales[input] = out_scale; + } + } else { + warn!("input {} not found for rescaling, skipping ...", input); } } diff --git a/src/graph/utilities.rs b/src/graph/utilities.rs index 8266aa38e..b605b8eb2 100644 --- a/src/graph/utilities.rs +++ b/src/graph/utilities.rs @@ -310,7 +310,13 @@ pub fn new_op_from_onnx( deleted_indices.push(inputs.len() - 1); op = SupportedOp::Hybrid(crate::circuit::ops::hybrid::HybridOp::Gather { dim: axis, - constant_idx: Some(c.raw_values.map(|x| x as usize)), + constant_idx: Some(c.raw_values.map(|x| { + if x == -1.0 { + inputs[0].out_dims()[0][axis] - 1 + } else { + x as usize + } + })), }); } // } @@ -339,7 +345,11 @@ pub fn new_op_from_onnx( op.fallback_k.to_i64()? as usize }; - SupportedOp::Hybrid(crate::circuit::ops::hybrid::HybridOp::TopK { dim: axis, k }) + SupportedOp::Hybrid(crate::circuit::ops::hybrid::HybridOp::TopK { + dim: axis, + k, + largest: op.largest, + }) } "Onehot" => { let op = load_op::(node.op(), idx, node.op().name().to_string())?; @@ -791,8 +801,8 @@ pub fn new_op_from_onnx( if input_scales[0] != 0 { replace_const( 0, - SupportedOp::Nonlinear(LookupOp::Div { - denom: crate::circuit::utils::F32(scale_to_multiplier( + SupportedOp::Nonlinear(LookupOp::Cast { + scale: crate::circuit::utils::F32(scale_to_multiplier( input_scales[0], ) as f32), diff --git a/src/python.rs b/src/python.rs index 055c9895c..bcce9a39c 100644 --- a/src/python.rs +++ b/src/python.rs @@ -509,6 +509,7 @@ fn gen_settings( model = PathBuf::from(DEFAULT_MODEL), settings = PathBuf::from(DEFAULT_SETTINGS), target = CalibrationTarget::default(), // default is "resources + lookup_safety_margin = DEFAULT_LOOKUP_SAFETY_MARGIN.parse().unwrap(), scales = None, max_logrows = None, ))] @@ -517,10 +518,20 @@ fn calibrate_settings( model: PathBuf, settings: PathBuf, target: CalibrationTarget, + lookup_safety_margin: i128, scales: Option>, max_logrows: Option, ) -> Result { - crate::execute::calibrate(model, data, settings, target, scales, max_logrows).map_err(|e| { + crate::execute::calibrate( + model, + data, + settings, + target, + lookup_safety_margin, + scales, + max_logrows, + ) + .map_err(|e| { let err_str = format!("Failed to calibrate settings: {}", e); PyRuntimeError::new_err(err_str) })?; diff --git a/src/tensor/ops.rs b/src/tensor/ops.rs index 765eedc24..47d9ebfb7 100644 --- a/src/tensor/ops.rs +++ b/src/tensor/ops.rs @@ -1415,14 +1415,18 @@ pub fn prod_axes + Send + Sync>( /// Some(&[2, 15, 2, 1, 1, 0]), /// &[6], /// ).unwrap(); -/// let result = topk(&x, 3).unwrap(); +/// let result = topk(&x, 3, true).unwrap(); /// let expected = Tensor::::new( /// Some(&[15, 2, 2]), /// &[3], /// ).unwrap(); /// assert_eq!(result, expected); /// ``` -pub fn topk(a: &Tensor, k: usize) -> Result, TensorError> { +pub fn topk( + a: &Tensor, + k: usize, + largest: bool, +) -> Result, TensorError> { let mut indexed_a = a.clone(); indexed_a.flatten(); @@ -1432,7 +1436,11 @@ pub fn topk(a: &Tensor, k: usize) -> Result>(); - indexed_a.sort_by(|(_, a), (_, b)| b.partial_cmp(a).unwrap()); + if largest { + indexed_a.sort_by(|(_, a), (_, b)| b.partial_cmp(a).unwrap()); + } else { + indexed_a.sort_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap()); + } let indexed_a = indexed_a .into_iter() @@ -1454,6 +1462,8 @@ pub fn topk(a: &Tensor, k: usize) -> Result(a: &Tensor, k: usize) -> Result::new( /// Some(&[15, 2, 1, 1]), /// &[2,2], @@ -1473,6 +1483,7 @@ pub fn topk_axes( a: &Tensor, k: usize, dim: usize, + largest: bool, ) -> Result, TensorError> { let mut new_dims = a.dims().to_vec(); new_dims[dim] = k; @@ -1496,7 +1507,7 @@ pub fn topk_axes( } } let sliced_value = a.get_slice(&slice)?; - let topk = topk(&sliced_value, k)?; + let topk = topk(&sliced_value, k, largest)?; Ok(topk[coord[dim]].clone()) })?; diff --git a/tests/python/binding_tests.py b/tests/python/binding_tests.py index 1951bfd45..96104395b 100644 --- a/tests/python/binding_tests.py +++ b/tests/python/binding_tests.py @@ -137,7 +137,7 @@ def test_calibrate_over_user_range(): assert res == True res = ezkl.calibrate_settings( - data_path, model_path, output_path, "resources", [0, 1, 2]) + data_path, model_path, output_path, "resources", 1, [0, 1, 2]) assert res == True assert os.path.isfile(output_path) diff --git a/tests/wasm/model.compiled b/tests/wasm/model.compiled index ee8f96f189770b2da00c8bf852133dde74bb4d2a..c0e4c80234ad73c327824c3ccebf9112b6b2c31b 100644 GIT binary patch delta 26 icmeyx^NVLgD9dCQCV|QMtQ?zjS-cn-nJ4dHJp=%KeF&2P delta 22 ecmeyx^NVLgD9hw{R*B8IEMAO^Op|x89s&ShEeELp diff --git a/tests/wasm/proof.json b/tests/wasm/proof.json index aa3006e6c..1aba7b13e 100644 --- a/tests/wasm/proof.json +++ b/tests/wasm/proof.json @@ -1,7333 +1 @@ -{ - "protocol": { - "domain": { - "k": 6, - "n": 64, - "n_inv": [ - 0, - 0, - 0, - 288230376151711744 - ], - "gen": [ - 13065489725457997378, - 11211756437640344014, - 7238224585957573902, - 708111906564994541 - ], - "gen_inv": [ - 12835574056175175549, - 9273301601072327479, - 17618698331133403535, - 2628560312543510721 - ] - }, - "preprocessed": [ - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 18112345141133463434, - 5818151611473276308, - 6654551641347296750, - 645001517410635059 - ], - "y": [ - 2541257524718876535, - 12026165214142124735, - 14947127798426010763, - 1291068511166000853 - ] - }, - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 10451083550665550188, - 4931025277335468226, - 7576131525244012751, - 732602398172653619 - ], - "y": [ - 11462807050877588281, - 17901628272728915965, - 3228101036953356146, - 986233803214739591 - ] - }, - { - "x": [ - 10451083550665550188, - 4931025277335468226, - 7576131525244012751, - 732602398172653619 - ], - "y": [ - 11462807050877588281, - 17901628272728915965, - 3228101036953356146, - 986233803214739591 - ] - }, - { - "x": [ - 13120457791693094846, - 7803260213243350901, - 9334382489125164659, - 2343255951908240068 - ], - "y": [ - 18049433600144337889, - 17102717865772125436, - 15465540052162829751, - 156365542653813991 - ] - }, - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 13120457791693094846, - 7803260213243350901, - 9334382489125164659, - 2343255951908240068 - ], - "y": [ - 18049433600144337889, - 17102717865772125436, - 15465540052162829751, - 156365542653813991 - ] - }, - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 13751579983794831648, - 10607539830531201775, - 14346507665568791169, - 3031042986966695519 - ], - "y": [ - 6664415047238284862, - 10692876107166835970, - 6673002649063812943, - 1112739967548021524 - ] - }, - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 0, - 0, - 0, - 0 - ], - "y": [ - 0, - 0, - 0, - 0 - ] - }, - { - "x": [ - 5207533914487648574, - 2482623105676331420, - 924019210298798756, - 2014946943582383048 - ], - "y": [ - 12267069497884989327, - 13028235170428579280, - 6590255043171984442, - 1919711059571291541 - ] - }, - { - "x": [ - 3653687220904353986, - 7139295517974691755, - 902009685081882976, - 344392366463050541 - ], - "y": [ - 8586460972570940541, - 201712786453498080, - 16338268784029778808, - 32063816462212425 - ] - }, - { - "x": [ - 12910798897758397770, - 5812219613194459466, - 16415404214239898386, - 2839857773326089528 - ], - "y": [ - 10019240196912393615, - 44278568251463749, - 11600986489485005436, - 2062942417595853570 - ] - }, - { - "x": [ - 1769711075627753904, - 7287362796573962511, - 3292140260059543489, - 993712661983547167 - ], - "y": [ - 17392234250344276877, - 2943451043809562240, - 122464511448808746, - 2876967788403718197 - ] - }, - { - "x": [ - 7956846759390884486, - 3992996272528664104, - 7718354087344238252, - 1643570499727917126 - ], - "y": [ - 4994719425190185360, - 6724111561246538675, - 1414229838379627472, - 155666135179288368 - ] - }, - { - "x": [ - 13235763218222015681, - 11865437313394681082, - 17563291980453539676, - 2778980649844752143 - ], - "y": [ - 6711591403635829163, - 14350153586387849994, - 708770078805058585, - 2958402263070329436 - ] - }, - { - "x": [ - 4996662368945975645, - 17247411496572037302, - 13327382757797463167, - 788899917023489273 - ], - "y": [ - 11658862546607536650, - 7230417578236958670, - 14139388206179467341, - 2827141974385716372 - ] - }, - { - "x": [ - 1162095217357138411, - 937154552799557412, - 12683739500322405654, - 2752651722385824038 - ], - "y": [ - 9491772874098003062, - 15662509551227095103, - 9788587755793733750, - 2005790496835314846 - ] - } - ], - "num_instance": [ - 4 - ], - "num_witness": [ - 6, - 2, - 6 - ], - "num_challenge": [ - 1, - 2, - 1 - ], - "evaluations": [ - { - "poly": 21, - "rotation": 0 - }, - { - "poly": 22, - "rotation": 0 - }, - { - "poly": 23, - "rotation": 0 - }, - { - "poly": 24, - "rotation": 0 - }, - { - "poly": 25, - "rotation": 0 - }, - { - "poly": 26, - "rotation": 0 - }, - { - "poly": 25, - "rotation": -1 - }, - { - "poly": 0, - "rotation": 0 - }, - { - "poly": 1, - "rotation": 0 - }, - { - "poly": 2, - "rotation": 0 - }, - { - "poly": 3, - "rotation": 0 - }, - { - "poly": 4, - "rotation": 0 - }, - { - "poly": 5, - "rotation": 0 - }, - { - "poly": 6, - "rotation": 0 - }, - { - "poly": 7, - "rotation": 0 - }, - { - "poly": 8, - "rotation": 0 - }, - { - "poly": 9, - "rotation": 0 - }, - { - "poly": 10, - "rotation": 0 - }, - { - "poly": 11, - "rotation": 0 - }, - { - "poly": 34, - "rotation": 0 - }, - { - "poly": 12, - "rotation": 0 - }, - { - "poly": 13, - "rotation": 0 - }, - { - "poly": 14, - "rotation": 0 - }, - { - "poly": 15, - "rotation": 0 - }, - { - "poly": 16, - "rotation": 0 - }, - { - "poly": 17, - "rotation": 0 - }, - { - "poly": 18, - "rotation": 0 - }, - { - "poly": 19, - "rotation": 0 - }, - { - "poly": 29, - "rotation": 0 - }, - { - "poly": 29, - "rotation": 1 - }, - { - "poly": 29, - "rotation": -6 - }, - { - "poly": 30, - "rotation": 0 - }, - { - "poly": 30, - "rotation": 1 - }, - { - "poly": 30, - "rotation": -6 - }, - { - "poly": 31, - "rotation": 0 - }, - { - "poly": 31, - "rotation": 1 - }, - { - "poly": 32, - "rotation": 0 - }, - { - "poly": 32, - "rotation": 1 - }, - { - "poly": 27, - "rotation": 0 - }, - { - "poly": 33, - "rotation": 0 - }, - { - "poly": 33, - "rotation": 1 - }, - { - "poly": 28, - "rotation": 0 - } - ], - "queries": [ - { - "poly": 21, - "rotation": 0 - }, - { - "poly": 22, - "rotation": 0 - }, - { - "poly": 23, - "rotation": 0 - }, - { - "poly": 24, - "rotation": 0 - }, - { - "poly": 25, - "rotation": 0 - }, - { - "poly": 26, - "rotation": 0 - }, - { - "poly": 25, - "rotation": -1 - }, - { - "poly": 29, - "rotation": 0 - }, - { - "poly": 29, - "rotation": 1 - }, - { - "poly": 30, - "rotation": 0 - }, - { - "poly": 30, - "rotation": 1 - }, - { - "poly": 31, - "rotation": 0 - }, - { - "poly": 31, - "rotation": 1 - }, - { - "poly": 30, - "rotation": -6 - }, - { - "poly": 29, - "rotation": -6 - }, - { - "poly": 32, - "rotation": 0 - }, - { - "poly": 32, - "rotation": 1 - }, - { - "poly": 27, - "rotation": 0 - }, - { - "poly": 33, - "rotation": 0 - }, - { - "poly": 33, - "rotation": 1 - }, - { - "poly": 28, - "rotation": 0 - }, - { - "poly": 0, - "rotation": 0 - }, - { - "poly": 1, - "rotation": 0 - }, - { - "poly": 2, - "rotation": 0 - }, - { - "poly": 3, - "rotation": 0 - }, - { - "poly": 4, - "rotation": 0 - }, - { - "poly": 5, - "rotation": 0 - }, - { - "poly": 6, - "rotation": 0 - }, - { - "poly": 7, - "rotation": 0 - }, - { - "poly": 8, - "rotation": 0 - }, - { - "poly": 9, - "rotation": 0 - }, - { - "poly": 10, - "rotation": 0 - }, - { - "poly": 11, - "rotation": 0 - }, - { - "poly": 12, - "rotation": 0 - }, - { - "poly": 13, - "rotation": 0 - }, - { - "poly": 14, - "rotation": 0 - }, - { - "poly": 15, - "rotation": 0 - }, - { - "poly": 16, - "rotation": 0 - }, - { - "poly": 17, - "rotation": 0 - }, - { - "poly": 18, - "rotation": 0 - }, - { - "poly": 19, - "rotation": 0 - }, - { - "poly": 35, - "rotation": 0 - }, - { - "poly": 34, - "rotation": 0 - } - ], - "quotient": { - "chunk_degree": 1, - "num_chunk": 4, - "numerator": { - "DistributePowers": [ - [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Negated": { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 7959790035488735211, - 12951774245394433045, - 16242874202584236123, - 560012691975822483 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Negated": { - "Negated": { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 5, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 7, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 6, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - }, - { - "Negated": { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - } - ] - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 8, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - }, - { - "Negated": { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - } - ] - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": -1 - } - }, - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 415066004289224689, - 11886516471525959549, - 3696305541684646538, - 3035258219084094862 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 9, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Product": [ - { - "Product": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 10, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 6425625360762666998, - 7924344314350639699, - 14762033076929465436, - 2023505479389396574 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 10, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 25, - "rotation": -1 - } - }, - { - "Product": [ - { - "Product": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Polynomial": { - "poly": 11, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 10, - "rotation": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 10, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Negated": { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": -1 - } - }, - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": 0 - } - }, - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 29, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": -6 - } - }, - { - "Sum": [ - { - "Product": [ - { - "Polynomial": { - "poly": 31, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 31, - "rotation": 0 - } - } - ] - }, - { - "Negated": { - "Polynomial": { - "poly": 31, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": 0 - } - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 30, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 29, - "rotation": -6 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": 0 - } - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 31, - "rotation": 0 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 30, - "rotation": -6 - } - } - } - ] - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "CommonPolynomial": { - "Lagrange": -6 - } - } - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "CommonPolynomial": { - "Lagrange": -5 - } - }, - { - "CommonPolynomial": { - "Lagrange": -4 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -3 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -2 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -1 - } - } - ] - } - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Polynomial": { - "poly": 29, - "rotation": 1 - } - }, - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 12, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 13, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 14, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 29, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 11100302345850292309, - 5109383341788583484, - 6450182039226333095, - 2498166472155664813 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 11922143911221101039, - 4762855335879493275, - 9634852812984583437, - 2104342265551292894 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "CommonPolynomial": { - "Lagrange": -6 - } - } - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "CommonPolynomial": { - "Lagrange": -5 - } - }, - { - "CommonPolynomial": { - "Lagrange": -4 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -3 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -2 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -1 - } - } - ] - } - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Polynomial": { - "poly": 30, - "rotation": 1 - } - }, - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 15, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 16, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 17, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 30, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 6393076176221150738, - 7283021187728417300, - 15472188617747294665, - 3366061389777165561 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 25, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 5185504448716010194, - 13473122879869045206, - 7110214824824105482, - 296185565312886903 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 26, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 3788189710366593638, - 12364756977029776224, - 17445039711624853376, - 2145282486335891750 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "CommonPolynomial": { - "Lagrange": -6 - } - } - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "CommonPolynomial": { - "Lagrange": -5 - } - }, - { - "CommonPolynomial": { - "Lagrange": -4 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -3 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -2 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -1 - } - } - ] - } - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Polynomial": { - "poly": 31, - "rotation": 1 - } - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 0, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 18, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 20, - "rotation": 0 - } - }, - { - "Product": [ - { - "Challenge": 1 - }, - { - "Polynomial": { - "poly": 19, - "rotation": 0 - } - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 31, - "rotation": 0 - } - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 0, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 4313891821910826284, - 3017229878821944834, - 2706732049417028840, - 1207705578258863476 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - }, - { - "Sum": [ - { - "Sum": [ - { - "Polynomial": { - "poly": 20, - "rotation": 0 - } - }, - { - "Product": [ - { - "Product": [ - { - "Challenge": 1 - }, - { - "Constant": [ - 13059828841148723808, - 11237179000843376725, - 9900274079592382525, - 739015709256124487 - ] - } - ] - }, - { - "CommonPolynomial": "Identity" - } - ] - } - ] - }, - { - "Challenge": 2 - } - ] - } - ] - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": 0 - } - }, - { - "Polynomial": { - "poly": 32, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": -6 - } - }, - { - "Polynomial": { - "poly": 32, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "CommonPolynomial": { - "Lagrange": -6 - } - } - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "CommonPolynomial": { - "Lagrange": -5 - } - }, - { - "CommonPolynomial": { - "Lagrange": -4 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -3 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -2 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -1 - } - } - ] - } - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Polynomial": { - "poly": 1, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 2, - "rotation": 0 - } - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - }, - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 16912579398983483403, - 13419314142665758269, - 16965902948054780928, - 1463492787413574090 - ] - } - ] - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - } - ] - } - ] - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 32, - "rotation": 1 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 32, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Polynomial": { - "poly": 1, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 2, - "rotation": 0 - } - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 27, - "rotation": 0 - } - }, - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 21, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 16912579398983483403, - 13419314142665758269, - 16965902948054780928, - 1463492787413574090 - ] - } - ] - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 23, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 3, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - } - ] - } - ] - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - } - ] - } - } - ] - } - } - ] - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": 0 - } - }, - { - "Polynomial": { - "poly": 33, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "CommonPolynomial": { - "Lagrange": -6 - } - }, - { - "Polynomial": { - "poly": 33, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "CommonPolynomial": { - "Lagrange": -6 - } - } - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "Sum": [ - { - "CommonPolynomial": { - "Lagrange": -5 - } - }, - { - "CommonPolynomial": { - "Lagrange": -4 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -3 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -2 - } - } - ] - }, - { - "CommonPolynomial": { - "Lagrange": -1 - } - } - ] - } - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Polynomial": { - "poly": 1, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 2, - "rotation": 0 - } - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - }, - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 16912579398983483403, - 13419314142665758269, - 16965902948054780928, - 1463492787413574090 - ] - } - ] - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - } - ] - } - ] - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - } - ] - }, - { - "Sum": [ - { - "Polynomial": { - "poly": 33, - "rotation": 1 - } - }, - { - "Negated": { - "Polynomial": { - "poly": 33, - "rotation": 0 - } - } - } - ] - } - ] - }, - { - "Negated": { - "Sum": [ - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Polynomial": { - "poly": 1, - "rotation": 0 - } - }, - { - "Polynomial": { - "poly": 2, - "rotation": 0 - } - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 28, - "rotation": 0 - } - }, - { - "Sum": [ - { - "DistributePowers": [ - [ - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 22, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 16912579398983483403, - 13419314142665758269, - 16965902948054780928, - 1463492787413574090 - ] - } - ] - } - ] - }, - { - "Sum": [ - { - "Product": [ - { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - }, - { - "Polynomial": { - "poly": 24, - "rotation": 0 - } - } - ] - }, - { - "Product": [ - { - "Sum": [ - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - }, - { - "Negated": { - "Product": [ - { - "Polynomial": { - "poly": 4, - "rotation": 0 - } - }, - { - "Constant": [ - 12436184717236109307, - 3962172157175319849, - 7381016538464732718, - 1011752739694698287 - ] - } - ] - } - } - ] - }, - { - "Constant": [ - 0, - 0, - 0, - 0 - ] - } - ] - } - ] - } - ], - { - "Challenge": 0 - } - ] - }, - { - "Challenge": 1 - } - ] - } - ] - } - } - ] - } - } - ] - } - ] - } - ], - { - "Challenge": 3 - } - ] - } - }, - "transcript_initial_state": [ - 5431536873760667688, - 17167224025770663825, - 4282675818781079647, - 1669050332380787723 - ], - "instance_committing_key": null, - "linearization": null, - "accumulator_indices": [] - }, - "instances": [ - [ - [ - 0, - 0, - 0, - 0 - ], - [ - 0, - 0, - 0, - 0 - ], - [ - 0, - 0, - 0, - 0 - ], - [ - 0, - 0, - 0, - 0 - ] - ] - ], - "proof": [ - 6, - 233, - 32, - 74, - 29, - 58, - 97, - 211, - 105, - 4, - 206, - 139, - 120, - 90, - 192, - 152, - 211, - 93, - 101, - 90, - 66, - 230, - 117, - 156, - 62, - 27, - 254, - 14, - 66, - 249, - 221, - 185, - 22, - 99, - 102, - 52, - 238, - 75, - 249, - 31, - 150, - 192, - 35, - 159, - 79, - 220, - 160, - 195, - 242, - 105, - 58, - 210, - 82, - 98, - 228, - 13, - 206, - 244, - 238, - 169, - 164, - 211, - 75, - 151, - 45, - 133, - 212, - 171, - 87, - 39, - 205, - 6, - 149, - 30, - 155, - 77, - 75, - 5, - 131, - 145, - 233, - 51, - 52, - 162, - 69, - 32, - 4, - 59, - 127, - 211, - 210, - 86, - 245, - 171, - 212, - 224, - 34, - 43, - 253, - 34, - 135, - 182, - 216, - 155, - 250, - 236, - 238, - 42, - 177, - 247, - 18, - 130, - 103, - 5, - 207, - 219, - 195, - 126, - 220, - 158, - 126, - 83, - 85, - 1, - 106, - 185, - 52, - 160, - 43, - 137, - 51, - 103, - 238, - 183, - 199, - 25, - 31, - 186, - 56, - 69, - 27, - 178, - 165, - 69, - 215, - 240, - 81, - 167, - 56, - 5, - 20, - 127, - 247, - 140, - 78, - 56, - 29, - 35, - 222, - 163, - 15, - 180, - 105, - 20, - 41, - 32, - 121, - 101, - 153, - 131, - 167, - 170, - 224, - 87, - 14, - 85, - 71, - 0, - 115, - 167, - 117, - 149, - 92, - 1, - 133, - 203, - 40, - 225, - 68, - 75, - 156, - 3, - 35, - 90, - 109, - 11, - 207, - 140, - 161, - 106, - 66, - 174, - 130, - 84, - 210, - 105, - 13, - 21, - 50, - 204, - 41, - 210, - 148, - 114, - 100, - 122, - 36, - 184, - 205, - 20, - 72, - 188, - 102, - 104, - 0, - 171, - 190, - 70, - 208, - 86, - 253, - 88, - 136, - 49, - 84, - 232, - 40, - 120, - 14, - 183, - 160, - 204, - 180, - 166, - 112, - 245, - 128, - 67, - 213, - 46, - 46, - 69, - 137, - 216, - 88, - 52, - 22, - 204, - 143, - 54, - 229, - 13, - 76, - 202, - 38, - 69, - 246, - 176, - 100, - 162, - 175, - 244, - 228, - 131, - 102, - 30, - 184, - 192, - 144, - 224, - 217, - 140, - 45, - 123, - 61, - 184, - 226, - 92, - 42, - 207, - 176, - 0, - 126, - 93, - 208, - 210, - 118, - 157, - 187, - 124, - 20, - 4, - 179, - 170, - 30, - 173, - 107, - 136, - 120, - 204, - 98, - 224, - 13, - 250, - 103, - 251, - 247, - 251, - 162, - 170, - 44, - 183, - 41, - 160, - 173, - 17, - 81, - 116, - 253, - 152, - 122, - 196, - 29, - 212, - 232, - 74, - 130, - 233, - 15, - 42, - 228, - 3, - 60, - 63, - 141, - 162, - 196, - 170, - 241, - 13, - 73, - 41, - 45, - 108, - 230, - 86, - 188, - 5, - 248, - 33, - 145, - 36, - 0, - 40, - 183, - 37, - 25, - 32, - 53, - 108, - 165, - 47, - 160, - 25, - 236, - 186, - 234, - 238, - 24, - 144, - 63, - 15, - 243, - 116, - 42, - 29, - 23, - 75, - 127, - 138, - 84, - 57, - 241, - 193, - 71, - 212, - 213, - 184, - 25, - 163, - 131, - 79, - 55, - 28, - 182, - 52, - 178, - 65, - 193, - 214, - 211, - 84, - 24, - 52, - 155, - 247, - 21, - 200, - 242, - 170, - 146, - 244, - 46, - 164, - 38, - 166, - 5, - 201, - 19, - 214, - 103, - 89, - 20, - 8, - 5, - 173, - 157, - 189, - 211, - 53, - 137, - 20, - 32, - 222, - 97, - 102, - 44, - 188, - 16, - 145, - 221, - 184, - 213, - 44, - 170, - 39, - 232, - 87, - 191, - 205, - 210, - 88, - 173, - 154, - 93, - 201, - 207, - 149, - 219, - 142, - 251, - 49, - 236, - 190, - 224, - 58, - 214, - 93, - 197, - 59, - 30, - 131, - 58, - 14, - 136, - 80, - 153, - 28, - 173, - 52, - 197, - 96, - 160, - 139, - 106, - 223, - 61, - 2, - 174, - 199, - 122, - 225, - 200, - 137, - 59, - 99, - 54, - 134, - 12, - 22, - 108, - 191, - 35, - 254, - 164, - 201, - 229, - 120, - 36, - 125, - 228, - 185, - 85, - 193, - 8, - 192, - 116, - 10, - 78, - 228, - 163, - 173, - 133, - 182, - 214, - 68, - 109, - 232, - 168, - 172, - 97, - 192, - 189, - 95, - 31, - 171, - 148, - 58, - 14, - 2, - 201, - 231, - 101, - 96, - 175, - 74, - 41, - 85, - 154, - 13, - 95, - 157, - 14, - 225, - 235, - 79, - 96, - 67, - 55, - 3, - 116, - 41, - 146, - 154, - 122, - 146, - 46, - 210, - 151, - 162, - 180, - 105, - 179, - 115, - 246, - 99, - 191, - 185, - 57, - 75, - 250, - 34, - 116, - 236, - 144, - 13, - 228, - 232, - 44, - 106, - 38, - 209, - 24, - 135, - 14, - 190, - 127, - 120, - 12, - 195, - 201, - 117, - 133, - 40, - 215, - 27, - 253, - 254, - 206, - 35, - 234, - 210, - 59, - 38, - 208, - 208, - 253, - 162, - 210, - 254, - 92, - 252, - 225, - 110, - 68, - 184, - 210, - 116, - 171, - 3, - 41, - 142, - 146, - 191, - 93, - 188, - 125, - 159, - 86, - 174, - 244, - 159, - 146, - 59, - 252, - 139, - 72, - 92, - 130, - 151, - 166, - 23, - 52, - 248, - 8, - 214, - 238, - 2, - 192, - 219, - 148, - 151, - 46, - 14, - 131, - 218, - 168, - 205, - 28, - 9, - 241, - 248, - 106, - 76, - 174, - 109, - 221, - 243, - 158, - 69, - 82, - 49, - 3, - 178, - 141, - 226, - 103, - 143, - 170, - 121, - 142, - 142, - 136, - 104, - 37, - 163, - 55, - 210, - 189, - 34, - 136, - 230, - 141, - 167, - 5, - 73, - 179, - 4, - 79, - 97, - 225, - 205, - 137, - 124, - 106, - 166, - 1, - 128, - 137, - 78, - 75, - 255, - 64, - 185, - 216, - 200, - 12, - 22, - 75, - 22, - 196, - 102, - 33, - 182, - 189, - 90, - 222, - 238, - 50, - 179, - 242, - 8, - 181, - 224, - 191, - 187, - 239, - 110, - 105, - 45, - 27, - 66, - 36, - 250, - 53, - 246, - 160, - 121, - 43, - 68, - 212, - 113, - 38, - 71, - 107, - 142, - 243, - 121, - 128, - 27, - 79, - 130, - 160, - 141, - 53, - 98, - 86, - 216, - 80, - 207, - 111, - 190, - 163, - 181, - 11, - 89, - 23, - 229, - 214, - 170, - 14, - 54, - 209, - 80, - 214, - 199, - 136, - 241, - 103, - 190, - 218, - 251, - 190, - 37, - 125, - 34, - 50, - 13, - 239, - 58, - 158, - 77, - 244, - 102, - 220, - 230, - 155, - 224, - 83, - 84, - 234, - 216, - 35, - 230, - 188, - 145, - 210, - 106, - 175, - 169, - 133, - 236, - 41, - 204, - 215, - 158, - 74, - 137, - 42, - 209, - 232, - 235, - 48, - 67, - 112, - 44, - 73, - 196, - 170, - 55, - 243, - 3, - 241, - 112, - 36, - 216, - 122, - 15, - 230, - 38, - 241, - 205, - 118, - 35, - 214, - 2, - 242, - 114, - 188, - 8, - 69, - 40, - 221, - 229, - 155, - 184, - 41, - 234, - 54, - 19, - 52, - 254, - 203, - 186, - 120, - 67, - 28, - 130, - 12, - 237, - 159, - 55, - 111, - 8, - 24, - 206, - 8, - 185, - 68, - 69, - 225, - 232, - 6, - 23, - 81, - 243, - 80, - 43, - 109, - 139, - 44, - 66, - 16, - 178, - 203, - 237, - 8, - 44, - 11, - 148, - 54, - 225, - 171, - 202, - 86, - 16, - 219, - 255, - 244, - 24, - 61, - 171, - 34, - 196, - 64, - 226, - 60, - 217, - 255, - 192, - 142, - 170, - 204, - 166, - 111, - 29, - 154, - 80, - 221, - 132, - 21, - 24, - 10, - 140, - 121, - 255, - 214, - 117, - 122, - 85, - 20, - 125, - 232, - 22, - 149, - 47, - 210, - 78, - 131, - 243, - 126, - 204, - 163, - 223, - 27, - 234, - 61, - 169, - 212, - 224, - 133, - 114, - 21, - 33, - 251, - 112, - 170, - 37, - 39, - 66, - 11, - 250, - 191, - 233, - 42, - 51, - 254, - 111, - 73, - 104, - 133, - 252, - 140, - 139, - 193, - 240, - 214, - 30, - 118, - 180, - 220, - 25, - 127, - 120, - 34, - 211, - 89, - 62, - 212, - 221, - 169, - 194, - 77, - 207, - 224, - 156, - 245, - 77, - 193, - 200, - 137, - 189, - 63, - 92, - 166, - 168, - 32, - 239, - 170, - 18, - 90, - 47, - 202, - 27, - 41, - 9, - 2, - 36, - 90, - 110, - 5, - 69, - 170, - 177, - 208, - 119, - 251, - 94, - 170, - 110, - 51, - 149, - 109, - 183, - 235, - 125, - 165, - 53, - 250, - 168, - 230, - 162, - 38, - 134, - 128, - 118, - 210, - 171, - 27, - 54, - 109, - 123, - 116, - 94, - 51, - 27, - 240, - 45, - 210, - 44, - 219, - 250, - 203, - 167, - 174, - 162, - 144, - 99, - 123, - 215, - 187, - 103, - 17, - 143, - 166, - 167, - 163, - 236, - 38, - 225, - 16, - 7, - 88, - 62, - 216, - 63, - 97, - 252, - 117, - 9, - 41, - 64, - 98, - 52, - 48, - 239, - 200, - 152, - 117, - 251, - 46, - 119, - 159, - 198, - 94, - 18, - 227, - 251, - 185, - 123, - 232, - 58, - 25, - 34, - 31, - 222, - 37, - 8, - 161, - 52, - 174, - 112, - 98, - 40, - 74, - 200, - 10, - 255, - 87, - 75, - 158, - 73, - 25, - 165, - 53, - 68, - 245, - 196, - 123, - 14, - 175, - 6, - 135, - 143, - 37, - 53, - 78, - 59, - 64, - 36, - 51, - 17, - 222, - 7, - 211, - 228, - 126, - 238, - 46, - 72, - 0, - 229, - 210, - 51, - 213, - 45, - 139, - 207, - 73, - 151, - 102, - 84, - 42, - 139, - 222, - 62, - 5, - 14, - 165, - 156, - 105, - 28, - 112, - 244, - 165, - 214, - 218, - 44, - 179, - 145, - 109, - 213, - 190, - 159, - 63, - 146, - 81, - 10, - 82, - 90, - 223, - 206, - 19, - 132, - 207, - 235, - 167, - 46, - 11, - 105, - 174, - 149, - 166, - 182, - 61, - 75, - 43, - 211, - 148, - 238, - 191, - 69, - 141, - 8, - 184, - 13, - 119, - 56, - 97, - 221, - 24, - 115, - 33, - 168, - 205, - 193, - 103, - 116, - 132, - 174, - 5, - 45, - 189, - 210, - 243, - 25, - 196, - 206, - 84, - 163, - 245, - 225, - 226, - 234, - 55, - 51, - 239, - 163, - 120, - 242, - 169, - 41, - 128, - 160, - 29, - 70, - 231, - 11, - 31, - 37, - 1, - 22, - 5, - 42, - 10, - 171, - 140, - 34, - 105, - 27, - 9, - 92, - 17, - 191, - 96, - 46, - 132, - 227, - 63, - 171, - 172, - 121, - 180, - 155, - 51, - 235, - 176, - 71, - 81, - 21, - 205, - 19, - 32, - 120, - 21, - 54, - 243, - 33, - 99, - 14, - 184, - 26, - 132, - 197, - 209, - 245, - 93, - 168, - 11, - 173, - 103, - 187, - 144, - 201, - 126, - 222, - 177, - 180, - 75, - 73, - 86, - 118, - 92, - 197, - 220, - 233, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 26, - 223, - 132, - 214, - 96, - 16, - 88, - 106, - 127, - 65, - 207, - 114, - 251, - 116, - 66, - 191, - 200, - 123, - 181, - 253, - 199, - 203, - 242, - 228, - 137, - 163, - 28, - 233, - 11, - 76, - 224, - 89, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 45, - 230, - 30, - 125, - 26, - 67, - 65, - 216, - 16, - 180, - 198, - 70, - 220, - 11, - 181, - 1, - 184, - 33, - 147, - 219, - 139, - 223, - 51, - 19, - 165, - 36, - 163, - 12, - 48, - 235, - 208, - 237, - 45, - 230, - 30, - 125, - 26, - 67, - 65, - 216, - 16, - 180, - 198, - 70, - 220, - 11, - 181, - 1, - 184, - 33, - 147, - 219, - 139, - 223, - 51, - 19, - 165, - 36, - 163, - 12, - 48, - 235, - 208, - 237, - 37, - 78, - 172, - 159, - 39, - 205, - 209, - 86, - 136, - 205, - 215, - 144, - 99, - 19, - 205, - 65, - 229, - 162, - 95, - 68, - 114, - 120, - 159, - 18, - 144, - 22, - 171, - 140, - 23, - 90, - 61, - 175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 37, - 78, - 172, - 159, - 39, - 205, - 209, - 86, - 136, - 205, - 215, - 144, - 99, - 19, - 205, - 65, - 229, - 162, - 95, - 68, - 114, - 120, - 159, - 18, - 144, - 22, - 171, - 140, - 23, - 90, - 61, - 175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 34, - 78, - 51, - 187, - 173, - 148, - 187, - 48, - 166, - 144, - 182, - 178, - 142, - 190, - 157, - 196, - 52, - 230, - 145, - 252, - 195, - 48, - 175, - 201, - 185, - 52, - 67, - 19, - 202, - 180, - 4, - 225, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 45, - 14, - 196, - 144, - 234, - 164, - 65, - 87, - 87, - 219, - 131, - 248, - 190, - 38, - 40, - 94, - 221, - 4, - 108, - 134, - 96, - 214, - 16, - 112, - 140, - 187, - 84, - 165, - 215, - 173, - 44, - 36, - 37, - 31, - 237, - 45, - 154, - 118, - 1, - 33, - 58, - 103, - 76, - 103, - 111, - 140, - 248, - 71, - 250, - 230, - 233, - 95, - 108, - 234, - 108, - 118, - 23, - 139, - 3, - 168, - 201, - 234, - 29, - 117, - 19, - 178, - 72, - 144, - 113, - 54, - 61, - 11, - 101, - 104, - 134, - 206, - 168, - 62, - 202, - 76, - 203, - 68, - 197, - 140, - 41, - 199, - 188, - 167, - 144, - 19, - 230, - 83, - 47, - 11, - 70, - 244, - 45, - 235, - 87, - 134, - 184, - 65, - 15, - 149, - 71, - 58, - 62, - 210, - 26, - 205, - 180, - 250, - 129, - 219, - 237, - 31, - 180, - 101, - 214, - 208, - 126, - 41, - 39, - 183, - 152, - 8, - 24, - 50, - 11, - 219, - 179, - 116, - 236, - 69, - 222, - 248, - 89, - 32, - 239, - 68, - 31, - 103, - 183, - 135, - 36, - 93, - 53, - 143, - 78, - 245, - 201, - 181, - 129, - 254, - 232, - 207, - 144, - 51, - 152, - 136, - 29, - 189, - 141, - 239, - 111, - 156, - 228, - 170, - 103, - 117, - 139, - 199, - 157, - 75, - 85, - 132, - 117, - 159, - 34, - 122, - 231, - 242, - 2, - 56, - 168, - 65, - 246, - 162, - 167, - 69, - 119, - 32, - 11, - 40, - 98, - 144, - 62, - 100, - 160, - 111, - 49, - 117, - 64, - 21, - 209, - 194, - 219, - 10, - 97, - 71, - 62, - 154, - 134, - 213, - 155, - 199, - 222, - 186, - 136, - 45, - 51, - 244, - 22, - 210, - 36, - 16, - 188, - 89, - 217, - 232, - 136, - 17, - 17, - 169, - 32, - 103, - 131, - 42, - 31, - 132, - 8, - 21, - 36, - 82, - 111, - 64, - 128, - 132, - 255, - 142, - 210, - 18, - 145, - 62, - 109, - 147, - 47, - 235, - 81, - 0, - 165, - 214, - 239, - 203, - 158, - 224, - 236, - 61, - 124, - 12, - 25, - 96, - 73, - 72, - 154, - 219, - 245, - 15, - 68, - 197, - 178, - 87, - 174, - 118, - 80, - 164, - 149, - 223, - 24, - 133, - 186, - 253, - 20, - 142, - 66, - 94, - 169, - 80, - 123, - 173, - 94, - 119, - 130, - 241, - 110, - 139, - 228, - 134, - 11, - 67, - 81, - 52, - 252, - 234, - 51, - 112, - 154, - 243, - 67, - 161, - 21, - 176, - 236, - 54, - 209, - 92, - 158, - 88, - 28, - 42, - 28, - 211, - 159, - 251, - 73, - 184, - 179, - 55, - 208, - 222, - 39, - 232, - 13, - 44, - 82, - 47, - 226, - 155, - 37, - 218, - 129, - 214, - 16, - 143, - 251, - 151, - 53, - 105, - 59, - 216, - 246, - 234, - 70, - 155, - 132, - 34, - 161, - 132, - 83, - 70, - 97, - 187, - 96, - 228, - 111, - 233, - 26, - 50, - 217, - 214, - 237, - 131, - 149, - 51, - 17, - 207, - 82, - 97, - 17, - 247, - 45, - 80, - 37, - 153, - 188, - 141, - 211, - 194, - 205, - 184, - 225, - 232, - 121, - 48, - 52, - 58, - 43, - 219, - 42, - 90, - 246, - 58, - 173, - 144, - 184, - 151, - 10, - 165, - 126, - 14, - 107, - 11, - 152, - 183, - 234, - 73, - 125, - 185, - 1, - 111, - 180, - 200, - 122, - 88, - 176, - 93, - 156, - 181, - 124, - 179, - 65, - 77, - 59, - 123, - 32, - 163, - 147, - 186, - 35, - 44, - 94, - 48, - 154, - 99, - 231, - 136, - 33, - 251, - 187, - 44, - 249, - 64, - 32, - 108, - 187, - 194, - 35, - 122, - 227, - 15, - 147, - 229, - 208, - 156, - 68, - 208, - 172, - 195, - 103, - 203, - 25, - 15, - 122, - 54, - 40, - 203, - 255, - 35, - 140, - 76, - 151, - 210, - 113, - 208, - 152, - 135, - 12, - 115, - 115, - 55, - 19, - 114, - 215, - 24, - 205, - 82, - 149, - 54, - 106, - 17, - 96, - 87, - 29, - 104, - 231, - 90, - 79, - 162, - 208, - 194, - 71, - 215, - 147, - 129, - 103, - 109, - 146, - 27, - 210, - 181, - 18, - 171, - 14, - 132, - 228, - 247, - 207, - 50, - 231, - 120, - 198, - 50, - 144, - 193, - 45, - 150, - 109, - 33, - 67, - 74, - 69, - 243, - 48, - 25, - 44, - 247, - 145, - 218, - 12, - 236, - 29, - 138, - 171, - 162, - 79, - 24, - 232, - 200, - 53, - 176, - 10, - 41, - 93, - 208, - 238, - 47, - 32, - 24, - 48, - 35, - 141, - 122, - 224, - 11, - 11, - 237, - 56, - 68, - 84, - 224, - 236, - 12, - 150, - 227, - 2, - 248, - 59, - 136, - 150, - 247, - 15, - 99, - 134, - 68, - 34, - 176, - 144, - 78, - 22, - 227, - 198, - 217, - 64, - 236, - 31, - 196, - 197, - 144, - 137, - 146, - 88, - 231, - 237, - 170, - 151, - 59, - 197, - 169, - 114, - 33, - 126, - 1, - 240, - 24, - 32, - 250, - 44, - 30, - 162, - 135, - 21, - 17, - 223, - 26, - 237, - 53, - 193, - 230, - 55, - 0, - 171, - 90, - 197, - 135, - 48, - 158, - 252, - 250, - 242, - 25, - 253, - 166, - 255, - 131, - 162, - 96, - 203, - 234, - 152, - 164, - 126, - 11, - 1, - 23, - 142, - 252, - 56, - 86, - 125, - 97, - 52, - 115, - 114, - 25, - 67, - 199, - 10, - 191, - 159, - 205, - 60, - 2, - 117, - 200, - 159, - 71, - 73, - 137, - 64, - 184, - 96, - 179, - 37, - 55, - 12, - 140, - 104, - 157, - 201, - 26, - 218, - 196, - 177, - 144, - 118, - 10, - 237, - 242, - 191, - 190, - 204, - 46, - 253, - 249, - 142, - 213, - 26, - 181, - 180, - 213, - 246, - 206, - 138, - 18, - 64, - 40, - 20, - 215, - 33, - 101, - 221, - 110, - 41, - 239, - 237, - 29, - 218, - 220, - 8, - 102, - 109, - 106, - 34, - 97, - 116, - 12, - 104, - 87, - 123, - 210, - 135, - 87, - 192, - 133, - 150, - 58, - 94, - 51, - 21, - 199, - 12, - 73, - 86, - 223, - 54, - 86, - 185, - 176, - 108, - 239, - 28, - 235, - 121, - 6, - 67, - 240, - 48, - 202, - 16, - 124, - 87, - 69, - 188, - 35, - 132, - 147, - 58, - 215, - 230, - 46, - 1, - 150, - 224, - 150, - 117, - 11, - 47, - 63, - 255, - 179, - 31, - 19, - 240, - 170, - 198, - 115, - 251, - 235, - 120, - 66, - 118, - 174, - 82, - 62, - 98, - 184, - 119, - 45, - 255, - 250, - 225, - 243, - 14, - 112, - 143, - 111, - 174, - 65, - 8, - 195, - 66, - 184, - 136, - 194, - 171, - 157, - 143, - 205, - 132, - 233, - 214, - 110, - 141, - 221, - 232, - 42, - 235, - 0, - 62, - 89, - 22, - 6, - 50, - 153 - ], - "transcript_type": "EVM", - "split": null, - "pretty_public_inputs": { - "rescaled_inputs": [], - "inputs": [], - "processed_inputs": [], - "processed_params": [], - "processed_outputs": [], - "rescaled_outputs": [ - [ - "0", - "0", - "0", - "0" - ] - ], - "outputs": [ - [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ] - ] - }, - "timestamp": 1702477568094 -} \ No newline at end of file +{"protocol":null,"instances":[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],"proof":[0,228,53,25,72,96,41,33,55,84,178,177,112,81,54,16,46,60,22,112,162,82,199,20,13,22,35,181,120,179,251,142,32,3,138,204,87,167,94,57,35,229,44,44,29,175,13,233,123,75,158,232,105,162,10,174,249,95,202,68,197,61,112,210,35,240,24,205,164,172,191,218,222,68,190,94,4,189,146,121,12,66,107,158,119,10,252,87,249,227,55,208,221,182,68,203,28,31,230,89,249,126,34,31,191,245,251,241,141,145,39,170,185,155,10,76,145,88,13,70,30,211,9,53,104,99,224,212,7,239,203,25,197,15,23,26,113,115,121,113,115,153,255,48,41,170,20,209,11,55,27,214,217,241,134,28,173,3,72,59,9,181,82,109,101,63,238,150,154,237,87,89,213,133,130,126,199,47,63,198,77,245,223,60,160,208,83,84,240,77,96,64,23,68,146,138,147,221,48,227,81,114,39,231,238,132,79,134,72,216,211,47,170,101,242,198,111,27,52,236,202,210,174,58,18,10,121,8,43,27,28,84,247,223,196,5,227,24,220,132,98,217,28,129,220,174,98,197,30,193,26,253,45,157,20,64,40,195,3,247,9,184,117,238,88,244,207,69,130,120,121,37,142,244,57,27,109,252,64,220,149,185,219,244,172,150,191,134,32,28,146,189,200,50,245,173,77,201,0,139,224,177,67,130,89,150,182,229,91,150,153,212,0,198,247,164,189,239,163,240,28,201,147,132,135,141,56,45,91,116,23,139,52,235,181,82,33,57,99,188,14,161,143,4,175,97,152,216,145,244,13,104,10,70,233,148,170,54,240,247,243,2,171,134,236,91,36,220,238,209,180,54,237,173,136,175,169,168,98,154,6,77,236,192,42,29,23,75,127,138,84,57,241,193,71,212,213,184,25,163,131,79,55,28,182,52,178,65,193,214,211,84,24,52,155,247,21,200,242,170,146,244,46,164,38,166,5,201,19,214,103,89,20,8,5,173,157,189,211,53,137,20,32,222,97,102,44,188,16,145,221,184,213,44,170,39,232,87,191,205,210,88,173,154,93,201,207,149,219,142,251,49,236,190,224,58,214,93,197,59,30,131,58,14,136,80,153,28,173,52,197,96,160,139,106,223,61,2,174,199,122,225,200,137,59,99,54,134,12,22,108,191,42,64,64,170,155,42,16,174,219,249,96,168,50,241,53,56,96,186,18,242,34,222,89,120,220,21,230,209,215,91,17,230,37,59,112,69,63,206,114,211,230,178,194,71,149,187,112,62,120,70,47,143,251,6,48,123,9,67,244,69,234,242,237,26,1,176,119,81,94,20,162,120,254,176,174,117,6,165,27,217,37,67,97,124,222,113,103,168,197,204,200,165,159,75,150,23,24,17,52,70,170,102,1,31,81,95,160,144,252,178,197,64,195,115,75,213,23,93,19,144,12,215,109,89,105,92,85,59,8,151,63,179,54,186,165,251,227,156,171,9,59,117,204,28,104,154,3,229,111,244,237,180,141,151,14,146,245,169,197,213,3,233,94,121,170,200,125,66,235,177,121,2,50,205,17,218,147,146,187,112,132,212,106,28,10,135,214,45,191,173,26,244,34,194,126,19,9,2,91,175,173,62,246,97,194,186,106,220,60,140,171,19,16,134,121,89,148,138,111,214,250,186,223,117,45,9,55,152,251,63,192,233,180,173,35,220,157,55,148,186,74,227,201,195,226,178,141,42,234,148,9,76,196,84,193,84,41,215,239,79,105,52,113,195,41,132,144,38,39,175,57,129,181,211,118,180,245,183,149,4,212,13,65,172,62,164,26,98,38,71,83,125,54,27,177,16,113,168,62,33,234,215,228,209,15,206,192,231,190,134,35,58,168,117,60,155,141,98,228,204,9,46,18,1,237,99,220,87,85,10,130,226,226,207,138,103,162,17,242,168,30,79,237,194,228,45,85,77,92,118,199,99,12,69,238,2,29,9,39,66,70,90,239,163,217,223,42,68,33,195,4,67,102,132,21,164,131,134,199,61,209,136,120,222,43,116,41,155,176,68,182,249,89,3,34,181,233,219,192,29,4,17,130,190,51,131,216,12,202,199,54,198,58,150,142,210,6,96,223,249,211,81,85,53,65,183,234,100,168,51,164,251,235,93,100,220,159,73,91,103,124,249,182,170,88,125,191,157,18,252,210,136,164,37,47,216,133,209,5,165,47,166,217,172,253,167,241,128,191,28,201,233,53,188,43,23,16,11,109,40,26,176,235,37,193,71,97,96,148,12,43,2,184,114,134,242,10,244,204,140,18,48,245,182,52,53,179,234,66,232,11,80,23,82,153,81,61,136,75,121,26,143,188,125,178,237,39,26,23,39,254,97,197,141,231,169,224,108,228,251,113,183,36,114,16,244,169,231,34,75,57,80,38,73,112,14,106,161,85,27,65,76,49,6,204,37,59,149,50,32,107,136,61,150,5,184,36,202,195,184,155,123,180,234,36,68,13,48,79,114,182,23,229,214,33,138,147,48,154,14,95,118,1,48,51,138,90,247,12,98,175,57,173,215,238,224,104,78,149,154,79,229,22,191,2,188,74,79,132,206,72,192,80,7,202,172,240,76,79,205,17,158,237,185,236,238,33,139,83,9,207,37,39,24,177,92,46,12,52,67,136,97,136,10,117,128,248,99,110,87,66,236,36,252,14,33,37,40,165,204,245,104,40,105,75,166,48,50,145,213,85,57,245,163,253,19,84,99,120,78,3,128,147,87,41,22,209,73,105,240,157,164,78,123,148,142,38,67,154,170,59,39,46,72,187,252,73,240,135,36,2,97,17,201,146,191,1,134,253,193,244,66,178,160,176,140,9,4,202,226,105,165,7,248,57,54,114,73,76,20,112,143,144,242,89,217,201,51,35,182,129,11,253,137,220,247,242,158,73,46,126,79,172,201,79,210,97,206,192,92,187,234,114,130,75,118,210,126,116,53,23,164,195,216,194,111,127,131,118,192,214,179,18,84,236,50,129,12,110,143,94,127,59,37,16,40,255,174,248,70,62,238,0,57,146,228,216,222,174,97,86,123,56,149,255,161,149,185,144,21,103,158,26,45,40,207,180,186,122,247,157,214,12,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,156,173,28,45,222,230,154,190,124,233,122,198,63,119,250,116,217,18,83,221,118,176,98,116,87,44,244,168,75,194,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,138,136,70,27,151,11,75,149,44,47,9,142,149,118,60,135,128,142,255,199,47,30,2,211,84,188,239,143,160,46,53,32,138,136,70,27,151,11,75,149,44,47,9,142,149,118,60,135,128,142,255,199,47,30,2,211,84,188,239,143,160,46,53,22,47,8,175,41,74,126,92,40,52,220,215,167,195,154,53,189,28,80,142,135,172,63,231,188,186,153,14,136,217,96,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,47,8,175,41,74,126,92,40,52,220,215,167,195,154,53,189,28,80,142,135,172,63,231,188,186,153,14,136,217,96,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,66,157,65,78,89,171,110,74,87,234,47,72,128,236,129,171,252,215,24,34,167,220,137,255,171,65,131,15,187,214,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,115,195,208,10,5,125,228,36,95,30,38,146,146,183,192,116,165,230,178,149,234,216,117,242,23,24,36,175,78,149,250,12,108,164,255,108,122,71,123,184,122,133,40,11,78,59,250,253,166,241,213,254,245,144,81,8,104,235,249,140,213,48,138,22,22,222,236,137,78,27,166,24,9,252,50,5,55,185,118,241,200,217,71,253,126,0,160,154,134,91,231,87,140,53,74,26,68,110,207,194,87,246,239,51,187,18,93,22,201,175,145,223,101,218,21,174,155,214,5,236,145,149,201,112,10,185,96,40,153,73,241,160,104,95,231,129,236,145,180,159,45,164,104,24,226,158,10,59,20,152,93,88,58,166,12,12,170,143,227,42,153,39,167,34,104,23,177,103,113,239,106,9,165,178,48,156,119,194,202,104,174,100,218,154,114,67,210,212,126,171,184,38,209,167,60,184,152,139,232,77,209,1,35,63,97,187,9,72,16,33,42,146,97,130,250,132,56,115,123,170,80,162,246,2,81,147,245,151,161,0,204,59,101,125,238,79,188,86,22,72,184,211,99,66,73,148,20,206,204,120,159,208,119,58,88,47,23,42,56,254,166,238,243,185,39,33,187,51,186,200,248,69,179,171,197,141,42,18,203,132,111,8,253,204,119,44,228,14,19,42,137,200,159,173,79,52,129,16,103,212,233,150,194,48,253,88,172,175,127,97,14,184,167,229,12,52,57,150,230,5,6,106,175,95,207,116,80,222,242,119,149,51,84,252,34,235,59,136,169,71,232,240,143,180,228,55,252,168,174,26,179,21,200,5,74,186,149,10,250,147,45,205,16,72,252,129,146,23,227,115,9,81,63,41,185,133,228,14,17,107,89,5,198,20,166,84,126,220,93,175,37,25,107,192,41,229,158,195,189,151,111,28,17,160,22,30,207,228,233,30,27,124,219,145,75,41,18,8,2,247,56,12,224,149,165,213,191,49,85,164,98,239,105,134,74,122,231,16,237,123,149,232,20,190,167,255,236,43,61,182,80,222,161,164,95,89,217,51,254,164,19,186,156,219,2,152,155,199,181,164,120,64,57,186,183,25,59,115,229,34,246,228,181,164,193,150,106,206,68,159,229,188,233,17,186,247,140,203,168,2,19,121,203,31,81,131,65,200,176,27,126,8,12,42,163,141,205,25,78,85,40,199,250,4,162,123,84,102,100,144,174,80,87,254,35,143,121,111,215,104,37,69,121,19,210,62,24,83,229,231,208,196,234,14,226,202,184,221,199,77,167,233,23,134,188,53,116,173,90,63,33,101,236,137,177,8,104,190,154,237,33,198,144,237,98,142,215,102,136,208,4,243,81,19,35,178,19,190,5,104,77,163,180,33,60,196,88,44,156,235,208,95,18,102,21,167,193,2,144,87,231,215,234,97,153,78,34,172,145,180,125,19,234,49,194,198,60,41,147,0,150,94,132,111,253,106,130,45,115,93,128,123,98,237,225,98,145,87,168,202,26,13,249,218,196,3,147,3,243,133,142,27,128,75,203,227,69,221,63,188,215,86,254,36,210,132,246,224,146,102,134,234,247,128,207,88,207,59,26,154,60,245,84,18,253,199,213,146,35,100,19,120,55,96,112,173,52,194,242,250,74,40,233,142,200,133,30,71,168,191,35,109,7,144,134,43,130,72,165,80,202,226,236,84,218,133,166,220,236,136,74,10,221,120,76,196,127,197,107,171,127,94,146,176,48,229,255,41,180,64,226,35,0,175,166,156,34,81,107,57,241,218,176,140,15,165,92,32,190,217,236,157,128,5,193,106,61,158,93,31,95,109,161,13,37,122,115,240,131,230,46,241,253,210,38,240,135,101,34,70,120,228,96,167,241,51,195,120,214,37,41,42,48,187,222,134,134,254,111,90,174,60,55,34,51,191,123,17,126,159,232,172,87,3,145,251,68,71,16,15,46,176,243],"hex_proof":"0x00e43519486029213754b2b1705136102e3c1670a252c7140d1623b578b3fb8e20038acc57a75e3923e52c2c1daf0de97b4b9ee869a20aaef95fca44c53d70d223f018cda4acbfdade44be5e04bd92790c426b9e770afc57f9e337d0ddb644cb1c1fe659f97e221fbff5fbf18d9127aab99b0a4c91580d461ed309356863e0d407efcb19c50f171a717379717399ff3029aa14d10b371bd6d9f1861cad03483b09b5526d653fee969aed5759d585827ec72f3fc64df5df3ca0d05354f04d60401744928a93dd30e3517227e7ee844f8648d8d32faa65f2c66f1b34eccad2ae3a120a79082b1b1c54f7dfc405e318dc8462d91c81dcae62c51ec11afd2d9d144028c303f709b875ee58f4cf45827879258ef4391b6dfc40dc95b9dbf4ac96bf86201c92bdc832f5ad4dc9008be0b143825996b6e55b9699d400c6f7a4bdefa3f01cc99384878d382d5b74178b34ebb552213963bc0ea18f04af6198d891f40d680a46e994aa36f0f7f302ab86ec5b24dceed1b436edad88afa9a8629a064decc02a1d174b7f8a5439f1c147d4d5b819a3834f371cb634b241c1d6d35418349bf715c8f2aa92f42ea426a605c913d66759140805ad9dbdd335891420de61662cbc1091ddb8d52caa27e857bfcdd258ad9a5dc9cf95db8efb31ecbee03ad65dc53b1e833a0e8850991cad34c560a08b6adf3d02aec77ae1c8893b6336860c166cbf2a4040aa9b2a10aedbf960a832f1353860ba12f222de5978dc15e6d1d75b11e6253b70453fce72d3e6b2c24795bb703e78462f8ffb06307b0943f445eaf2ed1a01b077515e14a278feb0ae7506a51bd92543617cde7167a8c5ccc8a59f4b961718113446aa66011f515fa090fcb2c540c3734bd5175d13900cd76d59695c553b08973fb336baa5fbe39cab093b75cc1c689a03e56ff4edb48d970e92f5a9c5d503e95e79aac87d42ebb1790232cd11da9392bb7084d46a1c0a87d62dbfad1af422c27e1309025bafad3ef661c2ba6adc3c8cab1310867959948a6fd6fabadf752d093798fb3fc0e9b4ad23dc9d3794ba4ae3c9c3e2b28d2aea94094cc454c15429d7ef4f693471c32984902627af3981b5d376b4f5b79504d40d41ac3ea41a622647537d361bb11071a83e21ead7e4d10fcec0e7be86233aa8753c9b8d62e4cc092e1201ed63dc57550a82e2e2cf8a67a211f2a81e4fedc2e42d554d5c76c7630c45ee021d092742465aefa3d9df2a4421c30443668415a48386c73dd18878de2b74299bb044b6f9590322b5e9dbc01d041182be3383d80ccac736c63a968ed20660dff9d351553541b7ea64a833a4fbeb5d64dc9f495b677cf9b6aa587dbf9d12fcd288a4252fd885d105a52fa6d9acfda7f180bf1cc9e935bc2b17100b6d281ab0eb25c1476160940c2b02b87286f20af4cc8c1230f5b63435b3ea42e80b50175299513d884b791a8fbc7db2ed271a1727fe61c58de7a9e06ce4fb71b7247210f4a9e7224b39502649700e6aa1551b414c3106cc253b9532206b883d9605b824cac3b89b7bb4ea24440d304f72b617e5d6218a93309a0e5f760130338a5af70c62af39add7eee0684e959a4fe516bf02bc4a4f84ce48c05007caacf04c4fcd119eedb9ecee218b5309cf252718b15c2e0c34438861880a7580f8636e5742ec24fc0e212528a5ccf56828694ba6303291d55539f5a3fd135463784e038093572916d14969f09da44e7b948e26439aaa3b272e48bbfc49f08724026111c992bf0186fdc1f442b2a0b08c0904cae269a507f8393672494c14708f90f259d9c93323b6810bfd89dcf7f29e492e7e4facc94fd261cec05cbbea72824b76d27e743517a4c3d8c26f7f8376c0d6b31254ec32810c6e8f5e7f3b251028ffaef8463eee003992e4d8deae61567b3895ffa195b99015679e1a2d28cfb4ba7af79dd60c5b0000000000000000000000000000000000000000000000000000000000000000199cad1c2ddee69abe7ce97ac63f77fa74d91253dd76b06274572cf4a84bc21c0000000000000000000000000000000000000000000000000000000000000000208a88461b970b4b952c2f098e95763c87808effc72f1e02d354bcef8fa02e35208a88461b970b4b952c2f098e95763c87808effc72f1e02d354bcef8fa02e35162f08af294a7e5c2834dcd7a7c39a35bd1c508e87ac3fe7bcba990e88d960670000000000000000000000000000000000000000000000000000000000000000162f08af294a7e5c2834dcd7a7c39a35bd1c508e87ac3fe7bcba990e88d9606700000000000000000000000000000000000000000000000000000000000000001b429d414e59ab6e4a57ea2f4880ec81abfcd71822a7dc89ffab41830fbbd66b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001673c3d00a057de4245f1e269292b7c074a5e6b295ead875f2171824af4e95fa0c6ca4ff6c7a477bb87a85280b4e3bfafda6f1d5fef590510868ebf98cd5308a1616deec894e1ba61809fc320537b976f1c8d947fd7e00a09a865be7578c354a1a446ecfc257f6ef33bb125d16c9af91df65da15ae9bd605ec9195c9700ab960289949f1a0685fe781ec91b49f2da46818e29e0a3b14985d583aa60c0caa8fe32a9927a7226817b16771ef6a09a5b2309c77c2ca68ae64da9a7243d2d47eabb826d1a73cb8988be84dd101233f61bb094810212a926182fa8438737baa50a2f6025193f597a100cc3b657dee4fbc561648b8d36342499414cecc789fd0773a582f172a38fea6eef3b92721bb33bac8f845b3abc58d2a12cb846f08fdcc772ce40e132a89c89fad4f34811067d4e996c230fd58acaf7f610eb8a7e50c343996e605066aaf5fcf7450def277953354fc22eb3b88a947e8f08fb4e437fca8ae1ab315c8054aba950afa932dcd1048fc819217e37309513f29b985e40e116b5905c614a6547edc5daf25196bc029e59ec3bd976f1c11a0161ecfe4e91e1b7cdb914b29120802f7380ce095a5d5bf3155a462ef69864a7ae710ed7b95e814bea7ffec2b3db650dea1a45f59d933fea413ba9cdb02989bc7b5a4784039bab7193b73e522f6e4b5a4c1966ace449fe5bce911baf78ccba8021379cb1f518341c8b01b7e080c2aa38dcd194e5528c7fa04a27b54666490ae5057fe238f796fd76825457913d23e1853e5e7d0c4ea0ee2cab8ddc74da7e91786bc3574ad5a3f2165ec89b10868be9aed21c690ed628ed76688d004f3511323b213be05684da3b4213cc4582c9cebd05f126615a7c1029057e7d7ea61994e22ac91b47d13ea31c2c63c299300965e846ffd6a822d735d807b62ede1629157a8ca1a0df9dac4039303f3858e1b804bcbe345dd3fbcd756fe24d284f6e0926686eaf780cf58cf3b1a9a3cf55412fdc7d59223641378376070ad34c2f2fa4a28e98ec8851e47a8bf236d0790862b8248a550cae2ec54da85a6dcec884a0add784cc47fc56bab7f5e92b030e5ff29b440e22300afa69c22516b39f1dab08c0fa55c20bed9ec9d8005c16a3d9e5d1f5f6da10d257a73f083e62ef1fdd226f08765224678e460a7f133c378d625292a30bbde8686fe6f5aae3c372233bf7b117e9fe8ac570391fb4447100f2eb0f3","transcript_type":"EVM","split":null,"pretty_public_inputs":{"rescaled_inputs":[],"inputs":[],"processed_inputs":[],"processed_params":[],"processed_outputs":[],"rescaled_outputs":[["0","0","0","0"]],"outputs":[["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"]]},"timestamp":1704286433689} \ No newline at end of file diff --git a/tests/wasm/settings.json b/tests/wasm/settings.json index abc2c77cf..fcdf185f0 100644 --- a/tests/wasm/settings.json +++ b/tests/wasm/settings.json @@ -1 +1 @@ -{"run_args":{"tolerance":{"val":0.0,"scale":1.0},"input_scale":0,"param_scale":0,"scale_rebase_multiplier":10,"lookup_range":[-2,0],"logrows":6,"num_inner_cols":2,"variables":[["batch_size",1]],"input_visibility":"Private","output_visibility":"Public","param_visibility":"Private"},"num_rows":16,"total_assignments":32,"total_const_size":8,"model_instance_shapes":[[1,4]],"model_output_scales":[0],"model_input_scales":[0],"module_sizes":{"kzg":[],"poseidon":[0,[0]],"elgamal":[0,[0]]},"required_lookups":["ReLU"],"check_mode":"UNSAFE","version":"0.0.0","num_blinding_factors":null,"timestamp":1702474230544} \ No newline at end of file +{"run_args":{"tolerance":{"val":0.0,"scale":1.0},"input_scale":0,"param_scale":0,"scale_rebase_multiplier":10,"lookup_range":[-2,0],"logrows":6,"num_inner_cols":2,"variables":[["batch_size",1]],"input_visibility":"Private","output_visibility":"Public","param_visibility":"Private"},"num_rows":16,"total_assignments":32,"total_const_size":8,"model_instance_shapes":[[1,4]],"model_output_scales":[0],"model_input_scales":[0],"module_sizes":{"kzg":[],"poseidon":[0,[0]]},"required_lookups":["ReLU"],"check_mode":"UNSAFE","version":"0.0.0","num_blinding_factors":null,"timestamp":1702474230544} \ No newline at end of file From e97713f97d74f14fc8357bb3f3920b9b081febdb Mon Sep 17 00:00:00 2001 From: dante <45801863+alexander-camuto@users.noreply.github.com> Date: Fri, 5 Jan 2024 01:28:57 +0000 Subject: [PATCH 6/6] chore: update icicle to latest (#674) --------- Co-authored-by: VitaliiH Co-authored-by: Vitalii --- Cargo.lock | 12 +++++++++++- Cargo.toml | 10 ++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 02689f04f..798421d1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -840,6 +840,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "coins-bip32" version = "0.8.3" @@ -2542,7 +2551,7 @@ dependencies = [ [[package]] name = "icicle" version = "0.1.0" -source = "git+https://github.com/ingonyama-zk/icicle.git?branch=rust/large-bucket-factor-msm#2820f43746263fbae7b30a29e08099ea19383c64" +source = "git+https://github.com/ingonyama-zk/icicle?rev=45b00fb?branch=fix/vhnat/ezkl-build-fix#45b00fb1966cb236979f03f9068f6db9bf59f41e" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -2552,6 +2561,7 @@ dependencies = [ "ark-poly", "ark-std 0.3.0", "cc", + "cmake", "hex", "rand 0.8.5", "rustacuda", diff --git a/Cargo.toml b/Cargo.toml index 305c2b339..139bdf7fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,5 @@ +cargo-features = ["profile-rustflags"] + [package] name = "ezkl" version = "0.0.0" @@ -155,3 +157,11 @@ ezkl = ["onnx", "serde", "serde_json", "log", "colored", "env_logger", "tabled/c mv-lookup = ["halo2_proofs/mv-lookup", "snark-verifier/mv-lookup", "halo2_solidity_verifier/mv-lookup"] det-prove = [] icicle = ["halo2_proofs/icicle_gpu"] + + +# icicle patch to 0.1.0 if feature icicle is enabled +[patch.'https://github.com/ingonyama-zk/icicle'] +icicle = { git = "https://github.com/ingonyama-zk/icicle?rev=45b00fb", package = "icicle", branch = "fix/vhnat/ezkl-build-fix"} + +[profile.release] +rustflags = [ "-C", "relocation-model=pic" ]