Catalog/VC/EasyEpsilonNetLemma/Full.lean
| 1 | import Catalog.VC.EpsilonNet.Full |
| 2 | import Mathlib.Analysis.SpecialFunctions.Log.Basic |
| 3 | import Mathlib.Algebra.Order.Floor.Semiring |
| 4 | import Mathlib.Data.Finset.BooleanAlgebra |
| 5 | import Mathlib.Data.Fintype.BigOperators |
| 6 | import Mathlib.Data.Fintype.Powerset |
| 7 | |
| 8 | namespace Catalog.VC.EasyEpsilonNetLemma |
| 9 | |
| 10 | open Classical |
| 11 | |
| 12 | private lemma ground_card_pos {Ξ± : Type*} [DecidableEq Ξ±] [Fintype Ξ±] |
| 13 | (π : Finset (Finset Ξ±)) (hπ : 2 β€ π.card) : 0 < Fintype.card Ξ± := by |
| 14 | have hfamily : 2 β€ Fintype.card (Finset Ξ±) := le_trans hπ (Finset.card_le_univ π) |
| 15 | rw [Fintype.card_finset] at hfamily |
| 16 | by_contra hΞ± |
| 17 | have hΞ±0 : Fintype.card Ξ± = 0 := Nat.eq_zero_of_not_pos hΞ± |
| 18 | simp [hΞ±0] at hfamily |
| 19 | |
| 20 | private lemma sampleSize_pos {n : β} (hn : 2 β€ n) {r : β} (hr : 1 < r) : |
| 21 | 0 < βr * Real.log (n : β)ββ := by |
| 22 | refine Nat.ceil_pos.mpr ?_ |
| 23 | have hnR : (1 : β) < n := by |
| 24 | exact_mod_cast (lt_of_lt_of_le (by decide : 1 < 2) hn) |
| 25 | have hlogn : 0 < Real.log (n : β) := Real.log_pos hnR |
| 26 | positivity |
| 27 | |
| 28 | private lemma sampleSize_bound {n : β} (hn : 2 β€ n) {r : β} (hr : 1 < r) : |
| 29 | (((βr * Real.log (n : β)ββ : β) : β)) β€ r * Real.log (n : β) + 1 := by |
| 30 | have hnR : (1 : β) < n := by |
| 31 | exact_mod_cast (lt_of_lt_of_le (by decide : 1 < 2) hn) |
| 32 | have hlogn : 0 < Real.log (n : β) := Real.log_pos hnR |
| 33 | have hx : 0 β€ r * Real.log (n : β) := by positivity |
| 34 | linarith [Nat.ceil_lt_add_one hx] |
| 35 | |
| 36 | private lemma badTupleCount_eq {Ξ± : Type*} [DecidableEq Ξ±] [Fintype Ξ±] |
| 37 | (S : Finset Ξ±) (s : β) : |
| 38 | (Finset.univ.filter (fun f : Fin s β Ξ± => β i, f i β S)).card = |
| 39 | (Fintype.card Ξ± - S.card) ^ s := by |
| 40 | let p : Set (Fin s β Ξ±) := {f | β i, f i β S} |
| 41 | have hcard : |
| 42 | Fintype.card p = (Finset.univ.filter (fun f : Fin s β Ξ± => β i, f i β S)).card := by |
| 43 | simpa [p] using |
| 44 | (Fintype.card_ofFinset (p := p) |
| 45 | (Finset.univ.filter (fun f : Fin s β Ξ± => β i, f i β S)) |
| 46 | (fun f => by simp [p])) |
| 47 | have hsub : Fintype.card p = (Fintype.card Ξ± - S.card) ^ s := by |
| 48 | let e : p β (Fin s β β₯(SαΆ : Finset Ξ±)) := |
| 49 | { toFun := fun f i => β¨f.1 i, by exact Finset.mem_compl.mpr (f.2 i)β© |
| 50 | invFun := fun g => β¨fun i => (g i).1, by intro i; exact Finset.mem_compl.mp (g i).2β© |
| 51 | left_inv := by intro f; ext i; rfl |
| 52 | right_inv := by intro g; ext i; rfl } |
| 53 | rw [Fintype.card_congr e, Fintype.card_fun, Fintype.card_coe, Finset.card_compl, |
| 54 | Fintype.card_fin] |
| 55 | exact hcard.symm.trans hsub |
| 56 | |
| 57 | private lemma tupleImage_isEpsilonNet {Ξ± : Type*} [DecidableEq Ξ±] [Fintype Ξ±] |
| 58 | (π : Finset (Finset Ξ±)) {r : β} {s : β} (f : Fin s β Ξ±) |
| 59 | (hf : β S β π, (1 / r) * (Fintype.card Ξ± : β) β€ (S.card : β) β β i, f i β S) : |
| 60 | Catalog.VC.EpsilonNet.IsEpsilonNet π (1 / r) (Finset.univ.image f) := by |
| 61 | intro S hS hheavy |
| 62 | rcases hf S hS hheavy with β¨i, hiβ© |
| 63 | refine β¨f i, Finset.mem_inter.mpr β¨?_, hiβ©β© |
| 64 | exact Finset.mem_image.mpr β¨i, Finset.mem_univ i, rflβ© |
| 65 | |
| 66 | private lemma tupleImage_card_le {Ξ± : Type*} [DecidableEq Ξ±] [Fintype Ξ±] |
| 67 | {s : β} (f : Fin s β Ξ±) : |
| 68 | (((Finset.univ.image f).card : β) : β) β€ s := by |
| 69 | exact_mod_cast (show (Finset.univ.image f).card β€ s by |
| 70 | simpa [Fintype.card_fin] using |
| 71 | (Finset.card_image_le : (Finset.univ.image f).card β€ Finset.univ.card)) |
| 72 | |
| 73 | /-- For any finite set family and `r > 1`, there exists a `(1/r)`-net of size |
| 74 | at most `r Β· ln |π| + 1`. (Lemma 5.11) -/ |
| 75 | theorem easyEpsilonNetLemma {Ξ± : Type*} [DecidableEq Ξ±] [Fintype Ξ±] |
| 76 | (π : Finset (Finset Ξ±)) (hπ : 2 β€ π.card) {r : β} (hr : 1 < r) : |
| 77 | β N : Finset Ξ±, Catalog.VC.EpsilonNet.IsEpsilonNet π (1 / r) N β§ |
| 78 | (N.card : β) β€ r * Real.log (π.card : β) + 1 := by |
| 79 | let s : β := βr * Real.log (π.card : β)ββ |
| 80 | have hΞ±pos : 0 < Fintype.card Ξ± := ground_card_pos π hπ |
| 81 | have hs_pos : 0 < s := by |
| 82 | simpa [s] using sampleSize_pos hπ hr |
| 83 | have hs_bound : ((s : β) : β) β€ r * Real.log (π.card : β) + 1 := by |
| 84 | simpa [s] using sampleSize_bound hπ hr |
| 85 | have hgood : |
| 86 | β f : Fin s β Ξ±, |
| 87 | β S β π, (1 / r) * (Fintype.card Ξ± : β) β€ (S.card : β) β β i, f i β S := by |
| 88 | let H : Finset (Finset Ξ±) := |
| 89 | π.filter (fun S => (1 / r) * (Fintype.card Ξ± : β) β€ (S.card : β)) |
| 90 | let B : Finset Ξ± β Finset (Fin s β Ξ±) := |
| 91 | fun S => Finset.univ.filter (fun f : Fin s β Ξ± => β i, f i β S) |
| 92 | let Bad : Finset (Fin s β Ξ±) := H.biUnion B |
| 93 | have hHcard : H.card β€ π.card := by |
| 94 | simpa [H] using |
| 95 | (Finset.card_filter_le |
| 96 | (s := π) (p := fun S => (1 / r) * (Fintype.card Ξ± : β) β€ (S.card : β))) |
| 97 | have hbase_nonneg : 0 β€ 1 - 1 / r := by |
| 98 | have hr1 : (1 : β) / r < 1 := by |
| 99 | have hr0 : (0 : β) < r := lt_trans zero_lt_one hr |
| 100 | rw [div_lt_iffβ hr0] |
| 101 | simpa using hr |
| 102 | linarith |
| 103 | have hB_bound : |
| 104 | β S β H, ((B S).card : β) β€ (Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s := by |
| 105 | intro S hS |
| 106 | have hSheavy : (1 / r) * (Fintype.card Ξ± : β) β€ (S.card : β) := by |
| 107 | simpa [H] using Finset.mem_filter.mp hS |>.2 |
| 108 | have hcard_le : |
| 109 | ((Fintype.card Ξ± - S.card : β) : β) β€ (Fintype.card Ξ± : β) * (1 - 1 / r) := by |
| 110 | have hScard_le_nat : S.card β€ Fintype.card Ξ± := Finset.card_le_univ S |
| 111 | have hScard_le : (S.card : β) β€ Fintype.card Ξ± := by exact_mod_cast hScard_le_nat |
| 112 | rw [Nat.cast_sub hScard_le_nat] |
| 113 | linarith |
| 114 | calc |
| 115 | ((B S).card : β) = ((Fintype.card Ξ± - S.card : β) : β) ^ s := by |
| 116 | simp [B, badTupleCount_eq] |
| 117 | _ β€ ((Fintype.card Ξ± : β) * (1 - 1 / r)) ^ s := by |
| 118 | exact pow_le_pow_leftβ (by positivity) hcard_le s |
| 119 | _ = (Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s := by |
| 120 | rw [mul_pow] |
| 121 | have hBad_bound : |
| 122 | (Bad.card : β) β€ (H.card : β) * ((Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s) := by |
| 123 | have hbiUnion : |
| 124 | Bad.card β€ β S β H, (B S).card := by |
| 125 | simpa [Bad] using (Finset.card_biUnion_le : (H.biUnion B).card β€ β S β H, (B S).card) |
| 126 | calc |
| 127 | (Bad.card : β) β€ (β S β H, (B S).card : β) := by |
| 128 | exact_mod_cast hbiUnion |
| 129 | _ = β S β H, ((B S).card : β) := by rw [Nat.cast_sum] |
| 130 | _ β€ β S β H, ((Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s) := by |
| 131 | exact Finset.sum_le_sum fun S hS => hB_bound S hS |
| 132 | _ = (H.card : β) * ((Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s) := by |
| 133 | rw [Finset.sum_const, nsmul_eq_mul] |
| 134 | have hdecay_exp : |
| 135 | (1 - 1 / r) ^ s < Real.exp (-(s : β) / r) := by |
| 136 | have hone : |
| 137 | 1 - 1 / r < Real.exp (-(1 / r)) := by |
| 138 | have hr0 : (0 : β) < r := lt_trans zero_lt_one hr |
| 139 | refine Real.one_sub_lt_exp_neg ?_ |
| 140 | exact one_div_ne_zero hr0.ne' |
| 141 | calc |
| 142 | (1 - 1 / r) ^ s < (Real.exp (-(1 / r))) ^ s := by |
| 143 | exact pow_lt_pow_leftβ hone hbase_nonneg (Nat.ne_of_gt hs_pos) |
| 144 | _ = Real.exp ((s : β) * (-(1 / r))) := by |
| 145 | rw [β Real.exp_nat_mul] |
| 146 | _ = Real.exp (-(s : β) / r) := by ring_nf |
| 147 | have hs_ge : r * Real.log (π.card : β) β€ (s : β) := by |
| 148 | simpa [s] using (Nat.le_ceil (r * Real.log (π.card : β))) |
| 149 | have hexp_le : Real.exp (-(s : β) / r) β€ 1 / (π.card : β) := by |
| 150 | have hApos_nat : 0 < π.card := lt_of_lt_of_le (by decide : 0 < 2) hπ |
| 151 | have hApos : (0 : β) < π.card := by exact_mod_cast hApos_nat |
| 152 | have hs_div : Real.log (π.card : β) β€ (s : β) / r := by |
| 153 | have hr0 : (0 : β) < r := lt_trans zero_lt_one hr |
| 154 | exact (le_div_iffβ hr0).2 <| by simpa [mul_comm] using hs_ge |
| 155 | have hneg : -(s : β) / r β€ -Real.log (π.card : β) := by |
| 156 | simpa [neg_div] using |
| 157 | (neg_le_neg hs_div : -((s : β) / r) β€ -Real.log (π.card : β)) |
| 158 | calc |
| 159 | Real.exp (-(s : β) / r) β€ Real.exp (-Real.log (π.card : β)) := by |
| 160 | exact Real.exp_le_exp.mpr hneg |
| 161 | _ = 1 / (π.card : β) := by |
| 162 | rw [Real.exp_neg, Real.exp_log hApos, one_div] |
| 163 | have hfactor_lt_one : (H.card : β) * (1 - 1 / r) ^ s < 1 := by |
| 164 | have hHcardR : (H.card : β) β€ π.card := by |
| 165 | exact_mod_cast hHcard |
| 166 | calc |
| 167 | (H.card : β) * (1 - 1 / r) ^ s |
| 168 | β€ (π.card : β) * (1 - 1 / r) ^ s := by |
| 169 | exact mul_le_mul_of_nonneg_right hHcardR (by positivity) |
| 170 | _ < (π.card : β) * Real.exp (-(s : β) / r) := by |
| 171 | gcongr |
| 172 | _ β€ (π.card : β) * (1 / (π.card : β)) := by |
| 173 | gcongr |
| 174 | _ = 1 := by |
| 175 | have hApos_nat : 0 < π.card := lt_of_lt_of_le (by decide : 0 < 2) hπ |
| 176 | have hAne : (π.card : β) β 0 := by |
| 177 | exact_mod_cast (Nat.ne_of_gt hApos_nat) |
| 178 | field_simp [hAne] |
| 179 | have htotal_pos : 0 < (Fintype.card Ξ± : β) ^ s := by positivity |
| 180 | have hBad_lt_total : (Bad.card : β) < (Fintype.card (Fin s β Ξ±) : β) := by |
| 181 | calc |
| 182 | (Bad.card : β) |
| 183 | β€ (H.card : β) * ((Fintype.card Ξ± : β) ^ s * (1 - 1 / r) ^ s) := hBad_bound |
| 184 | _ = ((Fintype.card Ξ± : β) ^ s) * ((H.card : β) * (1 - 1 / r) ^ s) := by ring |
| 185 | _ < ((Fintype.card Ξ± : β) ^ s) * 1 := by |
| 186 | gcongr |
| 187 | _ = Fintype.card (Fin s β Ξ±) := by |
| 188 | rw [mul_one, Fintype.card_fun, Fintype.card_fin, Nat.cast_pow] |
| 189 | have hBad_lt_total_nat : Bad.card < Fintype.card (Fin s β Ξ±) := by |
| 190 | exact_mod_cast hBad_lt_total |
| 191 | rcases Finset.exists_mem_notMem_of_card_lt_card hBad_lt_total_nat with β¨f, hf_univ, hfBadβ© |
| 192 | refine β¨f, ?_β© |
| 193 | intro S hS hSheavy |
| 194 | have hSH : S β H := by |
| 195 | change S β π.filter (fun T => (1 / r) * (Fintype.card Ξ± : β) β€ (T.card : β)) |
| 196 | exact Finset.mem_filter.mpr β¨hS, hSheavyβ© |
| 197 | have hf_notB : f β B S := by |
| 198 | intro hfB |
| 199 | exact hfBad (by |
| 200 | simpa [Bad, Finset.mem_biUnion] using β¨S, hSH, hfBβ©) |
| 201 | by_contra hhit |
| 202 | apply hf_notB |
| 203 | simp [B] |
| 204 | intro i hi |
| 205 | exact hhit β¨i, hiβ© |
| 206 | rcases hgood with β¨f, hfβ© |
| 207 | refine β¨Finset.univ.image f, tupleImage_isEpsilonNet π f hf, ?_β© |
| 208 | calc |
| 209 | (((Finset.univ.image f).card : β) : β) β€ s := tupleImage_card_le f |
| 210 | _ β€ r * Real.log (π.card : β) + 1 := hs_bound |
| 211 | |
| 212 | end Catalog.VC.EasyEpsilonNetLemma |
| 213 |