From fc731a126ad66602348bb56c5f06f922d5bb8acc Mon Sep 17 00:00:00 2001 From: Andrew Z <1497456+z-tech@users.noreply.github.com> Date: Sun, 19 Apr 2026 11:27:12 +0200 Subject: [PATCH 01/12] canonical rewrite: SumcheckProver trait, generic field, SIMD, streaming --- .github/workflows/bench.yml | 70 ++ .github/workflows/ci.yml | 40 + .gitignore | 1 + CHANGELOG.md | 45 +- Cargo.toml | 38 +- README.md | 330 ++++-- benches/explanation.rs | 5 - benches/lag-poly-benches/Cargo.lock | 443 -------- benches/lag-poly-benches/Cargo.toml | 12 - benches/lag-poly-benches/run_benches.sh | 25 - benches/provers.rs | 69 -- benches/sumcheck-benches/Cargo.lock | 454 -------- benches/sumcheck-benches/Cargo.toml | 15 - benches/sumcheck-benches/run_benches.sh | 56 - benches/sumcheck-benches/src/main.rs | 122 --- .../sumcheck-benches/src/validation/mod.rs | 104 -- benches/sumcheck.rs | 190 ++++ docs/design.md | 763 ++++++++++++++ docs/slides.md | 610 +++++++++++ docs/slides.pdf | Bin 0 -> 415910 bytes docs/slides.pptx | Bin 0 -> 5239695 bytes examples/sumcheck_micro.rs | 87 ++ src/coefficient_sumcheck.rs | 588 ++++++++--- src/field.rs | 274 +++++ src/fold.rs | 14 + src/folding.rs | 143 ++- src/hypercube/eq_evals.rs | 13 +- src/hypercube/hypercube.rs | 181 ---- src/hypercube/hypercube_member.rs | 116 --- src/hypercube/mod.rs | 5 - src/inner_product_sumcheck.rs | 562 ++++++---- src/interpolation/lagrange_polynomial.rs | 214 ---- src/interpolation/mod.rs | 2 - src/lib.rs | 109 +- src/messages/mod.rs | 2 - src/messages/verifier_messages.rs | 130 --- src/multilinear/mod.rs | 9 - src/multilinear/provers/blendy/config.rs | 41 - src/multilinear/provers/blendy/core.rs | 236 ----- src/multilinear/provers/blendy/mod.rs | 6 - src/multilinear/provers/blendy/prover.rs | 78 -- src/multilinear/provers/mod.rs | 3 - src/multilinear/provers/space/config.rs | 52 - src/multilinear/provers/space/core.rs | 71 -- src/multilinear/provers/space/mod.rs | 6 - src/multilinear/provers/space/prover.rs | 59 -- src/multilinear/provers/time/config.rs | 57 -- src/multilinear/provers/time/core.rs | 20 - src/multilinear/provers/time/mod.rs | 8 - src/multilinear/provers/time/prover.rs | 122 --- .../provers/time/reductions/mod.rs | 9 - .../provers/time/reductions/pairwise.rs | 75 -- .../provers/time/reductions/variablewise.rs | 143 --- src/multilinear/sumcheck.rs | 142 --- src/multilinear_product/mod.rs | 9 - .../provers/blendy/config.rs | 44 - .../provers/blendy/core.rs | 269 ----- src/multilinear_product/provers/blendy/mod.rs | 6 - .../provers/blendy/prover.rs | 179 ---- src/multilinear_product/provers/mod.rs | 3 - .../provers/space/config.rs | 39 - src/multilinear_product/provers/space/core.rs | 71 -- src/multilinear_product/provers/space/mod.rs | 6 - .../provers/space/prover.rs | 67 -- .../provers/time/config.rs | 42 - src/multilinear_product/provers/time/core.rs | 100 -- src/multilinear_product/provers/time/mod.rs | 7 - .../provers/time/prover.rs | 63 -- .../provers/time/reductions/mod.rs | 2 - .../provers/time/reductions/pairwise.rs | 74 -- .../provers/time/reductions/variablewise.rs | 104 -- src/multilinear_product/sumcheck.rs | 73 -- src/multilinear_sumcheck.rs | 434 ++++++-- src/order_strategy/ascending/ascending.rs | 63 -- src/order_strategy/ascending/mod.rs | 4 - src/order_strategy/core.rs | 5 - src/order_strategy/descending/descending.rs | 64 -- src/order_strategy/descending/mod.rs | 4 - src/order_strategy/graycode/graycode.rs | 74 -- src/order_strategy/graycode/mod.rs | 3 - src/order_strategy/mod.rs | 11 - src/order_strategy/msb/mod.rs | 4 - src/order_strategy/msb/msb.rs | 83 -- src/poly_ops.rs | 257 +++++ src/proof.rs | 81 ++ src/prover/core.rs | 22 - src/prover/mod.rs | 2 - src/provers/coefficient.rs | 389 +++++++ src/provers/coefficient_lsb.rs | 496 +++++++++ src/provers/inner_product.rs | 218 ++++ src/provers/inner_product_lsb.rs | 265 +++++ src/provers/mod.rs | 13 + src/provers/multilinear.rs | 138 +++ src/provers/multilinear_lsb.rs | 268 +++++ src/reductions/mod.rs | 8 + src/reductions/pairwise.rs | 123 +++ src/reductions/tablewise.rs | 17 + src/runner.rs | 73 ++ src/simd_fields/goldilocks/avx512.rs | 969 ++++++++++++++++++ src/simd_fields/goldilocks/mod.rs | 22 + src/simd_fields/goldilocks/neon.rs | 513 ++++++++++ src/simd_fields/mod.rs | 142 +++ src/simd_sumcheck/dispatch.rs | 315 ++++++ src/simd_sumcheck/evaluate.rs | 695 +++++++++++++ src/simd_sumcheck/mod.rs | 7 + src/simd_sumcheck/reduce.rs | 961 +++++++++++++++++ src/streams/memory/core.rs | 85 +- src/streams/memory/mod.rs | 2 +- src/streams/mod.rs | 4 +- src/streams/stream_iterator.rs | 35 - src/sumcheck_prover.rs | 57 ++ src/tests/fields.rs | 95 +- src/tests/mod.rs | 5 +- src/tests/multilinear/mod.rs | 5 - src/tests/multilinear/provers/basic/config.rs | 17 - src/tests/multilinear/provers/basic/core.rs | 64 -- src/tests/multilinear/provers/basic/mod.rs | 6 - src/tests/multilinear/provers/basic/prover.rs | 138 --- src/tests/multilinear/provers/mod.rs | 3 - src/tests/multilinear/sanity.rs | 196 ---- src/tests/multilinear_product/consistency.rs | 56 - src/tests/multilinear_product/mod.rs | 9 - .../provers/basic/config.rs | 50 - .../multilinear_product/provers/basic/core.rs | 73 -- .../multilinear_product/provers/basic/mod.rs | 7 - .../provers/basic/prover.rs | 69 -- src/tests/multilinear_product/provers/mod.rs | 1 - src/tests/multilinear_product/sanity.rs | 145 --- src/tests/polynomials.rs | 76 +- src/transcript/mod.rs | 8 +- src/transcript/sanity.rs | 35 +- src/transcript/spongefish.rs | 32 +- src/transcript/transcript.rs | 45 +- src/verifier.rs | 139 +++ tests/canonical_api.rs | 253 +++++ tests/inner_product_sumcheck.rs | 354 +++++++ tests/multilinear_sumcheck.rs | 299 ++++++ 137 files changed, 11057 insertions(+), 6176 deletions(-) create mode 100644 .github/workflows/bench.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 benches/explanation.rs delete mode 100644 benches/lag-poly-benches/Cargo.lock delete mode 100644 benches/lag-poly-benches/Cargo.toml delete mode 100755 benches/lag-poly-benches/run_benches.sh delete mode 100644 benches/provers.rs delete mode 100644 benches/sumcheck-benches/Cargo.lock delete mode 100644 benches/sumcheck-benches/Cargo.toml delete mode 100755 benches/sumcheck-benches/run_benches.sh delete mode 100644 benches/sumcheck-benches/src/main.rs delete mode 100644 benches/sumcheck-benches/src/validation/mod.rs create mode 100644 benches/sumcheck.rs create mode 100644 docs/design.md create mode 100644 docs/slides.md create mode 100644 docs/slides.pdf create mode 100644 docs/slides.pptx create mode 100644 examples/sumcheck_micro.rs create mode 100644 src/field.rs create mode 100644 src/fold.rs delete mode 100644 src/hypercube/hypercube.rs delete mode 100644 src/hypercube/hypercube_member.rs delete mode 100644 src/interpolation/lagrange_polynomial.rs delete mode 100644 src/interpolation/mod.rs delete mode 100644 src/messages/mod.rs delete mode 100644 src/messages/verifier_messages.rs delete mode 100644 src/multilinear/mod.rs delete mode 100644 src/multilinear/provers/blendy/config.rs delete mode 100644 src/multilinear/provers/blendy/core.rs delete mode 100644 src/multilinear/provers/blendy/mod.rs delete mode 100644 src/multilinear/provers/blendy/prover.rs delete mode 100644 src/multilinear/provers/mod.rs delete mode 100644 src/multilinear/provers/space/config.rs delete mode 100644 src/multilinear/provers/space/core.rs delete mode 100644 src/multilinear/provers/space/mod.rs delete mode 100644 src/multilinear/provers/space/prover.rs delete mode 100644 src/multilinear/provers/time/config.rs delete mode 100644 src/multilinear/provers/time/core.rs delete mode 100644 src/multilinear/provers/time/mod.rs delete mode 100644 src/multilinear/provers/time/prover.rs delete mode 100644 src/multilinear/provers/time/reductions/mod.rs delete mode 100644 src/multilinear/provers/time/reductions/pairwise.rs delete mode 100644 src/multilinear/provers/time/reductions/variablewise.rs delete mode 100644 src/multilinear/sumcheck.rs delete mode 100644 src/multilinear_product/mod.rs delete mode 100644 src/multilinear_product/provers/blendy/config.rs delete mode 100644 src/multilinear_product/provers/blendy/core.rs delete mode 100644 src/multilinear_product/provers/blendy/mod.rs delete mode 100644 src/multilinear_product/provers/blendy/prover.rs delete mode 100644 src/multilinear_product/provers/mod.rs delete mode 100644 src/multilinear_product/provers/space/config.rs delete mode 100644 src/multilinear_product/provers/space/core.rs delete mode 100644 src/multilinear_product/provers/space/mod.rs delete mode 100644 src/multilinear_product/provers/space/prover.rs delete mode 100644 src/multilinear_product/provers/time/config.rs delete mode 100644 src/multilinear_product/provers/time/core.rs delete mode 100644 src/multilinear_product/provers/time/mod.rs delete mode 100644 src/multilinear_product/provers/time/prover.rs delete mode 100644 src/multilinear_product/provers/time/reductions/mod.rs delete mode 100644 src/multilinear_product/provers/time/reductions/pairwise.rs delete mode 100644 src/multilinear_product/provers/time/reductions/variablewise.rs delete mode 100644 src/multilinear_product/sumcheck.rs delete mode 100644 src/order_strategy/ascending/ascending.rs delete mode 100644 src/order_strategy/ascending/mod.rs delete mode 100644 src/order_strategy/core.rs delete mode 100644 src/order_strategy/descending/descending.rs delete mode 100644 src/order_strategy/descending/mod.rs delete mode 100644 src/order_strategy/graycode/graycode.rs delete mode 100644 src/order_strategy/graycode/mod.rs delete mode 100644 src/order_strategy/mod.rs delete mode 100644 src/order_strategy/msb/mod.rs delete mode 100644 src/order_strategy/msb/msb.rs create mode 100644 src/poly_ops.rs create mode 100644 src/proof.rs delete mode 100644 src/prover/core.rs delete mode 100644 src/prover/mod.rs create mode 100644 src/provers/coefficient.rs create mode 100644 src/provers/coefficient_lsb.rs create mode 100644 src/provers/inner_product.rs create mode 100644 src/provers/inner_product_lsb.rs create mode 100644 src/provers/mod.rs create mode 100644 src/provers/multilinear.rs create mode 100644 src/provers/multilinear_lsb.rs create mode 100644 src/reductions/mod.rs create mode 100644 src/reductions/pairwise.rs create mode 100644 src/reductions/tablewise.rs create mode 100644 src/runner.rs create mode 100644 src/simd_fields/goldilocks/avx512.rs create mode 100644 src/simd_fields/goldilocks/mod.rs create mode 100644 src/simd_fields/goldilocks/neon.rs create mode 100644 src/simd_fields/mod.rs create mode 100644 src/simd_sumcheck/dispatch.rs create mode 100644 src/simd_sumcheck/evaluate.rs create mode 100644 src/simd_sumcheck/mod.rs create mode 100644 src/simd_sumcheck/reduce.rs delete mode 100644 src/streams/stream_iterator.rs create mode 100644 src/sumcheck_prover.rs delete mode 100644 src/tests/multilinear/mod.rs delete mode 100644 src/tests/multilinear/provers/basic/config.rs delete mode 100644 src/tests/multilinear/provers/basic/core.rs delete mode 100644 src/tests/multilinear/provers/basic/mod.rs delete mode 100644 src/tests/multilinear/provers/basic/prover.rs delete mode 100644 src/tests/multilinear/provers/mod.rs delete mode 100644 src/tests/multilinear/sanity.rs delete mode 100644 src/tests/multilinear_product/consistency.rs delete mode 100644 src/tests/multilinear_product/mod.rs delete mode 100644 src/tests/multilinear_product/provers/basic/config.rs delete mode 100644 src/tests/multilinear_product/provers/basic/core.rs delete mode 100644 src/tests/multilinear_product/provers/basic/mod.rs delete mode 100644 src/tests/multilinear_product/provers/basic/prover.rs delete mode 100644 src/tests/multilinear_product/provers/mod.rs delete mode 100644 src/tests/multilinear_product/sanity.rs create mode 100644 src/verifier.rs create mode 100644 tests/canonical_api.rs create mode 100644 tests/inner_product_sumcheck.rs create mode 100644 tests/multilinear_sumcheck.rs diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml new file mode 100644 index 00000000..860ad42f --- /dev/null +++ b/.github/workflows/bench.yml @@ -0,0 +1,70 @@ +name: Benchmarks + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: write + deployments: write + +jobs: + benchmark: + name: Criterion benchmarks + # Use self-hosted for stable hardware (no noisy-neighbor variance). + # To use self-hosted: change to ["self-hosted", "linux", "x64"]. + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + build + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: bench-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Detect CPU features + id: cpu + run: | + if grep -q avx512ifma /proc/cpuinfo 2>/dev/null; then + echo "rustflags=-C target-feature=+avx512ifma" >> "$GITHUB_OUTPUT" + echo "label=avx512" >> "$GITHUB_OUTPUT" + echo "::notice::AVX-512 IFMA detected — SIMD benchmarks enabled" + elif [ "$(uname -m)" = "aarch64" ]; then + echo "rustflags=" >> "$GITHUB_OUTPUT" + echo "label=neon" >> "$GITHUB_OUTPUT" + echo "::notice::aarch64 detected — NEON benchmarks enabled" + else + echo "rustflags=" >> "$GITHUB_OUTPUT" + echo "label=scalar" >> "$GITHUB_OUTPUT" + echo "::notice::No SIMD target features detected — scalar benchmarks" + fi + + - name: Run benchmarks + env: + RUSTFLAGS: ${{ steps.cpu.outputs.rustflags }} + run: cargo bench --bench sumcheck -- --output-format bencher | tee output.txt + + - name: Store benchmark results + uses: benchmark-action/github-action-benchmark@v1 + with: + name: "Sumcheck Benchmarks (${{ steps.cpu.outputs.label }})" + tool: cargo + output-file-path: output.txt + # On push to main: commit results to gh-pages for trendline tracking. + # On PR: compare against main baseline and comment. + auto-push: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + github-token: ${{ secrets.GITHUB_TOKEN }} + # Alert thresholds. + alert-threshold: "115%" + comment-on-alert: true + fail-on-alert: false + benchmark-data-dir-path: "dev/bench-${{ steps.cpu.outputs.label }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..2444a5d9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + CARGO_TERM_COLOR: always + +jobs: + check: + name: Build + Test + Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ci-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Build + run: cargo build --release + + - name: Clippy + run: cargo clippy --release -- -D warnings + + - name: Tests + run: cargo test --release diff --git a/.gitignore b/.gitignore index e186dd4a..b7bfef53 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ **/lag-poly-benches/target/ .vscode .DS_Store +.claude/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 990164f8..00a51940 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,50 @@ All notable changes to this project will be documented in this file. -## [Unreleased] +## [Unreleased] — Canonical Rewrite + +### Breaking + +- **Package renamed** from `efficient-sumcheck` to `effsc`. +- **`Transcript` trait redesigned** — `read()`/`write()` replaced with `send()`/`receive()`/`challenge()` to distinguish prover messages from verifier challenges. Enables correct spongefish `VerifierState` interop. +- **Legacy entry points demoted** — `multilinear_sumcheck()`, `inner_product_sumcheck()` are now `pub(crate)`. Use `runner::sumcheck()` with a prover type instead. +- **`Sumcheck` and `ProductSumcheck`** replaced by unified `SumcheckProof`. +- **Order strategies removed** — MSB-only for in-memory workloads; LSB variants added for streaming. ### Added -- **Base/Extension field support**: `multilinear_sumcheck` and `inner_product_sumcheck` now take two type parameters `` — base field for evaluations, extension field for challenges. Set `EF = BF` when no extension is needed. -- `pairwise::cross_field_reduce` — parallel helper for folding `BF` evaluations with an `EF` challenge. + +- **`SumcheckProver` trait** — single extension point for all prover strategies and polynomial shapes. Methods: `degree()`, `round()`, `finalize()`, `final_value()`. +- **`SumcheckField` trait** — generic field interface (not arkworks-specific). Blanket impl for `ark_ff::Field` behind `feature = "arkworks"` (default). +- **`SimdRepr` trait** — safe SIMD opt-in for non-arkworks field types, with layout safety compiler-verified by `zerocopy`. +- **`runner::sumcheck()`** — single protocol runner for any `SumcheckProver`, with partial execution and per-round hooks. +- **`verifier::sumcheck_verify()`** — degree-generic verifier with Lagrange interpolation and `Result`-based error handling. +- **`SumcheckProof`** — unified proof type replacing `Sumcheck` and `ProductSumcheck`. +- **`SumcheckError`** — structured error type with `TranscriptError` variant. +- **`no_hook`** — named no-op hook function (replaces `|_, _| {}`). +- **`TestTranscript`** — renamed from `SanityTranscript` (old name kept as alias). +- **6 concrete provers** (3 shapes × 2 orderings): + - `MultilinearProver` / `MultilinearProverLSB` (degree 1) + - `InnerProductProver` / `InnerProductProverLSB` (degree 2) + - `CoefficientProver` / `CoefficientProverLSB` (degree d) +- **MSB + LSB variable ordering** — MSB (half-split) for in-memory/WHIR, LSB (pair-split) for sequential streaming/Jolt. +- **`arkworks` feature gate** — all ark dependencies optional; non-arkworks users compile with `--no-default-features`. +- **`zerocopy` dependency** — for `SimdRepr` layout verification. +- **CI workflows** — `ci.yml` (build + clippy + test), `bench.yml` (criterion regression tracking with auto SIMD detection). +- **Criterion benchmark harness** — `{multilinear, inner_product} × {F64, F64Ext3} × {2^16, 2^20, 2^24}` + fold throughput. +- **Design document** (`docs/design.md`) — 17-section specification based on Thaler Chapter 4. +- **Slide deck** (`docs/slides.md`, `docs/slides.pdf`) — 30-slide presentation. + +### Changed + +- **SIMD dispatch** uses `SumcheckField::_simd_field_config()` instead of `ark_ff::Field::BasePrimeField::MODULUS`. Same constant-folding behavior, no arkworks dependency in the dispatch path. +- **`CoefficientProver`** (MSB) uses half-split pairing; `CoefficientProverLSB` uses adjacent pairing. Both implement `SumcheckProver`. +- **`reorder_vec`** simplified to `reorder_vec_msb` (bit-reversal only, no order strategy parameter). + +### Removed + +- **~4,500 lines of legacy code**: old `Prover` trait, `TimeProver`/`SpaceProver`/`BlendyProver` (multilinear + product), `OrderStrategy` (ascending/descending/graycode), `messages/`, `interpolation/`, `Hypercube`/`HypercubeMember`, `StreamIterator`. +- **`simd_ops` module** — functionality merged into provers and fold. +- **Old benchmark files** (`provers.rs`, `simd_vs_generic.rs`). ## [0.0.2] - 2026-02-11 diff --git a/Cargo.toml b/Cargo.toml index 7f278d32..30aa08c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "efficient-sumcheck" +name = "effsc" version = "0.0.2" authors = ["arkworks maintainers"] description = "TODO" @@ -8,28 +8,42 @@ include = ["Cargo.toml", "src", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] edition = "2021" [dependencies] -ark-ff = "0.5.0" -ark-poly = "0.5.0" -ark-serialize = "0.5.0" -ark-std ="0.5.0" +ark-ff = { version = "0.5.0", optional = true } +ark-poly = { version = "0.5.0", optional = true } +ark-serialize = { version = "0.5.0", optional = true } +ark-std = { version = "0.5.0", optional = true } memmap2 = "0.9.5" nohash-hasher = "0.2.0" rayon = { version = "1.10", optional = true } -spongefish = { git = "https://github.com/arkworks-rs/spongefish", branch = "main", features = ["ark-ff"] } +spongefish = { git = "https://github.com/z-tech/spongefish.git", branch = "smallfp-support", features = ["ark-ff"], optional = true } +zerocopy = { version = "0.8", features = ["derive"] } [dev-dependencies] criterion = "0.8" [features] -default = ["parallel"] +default = ["arkworks", "parallel"] +arkworks = [ + "dep:ark-ff", + "dep:ark-poly", + "dep:ark-serialize", + "dep:ark-std", + "dep:spongefish", +] parallel = [ "dep:rayon", - "ark-ff/parallel", - "ark-poly/parallel", - "ark-std/parallel", + "ark-ff?/parallel", + "ark-poly?/parallel", + "ark-std?/parallel", ] [[bench]] -name = "provers" -path = "benches/provers.rs" +name = "sumcheck" +path = "benches/sumcheck.rs" harness = false + +[patch.crates-io] +ark-ff = { git = "https://github.com/arkworks-rs/algebra.git", branch = "master" } +ark-poly = { git = "https://github.com/arkworks-rs/algebra.git", branch = "master" } +ark-serialize = { git = "https://github.com/arkworks-rs/algebra.git", branch = "master" } +spongefish = { git = "https://github.com/z-tech/spongefish.git", branch = "smallfp-support" } diff --git a/README.md b/README.md index a64be6ef..5a9e0ec0 100644 --- a/README.md +++ b/README.md @@ -1,162 +1,280 @@

Efficient Sumcheck

-Efficient, streaming capable, sumcheck with **Fiat–Shamir** support via [SpongeFish](https://github.com/arkworks-rs/spongefish). +A high-performance sumcheck library with transparent SIMD acceleration, built-in Fiat-Shamir support, streaming capability, and correctness fuzzed against an [oracle](https://github.com/z-tech/sumcheck-lean4) with formalized completeness and soundness. -**Security note:** This library has not undergone a formal security audit. +This library was built for [arkworks](https://github.com/arkworks-rs) and compatible with any ecosystem that implements the [`SumcheckField`](#generic-field) trait. -## General Use +**Security:** This library has not undergone a security audit. -This library exposes three high-level functions: -1) [`multilinear_sumcheck`](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear_sumcheck.rs#L123), -2) [`inner_product_sumcheck`](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/inner_product_sumcheck.rs#L166), and -3) [`coefficient_sumcheck`](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/coefficient_sumcheck.rs#L17). +## Quick Start -The first two are parameterized by two field types: `BF` (base field, of the evaluations) and `EF` (extension field, of the challenges). When no extension field is needed, set `EF = BF`. +### Multilinear Sumcheck -Using [SpongeFish](https://github.com/arkworks-rs/spongefish) (or similar Fiat-Shamir interface) simply call the functions with the Spongefish transcript: +Proves $H = \displaystyle\sum_{x \in \lbrace 0,1 \rbrace^v} p(x)$ where $p$ is a multilinear polynomial. -### Multilinear Sumcheck -```math -claim = \sum_{x \in \{0,1\}^n} p(x) -``` ```rust -use efficient_sumcheck::{multilinear_sumcheck, Sumcheck}; -use efficient_sumcheck::transcript::SanityTranscript; - -let mut evals_p_01n: Vec = /* ... */; -let mut prover_state = SanityTranscript::new(&mut rng); -let sumcheck_transcript: Sumcheck = multilinear_sumcheck::( - &mut evals_p_01n, - &mut prover_state -); +use effsc::{no_hook, provers::multilinear::MultilinearProver, runner::sumcheck, transcript::TestTranscript}; + +let evals: Vec = /* */; +let num_vars = evals.len().trailing_zeros() as usize; + +let mut prover = MultilinearProver::new(evals); +let mut transcript = TestTranscript::new(&mut rng); +let proof = sumcheck(&mut prover, num_vars, &mut transcript, no_hook); + +// proof.round_polys: Vec> -- g_j at {0, 1, ..., deg} +// proof.challenges: Vec -- r_1, ..., r_v +// proof.final_value: F -- g(r_1, ..., r_v) ``` ### Inner Product Sumcheck -```math -claim = \sum_{x \in \{0,1\}^n} f(x) \cdot g(x) + +Proves $H = \displaystyle\sum_{x \in \lbrace 0,1 \rbrace^v} f(x) \cdot g(x)$ for two multilinear polynomials. Degree-2 round polynomials. + +```rust +use effsc::{provers::inner_product::InnerProductProver, runner::sumcheck}; + +let mut prover = InnerProductProver::new(a, b); +let proof = sumcheck(&mut prover, num_vars, &mut transcript, no_hook); + +// Prover-specific post-state: +let (f_at_r, g_at_r) = prover.final_evaluations(); ``` +### Coefficient Sumcheck + +Proves $H = \displaystyle\sum_{x \in \lbrace 0,1 \rbrace^v} p(x)$ where $\deg_{x_i}(p) \leq d$. The user implements `RoundPolyEvaluator` to define per-pair round polynomial contributions; the library handles iteration, parallelism, and reductions. + ```rust -use efficient_sumcheck::{inner_product_sumcheck, ProductSumcheck}; -use efficient_sumcheck::transcript::SanityTranscript; - -let mut evals_f_01n: Vec = /* ... */; -let mut evals_g_01n: Vec = /* ... */; -let mut prover_state = SanityTranscript::new(&mut rng); -let sumcheck_transcript: ProductSumcheck = inner_product_sumcheck::( - &mut evals_f_01n, - &mut evals_g_01n, - &mut prover_state +use effsc::coefficient_sumcheck::{coefficient_sumcheck, RoundPolyEvaluator}; + +struct MyEvaluator; +impl RoundPolyEvaluator for MyEvaluator { + fn degree(&self) -> usize { 1 } + fn accumulate_pair( + &self, + coeffs: &mut [F], + tw: &[(&[F], &[F])], + pw: &[(F, F)], + ) { + let (even, odd) = pw[0]; + coeffs[0] += even; + coeffs[1] += odd - even; + } +} + +let result = coefficient_sumcheck( + &MyEvaluator, + &mut tablewise, + &mut pairwise, + num_rounds, + &mut transcript, ); ``` -### Coefficient Sumcheck -```math -claim = \sum_{x \in \{0,1\}^n} p(x), \quad \deg_{x_i}(p) \leq d +Or via the `SumcheckProver` trait: + +```rust +use effsc::{provers::coefficient::CoefficientProver, runner::sumcheck}; + +let mut prover = CoefficientProver::new(&MyEvaluator, tablewise, pairwise); +let proof = sumcheck(&mut prover, num_rounds, &mut transcript, no_hook); ``` -Unlike the multilinear and inner product variants where `p` is multilinear (degree 1 in each variable, yielding degree-1 round polynomials), `coefficient_sumcheck` handles polynomials with arbitrary per-variable degree `d`, producing degree-`d` round polynomials. The user supplies a closure `compute_round_poly` that computes each round polynomial; the library handles transcript interaction and table reductions (both pairwise and tablewise) automatically. +### Verification + +One verifier for any degree $d$: ```rust -use efficient_sumcheck::coefficient_sumcheck::{coefficient_sumcheck, CoefficientSumcheck}; -use efficient_sumcheck::transcript::SanityTranscript; -use ark_poly::univariate::DensePolynomial; - -let mut tablewise: Vec>> = /* multi-column tables */; -let mut pairwise: Vec> = /* flat evaluation vectors */; -let mut transcript = SanityTranscript::new(&mut rng); - -let result: CoefficientSumcheck = coefficient_sumcheck( - |tablewise, pairwise| { - // Compute h(X) as a DensePolynomial from current table state. - // Return coefficients in ascending order: [c0, c1, ..., cd]. - DensePolynomial::from_coefficients_vec(vec![/* ... */]) - }, - &mut tablewise, - &mut pairwise, - n_rounds, - &mut transcript, -); +use effsc::verifier::sumcheck_verify; + +let result = sumcheck_verify(claimed_sum, degree, num_rounds, &mut transcript, no_hook_verify); +match result { + Ok((final_claim, challenges)) => { /* caller checks final_claim = g(r) */ } + Err(e) => { /* consistency check failed */ } +} +``` + +### Fold + +The fold primitive is exposed for callers that need it independently of the sumcheck protocol (e.g., WHIR's `multilinear_fold`): + +$$\tilde{p}(x_2, \ldots, x_v) = r_1 \cdot \tilde{p}(1, x_2, \ldots, x_v) + (1 - r_1) \cdot \tilde{p}(0, x_2, \ldots, x_v)$$ + +```rust +use effsc::fold; + +fold(&mut evals, challenge); // MSB half-split, SIMD-accelerated ``` -The closure receives immutable references to the current tables; after each round the library automatically reduces all pairwise and tablewise entries by folding with the verifier challenge. +## The Prover Trait -## Examples +All provers implement `SumcheckProver`: -### 1) WARP - Multilinear Constraint Batching +```rust +pub trait SumcheckProver { + fn degree(&self) -> usize; + fn round(&mut self, challenge: Option) -> Vec; + fn finalize(&mut self, last_challenge: F); + fn final_value(&self) -> F; +} +``` -Before integration, [WARP](https://github.com/compsec-epfl/warp) used 200+ lines of sumcheck related code including calls to SpongeFish, pair- and table-wise reductions, as well as sparse-map foldings ([PR #14](https://github.com/compsec-epfl/warp/pull/14), [PR #12](https://github.com/compsec-epfl/warp/pull/12/changes#diff-904f410986c619441fb8554f4840cb36613f2de354b41ca991d381dec78959b0L34)). +The protocol runner calls `round()` once per round. The caller retains `&mut P` ownership after sumcheck and can query prover-specific post-state (e.g., folded vectors for WHIR, claimed $W$ values for GKR). -Using Efficient Sumcheck this reduces to six lines of code and brings parallelization via Rayon (and soon vectorization via SIMD): +## Generic Field + +The library is generic over any type implementing `SumcheckField`: ```rust -use efficient_sumcheck::{inner_product_sumcheck, batched_constraint_poly}; +pub trait SumcheckField: + Copy + Send + Sync + PartialEq + Debug + + Add + Sub + Mul + Neg + AddAssign + SubAssign + MulAssign + + Sum + 'static +{ + const ZERO: Self; + const ONE: Self; + fn from_u64(val: u64) -> Self; + fn inverse(&self) -> Option; +} +``` -let alpha = inner_product_sumcheck::( - &mut f, - &mut batched_constraint_poly(&dense_evals, &sparse_evals), +A blanket implementation for all `ark_ff::Field` types is provided when the `arkworks` feature is enabled (default). Non-arkworks users compile with `--no-default-features` and implement the trait for their own field type. + +## Variable Ordering + +Two layouts are supported, corresponding to different data availability patterns: + +| Prover | Layout | Fold pairing | Best for | +|--------|--------|-------------|----------| +| `MultilinearProver` | MSB (half-split) | $(v_k,\ v_{k+L/2})$ | In-memory, WHIR | +| `MultilinearProverLSB` | LSB (pair-split) | $(v_{2k},\ v_{2k+1})$ | Sequential streaming, Jolt | +| `InnerProductProver` | MSB | $(a_k \cdot b_k,\ a_{k+L/2} \cdot b_{k+L/2})$ | In-memory, WHIR | +| `InnerProductProverLSB` | LSB | $(a_{2k} \cdot b_{2k},\ a_{2k+1} \cdot b_{2k+1})$ | Sequential streaming, Jolt | +| `CoefficientProver` | MSB | half-split pairs | In-memory, WARP | +| `CoefficientProverLSB` | LSB | adjacent pairs | Sequential streaming, Jolt | + +MSB is optimal when the full table is in memory or seekable on disk. LSB is optimal when evaluations arrive incrementally (e.g., Jolt CPU trace) — adjacent pairs are immediately available for folding. + +## Partial Execution and Hooks + +The `sumcheck()` runner supports partial execution (`num_rounds < v`) and per-round hooks for composed protocols: + +```rust +// WHIR: partial sumcheck with proof-of-work grinding +let proof = sumcheck( + &mut InnerProductProver::new(a, b), + folding_factor, &mut transcript, -).verifier_messages; + |_, t| round_pow.prove(t), +); ``` -Here, `batched_constraint_poly` merges dense evaluation vectors (out-of-domain samples) with sparse map-represented polynomials (in-domain queries) into a single constraint polynomial, ready for the inner product sumcheck. +GKR compatibility (custom `SumcheckProver` impls with post-state inspection) is planned — see [`docs/design.md` section 10](docs/design.md). -### 2) WARP - Twin Constraint Batching +## SIMD Acceleration -[WARP](https://github.com/compsec-epfl/warp) also uses `coefficient_sumcheck` with `folding::protogalaxy::fold` to batch a codeword check and an R1CS constraint check into a single sumcheck. The codewords, witness vectors, and folding coefficients are stored as tablewise tables and the equality polynomial evaluations as a pairwise vector: +All provers auto-dispatch to SIMD-accelerated backends. Supported fields: + +- [x] Goldilocks ($p = 2^{64} - 2^{32} + 1$) and degree-2/3 extensions +- [ ] M31 ($p = 2^{31} - 1$) and extensions +- [ ] BabyBear ($p = 2^{31} - 2^{27} + 1$) and extensions +- [ ] KoalaBear ($p = 2^{31} - 2^{24} + 1$) and extensions + +| Backend | Width | Platform | +|---------|-------|----------| +| NEON | 2-wide | aarch64 (Apple M-series, Graviton) | +| AVX-512 IFMA | 8-wide | x86_64 (Sapphire Rapids) | + +Detection is constant-folded by LLVM after monomorphization. Zero overhead on non-Goldilocks fields. + +Non-arkworks Goldilocks types opt into SIMD via the `SimdRepr` trait, whose layout safety is compiler-verified by `zerocopy`: ```rust -use efficient_sumcheck::coefficient_sumcheck::coefficient_sumcheck; -use efficient_sumcheck::folding::protogalaxy; +#[derive(zerocopy::IntoBytes, zerocopy::FromBytes, zerocopy::Immutable)] +#[repr(transparent)] +struct MyGoldilocks(u64); -let mut tablewise = [codewords, z_vecs, alpha_vecs, beta_vecs]; -let mut pairwise = [tau_eq_evals]; +impl SimdRepr for MyGoldilocks { + fn modulus() -> u64 { GOLDILOCKS_P } +} +``` -let sc = coefficient_sumcheck( - |tw, pw| { - let (u, z, a, b) = (&tw[0], &tw[1], &tw[2], &tw[3]); - let tau = &pw[0]; +To enable AVX-512: +```bash +RUSTFLAGS="-C target-feature=+avx512ifma" cargo build --release +``` - let f = protogalaxy::fold(/* ... */, /* codeword polys */); - let p = protogalaxy::fold(/* ... */, /* constraint polys */); - let t = linear_poly(tau[0], tau[1]); +## Zero-Allocation Polynomial Arithmetic - // h(X) = (f(X) + ω·p(X)) · t(X) - (f + p * omega).naive_mul(&t) - }, - &mut tablewise, - &mut pairwise, - log_l, - &mut prover_state, -); -let gamma = sc.verifier_messages; +> **Note:** `poly_ops` will be upstreamed to arkworks soon. + +The `poly_ops` module provides slice-based polynomial arithmetic: + +```rust +use effsc::poly_ops; + +let mut out = [F::ZERO; 3]; +poly_ops::mul_into(&mut out, &a, &b); +poly_ops::add_scaled(&mut out, scalar, &c); +let val = poly_ops::eval_at(&out, challenge); +``` + +## Features + +```toml +[features] +default = ["arkworks", "parallel"] +arkworks = ["ark-ff", "ark-poly", "ark-serialize", "ark-std", "spongefish"] +parallel = ["rayon"] +``` + +- `arkworks` (default): blanket `SumcheckField` impl for `ark_ff::Field` +- `parallel` (default): rayon parallelism for fold and round computation +- `--no-default-features`: pure `SumcheckField` library, no arkworks dependency + +## Benchmarks + +```bash +cargo bench --bench sumcheck ``` -After each round `coefficient_sumcheck` reduces all four tablewise tables and the pairwise equality evaluations by folding with the verifier's challenge. +Benchmark matrix: `{multilinear, inner_product} x {F64, F64Ext3} x {2^16, 2^20, 2^24}` plus fold kernel throughput. CI tracks regressions via [github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark). + +## Integration Examples + +### WHIR + +[WHIR](https://github.com/WizardOfMenlo/whir) uses partial inner-product sumcheck with per-round proof-of-work hooks. See [`docs/design.md` section 11](docs/design.md). -## Advanced Usage +### WARP -Supporting the high-level interfaces are raw implementations of sumcheck [[LFKN92](#references)] using three proving algorithms: +[WARP](https://github.com/compsec-epfl/warp) uses `CoefficientProver` with `folding::protogalaxy::fold` to batch codeword + R1CS constraint checks into a single sumcheck. -- The quasi-linear time and logarithmic space algorithm of [[CTY11](#references)] - - [SpaceProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear/provers/space/core.rs#L8) - - [SpaceProductProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear_product/provers/space/core.rs#L11) +### Jolt -- The linear time and linear space algorithm of [[VSBW13](#references)] - - [TimeProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear/provers/time/core.rs#L7) - - [TimeProductProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear_product/provers/time/core.rs#L16) +[Jolt](https://github.com/a16z/jolt) compatibility is via an adapter struct that bridges `SumcheckProver` to Jolt's `SumcheckInstanceProver`. Use `MultilinearProverLSB` / `InnerProductProverLSB` for Jolt's default LSB binding order. See [`docs/design.md` section 12](docs/design.md). -- The linear time and sublinear space algorithms of [[CFFZ24](#references)] and [[BCFFMMZ25](#references)] respectively - - [BlendyProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear/provers/blendy/core.rs#L14) - - [BlendyProductProver](https://github.com/compsec-epfl/efficient-sumcheck/blob/main/src/multilinear_product/provers/blendy/core.rs#L13) +## Prover Strategies + +| Strategy | Reference | +|----------|-----------| +| Time (linear time, linear space) | [VSBW13] | +| Blendy (linear time, sublinear space) | [CFFZ24], [BCFFMMZ25] | +| Space (quasilinear time, logarithmic space) | [CTY11] | ## References -[[LFNK92](https://dl.acm.org/doi/pdf/10.1145/146585.146605)]: Carsten Lund, Lance Fortnow, Howard J. Karloff, and Noam Nisan. “Algebraic Methods for Interactive Proof Systems”. In: Journal of the ACM 39.4 (1992). -[[CTY11](https://arxiv.org/pdf/1109.6882.pdf)]: Graham Cormode, Justin Thaler, and Ke Yi. “Verifying computations with streaming interactive proofs”. In: Proceedings of the VLDB Endowment 5.1 (2011), pp. 25–36. +[[LFKN92](https://dl.acm.org/doi/pdf/10.1145/146585.146605)]: Carsten Lund, Lance Fortnow, Howard J. Karloff, and Noam Nisan. "Algebraic Methods for Interactive Proof Systems". In: Journal of the ACM 39.4 (1992). + +[[CTY11](https://arxiv.org/pdf/1109.6882.pdf)]: Graham Cormode, Justin Thaler, and Ke Yi. "Verifying computations with streaming interactive proofs". In: Proceedings of the VLDB Endowment 5.1 (2011), pp. 25-36. -[[VSBW13](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6547112)]: Victor Vu, Srinath Setty, Andrew J. Blumberg, and Michael Walfish. “A hybrid architecture for interactive verifiable computation”. In: Proceedings of the 34th IEEE Symposium on Security and Privacy. Oakland ’13. 2013, pp. 223–237. +[[VSBW13](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6547112)]: Victor Vu, Srinath Setty, Andrew J. Blumberg, and Michael Walfish. "A hybrid architecture for interactive verifiable computation". In: Proceedings of the 34th IEEE Symposium on Security and Privacy. Oakland '13. 2013, pp. 223-237. [[CFFZ24](https://eprint.iacr.org/2024/524.pdf)]: Alessandro Chiesa, Elisabetta Fedele, Giacomo Fenzi, Andrew Zitek-Estrada. "A time-space tradeoff for the sumcheck prover". In: Cryptology ePrint Archive. -[[BCFFMMZ25](https://eprint.iacr.org/2025/1473.pdf)]: Anubhav Bawejal, Alessandro Chiesa, Elisabetta Fedele, Giacomo Fenzi, Pratyush Mishra, Tushar Mopuri, and Andrew Zitek-Estrada. "Time-Space Trade-Offs for Sumcheck". In: TCC Theory of Cryptography: 23rd International Conference, pp. 37. +[[BCFFMMZ25](https://eprint.iacr.org/2025/1473.pdf)]: Anubhav Baweja, Alessandro Chiesa, Elisabetta Fedele, Giacomo Fenzi, Pratyush Mishra, Tushar Mopuri, and Andrew Zitek-Estrada. "Time-Space Trade-Offs for Sumcheck". In: TCC Theory of Cryptography: 23rd International Conference, pp. 37. + +[[Thaler23](https://people.cs.georgetown.edu/jthaler/ProofsArgsAndZK.pdf)]: Justin Thaler. "Proofs, Arguments, and Zero-Knowledge". Chapter 4: Interactive Proofs. July 2023. + +[[BDDT25](https://eprint.iacr.org/2025/1117.pdf)]: Aarushi Bagad, Quang Dao, Yuri Domb, and Justin Thaler. "Speeding Up Sum-Check Proving". Cryptology ePrint Archive, 2025/1117. diff --git a/benches/explanation.rs b/benches/explanation.rs deleted file mode 100644 index 5323a06e..00000000 --- a/benches/explanation.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn main() { - eprintln!("Error: This project uses a custom benchmarking workflow."); - eprintln!("Please navigate to the appropriate bench directory and call the shell './run_bench.sh' directly."); - std::process::exit(1); -} diff --git a/benches/lag-poly-benches/Cargo.lock b/benches/lag-poly-benches/Cargo.lock deleted file mode 100644 index 424bb95d..00000000 --- a/benches/lag-poly-benches/Cargo.lock +++ /dev/null @@ -1,443 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", - "itertools", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "arrayvec", - "digest", - "educe", - "itertools", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "arrayvec", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "crypto-common", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "lag-poly-benches" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-ff", - "ark-poly", - "ark-std", - "space-efficient-sumcheck", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "space-efficient-sumcheck" -version = "0.0.2" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-std", -] - -[[package]] -name = "syn" -version = "2.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/benches/lag-poly-benches/Cargo.toml b/benches/lag-poly-benches/Cargo.toml deleted file mode 100644 index 9b942a60..00000000 --- a/benches/lag-poly-benches/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "lag-poly-benches" -version = "0.1.0" -edition = "2021" - -[dependencies] -ark-ff = "0.5.0" -ark-poly = "0.5.0" -ark-std ="0.5.0" -ark-bn254 = "0.5.0" -space-efficient-sumcheck = { path = "../../." } - diff --git a/benches/lag-poly-benches/run_benches.sh b/benches/lag-poly-benches/run_benches.sh deleted file mode 100755 index 3b116cc9..00000000 --- a/benches/lag-poly-benches/run_benches.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -# We measure (i) wall time; and (ii) maximum resident set size, using the GNU-time facility. - -num_vars=15 -while [ $num_vars -le 30 ]; do - # NOTE FOR NEXT LINE: mac --> "gtime", linux --> "time" - output=`(gtime -v ./target/release/lag-poly-benches $num_vars) 2>&1` - user_time_seconds=$(echo "$output" | grep "User time (seconds):" | awk '{print $4}') - user_time_ms=$(awk "BEGIN {printf \"%.0f\", $user_time_seconds * 1000}") - ram_kilobytes=$(echo "$output" | grep "Maximum resident set size (kbytes)" | awk '{print $6}') - ram_bytes=$(echo "$ram_kilobytes" | awk '{ printf "%.0f", $1 * 1000 }') - echo "graycode, $num_vars, $user_time_ms, $ram_bytes" - num_vars=$((num_vars + 1)) -done - -# NOTE: helpful Unix commands -# -# 1) You can run this shell in the background while piping the output to a file like so: -# nohup ./run_benches.sh &> output_file.txt & -# -# 2) If you need to kill the running process you can find pid with: -# lsof | grep output_file -# Then: -# kill \ No newline at end of file diff --git a/benches/provers.rs b/benches/provers.rs deleted file mode 100644 index 2a0bed36..00000000 --- a/benches/provers.rs +++ /dev/null @@ -1,69 +0,0 @@ -use ark_std::{hint::black_box, time::Duration}; -use criterion::{ - criterion_group, criterion_main, measurement::WallTime, BatchSize, BenchmarkGroup, Criterion, -}; - -use efficient_sumcheck::{ - multilinear::TimeProver, - multilinear_product::TimeProductProver, - prover::{ProductProverConfig, Prover, ProverConfig}, - tests::{BenchStream, F128}, - ProductSumcheck, Sumcheck, -}; - -fn get_bench_group(c: &mut Criterion) -> BenchmarkGroup<'_, WallTime> { - let mut group = c.benchmark_group("sumcheck_prover"); - group - .sample_size(10) - .warm_up_time(Duration::from_secs(2)) - .measurement_time(Duration::from_secs(10)); - group -} - -fn time_prover_bench(c: &mut Criterion) { - let num_vars = 24usize; - get_bench_group(c).bench_function("time_prover", |bencher| { - bencher.iter_batched( - || { - let stream = BenchStream::::new(num_vars); - TimeProver::>::new( - > as Prover>::ProverConfig::default( - num_vars, stream, - ), - ) - }, - |mut prover: TimeProver>| { - black_box(Sumcheck::::prove::< - BenchStream, - TimeProver>, - >(&mut prover, &mut ark_std::test_rng())); - }, - BatchSize::LargeInput, - ) - }); -} - -fn time_product_prover_bench(c: &mut Criterion) { - let num_vars = 24usize; - get_bench_group(c).bench_function("time_product_prover", |bencher| { - bencher.iter_batched( - || { - let stream = BenchStream::::new(num_vars); - let streams: Vec> = vec![stream.clone(), stream.clone()]; - TimeProductProver::>::new(ProductProverConfig::default( - num_vars, streams, - )) - }, - |mut prover: TimeProductProver>| { - black_box(ProductSumcheck::::prove::< - BenchStream, - TimeProductProver>, - >(&mut prover, &mut ark_std::test_rng())); - }, - BatchSize::LargeInput, - ) - }); -} - -criterion_group!(benches, time_product_prover_bench, time_prover_bench); -criterion_main!(benches); diff --git a/benches/sumcheck-benches/Cargo.lock b/benches/sumcheck-benches/Cargo.lock deleted file mode 100644 index 0eff14c6..00000000 --- a/benches/sumcheck-benches/Cargo.lock +++ /dev/null @@ -1,454 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", - "itertools", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "arrayvec", - "digest", - "educe", - "itertools", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "arrayvec", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "crypto-common", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "efficient-sumcheck" -version = "0.0.2" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "memmap2", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "sumcheck-benches" -version = "0.1.0" -dependencies = [ - "ark-bn254", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "efficient-sumcheck", -] - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/benches/sumcheck-benches/Cargo.toml b/benches/sumcheck-benches/Cargo.toml deleted file mode 100644 index 21abef8d..00000000 --- a/benches/sumcheck-benches/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "sumcheck-benches" -version = "0.1.0" -edition = "2021" - -[dependencies] -ark-ff = "0.5.0" -ark-poly = "0.5.0" -ark-serialize = "0.5.0" -ark-std ="0.5.0" -ark-bn254 = "0.5.0" -efficient-sumcheck = { path = "../../.", default-features = false } - -[profile.release] -debug = true diff --git a/benches/sumcheck-benches/run_benches.sh b/benches/sumcheck-benches/run_benches.sh deleted file mode 100755 index 339174ac..00000000 --- a/benches/sumcheck-benches/run_benches.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh - -# We measure (i) wall time; and (ii) maximum resident set size, using the GNU-time facility. - -algorithms="VSBW Blendy2 Blendy1 Blendy3 Blendy4 CTY ProductBlendy2 ProductVSBW ProductCTY" -fields="Field64 Field128 FieldBn254" - -for algorithm in $algorithms; do - for field in $fields; do - num_vars=16 - while [ $num_vars -le 30 ]; do - case "$algorithm" in - "Blendy1") stage_size="1" ;; - "Blendy2") stage_size="2" ;; - "Blendy3") stage_size="3" ;; - "Blendy4") stage_size="4" ;; - "VSBW") stage_size="1" ;; - "CTY") stage_size="1" ;; - "ProductBlendy2") stage_size="2" ;; - "ProductVSBW") stage_size="1" ;; - "ProductCTY") stage_size="1" ;; - *) ;; - esac - case "$algorithm" in - "Blendy1") algorithm_label="Blendy" ;; - "Blendy2") algorithm_label="Blendy" ;; - "Blendy3") algorithm_label="Blendy" ;; - "Blendy4") algorithm_label="Blendy" ;; - "VSBW") algorithm_label="VSBW" ;; - "CTY") algorithm_label="CTY" ;; - "ProductBlendy2") algorithm_label="ProductBlendy" ;; - "ProductVSBW") algorithm_label="ProductVSBW" ;; - "ProductCTY") algorithm_label="ProductCTY" ;; - *) ;; - esac - # NOTE FOR NEXT LINE: mac --> "gtime", linux --> "time" - output=`(gtime -v ./target/release/sumcheck-benches $algorithm_label $field $num_vars $stage_size) 2>&1` - user_time_seconds=$(echo "$output" | grep "User time (seconds):" | awk '{print $4}') - user_time_ms=$(awk "BEGIN {printf \"%.0f\", $user_time_seconds * 1000}") - ram_kilobytes=$(echo "$output" | grep "Maximum resident set size (kbytes)" | awk '{print $6}') - ram_bytes=$(echo "$ram_kilobytes" | awk '{ printf "%.0f", $1 * 1000 }') - echo "$algorithm, $field, $num_vars, $user_time_ms, $num_vars, $ram_bytes" - num_vars=$((num_vars + 2)) - done - done -done - -# NOTE: helpful Unix commands -# -# 1) You can run this shell in the background while piping the output to a file like so: -# nohup ./run_benches.sh &> output_file.txt & -# -# 2) If you need to kill the running process you can find pid with: -# lsof | grep output_file -# Then: -# kill diff --git a/benches/sumcheck-benches/src/main.rs b/benches/sumcheck-benches/src/main.rs deleted file mode 100644 index 5de34666..00000000 --- a/benches/sumcheck-benches/src/main.rs +++ /dev/null @@ -1,122 +0,0 @@ -use ark_ff::Field; - -use efficient_sumcheck::{ - multilinear::{ - BlendyProver, BlendyProverConfig, ReduceMode, SpaceProver, SpaceProverConfig, TimeProver, - TimeProverConfig, - }, - multilinear_product::{ - BlendyProductProver, BlendyProductProverConfig, SpaceProductProver, - SpaceProductProverConfig, TimeProductProver, TimeProductProverConfig, - }, - prover::{Prover, ProverConfig}, - tests::{BenchStream, F128, F64}, - ProductSumcheck, Sumcheck, -}; - -pub mod validation; -use validation::{validate_and_format_command_line_args, AlgorithmLabel, BenchArgs, FieldLabel}; - -fn run_on_field(bench_args: BenchArgs) { - let mut rng = ark_std::test_rng(); - let s = BenchStream::::new(bench_args.num_variables); - - // switch on algorithm_label - match bench_args.algorithm_label { - AlgorithmLabel::Blendy => { - let config: BlendyProverConfig> = - BlendyProverConfig::>::default(bench_args.num_variables, s); - let transcript = Sumcheck::::prove::, BlendyProver>>( - &mut BlendyProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - AlgorithmLabel::VSBW => { - let config: TimeProverConfig> = - TimeProverConfig::>::new( - bench_args.num_variables, - s, - ReduceMode::Pairwise, - ); - let transcript = Sumcheck::::prove::, TimeProver>>( - &mut TimeProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - AlgorithmLabel::CTY => { - let config: SpaceProverConfig> = - SpaceProverConfig::>::default(bench_args.num_variables, s); - let transcript = Sumcheck::::prove::, SpaceProver>>( - &mut SpaceProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - AlgorithmLabel::ProductVSBW => { - let config: TimeProductProverConfig> = - TimeProductProverConfig::>::new( - bench_args.num_variables, - vec![s.clone(), s], - ); - let transcript = ProductSumcheck::::prove::< - BenchStream, - TimeProductProver>, - >( - &mut TimeProductProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - AlgorithmLabel::ProductBlendy => { - let config: BlendyProductProverConfig> = - BlendyProductProverConfig::>::new( - bench_args.num_variables, - bench_args.stage_size, - vec![s.clone(), s], - ); - let transcript = ProductSumcheck::::prove::< - BenchStream, - BlendyProductProver>, - >( - &mut BlendyProductProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - AlgorithmLabel::ProductCTY => { - let config: SpaceProductProverConfig> = - SpaceProductProverConfig::>::new( - bench_args.num_variables, - vec![s.clone(), s], - ); - let transcript = ProductSumcheck::::prove::< - BenchStream, - SpaceProductProver>, - >( - &mut SpaceProductProver::>::new(config), - &mut rng, - ); - assert!(transcript.is_accepted); - } - }; -} - -fn main() { - // Collect command line arguments - let bench_args: BenchArgs = validate_and_format_command_line_args(std::env::args().collect()); - // Run the requested bench - match bench_args.field_label { - FieldLabel::Field64 => { - run_on_field::(bench_args); - } - FieldLabel::Field128 => { - run_on_field::(bench_args); - } - FieldLabel::FieldBn254 => { - // run_on_field::(bench_args); - run_on_field::(bench_args); - } - }; -} diff --git a/benches/sumcheck-benches/src/validation/mod.rs b/benches/sumcheck-benches/src/validation/mod.rs deleted file mode 100644 index ff6f00e2..00000000 --- a/benches/sumcheck-benches/src/validation/mod.rs +++ /dev/null @@ -1,104 +0,0 @@ -#[derive(Debug)] -pub enum FieldLabel { - Field64, - Field128, - FieldBn254, -} - -#[derive(Debug)] -pub enum AlgorithmLabel { - CTY, - VSBW, - Blendy, - ProductBlendy, - ProductVSBW, - ProductCTY, -} - -pub struct BenchArgs { - pub field_label: FieldLabel, - pub algorithm_label: AlgorithmLabel, - pub num_variables: usize, - pub stage_size: usize, -} - -fn check_if_number(input_string: String) -> bool { - match input_string.parse::() { - Ok(_) => true, - Err(_) => false, - } -} - -pub fn validate_and_format_command_line_args(argsv: Vec) -> BenchArgs { - // Check if the correct number of command line arguments is provided - if argsv.len() != 5 { - eprintln!( - "Usage: {} field_label algorithm_label num_variables stage_size", - argsv[0] - ); - std::process::exit(1); - } - // algorithm label - if !(argsv[1] == "CTY" - || argsv[1] == "VSBW" - || argsv[1] == "Blendy" - || argsv[1] == "ProductBlendy" - || argsv[1] == "ProductVSBW" - || argsv[1] == "ProductCTY") - { - eprintln!( - "Usage: {} field_label algorithm_label num_variables stage_size", - argsv[0] - ); - eprintln!("Invalid input: algorithm_label must be one of (CTY, VSBW, Blendy, ProductVSBW, ProductBlendy, ProductCTY)"); - std::process::exit(1); - } - let algorithm_label = match argsv[1].as_str() { - "CTY" => AlgorithmLabel::CTY, - "VSBW" => AlgorithmLabel::VSBW, - "Blendy" => AlgorithmLabel::Blendy, - "ProductVSBW" => AlgorithmLabel::ProductVSBW, - "ProductCTY" => AlgorithmLabel::ProductCTY, - _ => AlgorithmLabel::ProductBlendy, // this is checked in previous line - }; - // field_label - if !(argsv[2] == "Field64" || argsv[2] == "Field128" || argsv[2] == "FieldBn254") { - eprintln!( - "Usage: {} field_label algorithm_label num_variables stage_size", - argsv[0] - ); - eprintln!("Invalid input: field_label must be one of (Field64, Field128, FieldBn254)"); - std::process::exit(1); - } - let field_label = match argsv[2].as_str() { - "Field64" => FieldLabel::Field64, - "Field128" => FieldLabel::Field128, - _ => FieldLabel::FieldBn254, // this is checked in previous line - }; - // num_variables - if !check_if_number(argsv[3].clone()) { - eprintln!( - "Usage: {} field_label algorithm_label num_variables stage_size", - argsv[0] - ); - eprintln!("Invalid input: num_variables must be a number"); - std::process::exit(1); - } - let num_variables = argsv[3].clone().parse::().unwrap(); - // stage_size - if !check_if_number(argsv[4].clone()) { - eprintln!( - "Usage: {} field_label algorithm_label num_variables stage_size", - argsv[0] - ); - eprintln!("Invalid input: stage_size must be a number"); - std::process::exit(1); - } - let stage_size = argsv[4].clone().parse::().unwrap(); - return BenchArgs { - field_label, - algorithm_label, - num_variables, - stage_size, - }; -} diff --git a/benches/sumcheck.rs b/benches/sumcheck.rs new file mode 100644 index 00000000..8a369bd5 --- /dev/null +++ b/benches/sumcheck.rs @@ -0,0 +1,190 @@ +//! Sumcheck benchmarks for the canonical API. +//! +//! Matrix: {multilinear, inner_product} × {F64, F64Ext3} × {2^16, 2^20, 2^24} +//! Plus: fold kernel throughput. +//! +//! Run: cargo bench --bench sumcheck +//! AVX: RUSTFLAGS="-C target-feature=+avx512ifma" cargo bench --bench sumcheck + +use ark_ff::UniformRand; +use ark_std::{hint::black_box, time::Duration}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; + +use effsc::provers::inner_product::InnerProductProver; +use effsc::provers::multilinear::MultilinearProver; +use effsc::runner::sumcheck; +use effsc::tests::{F64Ext3, F64}; +use effsc::transcript::SanityTranscript; + +const SIZES: [usize; 3] = [16, 20, 24]; + +fn multilinear_f64(c: &mut Criterion) { + let mut g = c.benchmark_group("multilinear/F64"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + (0..n).map(|_| F64::rand(&mut rng)).collect::>() + }, + |evals| { + let mut p = MultilinearProver::new(evals); + let mut rng = ark_std::test_rng(); + let mut t = SanityTranscript::new(&mut rng); + black_box(sumcheck(&mut p, nv, &mut t, |_, _| {})); + }, + ); + }); + } + g.finish(); +} + +fn multilinear_ext3(c: &mut Criterion) { + let mut g = c.benchmark_group("multilinear/F64Ext3"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + (0..n).map(|_| F64Ext3::rand(&mut rng)).collect::>() + }, + |evals| { + let mut p = MultilinearProver::new(evals); + let mut rng = ark_std::test_rng(); + let mut t = SanityTranscript::new(&mut rng); + black_box(sumcheck(&mut p, nv, &mut t, |_, _| {})); + }, + ); + }); + } + g.finish(); +} + +fn inner_product_f64(c: &mut Criterion) { + let mut g = c.benchmark_group("inner_product/F64"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + let a: Vec = (0..n).map(|_| F64::rand(&mut rng)).collect(); + let b: Vec = (0..n).map(|_| F64::rand(&mut rng)).collect(); + (a, b) + }, + |(a, b)| { + let mut p = InnerProductProver::new(a, b); + let mut rng = ark_std::test_rng(); + let mut t = SanityTranscript::new(&mut rng); + black_box(sumcheck(&mut p, nv, &mut t, |_, _| {})); + }, + ); + }); + } + g.finish(); +} + +fn inner_product_ext3(c: &mut Criterion) { + let mut g = c.benchmark_group("inner_product/F64Ext3"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + let a: Vec = (0..n).map(|_| F64Ext3::rand(&mut rng)).collect(); + let b: Vec = (0..n).map(|_| F64Ext3::rand(&mut rng)).collect(); + (a, b) + }, + |(a, b)| { + let mut p = InnerProductProver::new(a, b); + let mut rng = ark_std::test_rng(); + let mut t = SanityTranscript::new(&mut rng); + black_box(sumcheck(&mut p, nv, &mut t, |_, _| {})); + }, + ); + }); + } + g.finish(); +} + +fn fold_f64(c: &mut Criterion) { + let mut g = c.benchmark_group("fold/F64"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + let evals: Vec = (0..n).map(|_| F64::rand(&mut rng)).collect(); + let w = F64::rand(&mut rng); + (evals, w) + }, + |(mut evals, w)| { + effsc::fold(&mut evals, w); + black_box(evals); + }, + ); + }); + } + g.finish(); +} + +fn fold_ext3(c: &mut Criterion) { + let mut g = c.benchmark_group("fold/F64Ext3"); + g.sample_size(10) + .warm_up_time(Duration::from_secs(1)) + .measurement_time(Duration::from_secs(5)); + for nv in SIZES { + let n = 1usize << nv; + g.throughput(Throughput::Elements(n as u64)); + g.bench_function(BenchmarkId::from_parameter(format!("2^{nv}")), |b| { + b.iter_with_setup( + || { + let mut rng = ark_std::test_rng(); + let evals: Vec = (0..n).map(|_| F64Ext3::rand(&mut rng)).collect(); + let w = F64Ext3::rand(&mut rng); + (evals, w) + }, + |(mut evals, w)| { + effsc::fold(&mut evals, w); + black_box(evals); + }, + ); + }); + } + g.finish(); +} + +criterion_group!( + benches, + multilinear_f64, + multilinear_ext3, + inner_product_f64, + inner_product_ext3, + fold_f64, + fold_ext3, +); +criterion_main!(benches); diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 00000000..bcc6f8b0 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,763 @@ +# Sumcheck API Design + +Authoritative reference: Justin Thaler, *Proofs, Arguments, and Zero-Knowledge*, +Chapter 4 ("Interactive Proofs"), July 2023. +https://people.cs.georgetown.edu/jthaler/ProofsArgsAndZK.pdf + +## 1. The protocol (Thaler §4.1) + +Given a v-variate polynomial g over a finite field F with degree at most d +in each variable, the sum-check protocol proves: + +``` +H = sum_{b in {0,1}^v} g(b_1, ..., b_v) +``` + +The protocol proceeds in v rounds. Each round j: + +1. **P -> V**: a univariate polynomial g_j(X_j) of degree <= deg_j(g), + specified by its evaluations at {0, 1, ..., deg_j(g)}. +2. **V checks**: g_{j-1}(r_{j-1}) = g_j(0) + g_j(1). + (For round 1, checks H = g_1(0) + g_1(1).) +3. **V -> P**: random r_j in F. + +After round v: V checks g_v(r_v) = g(r_1, ..., r_v) via an oracle query +(or by delegation to another protocol). + +**Proposition 4.1.** Completeness error 0, soundness error <= vd / |F|. + +### What the prover sends + +Table 4.1: total prover-to-verifier communication is +sum_{j=1}^{v} (deg_j(g) + 1) field elements. When deg_j(g) = O(1) for +all j (the common case), this is O(v) field elements. + +### What the verifier checks + +Per round: one consistency equation (g_j(0) + g_j(1) = previous claim) +and a degree bound (deg g_j <= deg_j(g)). After all rounds: one oracle +query to g at a random point. + +Total verifier time: O(v + sum_j deg_j(g)) + T, where T is the cost of +one evaluation of g at a point in F^v. + +## 2. Our three use cases are one protocol + +Thaler's protocol is parameterized by g. Our current three entry points +are three instantiations: + +| Use case | g | deg per var | Ref | +|-------------------------|-----------------------------|-------------|------------| +| multilinear_sumcheck | f_tilde (MLE of evals) | 1 | §4.1 | +| inner_product_sumcheck | f_tilde * g_tilde | 2 | §4.4 | +| coefficient_sumcheck | user-defined | d | §4.6 | + +In all three cases, the *protocol* is identical — only the prover's +round-polynomial computation changes. This motivates a single protocol +runner parameterized by a prover trait, not three separate functions. + +## 3. The prover trait + +```rust +/// Prover side of the sum-check protocol (Thaler §4.1). +/// +/// Implementors define how the round polynomial g_j is computed +/// from the prover's internal state. The protocol runner calls +/// `round()` once per round, then the caller inspects post-state. +pub trait SumcheckProver { + /// Degree of g_j in the current variable X_j. + fn degree(&self) -> usize; + + /// Compute g_j and advance state. + /// + /// Returns evaluations of g_j at {0, 1, ..., degree()}. + /// `challenge` is `None` for round 0 (no prior challenge exists); + /// `Some(r_{j-1})` for rounds j >= 1, used to fold internal state. + fn round(&mut self, challenge: Option) -> Vec; + + /// Apply the final verifier challenge. + /// Called once after the last round, before `final_value()`. + fn finalize(&mut self, last_challenge: F); + + /// After finalize(): the claimed value g(r_1, ..., r_v). + fn final_value(&self) -> F; +} +``` + +The prover is passed as `&mut P` to the protocol runner. After sumcheck +completes, the caller retains ownership and can query prover-specific +post-state (e.g., for GKR: the two claimed W values at b* and c*). + +## 4. Prover strategies and streaming + +### Two axes: space strategy and variable ordering + +The prover has two independent design choices: + +1. **Space strategy** — how much memory to budget: + - *Time*: O(2^v) space, O(2^v) total time. Holds all evaluations. + - *Blendy*: O(2^k) space, O(2^v) total time (k < v). Partitions + variables into stages of size k, recomputes per stage. + - *Space*: O(v) space, O(v · 2^v) total time. Academic only. + +2. **Variable ordering** — which variable to fold each round: + - *MSB* (half-split): fold the topmost variable. Pairs `(v[k], v[k+L/2])`. + Best for in-memory and random-access-streaming workloads. + - *LSB* (pair-split): fold the bottommost variable. Pairs `(v[2k], v[2k+1])`. + Best for sequential-streaming workloads where data arrives incrementally. + +These choices are orthogonal: you can use blendy with MSB ordering (large +witness on SSD) or blendy with LSB ordering (Jolt CPU trace). + +### Streaming taxonomy + +The choice of variable ordering depends on how data is available: + +| Scenario | Data availability | Access | Best ordering | Strategy | +|----------|-------------------|--------|---------------|----------| +| In-memory | Full table in RAM | Random | MSB | Time | +| Random-access stream | Exists on disk, too big for RAM | Seekable | MSB | Blendy | +| Sequential stream | Generated incrementally | Forward-only | LSB | Blendy | + +**Random-access streaming** (e.g., large witness mmap'd from SSD): the data +exists but doesn't fit in RAM. MSB ordering has better cache behavior because +it reads two contiguous half-table regions; the blendy working set fits in +cache while the full table is paged in as needed. + +**Sequential streaming** (e.g., Jolt CPU trace): evaluations are computed +on-the-fly and arrive in index order (0, 1, 2, ...). LSB ordering is optimal +because adjacent pairs `(f[2k], f[2k+1])` are immediately available — +the prover can begin folding before the full table exists. + +In both streaming cases, blendy is used because the full table doesn't fit +in the working set. Blendy is the *space strategy*; MSB vs LSB is the +*traversal order*. They are independent. + +### Blendy stage scheduling + +Standard blendy (CFFZ24) partitions v variables into stages of fixed size k, +recomputing the partial-sum table once per stage. The optimal k depends on +the ratio of cache sizes to element size. + +Jolt's `HalfSplitSchedule` (based on BCFFMMZ25, eprint 2025/1473) takes a +different approach: **cost-model-driven, non-uniform window sizes**. + +For a degree-d sumcheck, the cost of processing a window of w variables +starting at round i is `(d+1)^w / 2^(w+i) * T` where T is the trace +length. Setting cost ~ 1 gives optimal window size: + +``` +w(i) = round(ratio * i) where ratio = ln(2) / ln((d+1)/2) +``` + +This produces growing windows: early rounds use small windows (the +hypercube is large), later rounds use larger windows (the residual sum is +small). For degree 2, the windows grow as 1, 2, 5, 14, ... + +| Degree | Ratio | Example window sequence | +|--------|-------|------------------------| +| 2 | 1.71 | 1, 2, 5, 14, ... | +| 3 | 1.00 | 1, 1, 2, 3, 4, ... | +| 4 | 0.76 | 1, 1, 1, 2, 2, 3, ... | + +The schedule is parameterized by a `StreamingSchedule` trait, not a fixed +constant: + +```rust +pub trait StreamingSchedule { + fn num_rounds(&self) -> usize; + fn switch_over_point(&self) -> usize; + fn is_window_start(&self, round: usize) -> bool; + fn num_unbound_vars(&self, round: usize) -> usize; +} +``` + +This allows tuning per deployment target and polynomial degree. + +### Strategies table + +Per Thaler §4.4.3 and prior work (CTY11, VSBW13, CFFZ24, BCFFMMZ25): + +| Strategy | Space | Total time | Input | Ordering | Ref | +|----------|-----------|--------------|--------------|----------|------------------| +| Time | O(2^v) | O(2^v) | Vec\ | MSB | VSBW13 | +| Blendy | O(2^k) | O(2^v) | Stream\ | MSB or LSB | CFFZ24, BCFFMMZ25 | +| Space | O(v) | O(v * 2^v) | Stream\ | MSB or LSB | CTY11 | + +All implement `SumcheckProver`. The difference is internal: +how `round()` computes the polynomial from the data. + +### Construction + +```rust +// In-memory (MSB, time strategy). +impl MultilinearProver { + pub fn new(evals: Vec) -> Self; +} + +// Streaming (LSB or MSB, blendy strategy). +impl StreamingMultilinearProver { + /// Random-access stream, MSB ordering. Best for mmap'd data. + pub fn new_msb>(stream: S, k: usize) -> Self; + + /// Sequential stream, LSB ordering. Best for incremental data (Jolt). + pub fn new_lsb>(stream: S, k: usize) -> Self; +} +``` + +The `Stream` trait (already in `src/streams/`) provides random access to +evaluations without requiring the full table in memory. + +## 5. Three polynomial shapes + +Each polynomial shape (multilinear, product, general) has its own prover +type for each strategy, but all implement `SumcheckProver`: + +```rust +/// g = f_tilde, degree 1. Prover folds evals via Lemma 4.3. +pub struct MultilinearProver { evals: Vec } + +/// g = f_tilde * g_tilde, degree 2. Prover folds both vectors. +pub struct InnerProductProver { a: Vec, b: Vec } + +/// g = user-defined, degree d. Wraps a RoundPolyEvaluator. +pub struct CoefficientProver> { ... } +``` + +### The time prover's round() (Lemma 4.3 and 4.5) + +For a multilinear f over {0,1}^v with evaluations in array A: + +``` +A[x'] = r_1 * A[1, x'] + (1 - r_1) * A[0, x'] +``` + +This is the **fold** operation (Lemma 4.3, equation 4.13). After folding, +the array has half the entries, and the prover can compute the next round +polynomial from the folded array. + +For a product of k multilinears (Lemma 4.5), the same fold is applied to +each factor independently, and the round polynomial is computed from the +folded factors. + +## 6. The fold primitive + +The fold operation (Thaler Lemma 4.3, equation 4.13) is the computational +core of the time prover: + +```rust +/// Half-split (MSB) fold: new[k] = v[k] + weight * (v[k + L/2] - v[k]). +/// +/// Implicit zero padding for non-power-of-two inputs. +/// SIMD-accelerated for Goldilocks on NEON and AVX-512 IFMA. +pub fn fold(values: &mut Vec, weight: F); +``` + +The fold is exposed as a standalone public function because callers +(e.g., WHIR's `multilinear_fold`) need it independently of the full +sumcheck protocol. + +### Layout: half-split (MSB) + +We fold the *top-most* variable each round: `v[0..L/2]` vs `v[L/2..L]`. +This is the MSB (most-significant-bit-first) convention. It matches +Thaler's equation 4.13 directly: + +``` +p(x_1, ..., x_l) = x_1 * p(1, x_2, ..., x_l) + (1 - x_1) * p(0, x_2, ..., x_l) +``` + +where `p(1, ...)` is the upper half and `p(0, ...)` is the lower half. + +### SIMD opt-in for non-arkworks types (`SimdRepr`) + +Non-arkworks Goldilocks implementations opt into SIMD via the `SimdRepr` +trait, whose memory layout guarantee is enforced at compile time by +`zerocopy`: + +```rust +pub trait SimdRepr: + SumcheckField + zerocopy::IntoBytes + zerocopy::FromBytes + zerocopy::Immutable +{ + fn modulus() -> u64; +} +``` + +The zerocopy bounds verify at derive time that the type supports safe byte +reinterpretation. No `unsafe` needed from the implementor. A wrong +`modulus()` produces wrong arithmetic (logic bug), not UB. + +```rust +#[derive(zerocopy::IntoBytes, zerocopy::FromBytes, zerocopy::Immutable)] +#[repr(transparent)] +struct JoltGoldilocks(u64); + +impl SimdRepr for JoltGoldilocks { + fn modulus() -> u64 { GOLDILOCKS_P } +} +``` + +Arkworks types bypass `SimdRepr` — the blanket `SumcheckField` impl +auto-detects Goldilocks from `BasePrimeField::MODULUS` and the detection +is const-folded by LLVM. + +## 7. The protocol runner + +```rust +/// Run the sum-check protocol for `num_rounds` rounds. +/// +/// Partial execution (`num_rounds < v`) supports composed protocols +/// like GKR (one sumcheck per circuit layer) and WHIR (partial rounds +/// interleaved with commit/open). +/// +/// `hook` is called each round after the prover message is written +/// and before the verifier challenge is read. Pass `|_, _| {}` when +/// no hook is needed. +pub fn sumcheck( + prover: &mut P, + num_rounds: usize, + transcript: &mut T, + hook: H, +) -> SumcheckProof +where + F: Field, + T: Transcript, + H: FnMut(usize, &mut T), + P: SumcheckProver; +``` + +### The proof transcript + +```rust +pub struct SumcheckProof { + /// g_j evaluations per round: round_polys[j] has degree + 1 entries. + pub round_polynomials: Vec>, + /// Verifier challenges r_1, ..., r_v. + pub challenges: Vec, + /// g(r_1, ..., r_v) -- the prover's claimed final evaluation. + pub final_value: F, +} +``` + +This matches the protocol description exactly. The verifier can +reconstruct any round's consistency check from `round_polynomials` +and `challenges`. + +## 8. The verifier + +One function that checks any sumcheck proof, regardless of the +polynomial's degree: + +```rust +/// Verify a sum-check proof against a claimed sum. +/// +/// Checks per round: g_j(0) + g_j(1) = previous claim, and +/// deg(g_j) <= expected_degree. +/// +/// Returns the final claimed value and the challenge vector on success. +/// The caller is responsible for the oracle check: verifying that +/// final_value = g(r_1, ..., r_v). How this is done depends on the +/// application (direct evaluation, delegation to another sumcheck, +/// polynomial commitment query, etc.). +pub fn sumcheck_verify( + claimed_sum: F, + expected_degree: usize, + num_rounds: usize, + transcript: &mut T, + hook: H, +) -> Result<(F, Vec), SumcheckError> +where + F: Field, + T: Transcript, + H: FnMut(usize, &mut T); +``` + +The verifier does NOT perform the final oracle check. Per Remark 4.2, +the verifier can apply sumcheck "even without knowing the polynomial g." +The final check is the caller's responsibility because it depends on the +application: + +- Standalone sumcheck: evaluate g(r) directly. +- GKR: delegate to the next layer's sumcheck. +- WHIR: check via polynomial commitment. +- MatMult: evaluate f_A and f_B at derived points. + +## 9. Cross-field support (BF != EF) + +In practice, evaluations often live in a small base field BF (e.g., +Goldilocks, p = 2^64 - 2^32 + 1) while challenges are sampled from a +larger extension field EF (e.g., Goldilocks^3) for soundness. + +This is a prover concern, not a protocol concern: + +- Round 0: the prover computes g_1 over BF evaluations. +- After receiving r_1 in EF: the prover performs a cross-field fold, + lifting BF data to EF. +- Rounds 1+: everything is in EF. + +The `SumcheckProver` trait is generic over a single field `F` (= EF). +The BF -> EF transition happens inside the prover's `round()` method +when `challenge` transitions from `None` to `Some(r_1)`. The protocol +runner and verifier never see BF. + +A convenience constructor handles the common case: + +```rust +impl> MultilinearProver { + /// Cross-field prover: evaluations in BF, challenges in EF. + /// Round 0 computes in BF, then lifts to EF on first challenge. + pub fn cross_field(evals: Vec) -> Self; +} +``` + +## 10. GKR compatibility (§4.6) + +GKR runs d sumcheck invocations (one per circuit layer). Each layer's +sumcheck is over a different polynomial f_r^(i) (equation 4.18): + +``` +f_r^(i)(b, c) = add_i(r_i, b, c) * (W_{i+1}(b) + W_{i+1}(c)) + + mult_i(r_i, b, c) * (W_{i+1}(b) * W_{i+1}(c)) +``` + +This is a (2k_{i+1})-variate polynomial of degree 2 in each variable. + +### What GKR needs from sumcheck + +1. **Custom polynomial**: GKR defines its own round polynomial via the + wiring predicates (add_i, mult_i). This is a custom `SumcheckProver` + implementation -- the trait handles it. + +2. **Partial execution**: each layer runs a full sumcheck (all rounds), + but the *claim chains* between layers. The `sumcheck()` function + returns, then GKR processes the result and starts a new sumcheck. + +3. **Post-state inspection**: after sumcheck, GKR needs the prover's + claimed values W_{i+1}(b*) and W_{i+1}(c*). Since `prover` is + `&mut P`, the caller retains the prover and calls GKR-specific + methods on the concrete type: + + ```rust + let proof = sumcheck(&mut gkr_prover, num_rounds, &mut t, |_, _| {}); + let (w_b, w_c) = gkr_prover.claimed_w_values(); // GKR-specific method + ``` + +4. **Reduce-to-one sub-protocol** (§4.5.2, Claim 4.6): after each + sumcheck, the verifier needs to reduce two evaluation claims to one. + This is a separate one-round protocol, NOT part of sumcheck: + + ```rust + /// Reduce claims W(b) = v_0 and W(c) = v_1 to a single claim + /// W(r) = v at a random point on the line through b and c. + pub fn reduce_to_one( + b: &[F], c: &[F], + v0: F, v1: F, + transcript: &mut T, + ) -> (Vec, F) + ``` + + This is a composable building block, not baked into sumcheck. + +## 11. WHIR compatibility + +WHIR's integration pattern: + +```rust +for round_config in &self.round_configs { + // Commit to the current folded polynomial + round_config.committer.commit(&a); + + // OOD / in-domain queries, RLC into covector b + update_covector(&mut b, &stir_challenges); + + // Partial sumcheck: fold a and b by folding_factor variables + let proof = sumcheck( + &mut InnerProductProver::new(a, b), + round_config.folding_factor, + &mut transcript, + |_, t| round_config.round_pow.prove(t), + ); + + // Extract folded state for the next round + a = prover.a(); // prover-specific accessor + b = prover.b(); +} +``` + +Key requirements satisfied: +- **Partial rounds**: `num_rounds = folding_factor < v`. +- **Hook**: proof-of-work grinding between write and read. +- **Post-state**: prover retains folded vectors after partial execution. +- **MSB fold**: `fold()` used independently for WHIR's `multilinear_fold`. + +## 12. Jolt integration + +Jolt (a16z/jolt) uses its own `SumcheckInstanceProver` trait, which +splits the round into two calls: + +```rust +// Jolt's trait (simplified) +trait SumcheckInstanceProver { + fn compute_message(&mut self, round: usize, previous_claim: F) -> UniPoly; + fn ingest_challenge(&mut self, r_j: F::Challenge, round: usize); + fn finalize(&mut self); +} +``` + +Our `SumcheckProver::round(challenge)` merges fold and compute into one +call. An adapter in Jolt's codebase bridges the two: + +```rust +struct Adapter> { + inner: P, + pending: Option, +} + +impl SumcheckInstanceProver for Adapter

{ + fn compute_message(&mut self, _round: usize, _claim: F) -> UniPoly { + let c = self.pending.take(); + UniPoly::from_evals(&self.inner.round(c)) + } + fn ingest_challenge(&mut self, r_j: F::Challenge, _round: usize) { + self.pending = Some(r_j.into()); + } + fn finalize(&mut self) { + if let Some(c) = self.pending.take() { + self.inner.finalize(c); + } + } +} +``` + +### Key compatibility points + +- **Variable ordering**: Jolt defaults to LSB (`BindingOrder::LowToHigh`). + Use `MultilinearProverLSB` for this path. Spartan outer sumcheck uses + MSB (`HighToLow`) — use `MultilinearProver`. + +- **Challenge type**: Jolt uses a narrow 128-bit `F::Challenge` type for + performance. The adapter converts via `Into` at the boundary. + +- **Return type**: Jolt expects `UniPoly` (coefficients). Our trait + returns evaluations at {0, 1, ..., d}. Convert via interpolation or + have the prover return coefficients directly. + +- **Batching**: Jolt's `BatchedSumcheck::prove` combines multiple instances + with random linear combinations. The orchestrator handles batching — + each instance just implements `SumcheckInstanceProver`. + +- **Streaming schedule**: Jolt's `HalfSplitSchedule` (BCFFMMZ25) uses + cost-model-driven window sizes. Our blendy implementation can adopt the + same `StreamingSchedule` trait for stage sizing. + +The adapter lives in Jolt's repository (or a thin integration crate), not +in this library. Our responsibility is keeping the trait surface clean +enough that the adapter is trivial. + +## 13. Advanced optimizations (Bagad-Dao-Domb-Thaler, ePrint 2025/1117) + +The `SumcheckProver` trait cleanly separates *what the protocol sends* +(round polynomials, final evaluation) from *how the prover computes them*. +All known prover-side optimizations live below this boundary and are +compatible without any trait or protocol changes. + +### Algorithms 1--2: LinearTime and SqrtSpace + +These are our "time" and "space" strategies (§4 above). LinearTime +maintains d arrays of size 2^(v−j), folding each round in O(2^v) total. +SqrtSpace streams over the input for the first v/2 rounds, using O(√2^v) +space. Both produce identical round polynomials. Each is a distinct +`SumcheckProver` implementation with different constructors +(`new` vs `from_stream`). + +### Algorithms 3--4: SmallValue optimization + +When sumcheck operates on a product g = f·eq(r, ·), many multiplications +involve "small" operands (those representable with few bits, e.g., R1CS +entries in {0, 1, −1}). The SmallValue optimization categorizes +multiplications as: + +- **ss** (small × small): result fits in a machine word, no field reduction. +- **sl** (small × large): a few shifts and adds, no full mul. +- **ll** (large × large): full field multiplication. + +Algorithms 3--4 defer ll multiplications by precomputing accumulators +and use Toom-Cook to reduce the number of ss multiplications from +3(d+1) to 2.5(d+1) per hypercube point. + +**Trait compatibility**: this is entirely internal to `round()`. The prover +maintains richer internal state (categorized accumulator tables) and uses +cheaper multiplication routines, but returns the same `Vec` of degree+1 +evaluations. A `SmallValueProver` implements `SumcheckProver` with +unchanged `degree()` and `final_value()`. + +### Algorithms 5--6: EqPoly optimization + +For sumcheck over g(x) = eq(r, x) · h(x), the naive approach materializes +a 2^v-sized table for eq(r, ·). The EqPoly optimization splits +eq(r, x) = eq(r_L, x_L) · eq(r_R, x_R) and only maintains tables of size +2^(v/2), reducing ll multiplications from 2^v to 2^(v/2+1). + +Algorithm 6 combines EqPoly with SmallValue for the Spartan-in-Jolt +use case. + +**Trait compatibility**: this changes how the prover manages its internal +tables — specifically, it defers half the eq computation and processes it +in a blocked fashion. The round polynomial's degree and protocol messages +are unchanged. This would be a constructor variant or flag on the +prover type. + +### Univariate skip (Gruen's optimization) + +When g has degree > 1 in its first variable, the prover can compute +a univariate restriction t_j(X_j) = g(r_1, ..., r_{j-1}, X_j, x_{j+1}*, ...) +and derive the standard round polynomial s_j from it. Per Setty and +Thaler (Section 3.1 of the paper): "the sum-check verifier is unchanged." + +This is relevant primarily in small-characteristic fields where the degree +of individual variables can be high. In our setting (Goldilocks, large +characteristic), the multilinear case (degree 1) doesn't benefit, but the +coefficient sumcheck (arbitrary degree d) could. + +**Trait compatibility**: the prover computes the round polynomial via the +univariate-skip shortcut inside `round()`, but returns the same evaluations. +No change to `degree()`, no change to the verifier, no change to the +wire format. + +### Per-round degree variation + +Some optimizations work best when the polynomial's degree varies by round +(e.g., degree d in round 1, degree 1 in rounds 2--v for univariate skip). +Our current trait returns a single `degree()` value. If a future prover +needs per-round variation, the trait can evolve to: + +```rust +fn degree(&self) -> usize; // max degree (for allocation) +fn round_degree(&self) -> usize; // degree of the current round +``` + +None of the paper's algorithms strictly require this — they maintain +constant degree throughout — but this is a natural extension point if +needed. + +### Summary: all optimizations are prover-internal + +| Optimization | Changes protocol? | Changes wire format? | Fits `SumcheckProver`? | +|---------------------------|-------------------|----------------------|------------------------| +| LinearTime (Alg 1) | No | No | Yes — "time" strategy | +| SqrtSpace (Alg 2) | No | No | Yes — "space" strategy | +| SmallValue (Alg 3--4) | No | No | Yes — smarter `round()` | +| EqPoly (Alg 5--6) | No | No | Yes — internal table mgmt | +| Univariate skip | No | No | Yes — alternate `round()` | + +The trait is the abstraction boundary: everything above it (protocol runner, +transcript, verifier) stays fixed; everything below it (prover strategy, +SIMD kernels, table layout, multiplication tricks) is implementation +freedom. + +## 14. What is NOT in scope + +- **Generic IP trait**: sumcheck is a specific protocol, not an instance + of a generic framework. The `Transcript` trait already captures the + interaction pattern. If GKR or FRI reveal common structure, a + shared trait can emerge later. + +- **Zero-knowledge**: ZK sumcheck adds masking polynomials but uses the + same protocol structure. A future `ZkSumcheckProver` wrapper could + add masking without changing the protocol runner. + +- **Batching**: multiple sumcheck instances can be batched with random + linear combinations. This is a composition technique, not a protocol + change. + +- **Reduce-to-one**: a separate composable sub-protocol (§4.5.2), + not part of sumcheck itself. + +## 15. Migration from current API + +| Current | New | +|-------------------------------------------|------------------------------------------------| +| `multilinear_sumcheck(evals, t, hook)` | `sumcheck(&mut MultilinearProver::new(evals), n, t, hook)` | +| `inner_product_sumcheck(a, b, t, hook)` | `sumcheck(&mut InnerProductProver::new(a, b), n, t, hook)` | +| `multilinear_sumcheck_partial(..., k, h)` | `sumcheck(&mut prover, k, t, hook)` | +| `fold(values, weight)` | `fold(values, weight)` (unchanged) | +| `coefficient_sumcheck(...)` | `sumcheck(&mut CoefficientProver::new(...), n, t, hook)` | +| `Sumcheck` | `SumcheckProof` | +| `ProductSumcheck` | `SumcheckProof` (unified) | +| `multilinear_sumcheck_verify(...)` | `sumcheck_verify(sum, deg, n, t, hook)` | + +The `Sumcheck` and `ProductSumcheck` return types unify into one +`SumcheckProof`. The `final_evaluations: (F, F)` field from +`ProductSumcheck` becomes a prover-specific accessor on +`InnerProductProver` post-state. + +## 16. Benchmarking + +### Three benchmark layers + +**Layer 1: Kernel throughput (elements/second).** Measures the computational +core — fold and round polynomial evaluation — independent of the protocol. + +- `fold` throughput: elements/sec for base field and each extension degree, + with and without SIMD. Compare against theoretical memory bandwidth + (Apple M-series: ~100 GB/s, Sapphire Rapids: ~50 GB/s per channel). + A Goldilocks element is 8 bytes, so the ceiling for base-field fold on + M2 is ~12.5 billion elements/sec. +- `round()` throughput: fold + evaluate combined. Shows the overhead of + evaluation on top of fold. +- Cross-field promotion cost: measure the first EF round (BF→EF lift) + separately. For ext3, memory triples and arithmetic cost jumps ~9×. + +**Layer 2: Protocol-level scaling (time vs num_variables).** Full +`sumcheck()` execution — all v rounds — for each combination of: + +- Strategy: time, blendy(k) for several k values +- Shape: multilinear (d=1), inner-product (d=2) +- Field: base only, base→ext3 +- Size: v = 16, 18, 20, 22, 24 (65K to 16M evaluations) + +Plot time vs 2^v on log-log axes. Time strategy should be linear (slope 1). +Blendy should show a constant-factor gap vs time — the benchmark should +quantify this gap at each k to guide users on the space/time tradeoff. + +The key metric is **time per element per round**, not total time. This +normalizes across sizes and makes regressions immediately visible. + +**Layer 3: Downstream integration.** Run WHIR's sumcheck bench with our +library as the backend. The metric is **regression detection**: pin a +baseline, alert on >5% regression. + +### CI regression tracking + +Continuous benchmarks via `github-action-benchmark`: + +- **criterion** bench harness with throughput annotations (elements/sec) +- Self-hosted runner on EC2 Sapphire Rapids for stable AVX-512 numbers +- Results committed to `gh-pages` branch with per-benchmark trendlines +- Alert threshold: 10% regression = warning, 15% = CI failure + +Benchmark matrix: + +``` +{time} × {multilinear, IP} × {F64, F64Ext3} × {2^16, 2^20, 2^24} +fold × {F64, F64Ext3} × {2^16, 2^20, 2^24} +``` + +~20 benchmark points, ~5 minutes on AVX-512 hardware. + +## 17. Summary + +The design follows Thaler's formalization exactly: + +- **One protocol** (Proposition 4.1), parameterized by the polynomial. +- **One trait** (`SumcheckProver`) for the prover's round computation. +- **Three strategies** (time/space/blendy) as construction choices. +- **Three polynomial shapes** (multilinear/product/general) as prover types. +- **One fold** (Lemma 4.3) as the core computational primitive. +- **One verifier** that checks any proof regardless of degree. +- **Partial execution** for protocol composition (GKR, WHIR). +- **Post-state inspection** via `&mut P` ownership for protocol chaining. + +The protocol runner, verifier, and fold are the public API. The prover +trait is the extension point. SIMD acceleration is transparent inside +fold. Everything else is internal. diff --git a/docs/slides.md b/docs/slides.md new file mode 100644 index 00000000..a248db45 --- /dev/null +++ b/docs/slides.md @@ -0,0 +1,610 @@ +--- +marp: true +theme: default +paginate: true +size: 16:9 +style: | + section { + font-size: 24px; + } + h1 { + font-size: 40px; + color: #1a1a2e; + } + h2 { + font-size: 32px; + color: #16213e; + } + h3 { + font-size: 26px; + } + table { + font-size: 20px; + } + code { + font-size: 18px; + } + pre { + font-size: 16px; + } +--- + +# efficient-sumcheck: Canonical Redesign + +A trait-based sumcheck library grounded in Thaler's formalization. + +--- + +## Slide 1: The Problem + +The library grew to **10,800 LOC** through incremental SIMD + WHIR integration. + +- 3 separate protocol runners (multilinear, inner-product, coefficient) +- 4 order strategies (ascending, descending, graycode, MSB) +- Old `Prover` trait with 6 associated types +- SIMD dispatch graph (benchmarked at 2-6x speedup) superseded by fused MSB kernels +- Duplicate `_with_hook` entry points + +**The code was correct. The architecture was not.** + +--- + +## Slide 2: The Goal + +Reduce complexity without losing functionality. + +| Metric | Before | After | +|--------|--------|-------| +| Lines of code | 10,800 | 7,448 | +| Source files | ~100 | 43 | +| Public entry points | 10+ | 4 | +| Order strategies | 4 | 1 (MSB) | +| Protocol runners | 3 | 1 | +| Verifiers | 2 | 1 | +| Return types | 2 | 1 | +| Tests | 69 | 63 | +| Clippy warnings | 46 | 0 | + +--- + +## Slide 3: The Authoritative Source + +Justin Thaler, *Proofs, Arguments, and Zero-Knowledge*, Chapter 4. + +**Proposition 4.1.** Given a v-variate polynomial g over F with degree +at most d in each variable, the sum-check protocol proves +`H = sum_{b in {0,1}^v} g(b)` in v rounds. + +- Completeness error: 0 +- Soundness error: <= v * d / |F| + +**Key insight:** the protocol is *one* protocol parameterized by g. +Three "different" sumchecks are three instantiations. + +--- + +## Slide 4: One Protocol, Three Instantiations + +| Use case | g | Degree | Reference | +|----------|---|--------|-----------| +| Multilinear | f_tilde (MLE) | 1 | Thaler S4.1 | +| Inner product | f_tilde * g_tilde | 2 | Thaler S4.4 | +| Coefficient | user-defined | d | Thaler S4.6 | + +The protocol (transcript, consistency checks, challenges) is identical. + +Only the prover's round polynomial computation changes. + +This motivates **one runner + one trait**, not three functions. + +--- + +## Slide 5: The Prover Trait + +```rust +pub trait SumcheckProver { + fn degree(&self) -> usize; + fn round(&mut self, challenge: Option) -> Vec; + fn finalize(&mut self, last_challenge: F); + fn final_value(&self) -> F; +} +``` + +**Lifecycle:** + +``` +round(None) -> g_0 evaluations // round 0 +round(Some(r_0)) -> g_1 evaluations // fold with r_0, compute g_1 +... +round(Some(r_{v-2})) -> g_{v-1} evaluations // fold, compute +finalize(r_{v-1}) // apply last challenge +final_value() -> g(r_0, ..., r_{v-1}) // oracle value +``` + +--- + +## Slide 6: The Protocol Runner + +```rust +pub fn sumcheck( + prover: &mut P, + num_rounds: usize, + transcript: &mut T, + hook: H, +) -> SumcheckProof +``` + +One function handles: +- Full sumcheck (num_rounds = v) +- Partial sumcheck (num_rounds < v) for GKR and WHIR +- Per-round hooks for proof-of-work grinding +- Any polynomial degree (degree is prover-reported) + +**The runner never inspects prover internals.** + +--- + +## Slide 7: The Verifier + +```rust +pub fn sumcheck_verify( + claimed_sum: F, + expected_degree: usize, + num_rounds: usize, + transcript: &mut T, + hook: H, +) -> Result<(F, Vec), SumcheckError> +``` + +- Checks g_j(0) + g_j(1) = claim each round +- Evaluates g_j(r_j) via Lagrange interpolation (any degree) +- Does NOT perform the final oracle check (Thaler Remark 4.2) +- Returns (final_claim, challenges) for caller to verify + +--- + +## Slide 8: Unified Proof Type + +```rust +pub struct SumcheckProof { + pub round_polys: Vec>, // g_j at {0,1,...,d} + pub challenges: Vec, // r_1, ..., r_v + pub final_value: F, // g(r_1, ..., r_v) +} +``` + +Replaces both `Sumcheck` and `ProductSumcheck`. + +Prover-specific post-state (e.g., `(f(r), g(r))` for inner product) +lives on the prover via `&mut P` ownership, not in the proof. + +--- + +## Slide 9: Concrete Provers + +### MultilinearProver (degree 1) + +```rust +let mut prover = MultilinearProver::new(evals); +let proof = sumcheck(&mut prover, v, &mut t, |_, _| {}); +``` + +### InnerProductProver (degree 2) + +```rust +let mut prover = InnerProductProver::new(a, b); +let proof = sumcheck(&mut prover, v, &mut t, |_, _| {}); +let (f_r, g_r) = prover.final_evaluations(); +``` + +Same runner. Same verifier. Same proof type. + +--- + +## Slide 10: The Fold Primitive (Lemma 4.3) + +``` +new[k] = v[k] + weight * (v[k + L/2] - v[k]) +``` + +- Half-split (MSB) layout: fold the topmost variable each round +- Matches Thaler eq. 4.13 directly +- Non-power-of-two: implicit zero padding on the high half +- SIMD-accelerated for Goldilocks (transparent, zero overhead otherwise) +- Exposed publicly for WHIR's `multilinear_fold` + +--- + +## Slide 11: SIMD Acceleration + +Goldilocks field (p = 2^64 - 2^32 + 1): + +| Backend | Width | Platform | +|---------|-------|----------| +| NEON | 2-wide | aarch64 (Apple M-series, Graviton) | +| AVX-512 IFMA | 8-wide | x86_64 (Sapphire Rapids) | + +Two paths to SIMD: + +**Arkworks** (automatic): blanket impl detects Goldilocks from modulus. +LLVM const-folds the branch. Zero overhead on non-Goldilocks. + +**Non-arkworks** (explicit): implement `SimdRepr` with `zerocopy` bounds: + +```rust +pub trait SimdRepr: + SumcheckField + zerocopy::IntoBytes + zerocopy::FromBytes +{ + fn modulus() -> u64; // GOLDILOCKS_P for SIMD +} +``` + +Layout safety is **compiler-verified** via zerocopy derives. No `unsafe`. + +--- + +## Slide 12: Generic Field Trait + +```rust +pub trait SumcheckField: + Copy + Send + Sync + PartialEq + Debug + + Add + Sub + Mul + Neg + + AddAssign + SubAssign + MulAssign + + Sum + 'static +{ + const ZERO: Self; + const ONE: Self; + fn from_u64(val: u64) -> Self; + fn inverse(&self) -> Option; + fn extension_degree() -> u64; + fn _simd_field_config() -> Option; +} +``` + +- **Not coupled to arkworks.** Any field-like type works. +- Blanket impl for `ark_ff::Field` behind `feature = "arkworks"` (default-on). +- Non-arkworks Goldilocks can opt into SIMD by overriding `_simd_field_config()`. + +--- + +## Slide 13: Cross-Field Support (BF -> EF) + +Evaluations in base field BF (e.g., Goldilocks). +Challenges from extension field EF (e.g., Goldilocks^3) for soundness. + +```rust +pub trait ExtensionOf: SumcheckField + From {} +``` + +The transition is prover-internal: +- Round 0: compute over BF +- `round(Some(r_1))`: lift BF -> EF, continue in EF +- Protocol runner and verifier never see BF + +--- + +## Slide 14: WHIR Integration + +```rust +for round_config in &self.round_configs { + round_config.committer.commit(&a); + update_covector(&mut b, &stir_challenges); + + let proof = sumcheck( + &mut InnerProductProver::new(a, b), + round_config.folding_factor, // partial! + &mut transcript, + |_, t| round_config.round_pow.prove(t), // hook! + ); + + a = prover.a(); // post-state access + b = prover.b(); +} +``` + +Three features exercised: partial execution, per-round hook, post-state. + +--- + +## Slide 15: GKR Integration + +GKR runs d sumcheck invocations (one per circuit layer). + +```rust +let proof = sumcheck( + &mut gkr_prover, + num_rounds, + &mut t, + |_, _| {}, +); +let (w_b, w_c) = gkr_prover.claimed_w_values(); +``` + +Then reduce-to-one (separate sub-protocol, not baked into sumcheck): + +```rust +let (point, value) = reduce_to_one(b, c, v0, v1, &mut t); +``` + +Composable building blocks, not monolithic protocols. + +--- + +## Slide 16: Two Orthogonal Axes + +Prover design has two independent choices: + +**Space strategy** -- how much memory to budget: +- Time: O(2^v) -- hold all evaluations +- Blendy: O(2^k) -- partition into stages, recompute per stage +- Space: O(v) -- recompute everything (academic only) + +**Variable ordering** -- which variable to fold each round: +- MSB (half-split): pairs `(v[k], v[k+L/2])` -- in-memory and seekable streams +- LSB (pair-split): pairs `(v[2k], v[2k+1])` -- sequential/incremental streams + +These are orthogonal. Blendy + MSB and Blendy + LSB are both valid. + +--- + +## Slide 17: Streaming Taxonomy + +| Scenario | Data | Access | Ordering | Example | +|----------|------|--------|----------|---------| +| In-memory | Full table in RAM | Random | MSB | WHIR | +| Random-access stream | On disk, too big for RAM | Seekable | MSB | Large witness (mmap) | +| Sequential stream | Generated incrementally | Forward-only | LSB | Jolt CPU trace | + +**Random-access** (mmap'd SSD): data exists but doesn't fit in RAM. +MSB reads two contiguous half-table regions -- good cache behavior. + +**Sequential** (Jolt trace): evaluations arrive in index order. +LSB pairs `(f[2k], f[2k+1])` are immediately available -- +folding begins before the full table exists. + +Both streaming cases use blendy. The ordering choice depends on the data source. + +--- + +## Slide 18: Blendy Stage Scheduling (BCFFMMZ25) + +Jolt's `HalfSplitSchedule` uses **cost-model-driven, non-uniform windows**: + +``` +w(i) = round(ratio * i) where ratio = ln(2) / ln((d+1)/2) +``` + +Windows grow with round number: early rounds (large hypercube) get small +windows; later rounds (small residual) get large windows. + +| Degree | Ratio | Window sequence | +|--------|-------|-----------------| +| 2 | 1.71 | 1, 2, 5, 14, ... | +| 3 | 1.00 | 1, 1, 2, 3, 4, ... | +| 4 | 0.76 | 1, 1, 1, 2, 2, 3, ... | + +**Two-phase structure:** +1. Streaming phase (first half): cost-optimal windows, one trace pass per window +2. Linear phase (second half): materialized mode, every round is its own window + +Parameterized by `StreamingSchedule` trait -- not a fixed constant. + +Based on BCFFMMZ25 (eprint 2025/1473): O(kN) time, O(N^{1/k}) space. + +--- + +## Slide 19: Jolt Compatibility + +Jolt's `SumcheckInstanceProver` trait: + +```rust +fn compute_message(&mut self, round: usize, claim: F) -> UniPoly; +fn ingest_challenge(&mut self, r_j: F::Challenge, round: usize); +fn finalize(&mut self); +``` + +Our `SumcheckProver` maps cleanly via adapter: + +```rust +fn compute_message(&mut self, round: usize, _claim: F) -> UniPoly { + let challenge = self.pending.take().map(Into::into); + UniPoly::from_evals(&self.inner.round(challenge)) +} +fn ingest_challenge(&mut self, r_j: F::Challenge, _round: usize) { + self.pending = Some(r_j); +} +``` + +LSB multilinear prover + this adapter = drop-in replacement for Jolt. + +--- + +## Slide 20: What We Deleted + +| Module | LOC | Why | +|--------|-----|-----| +| multilinear/provers/ | 1,190 | Old Prover trait scaffolding | +| multilinear_product/provers/ | 1,175 | Same | +| order_strategy/ | 315 | 4 strategies -> MSB only | +| SIMD dispatch (product paths) | ~500 | Superseded by fused MSB kernels | +| messages/, interpolation/ | 327 | Unused / graycode-coupled | +| Old test harness | ~800 | Legacy prover tests | +| prover/core.rs | 24 | Old trait definition | + +**Total: 4,518 lines deleted across 86 files.** + +--- + +## Slide 21: Advanced Optimizations Fit the Trait + +From Bagad-Dao-Domb-Thaler (ePrint 2025/1117): + +| Optimization | Changes protocol? | Changes wire format? | +|--------------|-------------------|---------------------| +| LinearTime (Alg 1) | No | No | +| SqrtSpace (Alg 2) | No | No | +| SmallValue (Alg 3-4) | No | No | +| EqPoly (Alg 5-6) | No | No | +| Univariate skip | No | No | + +**All optimizations live below the trait boundary.** + +The protocol runner, verifier, and transcript are untouched. +Each optimization is a different `SumcheckProver` implementation. + +--- + +## Slide 22: Feature Gate Architecture + +```toml +[features] +default = ["arkworks", "parallel"] + +arkworks = ["ark-ff", "ark-poly", "ark-serialize", + "ark-std", "spongefish"] +parallel = ["rayon", "ark-ff?/parallel", ...] +``` + +- `--no-default-features`: pure `SumcheckField` library, no arkworks +- `--features arkworks`: blanket impl for `ark_ff::Field` +- `--features parallel`: rayon parallelism for fold and round computation +- SIMD: always compiled in, dispatched at const-fold time + +--- + +## Slide 23: Benchmarking Strategy + +### Layer 1: Kernel Throughput +- fold elements/sec vs memory bandwidth ceiling +- round() overhead on top of fold +- BF->EF promotion cliff + +### Layer 2: Protocol Scaling +- Full sumcheck: time vs 2^v on log-log axes +- Matrix: {time, blendy} x {ml, IP} x {F64, F64Ext3} x {2^16..2^24} +- Key metric: **time per element per round** + +### Layer 3: Downstream Integration +- WHIR sumcheck bench as acceptance gate +- Regression detection, not absolute performance + +--- + +## Slide 24: CI Benchmark Infrastructure + +```yaml +# .github/workflows/bench.yml +- name: Detect CPU features + run: | + if grep -q avx512ifma /proc/cpuinfo; then + echo "rustflags=-C target-feature=+avx512ifma" + fi + +- name: Run benchmarks + run: cargo bench --bench sumcheck -- --output-format bencher + +- uses: benchmark-action/github-action-benchmark@v1 + with: + alert-threshold: "115%" + auto-push: true # on main +``` + +- Auto-detects AVX-512 IFMA / NEON / scalar +- Results to gh-pages with trendlines +- 15% regression = alert + PR comment + +--- + +## Slide 25: Current Benchmark Matrix + +18 benchmark points across 6 groups: + +``` +multilinear/F64: 2^16, 2^20, 2^24 +multilinear/F64Ext3: 2^16, 2^20, 2^24 +inner_product/F64: 2^16, 2^20, 2^24 +inner_product/F64Ext3: 2^16, 2^20, 2^24 +fold/F64: 2^16, 2^20, 2^24 +fold/F64Ext3: 2^16, 2^20, 2^24 +``` + +Criterion harness with `Throughput::Elements(n)` annotations. +~5 minutes on AVX-512 hardware. + +--- + +## Slide 26: Migration Table + +| Old | New | +|-----|-----| +| `multilinear_sumcheck(evals, t, hook)` | `sumcheck(&mut MultilinearProver::new(evals), v, t, hook)` | +| `inner_product_sumcheck(a, b, t, hook)` | `sumcheck(&mut InnerProductProver::new(a, b), v, t, hook)` | +| `multilinear_sumcheck_partial(...)` | `sumcheck(&mut prover, k, t, hook)` | +| `fold(values, weight)` | `fold(values, weight)` (unchanged) | +| `Sumcheck` | `SumcheckProof` | +| `ProductSumcheck` | `SumcheckProof` (unified) | + +--- + +## Slide 27: What's NOT in Scope + +Explicit non-goals (from Thaler's framing): + +- **Generic IP trait** -- sumcheck is specific, not an instance of a framework +- **Zero-knowledge** -- future `ZkSumcheckProver` wrapper (masking polynomials) +- **Batching** -- compose via random linear combinations externally +- **Reduce-to-one** -- separate sub-protocol (S4.5.2), not part of sumcheck + +These can be added later without changing the core trait or runner. + +--- + +## Slide 28: Design Principles + +1. **One protocol, one trait, many implementations.** + Three polynomial shapes are three `SumcheckProver` impls, not three runners. + +2. **The trait boundary is the optimization boundary.** + Everything above it (runner, verifier, transcript) is fixed. + Everything below it (fold, SIMD, table layout, multiplication tricks) is freedom. + +3. **Partial execution is first-class.** + `num_rounds < v` enables GKR and WHIR without special-casing. + +4. **Post-state via ownership, not return types.** + `&mut P` survives sumcheck; prover-specific accessors are type-safe. + +5. **No final oracle check in the verifier.** + The caller decides how to verify g(r) -- direct eval, delegation, or commit. + +--- + +## Slide 29: Next Steps + +| Item | Status | Notes | +|------|--------|-------| +| CoefficientProver | Deferred | Port from coefficient_sumcheck.rs | +| Blendy prover | Deferred | Pending LSB vs MSB investigation (Jolt) | +| Port utilities to SumcheckField | Pending | eq_evals, poly_ops, streams | +| LSB multilinear prover | In progress | Sequential streaming (Jolt) | +| Jolt adapter | In progress | Drop-in `SumcheckInstanceProver` impl | +| StreamingSchedule trait | Investigating | Cost-model windows (BCFFMMZ25) | +| Self-hosted CI runner | Pending | EC2 Sapphire Rapids for AVX-512 | +| WHIR integration test | Pending | Point WHIR at rewrite branch | +| README update | Pending | New API docs + examples | + +--- + +## Slide 30: Summary + +**The sum-check protocol is one protocol.** + +We made the code match that fact. + +- 1 runner, 1 verifier, 1 proof type, 1 fold +- Generic over any field (not arkworks-specific) +- SIMD transparent for Goldilocks +- 31% fewer lines, 57% fewer files +- All known optimizations fit below the trait boundary +- GKR and WHIR compose naturally +- CI regression tracking from day one diff --git a/docs/slides.pdf b/docs/slides.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b40aa349f421edd7f791932744a4c653da9d615 GIT binary patch literal 415910 zcma&MV~l9Q(k?u7~N> z>LQUB7NudJWrHFK`1e3TF)-oNO zq}0Q&i)lOU(5R&o`SGpI(w9t?Iba^!PX&H?^`az3QYHn-Gy7jq55||+CslXfy!NlCZ=~Fu|NEmYAM84)_MV&b;EV7dz z5fW-99M#Faa;5EN1lw0l8i6ROQo!lWV#NiGG$6belnrltofUHc@>su^w@yj4plyW| zrm9CuUW$3^+AwsFxKPeuxOw)K2I`F;Q(+-e9xa2ypVP5dZ|_yd6eJeg=Zb0740?gJ z8Dj!H+}zuF}u8so;SeA6z=^AT~vpwaUB{6e9}aMuf@B^>rU81V-rS z9J>frCw-?huLTXalG<`h?gBNFds4E-L=zB;XC&}yy8y`W0Zcp)9sktGjK<{djs298 z+ZC0?x~$evK})S5R>@HxwPsd^v{vmiy_GB8G`%Cwxfr;e9rhNnXcu5r}RN9+0K|32E`#BR{wJ~bM*S)%cdZzacL^t;%KC2Tj zm6Hf;mN}BFAVyRnRnM49B`^8v)4+VNLoPEq05cAQ2YP|R=EK^Wbutrm@~0B$b4rNS%*El#D}`0=t+aU3+dG7A6X&m)&E%%z37iHeMfcaj^Vv_FN-% ziU^LLt;njrs{-q@DNs=V;@fy%w2?bVOf*rqRIk$&>}bM?vk%q-?0_fU)LT;rfpp+` z=$tNaX!AFZzdB(v&?{osWPdH)+?UW3o|F_M43vqj@&6xF|ImK|5sH!RzYIxc7B;s3 z5tGZ@>#@Wg4!6&!@7Da-xQN8S>eTexOhoAQFl(6ox3(6m2&N?FB)@%#0*plIVrI__ zjLksI%Lx*Uwj(OXhJ^2S_fdMjhf{eFz8)XPFRNOP1cltIa&moJfB*h|&hFA)57zPR z@_w<>@cmwo%nDWeQq0r!{oKDSUh~=dp_04brlBkJ|31@A=E1xD#&q9*L3TgCM5pCE zd_m&@$q_laueU8igD>VX=;aqL`B7e#PG-~ ze0+6{5;Y5oUG86A52pD`MNY2f*%pj5QI~LP7mglZ(zW6B&c#ix^4)uN^r7`c@v=1c z{usOuoZgF`+o7n949?=iM^Qm8K$U<8fI0H&>$-h}8EfH2zb~bRUFZsoIWL@s(NqCXdk@N8Q`4ciQ{v?Qg&Vz~ zj(NVim+K4o`!cLrQ zNbH>_v2LY>qXHZb!13O=LDZ2{HW==^RmdU3g9uIJ_TE9l#a2-*Zf*kc6MQ$?M)oI2 zmcL{I8B!*HZ$<^kf!rgoWuSp0_X_kPQTB1;LiB+ovAr&){NObsD(HPYtuwpGsP+`? zQ<+ttd;d#~!^!EbXy0F%-&=Vu2%siah+?fD3Qb%*&3Z=PSXa*U zHJFAD7Q3m&S#w5;x25Cc%ujNJS|f&SYm4MYiS`9FS=VWT_I71&xY|>gLu33+c z&CRbiU!&`KyjBtXAzKGExl!)hku^Mnt}1=OK)MRHiW6ZndZkFHZ7617XAfC3w>xM) zXdA~*s}<9?Q-s`9v?qR2p)8F3rsFldY_W=**ONI&9e@h}YEEmuT_^9yBgCTiB*aw; zE-`3OLT8iIt)QafZ(j%i?@}eW=P2WDuTztD>>8J|88t6Z+Yovm`=!uCg1P;YR1!sR-dR)Wuo&vI{ns-JI0_HFm)bMwNt zp=%dmAyH7>w*ypn=2rxaT^e`cZ@(mJcq&Ta;~om7NMvKp>HP5)isDQ3U)V!pojLwT-G2 zO4

qTtE=m*#8bNO@ftd=;B_G!U5NhNE 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 H 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%0Aw|CeU|=JP)0_Qk(Lcuwr?qJ&WjL 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

gz|!`sOQm)Q@`O;y@_WI%U&@eJI^cu68S*x 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

M^kE~3YT+huooXI$r%qiza1 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

cQsAsjXvH>H`T! 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

DR5;PF6A<5{{Wh;Tm_2BK5$s`T5 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