R4: the Austin base, its action, and the base-extended bundle (#197 unit 2) - #207
Merged
Conversation
Fixes the action and proves it **strict** before any bundle, kernel or conditional-distribution statement is written. Equivariance cannot be repaired downstream, so it is established first. `AustinBaseSpace = PooledRankLatentSpace × ClusterSpace` is the equivariant lower-rank base over which the enriched kernel will be built — not fresh rank-`n` coordinates and not relational data. Every pooled latent index has cardinality `< n`, so it carries no rank-`n` block. All five required results: * `mixedClusterLift` with `_one` and `_mul`. `poolLift` acts on the original half and fixes the spare half; its preservation of `Sum.isRight` is what keeps mixed clusters mixed, all-spare ones included. * `austinBaseRelabel_one` and `_mul` as exact **function equalities**, in the **contravariant** orientation `austinBaseRelabel (σ * τ) = austinBaseRelabel τ ∘ austinBaseRelabel σ`. The orientation is forced by `Equiv.trans` applying its first argument first, and is stated explicitly so it is not re-derived wrongly. * `enrichedPollingMap_naturality` — **one square for all four components**: structure and pooled latents definitionally, clusters by `pollingClusters_relabel` (itself `rfl`), original latents by the split corollary `restrictOriginalLatents_sumCongr`. * `enrichedPollingLaw_map_enrichedAction` — exact invariance, derived from `Measure.map_map`, that square, and `Q.invariant` alone. No almost-everywhere reasoning and no component rewriting appear in it. * `StandardBorelSpace` **inferred** for `AustinBaseSpace`, `EnrichedLowerSpace` and `EnrichedBoundarySpace`. The adapter spaces take an arbitrary coherent basis, so no `Fintype S.Srt` enters. The dependent cluster fibres are handled by `Bool`-valued pointwise bridges, with the single required cast isolated in one private lemma. Marking `MixedClusterIndex` reducible would also have worked but was rejected: unlike the compatibility aliases elsewhere in the repository it is a substantive subtype, and exposing its implementation globally to solve a local elaboration problem is too broad. Lean note: `rankLatentRelabel` and `latentRelabelOver` are not interchangeable at face value; the split corollary is carrier-parametric, so the square bridges them with `rankLatentRelabel_eq_latentRelabelOver`. Audit 433 → 437. Gates: lake build clean (3410 jobs), census + axiom audit pass, zero sorries, no warnings.
#197) Compressing the enriched law in unit 2 needs the same forward transport of mutual conditional independence that unit 1's witness uses. Duplicating the proof would be the wrong fix, so `iCondIndepFun_of_map` moves from `private` into a route-local `Austin` namespace: public within this development, which now has more than one consumer for it, and consumed by both units. This is **not** promotion to `ForMathlib/`. A second consumer inside the same route is not an independent consumer; that remains the condition for extracting a general transport theorem, and the docstring says so. `PooledPollingWitness` deliberately stays outside the namespace, keeping the name it already has on master. Gates: lake build clean (3410 jobs), census + axiom audit pass, zero sorries, no warnings.
…t 2 bundle (#197) `AustinEnrichedObject` packages a **base-extended law over the existing signature**: no synthetic relational signature is introduced, and the pooled real latents remain real rather than being encoded as Boolean relation coordinates. `austinEnrichedObject` constructs it from `Q` and the unit-1 witness as the **exact pushforward** of `enrichedPollingLaw` along the compression that drops the redundant original-latent coordinate — redundant because on the image of `enrichedPollingMap` it is `restrictOriginalLatents` of the pooled array. So `map_original` recovers `C.P` from the pooled component alone, through `Q.map_restrict_embedding` at the original-vertex embedding. `mutualCondIndep` is the unit-1 witness moved forward by the route-local `Austin.iCondIndepFun_of_map`, not a second proof. The adapter is stated for an **arbitrary** coherent basis, so no `Fintype S.Srt` enters; selecting one via `nonempty_coherentBasis` is what would introduce it. All four commuting laws are exact: * boundary projection through the extended lower factor — `rfl`; * exact-anchor projection through the layer — `rfl`; * `map_forget_base` — forgetting the base returns the corresponding pushforward of `M.law`, since the base carries no structural information; * `map_recombine` — **the unit-2 regression for exact truncation**: recombining lower and layer through `lowerFactorSpaceSuccEquiv.symm` returns the rank-`(n+1)` lower-factor law. An equality of pushed measures with the base forgotten; an a.e. version, or one retaining a base coordinate, would not constrain the successor construction where it must be constrained. The rank-`m` layer deliberately does **not** carry the base: the layer is where the fresh rank-`m` information lives, and the base is the lower-rank data it is read against. Lean note: `measurable_lowerFactorMap` is stated at `lowerRankAlgebra`; the ambient-measurable form is `measurable_lowerFactorMap'`. Audit 437 → 442. Gates: lake build clean (3410 jobs), census + axiom audit pass, zero sorries, no warnings.
…w a claim (#197) Four corrections, one of them substantive. * **The base does not "carry no rank-`n` block".** That claim was false of exactly the half that matters: `ClusterSpace` is indexed by rank-`n` supports that are not wholly original, so the cluster component carries rank-`n` blocks by construction. Only the *latent* component is free of them. The claim was also self-undermining — a base with no rank-`n` block could not do the work the polling argument needs conditioning on it to do. Corrected at all three sites, plus a fourth in `RelAustinPolling` whose scoping was ambiguous in the same way; the text now states the asymmetry between the two components explicitly rather than a blanket claim. * **`map_forget_base` asserts no independence.** Its docstring said the base carries no structural information; the clusters are correlated structural polling data. The identity says only that the structural factor law is recovered once the base is discarded. * **`map_recombine` is a prerequisite, not the truncation statement.** It mentions neither `C.P` nor `rankLatentProjection`, so it cannot pin `RankSuccessor.truncation`. Exact truncation will come from `map_original` together with the assembly unit's source-splitting identity. Narrowed in the theorem, the section header, and the index. * **`[Fintype S.Srt]` removed from `austinEnrichedObject`.** Nothing there selects a basis; it contradicted the countable-only contract, and removing it strictly generalizes the signature. No signature in the module now carries it. Also recalibrates the module header and index entry, which described only the checkpoint and named the nonexistent `enrichedPollingLaw_map_austinBaseRelabel`; the declaration is `enrichedPollingLaw_map_enrichedAction`. No proof changes. Gates: lake build clean (3410 jobs), census + axiom audit pass, zero sorries, no warnings.
The heading still read "law-free checkpoint", which described the module before the bundle and adapter were added to it. It now names what the module actually contains. No statement or proof changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Unit 2 of the Austin route (#197; #107 remains open): the Austin base, its action, and the base-extended bundle with its coherent-basis adapter. Route A only — no Kallenberg machinery, and nothing here asserts the two routes' outputs agree.
The base, and the asymmetry between its two components
AustinBaseSpace = PooledRankLatentSpace × ClusterSpaceis the equivariant base over which the enriched kernel will be built, packaged over the existing signature — no synthetic relational signature is introduced, and the pooled real latents stay real rather than being encoded as Boolean relation coordinates.Its two components differ in kind, and conflating them is a mistake worth naming. The latent component carries no rank-
nlatent, every pooled index having cardinality< n. The cluster component deliberately does carry rank-nblocks, at supports that are not wholly original. The clusters are correlated structural polling data — which is exactly why conditioning on them is informative, and why a base free of rank-nblocks could not do the job.The action, proved strict before anything is built on it
Equivariance cannot be repaired downstream, so the action is fixed and proved strict first.
poolLiftacts on the original half and fixes the spare half; its preservation ofSum.isRightis what keeps mixed clusters mixed, all-spare ones included.mixedClusterLiftwith_oneand_mul;austinBaseRelabel_oneand_mulas exact function equalities.Equiv.transapplies its first argument first, soaustinBaseRelabel (σ * τ) = austinBaseRelabel τ ∘ austinBaseRelabel σ. This is stated explicitly in the module so it is not re-derived wrongly.enrichedPollingMap_naturality— one square for all four components: structure and pooled latents definitionally, clusters bypollingClusters_relabel(itselfrfl), original latents by the split corollaryrestrictOriginalLatents_sumCongr.enrichedPollingLaw_map_enrichedAction— exact invariance, fromMeasure.map_map, that square, andQ.invariantalone. No almost-everywhere step and no component rewriting inside it.The dependent cluster fibres are handled by
Bool-valued pointwise bridges, with the single required cast isolated in one private lemma. MarkingMixedClusterIndexreducible would also have worked and was rejected: unlike the compatibility aliases elsewhere in the repository it is a substantive subtype, and exposing its implementation globally to solve a local elaboration problem is too broad.The bundle
austinEnrichedObjectconstructsAustinEnrichedObjectfromQand the unit-1 witness as the exact pushforward ofenrichedPollingLawalong the compression that drops the original-latent coordinate — redundant because on the image ofenrichedPollingMapit isrestrictOriginalLatentsof the pooled array. Somap_originalrecoversC.Pfrom the pooled component alone, throughQ.map_restrict_embeddingat the original-vertex embedding, and the #195 gate theorem stays a compiled dependency.mutualCondIndepis the unit-1 witness moved forward byAustin.iCondIndepFun_of_map, not a second proof. That helper — andAustin.iCondIndepFun_congr_condalongside it — moved fromprivateinto a route-local namespace when this unit became their second consumer. That is notForMathlibpromotion: a second consumer inside the same route is not an independent one, which remains the condition for extraction.The adapter
Stated for an arbitrary coherent basis, so no
Fintype S.Srtenters any signature in the module; selecting a basis vianonempty_coherentBasisis what would introduce it. All four commuting laws are exact:rfl;rfl;map_forget_base— forgetting the base returns the corresponding pushforward ofM.law. This asserts no independence: the clusters are correlated structural data, and the identity says only that the structural factor law is recovered once the base is discarded;map_recombine— recombining lower and layer throughlowerFactorSpaceSuccEquiv.symmreturns the rank-(n+1)lower-factor law, an equality of pushed measures with the base forgotten and no a.e. weakening. It is a prerequisite for exact truncation, not that statement: it mentions neitherC.PnorrankLatentProjection, so it does not pinRankSuccessor.truncation. Exact truncation will come frommap_originaltogether with the assembly unit's source-splitting identity.The rank-
mlayer deliberately does not carry the base: the layer is where the fresh rank-minformation lives, and the base is the lower-rank data it is read against.Boundaries held
No
condDistribor kernel equalities — those belong to the kernel unit, where every such identity is almost-everywhere under a named law. No fresh rank-nuniforms, randomization, orRankSuccessor. Countable-only throughout.Bookkeeping
Audit 433 → 442 in both
scripts/axiom_audit.leanand the intended-set literal inscripts/check_census_and_axioms.py. Gates:lake buildclean (3410 jobs), census + axiom audit pass, zero sorries, no warnings.