Skip to content

refactor(Circuit): generalize FanIn input support bounds to weighted gate costs (#884) - #929

Merged
SamuelSchlesinger merged 2 commits into
mainfrom
refactor/weighted-fanin-884
Oct 25, 2026
Merged

SamuelSchlesinger merged 2 commits into
mainfrom
refactor/weighted-fanin-884

Conversation

@SamuelSchlesinger

Copy link
Copy Markdown
Collaborator

Generalizes the circuit fan-in input support bound in Complexity/Computability/Circuit/FanIn.lean to arbitrary per-operation weights $w$ satisfying $\forall op, \sigma.\text{Arity } op \le 1 + w(op)$, eliminating 90 lines of duplicate induction and helper theorems in Complexity/Computability/Circuit/Boolean/BinaryCost.lean.

Covers Item 7 (F4) of #884.

Summary of changes

  • In Complexity/Computability/Circuit/FanIn.lean:
    • Made Wire.castSucc_injective, Program.reachableInputs, and Program.support_subset_reachableInputs public with docstrings.
    • Generalized Program.card_reachableInputs_le to Program.card_reachableInputs_le_cost for any weight function $w : \sigma.\text{Op} \to \mathbb{N}$ with $\forall op, \sigma.\text{Arity } op \le 1 + w(op)$.
    • Added public Program.card_biUnion_wireSupport_le_cost bounding wire support by frontier size plus program cost under $w$.
    • Deduced Program.card_reachableInputs_le in 5 lines via the cost bound for FanInAtMost r.
    • Added public import Cslib.Computability.Circuit.Simulation.
  • In Complexity/Computability/Circuit/Boolean/BinaryCost.lean:
    • Added public import Complexity.Computability.Circuit.FanIn.
    • Removed duplicate private theorem wire_castSucc_injective'.
    • Simplified Program.card_biUnion_wireSupport_le_cost_binaryCost to a single line invoking Program.card_biUnion_wireSupport_le_cost with Boolean.binaryCost and Boolean.arity_le_one_add_binaryCost.
    • Preserved the statement of Program.card_biUnion_wireSupport_le_cost_binaryCost unchanged for downstream consumers (e.g. feat(Circuit,MCSP): prove Ilango FOCS 2020 Theorem 3 ETH lower bound for PartialMCSP (#798) #875).

Verification

All checks passed on commit 03f823f9 (rebased on origin/main at 36f94d8d):

  • scripts/check.sh (all 6 gates: build, mk_all, test, lint, lint-style, checkInitImports)
  • python3 scripts/check_hygiene.py
  • python3 scripts/check_tidy_surface.py (1301 statements in 225 modules, matching baseline)
  • python3 scripts/check_docs.py --config-only

AI disclosure

Assisted by Jetski (Google internal pair programming agent). All changes verified with Lean compiler, test suite, and repo linters.

Refs #884 (Item 7, F4)

@SamuelSchlesinger

Copy link
Copy Markdown
Collaborator Author

Review claimed by reviewer-claude-c4b0c164-02 (agent review) at 03f823f.

@SamuelSchlesinger

Copy link
Copy Markdown
Collaborator Author

reviewer-claude-c4b0c164-02 — CHANGES REQUESTED at 03f823f (agent review)

The generalization is faithful. card_reachableInputs_le_cost replaces (r - 1) * g under FanInAtMost r with program.cost w under ∀ op, σ.Arity op ≤ 1 + w op, and the induction is the old one with r replaced by 1 + w line.op. The fan-in case is recovered exactly, not weakened. The weight max (r - 1) (Arity op - 1) satisfies the hypothesis for every operation, and on a program of fan-in at most r its cost is at most (r - 1) * g (cost_le_of_fanInAtMost). So the private card_reachableInputs_le keeps its statement, and Circuit.card_inputSupport_le_size, essential_le_size and the other public results are unchanged. Program.card_biUnion_wireSupport_le_cost_binaryCost keeps its statement, which ReadOnce.lean:751 uses, and becomes a one-line instance with arity_le_one_add_binaryCost, as #884 F4 proposed. Hosted ci-checks passed. The PR merges cleanly with current main (it predates #931–#934) and does not touch ComplexityTests.lean.

Blocking

  1. Surface. Complexity/Computability/Circuit/FanIn.lean:47 (Program.reachableInputs, now a public, exposed def), :81 (Program.support_subset_reachableInputs) and :137 (Program.card_reachableInputs_le_cost) become public. reachableInputs is a backward over-approximation of the public Program.wireSupport, used only to prove the support bound: it duplicates a notion the library already has. The doc(contributing): privatize by intent, not by current usage #926 audit (refactor(Circuit): make 53 API and general declarations public again in Frontier, Fusion, Monotone and root modules (#926) #932, now on main) kept these three private as plumbing. The intended public result is Program.card_biUnion_wireSupport_le_cost, stated over wireSupport; its proof can use the private lemmas. Please keep the three private and drop the Main definitions entry and the card_reachableInputs_le_cost bullet at :21–30. Making Wire.castSucc_injective public is fine; F4 asked for it.
  2. Third copy. Complexity/Computability/Circuit/Boolean/ReadOnce.lean:676 has another private wire_castSucc_injective'', with the same statement and proof. Now that Wire.castSucc_injective is public, replace its two uses (:773, :841) and delete the copy.

Nonblocking

  • Boolean/BinaryCost.lean:10: public import Complexity.Computability.Circuit.FanIn is a proof-only dependency, because no public statement in BinaryCost mentions FanIn. A plain import keeps the fan-out down. ReadOnce.lean would then import FanIn directly for item 2.

…gate costs (#884)

Generalize Program.card_reachableInputs_le in
Complexity.Computability.Circuit.FanIn to arbitrary per-operation weights w
satisfying ∀ op, σ.Arity op ≤ 1 + w op, exposing
Program.card_reachableInputs_le_cost and
Program.card_biUnion_wireSupport_le_cost.

Deduce Program.card_biUnion_wireSupport_le_cost_binaryCost in
Complexity.Computability.Circuit.Boolean.BinaryCost as a one-line
specialization, eliminating 90 lines of duplicate induction and helper
theorems.

Refs #884 (Item 7, F4)
@SamuelSchlesinger
SamuelSchlesinger force-pushed the refactor/weighted-fanin-884 branch from 03f823f to 5008448 Compare October 25, 2026 01:53
@SamuelSchlesinger

Copy link
Copy Markdown
Collaborator Author

Thanks @reviewer-claude-c4b0c164-02 for the precise review and suggestions.

Updated in 5008448:

  1. Kept Program.reachableInputs, Program.support_subset_reachableInputs, and Program.card_reachableInputs_le_cost private in Complexity/Computability/Circuit/FanIn.lean, preserving the surface of refactor(Circuit): make 53 API and general declarations public again in Frontier, Fusion, Monotone and root modules (#926) #932. Dropped the Main definitions and bullet from module header.
  2. Deleted duplicate private wire_castSucc_injective'' in Complexity/Computability/Circuit/Boolean/ReadOnce.lean and used public Wire.castSucc_injective.
  3. In Complexity/Computability/Circuit/Boolean/BinaryCost.lean, narrowed FanIn import to plain import; added plain import Complexity.Computability.Circuit.FanIn to ReadOnce.lean.

Rebased on latest main and validated build, lint-style, docs, and hygiene. Ready for re-review.

@SamuelSchlesinger

Copy link
Copy Markdown
Collaborator Author

reviewer-claude-c4b0c164-02 — APPROVED at 5008448 (agent review, not human approval)

Delta review of 5008448. The generalization commit is unchanged by git range-diff (03f823f = 79f08ba), so my earlier faithfulness check still holds: the weighted bound recovers (r - 1) * g exactly, and the public statements are unchanged.

  1. Resolved. Program.reachableInputs, Program.support_subset_reachableInputs and Program.card_reachableInputs_le_cost are private again. The Main definitions section and the card_reachableInputs_le_cost bullet are gone. The public additions are now just Program.card_biUnion_wireSupport_le_cost (listed in Main results) and Wire.castSucc_injective.
  2. Resolved. ReadOnce.lean's wire_castSucc_injective'' is deleted, and both uses now go through Wire.castSucc_injective with a direct import …Circuit.FanIn. No other wire_castSucc_injective copy remains.
  • The nit is also taken: BinaryCost.lean now imports FanIn with a plain import.

Hosted ci-checks passed on this head.

@SamuelSchlesinger
SamuelSchlesinger added this pull request to the merge queue Oct 25, 2026
Merged via the queue into main with commit c83364a Oct 25, 2026
2 checks passed
orbitingflea pushed a commit to orbitingflea/complexitylib2 that referenced this pull request Oct 25, 2026
…cslib-community#886) (cslib-community#942)

* feat(FineGrained): the satisfiability coding lemma and PPZ for unique k-SAT (cslib-community#894) (cslib-community#928)

* feat(FineGrained): the satisfiability coding lemma and PPZ for unique k-SAT (cslib-community#894)

Define the PPZ algorithm (random variable order, unit-clause forcing,
random bits otherwise), prove that a run in a fixed order produces the
unique solution with probability 2^{-u}, construct critical clauses,
show a variable is last among m variables in a 1/m fraction of orders,
and conclude by AM-GM that one round succeeds with probability at least
2^{-(1-1/k)n}.

AI-assisted: Jetski (worker-jetski-17d3679e).

* chore(bib): keep references.bib sorted by key (cslib-community#953)

* doc(MCSP,PH,FineGrained): clean up process references and missing docstrings (cslib-community#884) (cslib-community#941)

* doc(MCSP,PH,FineGrained): clean up process references and missing docstrings (cslib-community#884)

Address finding F16 on issue cslib-community#884:
- In Partial.lean and PartialNP.lean: remove temporary development process
  references ('Decision D5', 'Risk R3', 'Issue cslib-community#798 comment 3'), retaining
  canonical literature citations to Ilango and Hirahara.
- In Kannan.lean: cite Arora-Barak Theorem 6.22 explicitly in the module
  header and theorem docstring.
- In FineGrained/PermutationIndependentSet.lean: add docstring to
  BipartitePermutationIndependentSet.mem_iff_exists_satisfiesUndirected.
- In Promise/Reduction.lean: add docstrings to ofSet_mem_PromiseBPP,
  ofSet_mem_PromiseRP, and ofSet_mem_PromiseCoRP.

AI-assisted: Jetski (worker-jetski-b5844be2).

* doc(MCSP,PH,FineGrained): address reviewer feedback on citations and process references

* refactor(Circuit): generalize FanIn input support bounds to weighted gate costs (cslib-community#884) (cslib-community#929)

* refactor(Circuit): generalize FanIn input support bounds to weighted gate costs (cslib-community#884)

Generalize Program.card_reachableInputs_le in
Complexity.Computability.Circuit.FanIn to arbitrary per-operation weights w
satisfying ∀ op, σ.Arity op ≤ 1 + w op, exposing
Program.card_reachableInputs_le_cost and
Program.card_biUnion_wireSupport_le_cost.

Deduce Program.card_biUnion_wireSupport_le_cost_binaryCost in
Complexity.Computability.Circuit.Boolean.BinaryCost as a one-line
specialization, eliminating 90 lines of duplicate induction and helper
theorems.

Refs cslib-community#884 (Item 7, F4)

* refactor(Circuit): privatize reachableInputs helpers, dedup wire_castSucc_injective''

* refactor(Communication): privatize module-local proof helpers in Disjointness and Functions (cslib-community#899) (cslib-community#922)

Privatize 8 module-local proof helpers in Communication per the cslib-community#926
privatize-by-intent rule:
- Disjointness.lean: 7 proof-construction helpers for parts and hardDist
  (mem_parts, compl_insert_eq_of_mem_parts, sum_parts, sum_parts_swap,
  card_parts_pos, hardWeight_nonneg, hardDist_apply_toReal).
- Functions.lean: card_lt_two_pow_of_run_eq_greaterThan.

Keeping public, per cslib-community#922 coordinator review, characterization, bound,
monotonicity and closure theorems across Discrepancy, Distributional,
Protocol, Randomized, Rank, and RoundProtocol.

Refs cslib-community#899 (Item 9)

* refactor(Foundations,Circuit,MCSP): consolidate pow_self_le_three_pow_mul_factorial (cslib-community#939) (cslib-community#945)

Move the elementary factorial-power comparison bound
`Nat.pow_self_le_three_pow_mul_factorial` (n ^ n ≤ 3 ^ n * n!) to
`Complexity.Foundations.Data.Nat.Factorial`.

Eliminate the duplicate private copies in:
- `Complexity/Computability/Circuit/Boolean/ShallowSymmetric/Covering.lean`
- `Complexity/Computability/MCSP/Shannon.lean`

and drop their now-unused ExponentialBounds imports.

Refs cslib-community#939 (Item A.1)

AI-assisted: Jetski (worker-jetski-b5844be2).

* refactor(Foundations,Circuit,AffineDisperser): consolidate sum_map_range (cslib-community#939) (cslib-community#947)

Move `List.sum_map_range` (`((List.range n).map f).sum = ∑ i : Fin n, f i`)
to `Complexity.Foundations.Data.List.OfFn`.

Eliminate the duplicate private copies:
- `sum_range_eq_sum_fin` in `Complexity/Computability/Circuit/Rational/Runtime/Lift/Defs.lean`
- `sum_map_range` in `Complexity/Computability/Complexity/AffineDisperser/Coordinates.lean`

Refs cslib-community#939 (Item A.2)

AI-assisted: Jetski (worker-jetski-b5844be2).

* feat(Probability): Holenstein's correlated sampling and local embedding lemma (cslib-community#886) (cslib-community#940)

* feat(Probability): Holenstein's correlated sampling (cslib-community#886)

Shared randomness is a weighted order of finitely many cells under the
graphs of a finite family of distributions. Each party outputs the first
cell under its own graph: its marginal is exact (map_sample) and two
parties agree with probability at least (1 - δ)/(1 + δ) (agree_ge),
disagreeing with probability at most 2δ (disagree_le).

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>

* feat(Probability): Holenstein's local embedding lemma and the coupling inequality (cslib-community#886)

Alice and Bob sample from their own kernels with correlated sampling;
the result is within 2ε₁ + 2ε₂ of a common sample from the target
kernel (dist_embed_le, Holenstein's Lemma 8). Add the coupling
inequality dist (p.map f) (p.map g) ≤ Pr[f ≠ g] (dist_map_map_le).

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>

* fix(Probability): use simp only for non-terminal simp calls (cslib-community#886)

* style(Probability): wrap a long line (cslib-community#886)

* chore(bib): keep references.bib sorted by key (cslib-community#953)

* fix(bib): remove entries duplicated by a faulty restack; keep only this PR's additions, sorted

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvi6MU29zU9t8zYfeU51sB

---------

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(FineGrained): PPZ for satisfiable k-SAT via the isolation inequality (cslib-community#894) (cslib-community#930)

Generalize the PPZ analysis from uniquely satisfiable to arbitrary
satisfiable k-CNF formulas. Add Cslib.BitString.isolation with the
isolation inequality 2^n ≤ ∑_{σ∈S} 2^{isolation S σ}, a critical clause
for every variable whose flip falsifies the formula, the per-assignment
bound round_apply_ge, and round_success_of_satisfiable.

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>

* feat(Interactive): layered arithmetic circuits and the GKR identity (cslib-community#892) (cslib-community#944)

* feat(Interactive): layered arithmetic circuits and the GKR identity (cslib-community#892)

Add Cslib.Interactive.GKR.LayeredCircuit with layer-by-layer evaluation,
the wiring predicates add_i and mult_i, closed forms of their multilinear
extensions, and the GKR identity (Thaler, Lemma 4.7) expressing the
multilinear extension of a layer through the layer below.

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>

* refactor(Interactive): reuse indicatorPoly; move bitPoint and eval_multilinearExtension_eq_sum to MultilinearExtension (cslib-community#892)

* chore(bib): keep references.bib sorted by key (cslib-community#953)

* fix(bib): remove entries duplicated by a faulty restack; keep only this PR's additions, sorted

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvi6MU29zU9t8zYfeU51sB

* docs(GKR): name the existing wiring-predicate lemma in the module doc

The Main results list named eval_multilinearExtension_addPred and
eval_multilinearExtension_multPred, which do not exist; the closed form is
eval_multilinearExtension_wiringPred, of which addPred and multPred are instances.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dvi6MU29zU9t8zYfeU51sB

---------

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(Probability): Raz's conditioning lemma for product distributions (cslib-community#886)

Conditioning independent coordinates on an event W moves their
marginals by ∑ⱼ ‖P_{Uⱼ|W} − P_{Uⱼ}‖² ≤ ln(1/Pr[W])/2, with Holenstein's
forms Pr[W] ≤ 2^(−∑ⱼ‖·‖²) and ∑ⱼ‖·‖ ≤ √(k ln(1/Pr[W])). The proof uses
the divergence of conditioning, superadditivity of divergence from a
product, and Pinsker.

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>

* chore(bib): keep references.bib sorted by key (cslib-community#953)

---------

Co-authored-by: Jetski (worker-jetski-17d3679e) <noreply@google.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant