feat: relatively independent joinings over a common factor (#107) - #159
Merged
Conversation
Generic, signature-free transfer infrastructure for the rankwise recursion, one level above the uniform construction it was drafted as. `Graphon/ForMathlib/RelativeFactorCoupling.lean` (upstream candidate, Mathlib-only imports): * `map_condDistrib_id` — fibre concentration: pushing `condDistrib id q μ` through `q` is the deterministic identity kernel. Conditioning on `q` pins down `q`; everything else rests on this. * `relativeFactorCoupling μ ν q r = (condDistrib id q μ ×ₖ condDistrib id r ν) ∘ₘ μ.map q` — both sides disintegrated over the common `Z`-factor, fibres multiplied independently. * both marginals, the common-factor identity `q ∘ fst =ᵐ r ∘ snd` (proved from the two fibre-concentration statements, one per side — equality of the factor marginals says nothing about the joint), and `condIndepFun_fst_snd_relativeFactorCoupling`. The conditioning σ-algebra is `comap (q ∘ Prod.fst)`, a variable on the coupling space, not the disintegration variable `∘ₘ` integrates out: only the former is visible to consumers. No σ-algebra equality `σ(q ∘ fst) = σ(snd)` is claimed or supplied — the latent may carry strictly more than the factor. `Graphon/UniformFactorCoupling.lean`: `exists_relativeFactorCoupling_uniform01`, the uniform specialization. The only uniform-specific input is `Measure.exists_measurable_map_eq_uniform01` (#140). Audit 227 → 237 (both scripts). Build clean, census + axiom audit OK.
2 tasks
# Conflicts: # scripts/axiom_audit.lean # scripts/check_census_and_axioms.py
This was referenced Jul 31, 2026
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.
Generic transfer infrastructure for the R4 rankwise recursion, pitched one level above the uniform construction it was drafted as. Signature-free throughout; #107 remains open.
Branched from
master, independent of #158.Graphon/ForMathlib/RelativeFactorCoupling.lean— upstream candidateMathlib-only imports, nothing about relational structures.
map_condDistrib_id— fibre concentration: pushingcondDistrib id q μforward throughqis the deterministic identity kernel, a.e. for the law of the factor. This is the whole content of "conditioning onqpins downq", and everything else rests on it. It plausibly belongs besidecondDistrib_compandcondDistrib_self.relativeFactorCoupling μ ν q r = (condDistrib id q μ ×ₖ condDistrib id r ν) ∘ₘ μ.map q— the relatively independent joining ofμandνover a common factor: both sides disintegrated overZ, fibres multiplied independently. The independent productμ.prod νdoes not identify the factors, and an arbitrary coupling that did could still let each side see more of the other.μandν(the second underν.map r = μ.map q);comp_fst_ae_eq_comp_snd_relativeFactorCoupling— the common-factor identityq ∘ Prod.fst =ᵐ r ∘ Prod.snd, proved from the two fibre-concentration statements, one on each side. Equality of the two factor marginals would not suffice: it says nothing about the joint law.condIndepFun_fst_snd_relativeFactorCoupling— the two coordinates are conditionally independent given the common factor.Conditioning
The conditioning σ-algebra is
MeasurableSpace.comap (q ∘ Prod.fst) inferInstance, generated by a variable on the coupling space itself, not by theZ-valued disintegration variable that∘ₘintegrates out. Only the former is available to downstream consumers, who see the coupling and not its construction. Conditional independence of the second coordinate from any coarser measurable function of the first is then a corollary by composition, and the common-factor identity transfers the statement tor ∘ Prod.sndwhen that side is more convenient.No σ-algebra equality
σ(q ∘ fst) = σ(snd)is asserted or supplied. The coupling gives only the inclusion modulo the law: the second coordinate may carry strictly more than the shared factor, exactly asUcarries more than1_{U < p}. What the conditional independence excludes is that the surplus says anything about the first coordinate beyond what the factor already determines.The structural identity behind the proof is
map_factorProd_relativeFactorCoupling: the joint law of the factor and the two coordinates is(Kernel.id ×ₖ (κ ×ₖ η)) ∘ₘ μ.map q, i.e. reading the factor off the first coordinate reconstitutes the outer integration. The two conditional distributions are then identified with the two disintegration kernels, and Mathlib'scondIndepFun_iff_map_prod_eq_prod_condDistrib_prod_condDistribcloses it.Graphon/UniformFactorCoupling.leanexists_relativeFactorCoupling_uniform01— the uniform specialization, bundling a measurable coding map with all five properties of the resulting coupling. The only uniform-specific input isMeasure.exists_measurable_map_eq_uniform01(#140), which suppliesf : ℝ → Zmatching the two factor laws; everything after that is the generic joining. There is no separateuniformFactorCouplingdefinition — the wrapper specializes the generic construction directly, so there is one object and one API.This runs in the direction
Graphon.KernelRandomizationdoes not: that module manufactures a variable with a prescribed law out of a uniform, whereas here a uniform is manufactured alongside an already-given variable. Being reusable at every rank, it is the narrow transfer step the recursion needs in place of porting an external de Finetti package.Gates
lake build— 0 errors.scripts/check_census_and_axioms.py— census and axiom audit OK; the ten new declarations use onlypropext,Classical.choice,Quot.sound.scripts/axiom_audit.leanand theAUDITED_DECLSliteral: 229 → 239, measured directly on base and head (base is master after feat: rank-one mutual conditional independence (#107) #158).sorry/admit.