@lapxo/obligations 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -3
- package/TARGET.bound +147 -4
- package/contracts/extension-lineage-participation.json +30 -0
- package/contracts/m0-allocation.json +6 -0
- package/contracts/m0-binomial-bridge.json +6 -0
- package/contracts/m0-diagonal-conditional.json +15 -0
- package/contracts/m0-finite-grid.json +6 -0
- package/contracts/m0-keff-interval.json +27 -0
- package/contracts/m0-limit-diag.json +6 -0
- package/contracts/m0-limit-offdiag.json +6 -0
- package/contracts/m0-moment-identification.json +42 -0
- package/contracts/m0-pair-coincidence.json +6 -0
- package/contracts/m1-diagonal-regions.json +45 -0
- package/contracts/m1-generator-binomial.json +26 -0
- package/contracts/m1-offdiag-limit.json +42 -0
- package/contracts/m1-subcauses.json +66 -0
- package/contracts/model-collapse-1a.json +16 -0
- package/contracts/projection-chain.json +20 -0
- package/docs/contracts/experiment1a-public-attribution.md +1 -0
- package/docs/contracts/extension-lineage-participation.md +13 -0
- package/docs/contracts/installation-046-inputs.md +1 -0
- package/docs/contracts/m0-allocation.md +1 -0
- package/docs/contracts/m0-binomial-bridge.md +1 -0
- package/docs/contracts/m0-diagonal-lindeberg.md +1 -0
- package/docs/contracts/m0-diagonal-moments.md +1 -0
- package/docs/contracts/m0-diagonal-symmetric.md +1 -0
- package/docs/contracts/m0-diagonal-threshold.md +1 -0
- package/docs/contracts/m0-finite-grid.md +1 -0
- package/docs/contracts/m0-keff-floor-refutation.md +1 -0
- package/docs/contracts/m0-keff-interval.md +1 -0
- package/docs/contracts/m0-limit-diag.md +1 -0
- package/docs/contracts/m0-limit-offdiag.md +1 -0
- package/docs/contracts/m0-moment-identification.md +1 -0
- package/docs/contracts/m0-pair-coincidence.md +1 -0
- package/docs/contracts/m0-refuted-inverses.md +1 -0
- package/docs/contracts/m0-wf-floor-refutation.md +1 -0
- package/docs/contracts/m1-diagonal-regions.md +1 -0
- package/docs/contracts/m1-generator-binomial.md +1 -0
- package/docs/contracts/m1-offdiag-limit.md +1 -0
- package/docs/contracts/model-collapse-1a.md +11 -0
- package/docs/contracts/projection-chain.md +1 -0
- package/docs/proofs/floor-limit-diag.proof.json +29 -0
- package/package.json +1 -1
- package/proofs/definitions-046/declaration.json +11 -0
- package/proofs/experiment1a-046/declaration.json +11 -0
- package/proofs/m0-045/Obligations045/ConsensusGrid.lean +72 -0
- package/proofs/m0-045/Obligations045/M0Coincidence.lean +39 -0
- package/proofs/m0-045/Obligations045/M0Diagonal.lean +18 -0
- package/proofs/m0-045/Obligations045/M0Limit.lean +134 -0
- package/proofs/m0-045/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m0-045/Obligations045.lean +5 -0
- package/proofs/m0-045/lake-manifest.json +116 -0
- package/proofs/m0-045/lakefile.toml +9 -0
- package/proofs/m0-045/lean-toolchain +1 -0
- package/proofs/m0-046/BridgeNegatives.lean +23 -0
- package/proofs/m0-046/M0Bridge.lean +300 -0
- package/proofs/m0-046/Obligations045/ConsensusGrid.lean +72 -0
- package/proofs/m0-046/Obligations045/M0Coincidence.lean +39 -0
- package/proofs/m0-046/Obligations045/M0Diagonal.lean +18 -0
- package/proofs/m0-046/Obligations045/M0Limit.lean +134 -0
- package/proofs/m0-046/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m0-046/Obligations045.lean +5 -0
- package/proofs/m0-046/lake-manifest.json +116 -0
- package/proofs/m0-046/lakefile.toml +14 -0
- package/proofs/m0-046/lean-toolchain +1 -0
- package/proofs/m0-046-diagonal/BridgeNegatives.lean +23 -0
- package/proofs/m0-046-diagonal/M0Bridge.lean +300 -0
- package/proofs/m0-046-diagonal/M0Diagonal046.lean +235 -0
- package/proofs/m0-046-diagonal/M0Lindeberg046.lean +92 -0
- package/proofs/m0-046-diagonal/M0Moments046.lean +295 -0
- package/proofs/m0-046-diagonal/M0Threshold046.lean +278 -0
- package/proofs/m0-046-diagonal/Obligations045/ConsensusGrid.lean +72 -0
- package/proofs/m0-046-diagonal/Obligations045/M0Coincidence.lean +39 -0
- package/proofs/m0-046-diagonal/Obligations045/M0Diagonal.lean +18 -0
- package/proofs/m0-046-diagonal/Obligations045/M0Limit.lean +134 -0
- package/proofs/m0-046-diagonal/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m0-046-diagonal/Obligations045.lean +5 -0
- package/proofs/m0-046-diagonal/lake-manifest.json +116 -0
- package/proofs/m0-046-diagonal/lakefile.toml +26 -0
- package/proofs/m0-046-diagonal/lean-toolchain +1 -0
- package/proofs/m0-046-identification/M0Identification046.lean +209 -0
- package/proofs/m0-046-identification/Obligations045/M0Coincidence.lean +39 -0
- package/proofs/m0-046-identification/lake-manifest.json +116 -0
- package/proofs/m0-046-identification/lakefile.toml +12 -0
- package/proofs/m0-046-identification/lean-toolchain +1 -0
- package/proofs/m0-046-uncertainty/BridgeNegatives.lean +23 -0
- package/proofs/m0-046-uncertainty/M0BlockCoverage046.lean +163 -0
- package/proofs/m0-046-uncertainty/M0Bridge.lean +300 -0
- package/proofs/m0-046-uncertainty/M0Diagonal046.lean +235 -0
- package/proofs/m0-046-uncertainty/M0FiniteDiscord046.lean +207 -0
- package/proofs/m0-046-uncertainty/M0Interval046.lean +82 -0
- package/proofs/m0-046-uncertainty/M0Lindeberg046.lean +92 -0
- package/proofs/m0-046-uncertainty/M0Moments046.lean +295 -0
- package/proofs/m0-046-uncertainty/M0Threshold046.lean +278 -0
- package/proofs/m0-046-uncertainty/Obligations045/ConsensusGrid.lean +72 -0
- package/proofs/m0-046-uncertainty/Obligations045/M0Coincidence.lean +39 -0
- package/proofs/m0-046-uncertainty/Obligations045/M0Diagonal.lean +18 -0
- package/proofs/m0-046-uncertainty/Obligations045/M0Limit.lean +134 -0
- package/proofs/m0-046-uncertainty/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m0-046-uncertainty/Obligations045.lean +5 -0
- package/proofs/m0-046-uncertainty/lake-manifest.json +116 -0
- package/proofs/m0-046-uncertainty/lakefile.toml +35 -0
- package/proofs/m0-046-uncertainty/lean-toolchain +1 -0
- package/proofs/m1-046-bridge/M0Bridge.lean +300 -0
- package/proofs/m1-046-bridge/M1Bridge046.lean +359 -0
- package/proofs/m1-046-bridge/Obligations045/M0Limit.lean +134 -0
- package/proofs/m1-046-bridge/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m1-046-bridge/lake-manifest.json +116 -0
- package/proofs/m1-046-bridge/lakefile.toml +29 -0
- package/proofs/m1-046-bridge/lean-toolchain +1 -0
- package/proofs/m1-046-diagonal/M0Bridge.lean +300 -0
- package/proofs/m1-046-diagonal/M0Diagonal046.lean +235 -0
- package/proofs/m1-046-diagonal/M0Lindeberg046.lean +92 -0
- package/proofs/m1-046-diagonal/M0Moments046.lean +295 -0
- package/proofs/m1-046-diagonal/M0Threshold046.lean +278 -0
- package/proofs/m1-046-diagonal/M1Bridge046.lean +359 -0
- package/proofs/m1-046-diagonal/M1Diagonal046.lean +334 -0
- package/proofs/m1-046-diagonal/M1Offdiag046.lean +270 -0
- package/proofs/m1-046-diagonal/Obligations045/M0Limit.lean +134 -0
- package/proofs/m1-046-diagonal/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m1-046-diagonal/lake-manifest.json +116 -0
- package/proofs/m1-046-diagonal/lakefile.toml +35 -0
- package/proofs/m1-046-diagonal/lean-toolchain +1 -0
- package/proofs/m1-046-offdiag/M0Bridge.lean +300 -0
- package/proofs/m1-046-offdiag/M0Diagonal046.lean +235 -0
- package/proofs/m1-046-offdiag/M0Moments046.lean +295 -0
- package/proofs/m1-046-offdiag/M1Bridge046.lean +359 -0
- package/proofs/m1-046-offdiag/M1Offdiag046.lean +270 -0
- package/proofs/m1-046-offdiag/Obligations045/M0Limit.lean +134 -0
- package/proofs/m1-046-offdiag/Obligations045/M0Offdiag.lean +171 -0
- package/proofs/m1-046-offdiag/lake-manifest.json +116 -0
- package/proofs/m1-046-offdiag/lakefile.toml +32 -0
- package/proofs/m1-046-offdiag/lean-toolchain +1 -0
- package/proofs/projection-chain.md +11 -0
- package/protocols/model-collapse-1a.json +108 -0
- package/receipts.bound +684 -208
- package/samples/laws/definitions/no/sample.json +26 -0
- package/samples/laws/definitions/yes/sample.json +12 -0
- package/samples/laws/experiment1a/no/sample.json +16 -0
- package/samples/laws/experiment1a/yes/sample.json +8 -0
- package/samples/laws/m0-allocation/no/sample.json +5 -0
- package/samples/laws/m0-allocation/yes/sample.json +7 -0
- package/samples/laws/m0-binomial-bridge/no/pairwise-is-not-joint.json +59 -0
- package/samples/laws/m0-binomial-bridge/no/sample.json +13 -0
- package/samples/laws/m0-binomial-bridge/yes/sample.json +16 -0
- package/samples/laws/m0-binomial-bridge/yes/small-binomial-table.json +100 -0
- package/samples/laws/m0-diagonal-conditional/no/sample.json +5 -0
- package/samples/laws/m0-diagonal-conditional/yes/sample.json +7 -0
- package/samples/laws/m0-finite-grid/no/sample.json +5 -0
- package/samples/laws/m0-finite-grid/yes/sample.json +7 -0
- package/samples/laws/m0-keff-interval/no/sample.json +215 -0
- package/samples/laws/m0-keff-interval/yes/api-rows.json +2002 -0
- package/samples/laws/m0-keff-interval/yes/sample.json +70 -0
- package/samples/laws/m0-limit-diag/no/sample.json +5 -0
- package/samples/laws/m0-limit-diag/yes/sample.json +7 -0
- package/samples/laws/m0-limit-offdiag/no/sample.json +5 -0
- package/samples/laws/m0-limit-offdiag/yes/sample.json +7 -0
- package/samples/laws/m0-moment-identification/no/sample.json +47 -0
- package/samples/laws/m0-moment-identification/yes/sample.json +97 -0
- package/samples/laws/m0-pair-coincidence/no/sample.json +5 -0
- package/samples/laws/m0-pair-coincidence/yes/sample.json +7 -0
- package/samples/laws/m1-diagonal-regions/no/sample.json +44 -0
- package/samples/laws/m1-diagonal-regions/yes/sample.json +45 -0
- package/samples/laws/m1-generator-binomial/no/sample.json +21 -0
- package/samples/laws/m1-generator-binomial/yes/sample.json +290 -0
- package/samples/laws/m1-offdiag-limit/no/sample.json +17 -0
- package/samples/laws/m1-offdiag-limit/yes/sample.json +87 -0
- package/samples/laws/projection-chain/no/sample.json +26 -0
- package/samples/laws/projection-chain/yes/sample.json +25 -0
- package/samples/no/installed-artifact.json +2 -2
- package/samples/yes/installed-artifact.json +2 -2
- package/src/laws/laws.bound +146 -0
- package/vectors/laws/a7-t90.json +72 -0
- package/vectors/laws/a9-t99.json +110 -0
- package/vectors/laws/definitions.native-capture.json +326 -0
- package/vectors/laws/definitions.native.json +82 -0
- package/vectors/laws/experiment1a-protocol.native-capture.json +391 -0
- package/vectors/laws/experiment1a-protocol.native.json +64 -0
- package/vectors/laws/experiment1a-public-input.native-capture.json +224 -0
- package/vectors/laws/m0-allocation.lean.json +150 -0
- package/vectors/laws/m0-allocation.native.json +104 -0
- package/vectors/laws/m0-binomial-bridge.lean.json +185 -0
- package/vectors/laws/m0-diagonal-lindeberg.lean.json +167 -0
- package/vectors/laws/m0-diagonal-moments.lean.json +185 -0
- package/vectors/laws/m0-diagonal-symmetric.lean.json +188 -0
- package/vectors/laws/m0-diagonal-threshold.lean.json +199 -0
- package/vectors/laws/m0-finite-grid.lean.json +144 -0
- package/vectors/laws/m0-finite-grid.native.json +104 -0
- package/vectors/laws/m0-identification.lean.json +136 -0
- package/vectors/laws/m0-identification.native-capture.json +230 -0
- package/vectors/laws/m0-keff-interval.json +569 -0
- package/vectors/laws/m0-limit-diag.lean.json +141 -0
- package/vectors/laws/m0-limit-diag.native.json +108 -0
- package/vectors/laws/m0-limit-offdiag.lean.json +143 -0
- package/vectors/laws/m0-limit-offdiag.native.json +104 -0
- package/vectors/laws/m0-pair-coincidence.lean.json +139 -0
- package/vectors/laws/m0-pair-coincidence.native.json +104 -0
- package/vectors/laws/m0-uncertainty-blocks.lean.json +201 -0
- package/vectors/laws/m0-uncertainty-finite-discord.lean.json +194 -0
- package/vectors/laws/m0-uncertainty-interval.lean.json +189 -0
- package/vectors/laws/m0-uncertainty.native-capture.json +651 -0
- package/vectors/laws/m1-diagonal-partial.lean.json +192 -0
- package/vectors/laws/m1-diagonal-partial.native-capture.json +275 -0
- package/vectors/laws/m1-generator-binomial.lean.json +162 -0
- package/vectors/laws/m1-generator-binomial.native-capture.json +245 -0
- package/vectors/laws/m1-offdiag-limit.lean.json +166 -0
- package/vectors/laws/m1-offdiag-limit.native-capture.json +260 -0
- package/vectors/laws/model-collapse-1a.json +12 -0
- package/vectors/laws/projection-chain.json +61 -0
- package/vectors/laws/projection-chain.native-capture.json +311 -0
- package/vectors/laws/projection-chain.native.json +56 -0
- package/vectors/measures/installed-artifact.cli.json +6 -6
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import Obligations045.M0Offdiag
|
|
2
|
+
import Mathlib.Data.Nat.Choose.Sum
|
|
3
|
+
import Mathlib.Probability.ProbabilityMassFunction.Integrals
|
|
4
|
+
import Mathlib.Algebra.BigOperators.Group.Finset.Pi
|
|
5
|
+
|
|
6
|
+
open scoped BigOperators
|
|
7
|
+
open MeasureTheory ProbabilityTheory Filter Topology
|
|
8
|
+
noncomputable section
|
|
9
|
+
open Classical
|
|
10
|
+
namespace Obligations046.Bridge
|
|
11
|
+
|
|
12
|
+
def count {n : ℕ} (s : Finset (Fin n)) : Fin (n+1) :=
|
|
13
|
+
⟨s.card, Nat.lt_succ_of_le (by simpa using s.card_le_univ)⟩
|
|
14
|
+
def mass (p : ℝ) {n : ℕ} (s : Finset (Fin n)) : ℝ :=
|
|
15
|
+
p^s.card*(1-p)^(n-s.card)
|
|
16
|
+
def binMass (p : ℝ) (n : ℕ) (k : Fin (n+1)) : ℝ :=
|
|
17
|
+
(n.choose k : ℝ)*p^(k:ℕ)*(1-p)^(n-(k:ℕ))
|
|
18
|
+
|
|
19
|
+
theorem count_fiber_mass (p : ℝ) (n : ℕ) (k : Fin (n+1)) :
|
|
20
|
+
(∑ s : Finset (Fin n), if count s = k then mass p s else 0) = binMass p n k := by
|
|
21
|
+
have hfilter : Finset.univ.filter (fun s : Finset (Fin n) => count s = k) =
|
|
22
|
+
Finset.powersetCard (k:ℕ) (Finset.univ : Finset (Fin n)) := by
|
|
23
|
+
ext s
|
|
24
|
+
simp [count, Fin.ext_iff, Finset.mem_powersetCard]
|
|
25
|
+
rw [← Finset.sum_filter, hfilter]
|
|
26
|
+
calc
|
|
27
|
+
_ = ∑ _s ∈ Finset.powersetCard (k:ℕ) (Finset.univ : Finset (Fin n)),
|
|
28
|
+
p^(k:ℕ)*(1-p)^(n-(k:ℕ)) := by
|
|
29
|
+
apply Finset.sum_congr rfl
|
|
30
|
+
intro s hs
|
|
31
|
+
simp only [Finset.mem_powersetCard] at hs
|
|
32
|
+
simp [mass, hs.2]
|
|
33
|
+
_ = binMass p n k := by
|
|
34
|
+
simp [binMass, Finset.card_powersetCard, nsmul_eq_mul, mul_assoc]
|
|
35
|
+
|
|
36
|
+
/-- Finite product-law pushforward, before any choice of Bernoulli parameters. -/
|
|
37
|
+
theorem product_pushforward {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
38
|
+
{S T : ι → Type*} [∀ i, Fintype (S i)] [∀ i, Fintype (T i)]
|
|
39
|
+
[∀ i, DecidableEq (T i)] (m : ∀ i, S i → ℝ) (c : ∀ i, S i → T i)
|
|
40
|
+
(f : (∀ i, T i) → ℝ) :
|
|
41
|
+
(∑ x : ∀ i, S i, (∏ i, m i (x i))*f (fun i => c i (x i))) =
|
|
42
|
+
∑ k : ∀ i, T i, (∏ i, ∑ s : S i, if c i s = k i then m i s else 0)*f k := by
|
|
43
|
+
have gate (x : ∀ i, S i) (k : ∀ i, T i) :
|
|
44
|
+
(∏ i, if c i (x i) = k i then m i (x i) else 0) =
|
|
45
|
+
if (fun i => c i (x i)) = k then ∏ i, m i (x i) else 0 := by
|
|
46
|
+
by_cases h : (fun i => c i (x i)) = k
|
|
47
|
+
· subst k
|
|
48
|
+
simp
|
|
49
|
+
· rw [if_neg h]
|
|
50
|
+
have h' : ∃ i, c i (x i) ≠ k i := by
|
|
51
|
+
by_contra hn
|
|
52
|
+
push_neg at hn
|
|
53
|
+
exact h (funext hn)
|
|
54
|
+
obtain ⟨i, hi⟩ := h'
|
|
55
|
+
exact Finset.prod_eq_zero (Finset.mem_univ i) (by simp [hi])
|
|
56
|
+
symm
|
|
57
|
+
simp_rw [Fintype.prod_sum, Finset.sum_mul]
|
|
58
|
+
rw [Finset.sum_comm]
|
|
59
|
+
apply Finset.sum_congr rfl
|
|
60
|
+
intro x _
|
|
61
|
+
simp_rw [gate, ite_mul, zero_mul]
|
|
62
|
+
simp
|
|
63
|
+
|
|
64
|
+
/-- Raw individual Bernoulli outcomes are subsets of named member indices. -/
|
|
65
|
+
abbrev World {ι : Type*} (n : ι → ℕ) := ∀ i, Finset (Fin (n i))
|
|
66
|
+
instance worldMeasurableSpace {ι : Type*} (n : ι → ℕ) : MeasurableSpace (World n) := ⊤
|
|
67
|
+
instance worldDiscreteMeasurable {ι : Type*} (n : ι → ℕ) : DiscreteMeasurableSpace (World n) := ⟨fun _ => trivial⟩
|
|
68
|
+
|
|
69
|
+
def jointMass {ι : Type*} [Fintype ι] (n : ι → ℕ) (p : ι → ℝ)
|
|
70
|
+
(x : World n) : ℝ := ∏ i, mass (p i) (x i)
|
|
71
|
+
|
|
72
|
+
theorem joint_count_pushforward {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
73
|
+
(n : ι → ℕ) (p : ι → ℝ) (f : (∀ i, Fin (n i+1)) → ℝ) :
|
|
74
|
+
(∑ x : World n, jointMass n p x*f (fun i => count (x i))) =
|
|
75
|
+
∑ k : ∀ i, Fin (n i+1), (∏ i, binMass (p i) (n i) (k i))*f k := by
|
|
76
|
+
simpa [jointMass, count_fiber_mass] using
|
|
77
|
+
product_pushforward (fun i => mass (p i)) (fun _ => count) f
|
|
78
|
+
|
|
79
|
+
theorem mass_sum (p : ℝ) (n : ℕ) :
|
|
80
|
+
∑ s : Finset (Fin n), mass p s = 1 := by
|
|
81
|
+
have h := Finset.sum_powerset_apply_card (fun k => p^k*(1-p)^(n-k))
|
|
82
|
+
(x := (Finset.univ : Finset (Fin n)))
|
|
83
|
+
simp only [Finset.powerset_univ, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] at h
|
|
84
|
+
change (∑ s : Finset (Fin n), p^s.card*(1-p)^(n-s.card)) = 1
|
|
85
|
+
rw [h]
|
|
86
|
+
calc
|
|
87
|
+
_ = (p+(1-p))^n := by
|
|
88
|
+
rw [add_pow]
|
|
89
|
+
apply Finset.sum_congr rfl
|
|
90
|
+
intro k _
|
|
91
|
+
ring
|
|
92
|
+
_ = 1 := by simp
|
|
93
|
+
|
|
94
|
+
theorem mass_nonneg (p : ℝ) (hp : 0 ≤ p) (hp1 : p ≤ 1)
|
|
95
|
+
{n : ℕ} (s : Finset (Fin n)) : 0 ≤ mass p s :=
|
|
96
|
+
mul_nonneg (pow_nonneg hp _) (pow_nonneg (sub_nonneg.mpr hp1) _)
|
|
97
|
+
|
|
98
|
+
theorem jointMass_sum {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
99
|
+
(n : ι → ℕ) (p : ι → ℝ) : ∑ x : World n, jointMass n p x = 1 := by
|
|
100
|
+
simp only [jointMass, ← Fintype.prod_sum, mass_sum, Finset.prod_const_one]
|
|
101
|
+
|
|
102
|
+
def memberLaw {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
103
|
+
(n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1) :
|
|
104
|
+
PMF (World n) :=
|
|
105
|
+
PMF.ofFintype (fun x => ENNReal.ofReal (jointMass n p x)) (by
|
|
106
|
+
rw [← ENNReal.ofReal_sum_of_nonneg]
|
|
107
|
+
· simp [jointMass_sum]
|
|
108
|
+
· intro x _
|
|
109
|
+
exact Finset.prod_nonneg (fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i)))
|
|
110
|
+
|
|
111
|
+
theorem memberLaw_expectation {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
112
|
+
(n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
|
|
113
|
+
(f : World n → ℝ) :
|
|
114
|
+
(∫ x, f x ∂(memberLaw n p hp hp1).toMeasure) =
|
|
115
|
+
∑ x : World n, jointMass n p x*f x := by
|
|
116
|
+
rw [PMF.integral_eq_sum]
|
|
117
|
+
apply Finset.sum_congr rfl
|
|
118
|
+
intro x _
|
|
119
|
+
simp only [memberLaw, PMF.ofFintype_apply, smul_eq_mul]
|
|
120
|
+
have hm : 0 ≤ jointMass n p x := Finset.prod_nonneg
|
|
121
|
+
(fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i))
|
|
122
|
+
rw [ENNReal.toReal_ofReal hm]
|
|
123
|
+
|
|
124
|
+
open Obligations045.M0
|
|
125
|
+
abbrev sizes (M : Domain) (N : ℕ) (i : Fin M.K) := allocation M.w N i
|
|
126
|
+
def modelLaw (M : Domain) (N : ℕ) (a : Fin M.K → Bool) : PMF (World (sizes M N)) :=
|
|
127
|
+
memberLaw (sizes M N) (fun i => q M (a i))
|
|
128
|
+
(fun i => (q_pos M (a i)).le) (fun i => (q_lt_one M (a i)).le)
|
|
129
|
+
def correctCount {ι : Type*} [Fintype ι] {n : ι → ℕ} (x : World n) : ℕ :=
|
|
130
|
+
∑ i, (x i).card
|
|
131
|
+
|
|
132
|
+
/-- Exact finite expectation of individual Bernoulli member outcomes, not an assumed count law. -/
|
|
133
|
+
theorem conditional_error_representation (M : Domain) (N : ℕ) (a : Fin M.K → Bool) :
|
|
134
|
+
(∫ x, fairLoss (correctCount x) N ∂(modelLaw M N a).toMeasure) =
|
|
135
|
+
conditionalError M N a := by
|
|
136
|
+
rw [modelLaw, memberLaw_expectation]
|
|
137
|
+
have h := joint_count_pushforward (sizes M N) (fun i => q M (a i))
|
|
138
|
+
(fun k => fairLoss (∑ i, (k i : ℕ)) N)
|
|
139
|
+
simpa [conditionalError, binMass, count, correctCount, sizes] using h
|
|
140
|
+
|
|
141
|
+
/-- N=0 has fairLoss=1/2; it is not the average bridge. -/
|
|
142
|
+
theorem conditional_error_zero (M : Domain) (a : Fin M.K → Bool) :
|
|
143
|
+
conditionalError M 0 a = 1/2 := by
|
|
144
|
+
rw [← conditional_error_representation]
|
|
145
|
+
have hz : ∀ x : World (sizes M 0), correctCount x = 0 := by
|
|
146
|
+
intro x
|
|
147
|
+
have h : ∀ i, x i = ∅ := by
|
|
148
|
+
intro i
|
|
149
|
+
apply Finset.eq_empty_iff_forall_not_mem.mpr
|
|
150
|
+
intro j _
|
|
151
|
+
have hj := j.isLt
|
|
152
|
+
simp [sizes, allocation] at hj
|
|
153
|
+
simp [correctCount, h]
|
|
154
|
+
simp [hz, fairLoss]
|
|
155
|
+
|
|
156
|
+
theorem fair_loss_average_bridge (total N : ℕ) (hN : 0 < N) :
|
|
157
|
+
fairLoss total N = limitingLoss ((total:ℝ)/(N:ℝ)) := by
|
|
158
|
+
have hn : (0:ℝ) < N := by exact_mod_cast hN
|
|
159
|
+
have hlt : (total:ℝ)/(N:ℝ) < (1:ℝ)/2 ↔ 2*total < N := by
|
|
160
|
+
rw [div_lt_iff₀ hn]
|
|
161
|
+
constructor
|
|
162
|
+
· intro h
|
|
163
|
+
exact_mod_cast (show (2:ℝ)*total < N by linarith)
|
|
164
|
+
· intro h
|
|
165
|
+
have h' : (2:ℝ)*total < N := by exact_mod_cast h
|
|
166
|
+
linarith
|
|
167
|
+
have heq : (total:ℝ)/(N:ℝ) = (1:ℝ)/2 ↔ 2*total = N := by
|
|
168
|
+
rw [div_eq_iff hn.ne']
|
|
169
|
+
constructor
|
|
170
|
+
· intro h
|
|
171
|
+
exact_mod_cast (show (2:ℝ)*total = N by linarith)
|
|
172
|
+
· intro h
|
|
173
|
+
have h' : (2:ℝ)*total = N := by exact_mod_cast h
|
|
174
|
+
linarith
|
|
175
|
+
unfold fairLoss limitingLoss
|
|
176
|
+
simp only [hlt, heq]
|
|
177
|
+
|
|
178
|
+
/-- Probability of every joint count event, derived from raw member product probabilities. -/
|
|
179
|
+
theorem lineage_count_binomial_law {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
180
|
+
(n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
|
|
181
|
+
(k : ∀ i, Fin (n i+1)) :
|
|
182
|
+
(∫ x, if (fun i => count (x i)) = k then (1:ℝ) else 0
|
|
183
|
+
∂(memberLaw n p hp hp1).toMeasure) = ∏ i, binMass (p i) (n i) (k i) := by
|
|
184
|
+
rw [memberLaw_expectation]
|
|
185
|
+
simpa using joint_count_pushforward n p (fun z => if z = k then (1:ℝ) else 0)
|
|
186
|
+
|
|
187
|
+
/-- The snapshot retains individual named Bernoulli outcomes; it is not a count-law certificate. -/
|
|
188
|
+
def snapshot {Ω : Type*} (M : Domain) (N : ℕ)
|
|
189
|
+
(X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) : World (sizes M N) :=
|
|
190
|
+
fun i => Finset.univ.filter (fun j : Fin (sizes M N i) => X i j ω)
|
|
191
|
+
def indicator {Ω : Type*} {K : ℕ} (X : Fin K → ℕ → Ω → Bool) : Fin K → ℕ → Ω → ℝ :=
|
|
192
|
+
fun i j ω => if X i j ω then 1 else 0
|
|
193
|
+
|
|
194
|
+
theorem snapshot_card {Ω : Type*} (M : Domain) (N : ℕ)
|
|
195
|
+
(X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) (i : Fin M.K) :
|
|
196
|
+
(((snapshot M N X ω) i).card : ℝ) =
|
|
197
|
+
∑ j ∈ Finset.range (allocation M.w N i), indicator X i j ω := by
|
|
198
|
+
simp only [snapshot, Finset.card_filter, Nat.cast_sum, Nat.cast_ite,
|
|
199
|
+
Nat.cast_one, Nat.cast_zero, indicator]
|
|
200
|
+
exact Fin.sum_univ_eq_sum_range (fun j => if X i j ω then (1:ℝ) else 0) _
|
|
201
|
+
|
|
202
|
+
theorem snapshot_average {Ω : Type*} (M : Domain) (N : ℕ)
|
|
203
|
+
(X : Fin M.K → ℕ → Ω → Bool) (ω : Ω) :
|
|
204
|
+
memberAverage M (indicator X) N ω = (correctCount (snapshot M N X ω):ℝ)/(N:ℝ) := by
|
|
205
|
+
simp only [memberAverage, correctCount, Nat.cast_sum, snapshot_card, Finset.sum_div]
|
|
206
|
+
|
|
207
|
+
/-- Transfer from a declared joint Bernoulli MEMBER law on an ambient probability space.
|
|
208
|
+
hproduct names all raw bits, not counts, their expectation, or a tail/convergence law. -/
|
|
209
|
+
theorem ambient_conditional_error_representation {Ω : Type*} [MeasurableSpace Ω]
|
|
210
|
+
(M : Domain) (N : ℕ) (a : Fin M.K → Bool) (μ : Measure Ω)
|
|
211
|
+
(X : Fin M.K → ℕ → Ω → Bool) (hN : 0 < N)
|
|
212
|
+
(hmeas : AEMeasurable (snapshot M N X) μ)
|
|
213
|
+
(hproduct : Measure.map (snapshot M N X) μ = (modelLaw M N a).toMeasure) :
|
|
214
|
+
(∫ ω, limitingLoss (memberAverage M (indicator X) N ω) ∂μ) =
|
|
215
|
+
conditionalError M N a := by
|
|
216
|
+
have hpoint : (fun ω => limitingLoss (memberAverage M (indicator X) N ω)) =
|
|
217
|
+
(fun ω => fairLoss (correctCount (snapshot M N X ω)) N) := by
|
|
218
|
+
funext ω
|
|
219
|
+
rw [snapshot_average, fair_loss_average_bridge _ _ hN]
|
|
220
|
+
rw [hpoint]
|
|
221
|
+
have hf : AEStronglyMeasurable (fun x : World (sizes M N) => fairLoss (correctCount x) N)
|
|
222
|
+
(Measure.map (snapshot M N X) μ) := Measurable.of_discrete.stronglyMeasurable.aestronglyMeasurable
|
|
223
|
+
rw [← integral_map hmeas hf, hproduct, conditional_error_representation]
|
|
224
|
+
|
|
225
|
+
theorem mixture_error_representation {Ω : Type*} [MeasurableSpace Ω]
|
|
226
|
+
(M : Domain) (N : ℕ) (μ : Measure Ω)
|
|
227
|
+
(X : (Fin M.K → Bool) → Fin M.K → ℕ → Ω → Bool) (hN : 0 < N)
|
|
228
|
+
(hmeas : ∀ a, AEMeasurable (snapshot M N (X a)) μ)
|
|
229
|
+
(hproduct : ∀ a, Measure.map (snapshot M N (X a)) μ = (modelLaw M N a).toMeasure) :
|
|
230
|
+
error M N = ∑ a : Fin M.K → Bool, latentMass M a *
|
|
231
|
+
∫ ω, limitingLoss (memberAverage M (indicator (X a)) N ω) ∂μ := by
|
|
232
|
+
unfold error
|
|
233
|
+
apply Finset.sum_congr rfl
|
|
234
|
+
intro a _
|
|
235
|
+
rw [ambient_conditional_error_representation M N a μ (X a) hN (hmeas a) (hproduct a)]
|
|
236
|
+
|
|
237
|
+
/-- The implementation limit follows from the old model theorem and the new representation bridge.
|
|
238
|
+
No CLT, diagonal theorem, count-law certificate, or convergence premise is assumed. -/
|
|
239
|
+
theorem computational_offdiag_limit {Ω : Type*} [MeasurableSpace Ω]
|
|
240
|
+
(M : Domain) (μ : Measure Ω) [IsProbabilityMeasure μ]
|
|
241
|
+
(X : (Fin M.K → Bool) → Fin M.K → ℕ → Ω → Bool)
|
|
242
|
+
(hsnapshot : ∀ a N, AEMeasurable (snapshot M N (X a)) μ)
|
|
243
|
+
(hproduct : ∀ a N, Measure.map (snapshot M N (X a)) μ = (modelLaw M N a).toMeasure)
|
|
244
|
+
(hint : ∀ a i, Integrable (indicator (X a) i 0) μ)
|
|
245
|
+
(hindep : ∀ a i, Pairwise (fun j k : ℕ => IndepFun (indicator (X a) i j) (indicator (X a) i k) μ))
|
|
246
|
+
(hident : ∀ a i j, IdentDistrib (indicator (X a) i j) (indicator (X a) i 0) μ μ)
|
|
247
|
+
(hmean : ∀ a i, ∫ ω, indicator (X a) i 0 ω ∂μ = q M (a i))
|
|
248
|
+
(hmeas : ∀ a N, AEStronglyMeasurable
|
|
249
|
+
(fun ω => limitingLoss (memberAverage M (indicator (X a)) N ω)) μ)
|
|
250
|
+
(hoff : ∀ a, score M a ≠ (1:ℝ)/2) :
|
|
251
|
+
Tendsto (error M) atTop (𝓝 (floor M)) := by
|
|
252
|
+
have h := floor_limit_offdiag_mixture M μ (fun a => indicator (X a))
|
|
253
|
+
hint hindep hident hmean hmeas hoff
|
|
254
|
+
have heq : (fun N => error M N) =ᶠ[atTop]
|
|
255
|
+
(fun N => ∑ a : Fin M.K → Bool, latentMass M a *
|
|
256
|
+
∫ ω, limitingLoss (memberAverage M (indicator (X a)) N ω) ∂μ) := by
|
|
257
|
+
filter_upwards [eventually_ge_atTop 1] with N hN
|
|
258
|
+
exact mixture_error_representation M N μ X (lt_of_lt_of_le Nat.zero_lt_one hN)
|
|
259
|
+
(fun a => hsnapshot a N) (fun a => hproduct a N)
|
|
260
|
+
exact h.congr' heq.symm
|
|
261
|
+
|
|
262
|
+
/-- The starting probability is the product over NAMED INDIVIDUAL bits, with no binomial factor. -/
|
|
263
|
+
theorem mass_eq_individual_product (p : ℝ) {n : ℕ} (s : Finset (Fin n)) :
|
|
264
|
+
mass p s = ∏ j : Fin n, if j ∈ s then p else 1-p := by
|
|
265
|
+
have hc : (Finset.univ.filter (fun j : Fin n => j ∉ s)) = sᶜ := by
|
|
266
|
+
ext j
|
|
267
|
+
simp
|
|
268
|
+
rw [Finset.prod_ite]
|
|
269
|
+
simp [mass, Finset.filter_mem_eq_inter, hc, Finset.card_compl]
|
|
270
|
+
|
|
271
|
+
theorem memberLaw_individual_probability {ι : Type*} [Fintype ι] [DecidableEq ι]
|
|
272
|
+
(n : ι → ℕ) (p : ι → ℝ) (hp : ∀ i, 0 ≤ p i) (hp1 : ∀ i, p i ≤ 1)
|
|
273
|
+
(x : World n) :
|
|
274
|
+
((memberLaw n p hp hp1) x).toReal =
|
|
275
|
+
∏ i, ∏ j : Fin (n i), if j ∈ x i then p i else 1-p i := by
|
|
276
|
+
simp only [memberLaw, PMF.ofFintype_apply]
|
|
277
|
+
have hm : 0 ≤ jointMass n p x := Finset.prod_nonneg
|
|
278
|
+
(fun i _ => mass_nonneg (p i) (hp i) (hp1 i) (x i))
|
|
279
|
+
rw [ENNReal.toReal_ofReal hm]
|
|
280
|
+
simp only [jointMass, mass_eq_individual_product]
|
|
281
|
+
|
|
282
|
+
theorem zero_average_counterexample : fairLoss 0 0 ≠ limitingLoss ((0:ℝ)/0) := by
|
|
283
|
+
norm_num [fairLoss, limitingLoss]
|
|
284
|
+
|
|
285
|
+
theorem latentMass_sum (M : Domain) : ∑ a : Fin M.K → Bool, latentMass M a = 1 := by
|
|
286
|
+
have h := (Fintype.prod_sum (fun (_i : Fin M.K) (b : Bool) =>
|
|
287
|
+
if b then M.p else 1-M.p)).symm
|
|
288
|
+
simpa [latentMass] using h
|
|
289
|
+
|
|
290
|
+
/-- The finite mixture itself equals the existing implementation for EVERY N,
|
|
291
|
+
including zero. Its product-Bernoulli latent weights sum to one. -/
|
|
292
|
+
theorem model_mixture_error_representation (M : Domain) (N : ℕ) :
|
|
293
|
+
(∑ a : Fin M.K → Bool, latentMass M a *
|
|
294
|
+
∫ x, fairLoss (correctCount x) N ∂(modelLaw M N a).toMeasure) = error M N := by
|
|
295
|
+
unfold error
|
|
296
|
+
apply Finset.sum_congr rfl
|
|
297
|
+
intro a _
|
|
298
|
+
rw [conditional_error_representation]
|
|
299
|
+
|
|
300
|
+
end Obligations046.Bridge
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import M0Bridge
|
|
2
|
+
|
|
3
|
+
open scoped BigOperators
|
|
4
|
+
open MeasureTheory ProbabilityTheory
|
|
5
|
+
noncomputable section
|
|
6
|
+
open Classical
|
|
7
|
+
namespace Obligations046.M1Bridge
|
|
8
|
+
open Obligations046.Bridge
|
|
9
|
+
|
|
10
|
+
/-- Four EXCLUSIVE outcomes of the sequential ancestor-first generator.
|
|
11
|
+
Fresh success/failure are distinct elementary outcomes, not a count-law premise. -/
|
|
12
|
+
def branchMass (p c1 c2 : ℝ) (e : Fin 4) : ℝ :=
|
|
13
|
+
if e = 0 then c1 else if e = 1 then (1-c1)*c2
|
|
14
|
+
else if e = 2 then (1-c1)*(1-c2)*p else (1-c1)*(1-c2)*(1-p)
|
|
15
|
+
def branchBit (A B : Bool) (e : Fin 4) : Bool :=
|
|
16
|
+
if e = 0 then A else if e = 1 then B else decide (e = 2)
|
|
17
|
+
def success (p c1 c2 : ℝ) (A B : Bool) : ℝ :=
|
|
18
|
+
c1*(if A then 1 else 0)+(1-c1)*c2*(if B then 1 else 0)+(1-c1)*(1-c2)*p
|
|
19
|
+
|
|
20
|
+
theorem branch_normalized (p c1 c2 : ℝ) : ∑ e : Fin 4, branchMass p c1 c2 e = 1 := by
|
|
21
|
+
simp [Fin.sum_univ_succ, branchMass]
|
|
22
|
+
ring
|
|
23
|
+
|
|
24
|
+
theorem branch_nonneg (p c1 c2 : ℝ) (hp : 0 ≤ p) (hp1 : p ≤ 1)
|
|
25
|
+
(hc1 : 0 ≤ c1) (hc1' : c1 ≤ 1) (hc2 : 0 ≤ c2) (hc2' : c2 ≤ 1)
|
|
26
|
+
(e : Fin 4) : 0 ≤ branchMass p c1 c2 e := by
|
|
27
|
+
have h1 : 0 ≤ 1-c1 := sub_nonneg.mpr hc1'
|
|
28
|
+
have h2 : 0 ≤ 1-c2 := sub_nonneg.mpr hc2'
|
|
29
|
+
have h3 : 0 ≤ 1-p := sub_nonneg.mpr hp1
|
|
30
|
+
unfold branchMass
|
|
31
|
+
split_ifs <;> positivity
|
|
32
|
+
|
|
33
|
+
theorem branch_bit_fiber (p c1 c2 : ℝ) (A B z : Bool) :
|
|
34
|
+
(∑ e : Fin 4, if branchBit A B e = z then branchMass p c1 c2 e else 0) =
|
|
35
|
+
if z then success p c1 c2 A B else 1-success p c1 c2 A B := by
|
|
36
|
+
cases A <;> cases B <;> cases z <;>
|
|
37
|
+
simp [Fin.sum_univ_succ, branchBit, branchMass, success] <;> ring
|
|
38
|
+
|
|
39
|
+
/-- Bijection between raw named binary member outcomes and subsets, independent of probabilities. -/
|
|
40
|
+
def subsetBits (n : ℕ) : Finset (Fin n) ≃ (Fin n → Bool) where
|
|
41
|
+
toFun s j := decide (j ∈ s)
|
|
42
|
+
invFun z := Finset.univ.filter (fun j => z j)
|
|
43
|
+
left_inv s := by ext j; simp
|
|
44
|
+
right_inv z := by funext j; simp
|
|
45
|
+
|
|
46
|
+
def memberSubset {n : ℕ} (A B : Bool) (x : Fin n → Fin 4) : Finset (Fin n) :=
|
|
47
|
+
Finset.univ.filter (fun j => branchBit A B (x j))
|
|
48
|
+
|
|
49
|
+
theorem selector_to_member (p c1 c2 : ℝ) (A B : Bool) (n : ℕ)
|
|
50
|
+
(f : Finset (Fin n) → ℝ) :
|
|
51
|
+
(∑ x : Fin n → Fin 4, (∏ j, branchMass p c1 c2 (x j))*f (memberSubset A B x)) =
|
|
52
|
+
∑ s : Finset (Fin n), mass (success p c1 c2 A B) s*f s := by
|
|
53
|
+
have h := product_pushforward (fun (_j : Fin n) e => branchMass p c1 c2 e)
|
|
54
|
+
(fun _ e => branchBit A B e) (fun z => f ((subsetBits n).symm z))
|
|
55
|
+
simp only [branch_bit_fiber] at h
|
|
56
|
+
change _ = _ at h
|
|
57
|
+
calc
|
|
58
|
+
_ = ∑ z : Fin n → Bool,
|
|
59
|
+
(∏ j, if z j then success p c1 c2 A B else 1-success p c1 c2 A B)*
|
|
60
|
+
f ((subsetBits n).symm z) := by simpa [memberSubset, subsetBits] using h
|
|
61
|
+
_ = ∑ s : Finset (Fin n), mass (success p c1 c2 A B) s*f s := by
|
|
62
|
+
rw [← (subsetBits n).sum_comp]
|
|
63
|
+
apply Finset.sum_congr rfl
|
|
64
|
+
intro s _
|
|
65
|
+
simp only [Equiv.symm_apply_apply]
|
|
66
|
+
rw [mass_eq_individual_product]
|
|
67
|
+
simp [subsetBits]
|
|
68
|
+
|
|
69
|
+
/-- Push forward literal independent selectors to every joint lineage COUNT event. -/
|
|
70
|
+
theorem selector_count_fiber (p c1 c2 : ℝ) (A B : Bool) (n : ℕ) (k : Fin (n+1)) :
|
|
71
|
+
(∑ x : Fin n → Fin 4,
|
|
72
|
+
if count (memberSubset A B x) = k then ∏ j, branchMass p c1 c2 (x j) else 0) =
|
|
73
|
+
binMass (success p c1 c2 A B) n k := by
|
|
74
|
+
have h := selector_to_member p c1 c2 A B n (fun s => if count s = k then 1 else 0)
|
|
75
|
+
simpa only [mul_ite, mul_one, mul_zero, count_fiber_mass] using h
|
|
76
|
+
|
|
77
|
+
/-- p and weights/quota domain are exactly the existing M0 domain; c is c1 here.
|
|
78
|
+
The additional conditional child rate and named parent map are new model parameters. -/
|
|
79
|
+
structure Model where
|
|
80
|
+
base : Obligations045.M0.Domain
|
|
81
|
+
ancestors : ℕ
|
|
82
|
+
parent : Fin base.K → Fin ancestors
|
|
83
|
+
c2 : ℝ
|
|
84
|
+
c2_nonneg : 0 ≤ c2
|
|
85
|
+
c2_lt_one : c2 < 1
|
|
86
|
+
|
|
87
|
+
abbrev sizes (M : Model) (N : ℕ) (i : Fin M.base.K) :=
|
|
88
|
+
Obligations045.M0.allocation M.base.w N i
|
|
89
|
+
abbrev Ancestors (M : Model) := Fin M.ancestors → Bool
|
|
90
|
+
abbrev Leaves (M : Model) := Fin M.base.K → Bool
|
|
91
|
+
abbrev Raw (M : Model) (N : ℕ) := ∀ i : Fin M.base.K, Fin (sizes M N i) → Fin 4
|
|
92
|
+
|
|
93
|
+
def q (M : Model) (A : Ancestors M) (B : Leaves M) (i : Fin M.base.K) : ℝ :=
|
|
94
|
+
success M.base.p M.base.c M.c2 (A (M.parent i)) (B i)
|
|
95
|
+
def rawMass (M : Model) (N : ℕ) (x : Raw M N) : ℝ :=
|
|
96
|
+
∏ i, ∏ j, branchMass M.base.p M.base.c M.c2 (x i j)
|
|
97
|
+
def counts (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M) (x : Raw M N) :=
|
|
98
|
+
fun i => count (memberSubset (A (M.parent i)) (B i) (x i))
|
|
99
|
+
|
|
100
|
+
theorem rawMass_normalized (M : Model) (N : ℕ) : ∑ x : Raw M N, rawMass M N x = 1 := by
|
|
101
|
+
calc
|
|
102
|
+
_ = ∏ i : Fin M.base.K, ∑ x : Fin (sizes M N i) → Fin 4,
|
|
103
|
+
∏ j, branchMass M.base.p M.base.c M.c2 (x j) :=
|
|
104
|
+
(Fintype.prod_sum (fun i (x : Fin (sizes M N i) → Fin 4) =>
|
|
105
|
+
∏ j, branchMass M.base.p M.base.c M.c2 (x j))).symm
|
|
106
|
+
_ = 1 := by
|
|
107
|
+
apply Finset.prod_eq_one
|
|
108
|
+
intro i _
|
|
109
|
+
rw [← Fintype.prod_sum (fun (_j : Fin (sizes M N i)) e => branchMass M.base.p M.base.c M.c2 e)]
|
|
110
|
+
simp only [branch_normalized, Finset.prod_const_one]
|
|
111
|
+
|
|
112
|
+
theorem rawMass_nonneg (M : Model) (N : ℕ) (x : Raw M N) : 0 ≤ rawMass M N x := by
|
|
113
|
+
apply Finset.prod_nonneg
|
|
114
|
+
intro i _
|
|
115
|
+
apply Finset.prod_nonneg
|
|
116
|
+
intro j _
|
|
117
|
+
exact branch_nonneg _ _ _ (by linarith [M.base.p_half]) M.base.p_lt_one.le
|
|
118
|
+
M.base.c_nonneg M.base.c_lt_one.le M.c2_nonneg M.c2_lt_one.le _
|
|
119
|
+
|
|
120
|
+
/-- Full finite expectation bridge: no binomial count premise, limit premise or CLT. -/
|
|
121
|
+
theorem generator_to_binomial (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M)
|
|
122
|
+
(f : (∀ i : Fin M.base.K, Fin (sizes M N i+1)) → ℝ) :
|
|
123
|
+
(∑ x : Raw M N, rawMass M N x*f (counts M N A B x)) =
|
|
124
|
+
∑ k : ∀ i : Fin M.base.K, Fin (sizes M N i+1),
|
|
125
|
+
(∏ i, binMass (q M A B i) (sizes M N i) (k i))*f k := by
|
|
126
|
+
have h := product_pushforward
|
|
127
|
+
(fun i (x : Fin (sizes M N i) → Fin 4) => ∏ j, branchMass M.base.p M.base.c M.c2 (x j))
|
|
128
|
+
(fun i x => count (memberSubset (A (M.parent i)) (B i) x)) f
|
|
129
|
+
simpa only [selector_count_fiber, q, rawMass, counts] using h
|
|
130
|
+
|
|
131
|
+
def rawError (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M) : ℝ :=
|
|
132
|
+
∑ x : Raw M N, rawMass M N x *
|
|
133
|
+
Obligations045.M0.fairLoss (∑ i, (counts M N A B x i : ℕ)) N
|
|
134
|
+
|
|
135
|
+
def binomialError (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M) : ℝ :=
|
|
136
|
+
∑ k : ∀ i : Fin M.base.K, Fin (sizes M N i+1),
|
|
137
|
+
(∏ i, binMass (q M A B i) (sizes M N i) (k i))*
|
|
138
|
+
Obligations045.M0.fairLoss (∑ i, (k i : ℕ)) N
|
|
139
|
+
|
|
140
|
+
theorem conditional_error_bridge (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M) :
|
|
141
|
+
rawError M N A B = binomialError M N A B :=
|
|
142
|
+
by
|
|
143
|
+
simpa only [rawError, binomialError] using generator_to_binomial M N A B
|
|
144
|
+
(fun k => Obligations045.M0.fairLoss (∑ i, (k i : ℕ)) N)
|
|
145
|
+
|
|
146
|
+
/-- Primitive jointly independent ancestor-selector, child-selector and fresh-vote bits.
|
|
147
|
+
Unused primitive draws are retained in the world and summed out, not conditioned away. -/
|
|
148
|
+
abbrev Primitive := Bool × Bool × Bool
|
|
149
|
+
def bernMass (r : ℝ) (b : Bool) : ℝ := if b then r else 1-r
|
|
150
|
+
def primitiveMass (p c1 c2 : ℝ) (t : Primitive) : ℝ :=
|
|
151
|
+
bernMass c1 t.1 * bernMass c2 t.2.1 * bernMass p t.2.2
|
|
152
|
+
def primitiveBranch (t : Primitive) : Fin 4 :=
|
|
153
|
+
if t.1 then 0 else if t.2.1 then 1 else if t.2.2 then 2 else 3
|
|
154
|
+
|
|
155
|
+
theorem primitive_branch_fiber (p c1 c2 : ℝ) (e : Fin 4) :
|
|
156
|
+
(∑ t : Primitive, if primitiveBranch t = e then primitiveMass p c1 c2 t else 0) =
|
|
157
|
+
branchMass p c1 c2 e := by
|
|
158
|
+
fin_cases e <;>
|
|
159
|
+
simp [Fintype.sum_prod_type, Fintype.sum_bool, primitiveBranch, primitiveMass, bernMass, branchMass] <;> ring
|
|
160
|
+
|
|
161
|
+
theorem primitive_normalized (p c1 c2 : ℝ) : ∑ t : Primitive, primitiveMass p c1 c2 t = 1 := by
|
|
162
|
+
simp [Fintype.sum_prod_type, Fintype.sum_bool, primitiveMass, bernMass]
|
|
163
|
+
ring
|
|
164
|
+
|
|
165
|
+
theorem primitive_output_is_sequential (A B : Bool) (t : Primitive) :
|
|
166
|
+
branchBit A B (primitiveBranch t) =
|
|
167
|
+
if t.1 then A else if t.2.1 then B else t.2.2 := by
|
|
168
|
+
rcases t with ⟨u,v,f⟩
|
|
169
|
+
cases u <;> cases v <;> cases f <;> rfl
|
|
170
|
+
|
|
171
|
+
theorem primitive_member_pushforward (p c1 c2 : ℝ) (n : ℕ)
|
|
172
|
+
(f : (Fin n → Fin 4) → ℝ) :
|
|
173
|
+
(∑ t : Fin n → Primitive, (∏ j, primitiveMass p c1 c2 (t j))*
|
|
174
|
+
f (fun j => primitiveBranch (t j))) =
|
|
175
|
+
∑ x : Fin n → Fin 4, (∏ j, branchMass p c1 c2 (x j))*f x := by
|
|
176
|
+
simpa only [primitive_branch_fiber] using product_pushforward
|
|
177
|
+
(fun (_j : Fin n) t => primitiveMass p c1 c2 t) (fun _ => primitiveBranch) f
|
|
178
|
+
|
|
179
|
+
theorem primitive_count_fiber (p c1 c2 : ℝ) (A B : Bool) (n : ℕ) (k : Fin (n+1)) :
|
|
180
|
+
(∑ t : Fin n → Primitive,
|
|
181
|
+
if count (memberSubset A B (fun j => primitiveBranch (t j))) = k
|
|
182
|
+
then ∏ j, primitiveMass p c1 c2 (t j) else 0) =
|
|
183
|
+
binMass (success p c1 c2 A B) n k := by
|
|
184
|
+
have h := primitive_member_pushforward p c1 c2 n
|
|
185
|
+
(fun x => if count (memberSubset A B x) = k then 1 else 0)
|
|
186
|
+
simpa only [mul_ite, mul_one, mul_zero, selector_count_fiber] using h
|
|
187
|
+
|
|
188
|
+
abbrev PrimitiveWorld (M : Model) (N : ℕ) :=
|
|
189
|
+
∀ i : Fin M.base.K, Fin (sizes M N i) → Primitive
|
|
190
|
+
def primitiveJointMass (M : Model) (N : ℕ) (x : PrimitiveWorld M N) : ℝ :=
|
|
191
|
+
∏ i, ∏ j, primitiveMass M.base.p M.base.c M.c2 (x i j)
|
|
192
|
+
def primitiveCounts (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M)
|
|
193
|
+
(x : PrimitiveWorld M N) :=
|
|
194
|
+
fun i => count (memberSubset (A (M.parent i)) (B i) (fun j => primitiveBranch (x i j)))
|
|
195
|
+
|
|
196
|
+
/-- The main bridge begins with the THREE INDEPENDENT PRIMITIVE BITS per named member,
|
|
197
|
+
not assumed Bernoulli output bits or an assumed binomial count distribution. -/
|
|
198
|
+
theorem primitive_generator_to_binomial (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M)
|
|
199
|
+
(f : (∀ i : Fin M.base.K, Fin (sizes M N i+1)) → ℝ) :
|
|
200
|
+
(∑ x : PrimitiveWorld M N, primitiveJointMass M N x*f (primitiveCounts M N A B x)) =
|
|
201
|
+
∑ k : ∀ i : Fin M.base.K, Fin (sizes M N i+1),
|
|
202
|
+
(∏ i, binMass (q M A B i) (sizes M N i) (k i))*f k := by
|
|
203
|
+
have h := product_pushforward
|
|
204
|
+
(fun i (x : Fin (sizes M N i) → Primitive) => ∏ j, primitiveMass M.base.p M.base.c M.c2 (x j))
|
|
205
|
+
(fun i x => count (memberSubset (A (M.parent i)) (B i) (fun j => primitiveBranch (x j)))) f
|
|
206
|
+
simpa only [primitive_count_fiber, primitiveJointMass, primitiveCounts, q] using h
|
|
207
|
+
|
|
208
|
+
theorem bern_nonneg (r : ℝ) (hr : 0 ≤ r) (hr1 : r ≤ 1) (b : Bool) :
|
|
209
|
+
0 ≤ bernMass r b := by
|
|
210
|
+
cases b <;> simp only [bernMass, Bool.false_eq_true, ite_false, ite_true]
|
|
211
|
+
· exact sub_nonneg.mpr hr1
|
|
212
|
+
· exact hr
|
|
213
|
+
|
|
214
|
+
theorem primitive_joint_nonneg (M : Model) (N : ℕ) (x : PrimitiveWorld M N) :
|
|
215
|
+
0 ≤ primitiveJointMass M N x := by
|
|
216
|
+
apply Finset.prod_nonneg
|
|
217
|
+
intro i _
|
|
218
|
+
apply Finset.prod_nonneg
|
|
219
|
+
intro j _
|
|
220
|
+
exact mul_nonneg
|
|
221
|
+
(mul_nonneg (bern_nonneg _ M.base.c_nonneg M.base.c_lt_one.le _)
|
|
222
|
+
(bern_nonneg _ M.c2_nonneg M.c2_lt_one.le _))
|
|
223
|
+
(bern_nonneg _ (by linarith [M.base.p_half]) M.base.p_lt_one.le _)
|
|
224
|
+
|
|
225
|
+
theorem primitive_joint_normalized (M : Model) (N : ℕ) :
|
|
226
|
+
∑ x : PrimitiveWorld M N, primitiveJointMass M N x = 1 := by
|
|
227
|
+
calc
|
|
228
|
+
_ = ∏ i : Fin M.base.K, ∑ x : Fin (sizes M N i) → Primitive,
|
|
229
|
+
∏ j, primitiveMass M.base.p M.base.c M.c2 (x j) :=
|
|
230
|
+
(Fintype.prod_sum (fun i (x : Fin (sizes M N i) → Primitive) =>
|
|
231
|
+
∏ j, primitiveMass M.base.p M.base.c M.c2 (x j))).symm
|
|
232
|
+
_ = 1 := by
|
|
233
|
+
apply Finset.prod_eq_one
|
|
234
|
+
intro i _
|
|
235
|
+
rw [← Fintype.prod_sum (fun (_j : Fin (sizes M N i)) t => primitiveMass M.base.p M.base.c M.c2 t)]
|
|
236
|
+
simp only [primitive_normalized, Finset.prod_const_one]
|
|
237
|
+
|
|
238
|
+
instance primitiveMeasurableSpace (M : Model) (N : ℕ) :
|
|
239
|
+
MeasurableSpace (PrimitiveWorld M N) := ⊤
|
|
240
|
+
instance primitiveDiscreteMeasurable (M : Model) (N : ℕ) :
|
|
241
|
+
DiscreteMeasurableSpace (PrimitiveWorld M N) := ⟨fun _ => trivial⟩
|
|
242
|
+
|
|
243
|
+
/-- Genuine finite PMF on independent primitive bits; no binomial premise. -/
|
|
244
|
+
def primitiveLaw (M : Model) (N : ℕ) : PMF (PrimitiveWorld M N) :=
|
|
245
|
+
PMF.ofFintype (fun x => ENNReal.ofReal (primitiveJointMass M N x)) (by
|
|
246
|
+
rw [← ENNReal.ofReal_sum_of_nonneg]
|
|
247
|
+
· simp [primitive_joint_normalized]
|
|
248
|
+
· intro x _
|
|
249
|
+
exact primitive_joint_nonneg M N x)
|
|
250
|
+
|
|
251
|
+
theorem primitive_law_count_expectation (M : Model) (N : ℕ)
|
|
252
|
+
(A : Ancestors M) (B : Leaves M)
|
|
253
|
+
(f : (∀ i : Fin M.base.K, Fin (sizes M N i+1)) → ℝ) :
|
|
254
|
+
(∫ x, f (primitiveCounts M N A B x) ∂(primitiveLaw M N).toMeasure) =
|
|
255
|
+
∑ k : ∀ i : Fin M.base.K, Fin (sizes M N i+1),
|
|
256
|
+
(∏ i, binMass (q M A B i) (sizes M N i) (k i))*f k := by
|
|
257
|
+
rw [PMF.integral_eq_sum]
|
|
258
|
+
calc
|
|
259
|
+
_ = ∑ x : PrimitiveWorld M N,
|
|
260
|
+
primitiveJointMass M N x*f (primitiveCounts M N A B x) := by
|
|
261
|
+
apply Finset.sum_congr rfl
|
|
262
|
+
intro x _
|
|
263
|
+
simp only [primitiveLaw, PMF.ofFintype_apply, smul_eq_mul]
|
|
264
|
+
rw [ENNReal.toReal_ofReal (primitive_joint_nonneg M N x)]
|
|
265
|
+
_ = _ := primitive_generator_to_binomial M N A B f
|
|
266
|
+
|
|
267
|
+
theorem primitive_law_count_probability (M : Model) (N : ℕ)
|
|
268
|
+
(A : Ancestors M) (B : Leaves M) (k : ∀ i : Fin M.base.K, Fin (sizes M N i+1)) :
|
|
269
|
+
(∫ x, if primitiveCounts M N A B x = k then (1:ℝ) else 0
|
|
270
|
+
∂(primitiveLaw M N).toMeasure) = ∏ i, binMass (q M A B i) (sizes M N i) (k i) := by
|
|
271
|
+
simpa using primitive_law_count_expectation M N A B (fun z => if z = k then (1:ℝ) else 0)
|
|
272
|
+
|
|
273
|
+
theorem primitive_law_error_bridge (M : Model) (N : ℕ) (A : Ancestors M) (B : Leaves M) :
|
|
274
|
+
(∫ x, Obligations045.M0.fairLoss (∑ i, (primitiveCounts M N A B x i : ℕ)) N
|
|
275
|
+
∂(primitiveLaw M N).toMeasure) = binomialError M N A B :=
|
|
276
|
+
by
|
|
277
|
+
simpa only [binomialError] using primitive_law_count_expectation M N A B
|
|
278
|
+
(fun k => Obligations045.M0.fairLoss (∑ i, (k i : ℕ)) N)
|
|
279
|
+
|
|
280
|
+
def latentMass (M : Model) (A : Ancestors M) (B : Leaves M) : ℝ :=
|
|
281
|
+
(∏ g, bernMass M.base.p (A g))*(∏ i, bernMass M.base.p (B i))
|
|
282
|
+
|
|
283
|
+
theorem latent_normalized (M : Model) :
|
|
284
|
+
∑ A : Ancestors M, ∑ B : Leaves M, latentMass M A B = 1 := by
|
|
285
|
+
have ha : (∑ A : Ancestors M, ∏ g, bernMass M.base.p (A g)) = 1 := by
|
|
286
|
+
rw [← Fintype.prod_sum]
|
|
287
|
+
simp [Fintype.sum_bool, bernMass]
|
|
288
|
+
have hb : (∑ B : Leaves M, ∏ i, bernMass M.base.p (B i)) = 1 := by
|
|
289
|
+
rw [← Fintype.prod_sum]
|
|
290
|
+
simp [Fintype.sum_bool, bernMass]
|
|
291
|
+
simp only [latentMass, ← Finset.mul_sum, hb, mul_one, ha]
|
|
292
|
+
|
|
293
|
+
theorem mixture_error_bridge (M : Model) (N : ℕ) :
|
|
294
|
+
(∑ A : Ancestors M, ∑ B : Leaves M, latentMass M A B *
|
|
295
|
+
∫ x, Obligations045.M0.fairLoss (∑ i, (primitiveCounts M N A B x i : ℕ)) N
|
|
296
|
+
∂(primitiveLaw M N).toMeasure) =
|
|
297
|
+
∑ A : Ancestors M, ∑ B : Leaves M, latentMass M A B * binomialError M N A B := by
|
|
298
|
+
simp only [primitive_law_error_bridge]
|
|
299
|
+
|
|
300
|
+
/-- Pure algebraic reduction only; no new limit or uncertainty certificate. -/
|
|
301
|
+
theorem zero_ancestor_reduction (M : Model) (A : Ancestors M) (B : Leaves M)
|
|
302
|
+
(hc : M.base.c = 0) (i : Fin M.base.K) :
|
|
303
|
+
q M A B i = (1-M.c2)*M.base.p + if B i then M.c2 else 0 := by
|
|
304
|
+
cases h : B i <;> simp [q, success, hc, h, add_comm]
|
|
305
|
+
|
|
306
|
+
theorem latent_nonneg (M : Model) (A : Ancestors M) (B : Leaves M) :
|
|
307
|
+
0 ≤ latentMass M A B := by
|
|
308
|
+
apply mul_nonneg <;> apply Finset.prod_nonneg <;> intro i _ <;>
|
|
309
|
+
exact bern_nonneg _ (by linarith [M.base.p_half]) M.base.p_lt_one.le _
|
|
310
|
+
|
|
311
|
+
abbrev FullWorld (M : Model) (N : ℕ) := (Ancestors M × Leaves M) × PrimitiveWorld M N
|
|
312
|
+
def fullMass (M : Model) (N : ℕ) (x : FullWorld M N) : ℝ :=
|
|
313
|
+
latentMass M x.1.1 x.1.2 * primitiveJointMass M N x.2
|
|
314
|
+
|
|
315
|
+
theorem fullMass_nonneg (M : Model) (N : ℕ) (x : FullWorld M N) : 0 ≤ fullMass M N x :=
|
|
316
|
+
mul_nonneg (latent_nonneg M _ _) (primitive_joint_nonneg M N _)
|
|
317
|
+
|
|
318
|
+
theorem fullMass_normalized (M : Model) (N : ℕ) : ∑ x : FullWorld M N, fullMass M N x = 1 := by
|
|
319
|
+
simp only [Fintype.sum_prod_type, fullMass, ← Finset.mul_sum,
|
|
320
|
+
primitive_joint_normalized, mul_one, latent_normalized]
|
|
321
|
+
|
|
322
|
+
instance fullMeasurableSpace (M : Model) (N : ℕ) : MeasurableSpace (FullWorld M N) := ⊤
|
|
323
|
+
instance fullDiscreteMeasurable (M : Model) (N : ℕ) :
|
|
324
|
+
DiscreteMeasurableSpace (FullWorld M N) := ⟨fun _ => trivial⟩
|
|
325
|
+
|
|
326
|
+
/-- The COMPLETE finite generative law includes jointly independent latent bits
|
|
327
|
+
and all independent selector/fresh primitive draws. -/
|
|
328
|
+
def fullLaw (M : Model) (N : ℕ) : PMF (FullWorld M N) :=
|
|
329
|
+
PMF.ofFintype (fun x => ENNReal.ofReal (fullMass M N x)) (by
|
|
330
|
+
rw [← ENNReal.ofReal_sum_of_nonneg]
|
|
331
|
+
· simp [fullMass_normalized]
|
|
332
|
+
· intro x _
|
|
333
|
+
exact fullMass_nonneg M N x)
|
|
334
|
+
|
|
335
|
+
def implementationError (M : Model) (N : ℕ) : ℝ :=
|
|
336
|
+
∑ A : Ancestors M, ∑ B : Leaves M, latentMass M A B * binomialError M N A B
|
|
337
|
+
|
|
338
|
+
/-- Complete generator–implementation bridge for every finiteN. No count distribution,
|
|
339
|
+
error convergence, causal identification or oracle-free calibration is assumed. -/
|
|
340
|
+
theorem full_generator_error_bridge (M : Model) (N : ℕ) :
|
|
341
|
+
(∫ x, Obligations045.M0.fairLoss
|
|
342
|
+
(∑ i, (primitiveCounts M N x.1.1 x.1.2 x.2 i : ℕ)) N ∂(fullLaw M N).toMeasure) =
|
|
343
|
+
implementationError M N := by
|
|
344
|
+
rw [PMF.integral_eq_sum]
|
|
345
|
+
have hp (x : FullWorld M N) : ((fullLaw M N) x).toReal = fullMass M N x := by
|
|
346
|
+
simp only [fullLaw, PMF.ofFintype_apply]
|
|
347
|
+
exact ENNReal.toReal_ofReal (fullMass_nonneg M N x)
|
|
348
|
+
simp_rw [smul_eq_mul, hp]
|
|
349
|
+
simp only [Fintype.sum_prod_type, implementationError, fullMass, mul_assoc]
|
|
350
|
+
apply Finset.sum_congr rfl
|
|
351
|
+
intro A _
|
|
352
|
+
apply Finset.sum_congr rfl
|
|
353
|
+
intro B _
|
|
354
|
+
rw [← Finset.mul_sum]
|
|
355
|
+
congr 1
|
|
356
|
+
simpa only [binomialError] using primitive_generator_to_binomial M N A B
|
|
357
|
+
(fun k => Obligations045.M0.fairLoss (∑ i, (k i : ℕ)) N)
|
|
358
|
+
|
|
359
|
+
end Obligations046.M1Bridge
|