CubicPathwidth.Sw4.GoodLabelsA
Source file CubicPathwidth/Sw4/GoodLabelsA.lean of the Lean project (how it is built).
import CubicPathwidth.Sw4.Defs
import CubicPathwidth.T2.GoodLabelsCount
/-!
# Good labels for the switched layout: events, locality and total deviation
Labels `lab vec x v = ⟪vec v, x⟫` come from an abstract scheme (`T2.GLC.Sch`). Besides
the outer-frontier, cell and tail events of `T2.GLC`, the switched layout needs inner
frontiers (`innerEv`) and the two parts of `D̂` on either side of zero (`crossPosEv`,
`crossNegEv`). All events are local at radius `K + 1`. `devTotal` collects the absolute
deviations of all counts used; its expectation is `O(√n)` (`devTotal_integral_le`).
Counterpart of `C3.Labels` (subcubic, geometric labels) for maximum degree 4.
-/
noncomputable section
open scoped RealInnerProductSpace
open MeasureTheory ProbabilityTheory Classical
namespace CubicPathwidth
namespace Sw4
namespace SwL
open T2 T2.GLC
variable {n : ℕ}
/-! ## Membership in `D̂` -/
theorem mem_hatD (G : SimpleGraph (Fin n)) (y : Fin n → ℝ) (v : Fin n) :
v ∈ hatD G y ↔
(y v ≤ 0 ∧ 3 ≤ ((G.neighborFinset v).filter fun z => 0 < y z).card) ∨
(0 < y v ∧ 3 ≤ ((G.neighborFinset v).filter fun z => y z ≤ 0).card) := by
unfold hatD
rw [Finset.mem_filter]
simp only [Finset.mem_univ, true_and]
/-! ## Events -/
variable (G : SimpleGraph (Fin n)) (vec : Fin n → GaussianField.Sample n)
def innerEv (τ : ℝ) (v : Fin n) : Set (GaussianField.Sample n) :=
{x | v ∈ C3.innerFrontier G (lab vec x) τ}
def crossPosEv (v : Fin n) : Set (GaussianField.Sample n) :=
{x | v ∈ hatD G (lab vec x) ∧ 0 < lab vec x v}
def crossNegEv (v : Fin n) : Set (GaussianField.Sample n) :=
{x | v ∈ hatD G (lab vec x) ∧ lab vec x v ≤ 0}
theorem mset_innerEv (τ : ℝ) (v : Fin n) : MeasurableSet (innerEv G vec τ v) := by
simp only [innerEv, C3.mem_innerFrontier]
rw [Set.ofPred_and]
exact ((measurable_lab vec v) measurableSet_Iic).inter
(mset_exists_adj G vec v measurableSet_Ioi)
theorem mset_card_ge (v : Fin n) {p : ℝ → Prop} (hp : MeasurableSet {s : ℝ | p s}) :
MeasurableSet {x : GaussianField.Sample n |
3 ≤ ((G.neighborFinset v).filter fun z => p (lab vec x z)).card} := by
have hm : Measurable fun x : GaussianField.Sample n =>
∑ z ∈ G.neighborFinset v, (if p (lab vec x z) then (1 : ℕ) else 0) := by
refine Finset.measurable_sum _ fun z _ => ?_
exact Measurable.ite ((measurable_lab vec z) hp) measurable_const measurable_const
have e : {x : GaussianField.Sample n |
3 ≤ ((G.neighborFinset v).filter fun z => p (lab vec x z)).card} =
(fun x : GaussianField.Sample n =>
∑ z ∈ G.neighborFinset v, (if p (lab vec x z) then (1 : ℕ) else 0)) ⁻¹'
{k : ℕ | 3 ≤ k} := by
ext x
simp only [Set.mem_ofPred_eq, Set.mem_preimage, Finset.card_filter]
rw [e]
exact hm (MeasurableSet.of_discrete)
theorem mset_cross (v : Fin n) {p : ℝ → Prop} (hp : MeasurableSet {s : ℝ | p s}) :
MeasurableSet {x : GaussianField.Sample n | v ∈ hatD G (lab vec x) ∧ p (lab vec x v)} := by
simp only [mem_hatD]
have e : {x : GaussianField.Sample n |
((lab vec x v ≤ 0 ∧ 3 ≤ ((G.neighborFinset v).filter fun z => 0 < lab vec x z).card) ∨
(0 < lab vec x v ∧ 3 ≤ ((G.neighborFinset v).filter fun z => lab vec x z ≤ 0).card)) ∧
p (lab vec x v)} =
(({x | lab vec x v ≤ 0} ∩
{x | 3 ≤ ((G.neighborFinset v).filter fun z => 0 < lab vec x z).card}) ∪
({x | 0 < lab vec x v} ∩
{x | 3 ≤ ((G.neighborFinset v).filter fun z => lab vec x z ≤ 0).card})) ∩
{x | p (lab vec x v)} := by
ext x
simp only [Set.mem_ofPred_eq, Set.mem_union, Set.mem_inter_iff]
rw [e]
exact ((((measurable_lab vec v) measurableSet_Iic).inter
(mset_card_ge G vec v (p := fun s => 0 < s) measurableSet_Ioi)).union
(((measurable_lab vec v) measurableSet_Ioi).inter
(mset_card_ge G vec v (p := fun s => s ≤ 0) measurableSet_Iic))).inter
((measurable_lab vec v) hp)
theorem mset_crossPosEv (v : Fin n) : MeasurableSet (crossPosEv G vec v) :=
mset_cross G vec v (p := fun s => 0 < s) measurableSet_Ioi
theorem mset_crossNegEv (v : Fin n) : MeasurableSet (crossNegEv G vec v) :=
mset_cross G vec v (p := fun s => s ≤ 0) measurableSet_Iic
/-! ## Locality at radius `K + 1` -/
variable {G vec} {K : ℕ}
theorem local_innerEv (hs : Sch G K vec) (τ : ℝ) : C3.IsLocal G (K + 1) (innerEv G vec τ) := by
apply local_of_nbr hs
intro v x x' h1 h2 hx
simp only [innerEv, Set.mem_ofPred_eq, C3.mem_innerFrontier] at hx ⊢
obtain ⟨hv, w, hw, hwt⟩ := hx
exact ⟨h1 ▸ hv, w, hw, (h2 w hw) ▸ hwt⟩
theorem filter_nbr_congr {x x' : GaussianField.Sample n} {v : Fin n}
(h2 : ∀ z, G.Adj v z → lab vec x z = lab vec x' z) (p : ℝ → Prop) :
((G.neighborFinset v).filter fun z => p (lab vec x z)) =
((G.neighborFinset v).filter fun z => p (lab vec x' z)) := by
apply Finset.filter_congr
intro z hz
rw [h2 z ((G.mem_neighborFinset v z).mp hz)]
theorem local_cross (hs : Sch G K vec) {p : ℝ → Prop} :
C3.IsLocal G (K + 1) (fun v => {x : GaussianField.Sample n |
v ∈ hatD G (lab vec x) ∧ p (lab vec x v)}) := by
apply local_of_nbr hs
intro v x x' h1 h2 hx
simp only [Set.mem_ofPred_eq, mem_hatD] at hx ⊢
rw [← h1, ← filter_nbr_congr h2 (fun s => 0 < s), ← filter_nbr_congr h2 (fun s => s ≤ 0)]
exact hx
theorem local_crossPosEv (hs : Sch G K vec) : C3.IsLocal G (K + 1) (crossPosEv G vec) :=
local_cross hs (p := fun s => 0 < s)
theorem local_crossNegEv (hs : Sch G K vec) : C3.IsLocal G (K + 1) (crossNegEv G vec) :=
local_cross hs (p := fun s => s ≤ 0)
/-! ## Total deviation -/
variable (G vec)
/-- Total absolute deviation of all counts used: inner frontiers at `-i/q` and outer
frontiers at `i/q` for `i ≤ M`, the `2M` cells, the two tails and the two halves of
`D̂`. -/
def devTotal (M q : ℕ) (T : ℝ) (x : GaussianField.Sample n) : ℝ :=
(∑ i ∈ Finset.range (M + 1), |C3.centeredCount (innerEv G vec (-(i : ℝ) / q)) x|) +
(∑ i ∈ Finset.range (M + 1), |C3.centeredCount (outerEv G vec ((i : ℝ) / q)) x|) +
(∑ i ∈ Finset.range (2 * M),
|C3.centeredCount (cellEv vec (cellLo M q i) (cellHi M q i)) x|) +
|C3.centeredCount (lowTailEv vec T) x| + |C3.centeredCount (highTailEv vec T) x| +
|C3.centeredCount (crossPosEv G vec) x| + |C3.centeredCount (crossNegEv G vec) x|
theorem integrable_devTotal (M q : ℕ) (T : ℝ) :
Integrable (devTotal G vec M q T) (stdGaussian (GaussianField.Sample n)) := by
have hi1 := fun i : ℕ => L4.integrable_abs_cc (mset_innerEv G vec (-(i : ℝ) / q))
have hi2 := fun i : ℕ => L4.integrable_abs_cc (mset_outerEv G vec ((i : ℝ) / q))
have hi3 := fun i : ℕ => L4.integrable_abs_cc (mset_cellEv vec (cellLo M q i) (cellHi M q i))
have hl1 := L4.integrable_abs_cc (mset_lowTailEv vec T)
have hl2 := L4.integrable_abs_cc (mset_highTailEv vec T)
have hl3 := L4.integrable_abs_cc (mset_crossPosEv G vec)
have hl4 := L4.integrable_abs_cc (mset_crossNegEv G vec)
unfold devTotal
(repeat' apply Integrable.add) <;> first
| exact integrable_finsetSum _ (fun i _ => hi1 i)
| exact integrable_finsetSum _ (fun i _ => hi2 i)
| exact integrable_finsetSum _ (fun i _ => hi3 i)
| assumption
theorem devTotal_integral_le (hs : Sch G K vec) (hG : MaxDegreeAtMost 4 G) (M q : ℕ) (T : ℝ) :
∫ x, devTotal G vec M q T x ∂stdGaussian (GaussianField.Sample n) ≤
(4 * M + 6 : ℝ) * Real.sqrt (n * L4.depBound (K + 1)) := by
set s := Real.sqrt (n * L4.depBound (K + 1))
have hb : ∀ {E : Fin n → Set (GaussianField.Sample n)}, (∀ v, MeasurableSet (E v)) →
C3.IsLocal G (K + 1) E →
∫ x, |C3.centeredCount E x| ∂stdGaussian (GaussianField.Sample n) ≤ s :=
fun hE hl => L4.integral_abs_centeredCount_le4 G hG (K + 1) hE hl
have hi1 := fun i : ℕ => L4.integrable_abs_cc (mset_innerEv G vec (-(i : ℝ) / q))
have hi2 := fun i : ℕ => L4.integrable_abs_cc (mset_outerEv G vec ((i : ℝ) / q))
have hi3 := fun i : ℕ => L4.integrable_abs_cc (mset_cellEv vec (cellLo M q i) (cellHi M q i))
have hl1 := L4.integrable_abs_cc (mset_lowTailEv vec T)
have hl2 := L4.integrable_abs_cc (mset_highTailEv vec T)
have hl3 := L4.integrable_abs_cc (mset_crossPosEv G vec)
have hl4 := L4.integrable_abs_cc (mset_crossNegEv G vec)
unfold devTotal
rw [integral_add, integral_add, integral_add, integral_add, integral_add, integral_add,
integral_finsetSum _ (fun i _ => hi1 i), integral_finsetSum _ (fun i _ => hi2 i),
integral_finsetSum _ (fun i _ => hi3 i)]
· have e1 : ∑ i ∈ Finset.range (M + 1),
∫ x, |C3.centeredCount (innerEv G vec (-(i : ℝ) / q)) x|
∂stdGaussian (GaussianField.Sample n) ≤ (M + 1) * s := by
refine (Finset.sum_le_sum fun i _ =>
hb (mset_innerEv G vec _) (local_innerEv hs _)).trans ?_
simp
have e2 : ∑ i ∈ Finset.range (M + 1),
∫ x, |C3.centeredCount (outerEv G vec ((i : ℝ) / q)) x|
∂stdGaussian (GaussianField.Sample n) ≤ (M + 1) * s := by
refine (Finset.sum_le_sum fun i _ =>
hb (mset_outerEv G vec _) (local_outerEv hs _)).trans ?_
simp
have e3 : ∑ i ∈ Finset.range (2 * M), ∫ x,
|C3.centeredCount (cellEv vec (cellLo M q i) (cellHi M q i)) x|
∂stdGaussian (GaussianField.Sample n) ≤ (2 * M) * s := by
refine (Finset.sum_le_sum fun i _ =>
hb (mset_cellEv vec _ _) (local_cellEv hs _ _)).trans ?_
simp
have e4 := hb (mset_lowTailEv vec T) (local_lowTailEv hs T)
have e5 := hb (mset_highTailEv vec T) (local_highTailEv hs T)
have e6 := hb (mset_crossPosEv G vec) (local_crossPosEv hs)
have e7 := hb (mset_crossNegEv G vec) (local_crossNegEv hs)
push_cast at e1 e2 e3
nlinarith
all_goals (repeat' apply Integrable.add) <;> first
| exact integrable_finsetSum _ (fun i _ => hi1 i)
| exact integrable_finsetSum _ (fun i _ => hi2 i)
| exact integrable_finsetSum _ (fun i _ => hi3 i)
| assumption
/-! ## Each deviation is at most the total -/
section Terms
variable {G vec} {M q : ℕ} {T : ℝ} (x : GaussianField.Sample n)
theorem devTotal_parts :
0 ≤ ∑ i ∈ Finset.range (M + 1), |C3.centeredCount (innerEv G vec (-(i : ℝ) / q)) x| ∧
0 ≤ ∑ i ∈ Finset.range (M + 1), |C3.centeredCount (outerEv G vec ((i : ℝ) / q)) x| ∧
0 ≤ ∑ i ∈ Finset.range (2 * M),
|C3.centeredCount (cellEv vec (cellLo M q i) (cellHi M q i)) x| ∧
0 ≤ |C3.centeredCount (lowTailEv vec T) x| ∧ 0 ≤ |C3.centeredCount (highTailEv vec T) x| ∧
0 ≤ |C3.centeredCount (crossPosEv G vec) x| ∧ 0 ≤ |C3.centeredCount (crossNegEv G vec) x| :=
⟨Finset.sum_nonneg fun _ _ => abs_nonneg _, Finset.sum_nonneg fun _ _ => abs_nonneg _,
Finset.sum_nonneg fun _ _ => abs_nonneg _, abs_nonneg _, abs_nonneg _, abs_nonneg _,
abs_nonneg _⟩
theorem dev_inner_le {i : ℕ} (hi : i ≤ M) :
|C3.centeredCount (innerEv G vec (-(i : ℝ) / q)) x| ≤ devTotal G vec M q T x := by
have h := Finset.single_le_sum
(f := fun i : ℕ => |C3.centeredCount (innerEv G vec (-(i : ℝ) / q)) x|)
(fun _ _ => abs_nonneg _) (Finset.mem_range.mpr (Nat.lt_succ_of_le hi))
obtain ⟨-, h2, h3, h4, h5, h6, h7⟩ := devTotal_parts (G := G) (vec := vec) (M := M) (q := q)
(T := T) x
unfold devTotal
linarith
theorem dev_outer_le {i : ℕ} (hi : i ≤ M) :
|C3.centeredCount (outerEv G vec ((i : ℝ) / q)) x| ≤ devTotal G vec M q T x := by
have h := Finset.single_le_sum
(f := fun i : ℕ => |C3.centeredCount (outerEv G vec ((i : ℝ) / q)) x|)
(fun _ _ => abs_nonneg _) (Finset.mem_range.mpr (Nat.lt_succ_of_le hi))
obtain ⟨h1, -, h3, h4, h5, h6, h7⟩ := devTotal_parts (G := G) (vec := vec) (M := M) (q := q)
(T := T) x
unfold devTotal
linarith
theorem dev_cell_le {i : ℕ} (hi : i < 2 * M) :
|C3.centeredCount (cellEv vec (cellLo M q i) (cellHi M q i)) x| ≤
devTotal G vec M q T x := by
have h := Finset.single_le_sum
(f := fun i : ℕ => |C3.centeredCount (cellEv vec (cellLo M q i) (cellHi M q i)) x|)
(fun _ _ => abs_nonneg _) (Finset.mem_range.mpr hi)
obtain ⟨h1, h2, -, h4, h5, h6, h7⟩ := devTotal_parts (G := G) (vec := vec) (M := M) (q := q)
(T := T) x
unfold devTotal
linarith
theorem dev_rest_le :
|C3.centeredCount (lowTailEv vec T) x| ≤ devTotal G vec M q T x ∧
|C3.centeredCount (highTailEv vec T) x| ≤ devTotal G vec M q T x ∧
|C3.centeredCount (crossPosEv G vec) x| ≤ devTotal G vec M q T x ∧
|C3.centeredCount (crossNegEv G vec) x| ≤ devTotal G vec M q T x := by
obtain ⟨h1, h2, h3, h4, h5, h6, h7⟩ := devTotal_parts (G := G) (vec := vec) (M := M) (q := q)
(T := T) x
unfold devTotal
refine ⟨?_, ?_, ?_, ?_⟩ <;> linarith
end Terms
/-! ## Counts as filters -/
theorem innerFrontier_eq (x : GaussianField.Sample n) (τ : ℝ) :
C3.innerFrontier G (lab vec x) τ = Finset.univ.filter fun v => x ∈ innerEv G vec τ v := by
ext v
rw [Finset.mem_filter]
exact ⟨fun h => ⟨Finset.mem_univ v, h⟩, fun h => h.2⟩
theorem crossPos_eq (x : GaussianField.Sample n) :
((hatD G (lab vec x)).filter fun v => 0 < lab vec x v) =
Finset.univ.filter fun v => x ∈ crossPosEv G vec v := by
ext v
rw [Finset.mem_filter, Finset.mem_filter]
exact ⟨fun h => ⟨Finset.mem_univ v, h⟩, fun h => h.2⟩
theorem crossNeg_eq (x : GaussianField.Sample n) :
((hatD G (lab vec x)).filter fun v => lab vec x v ≤ 0) =
Finset.univ.filter fun v => x ∈ crossNegEv G vec v := by
ext v
rw [Finset.mem_filter, Finset.mem_filter]
exact ⟨fun h => ⟨Finset.mem_univ v, h⟩, fun h => h.2⟩
theorem hatL0_eq (x : GaussianField.Sample n) :
hatL0 G (lab vec x) =
(Finset.univ.filter fun v => x ∈ innerEv G vec 0 v).card +
(Finset.univ.filter fun v => x ∈ crossPosEv G vec v).card := by
rw [← innerFrontier_eq, ← crossPos_eq]
unfold hatL0
congr 1
theorem hatL0'_eq (x : GaussianField.Sample n) :
hatL0' G (lab vec x) =
(Finset.univ.filter fun v => x ∈ outerEv G vec 0 v).card +
(Finset.univ.filter fun v => x ∈ crossNegEv G vec v).card := by
rw [← outerFrontier_eq, ← crossNeg_eq]
unfold hatL0'
congr 1
/-! ## Deterministic grid comparison for inner frontiers, `Δ ≤ 4` -/
theorem inner_grid4 (hG : MaxDegreeAtMost 4 G) (y : Fin n → ℝ) {a t b : ℝ} (hat : a ≤ t)
(htb : t < b) :
(C3.innerFrontier G y t).card ≤
(C3.innerFrontier G y b).card + 4 * (C3.cellSet y a b).card := by
have hsub : C3.innerFrontier G y t ⊆ C3.innerFrontier G y b ∪
Finset.univ.filter fun v => ∃ z ∈ C3.cellSet y a b, G.Adj v z := by
intro v hv
rw [C3.mem_innerFrontier] at hv
obtain ⟨hvt, z, hz, hzt⟩ := hv
by_cases hzb : b < y z
· exact Finset.mem_union_left _
((C3.mem_innerFrontier G y b v).mpr ⟨by linarith, z, hz, hzb⟩)
· refine Finset.mem_union_right _ ?_
simp only [Finset.mem_filter, Finset.mem_univ, true_and, C3.cellSet]
exact ⟨z, ⟨by linarith, not_lt.mp hzb⟩, hz⟩
exact (Finset.card_le_card hsub).trans ((Finset.card_union_le _ _).trans
(Nat.add_le_add_left (L4.card_adj_le4 G hG _) _))
end SwL
end Sw4
end CubicPathwidth
Back to top