-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathKL.lean
More file actions
601 lines (569 loc) · 26.4 KB
/
KL.lean
File metadata and controls
601 lines (569 loc) · 26.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
/-
Copyright (c) 2024 Zichen Wang, Yifan Bai, Chenyi Li. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Zichen Wang, Yifan Bai, Chenyi Li
-/
import Mathlib.Analysis.Calculus.ContDiff.Basic
import Optlib.Function.Proximal
import Optlib.Differential.Subdifferential
open Filter BigOperators Set Topology
noncomputable section
variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace ℝ E]
variable {f : E → ℝ} {x : E}
def limsubdifferential_Graph (f : E → ℝ) :=
{(x, fx, u) : E × ℝ × E| fx = f x ∧ u ∈ f_subdifferential f x}
def subdifferential_Graph (f : E → ℝ) :=
{(x, u) : E × E| u ∈ subdifferential f x}
lemma subdifferential_Graph' (f : E → ℝ) :
subdifferential_Graph f =
{(x, u) : E × E| (x, f x, u) ∈ closure (limsubdifferential_Graph f)} := by
ext y
constructor
· intro hy
simp [subdifferential_Graph, subdifferential] at hy
simp [mem_closure_iff_seq_limit, limsubdifferential_Graph]
rcases hy with ⟨u, ⟨u_conv, ⟨fun_conv, ⟨v, hv⟩⟩⟩⟩
use fun n => (u n, f (u n), v n)
constructor
· intro n; simp; exact (hv n).1
· apply Tendsto.prod_mk_nhds u_conv
(Tendsto.prod_mk_nhds fun_conv ((forall_and_right _ _).1 hv).2)
· intro h
simp [subdifferential_Graph, subdifferential]
simp at h
obtain exist_seq := mem_closure_iff_seq_limit.1 h
rcases exist_seq with ⟨x, ⟨exist_seq₁, x_converge⟩⟩
rw [nhds_prod_eq] at x_converge
obtain ⟨x1_conv, x2_conv⟩ := (Filter.tendsto_prod_iff'.1 x_converge)
rw [nhds_prod_eq] at x2_conv
obtain ⟨fx1_conv, x2_conv'⟩ := (Filter.tendsto_prod_iff'.1 x2_conv)
simp [limsubdifferential_Graph] at exist_seq₁
use (fun n => (x n).1)
constructor; exact x1_conv
constructor
have : (fun n ↦ (x n).2.1) = (fun n => f (x n).1) := by
ext n; exact (exist_seq₁ n).1
rwa [this] at fx1_conv
use (fun n => (x n).2.2)
intro n; exact ⟨(exist_seq₁ n).2, x2_conv'⟩
theorem GraphOfSubgradientIsClosed {f : E → ℝ}
{xn un : ℕ → E} {x u : E} (hx : ∀ n , (xn n, un n) ∈ subdifferential_Graph f)
(hconv : Tendsto (fun n => (xn n , un n)) atTop (𝓝 (x, u)))
(hf : Tendsto (fun n => f (xn n)) atTop (𝓝 (f x))) :
(x, u) ∈ subdifferential_Graph f := by
rw [subdifferential_Graph',mem_setOf_eq]
simp only
rw [← closure_closure,mem_closure_iff_seq_limit]
use fun n => (xn n , f (xn n), un n)
constructor
· intro n
have := hx n
rw [subdifferential_Graph',mem_setOf_eq] at this
exact this
rw [nhds_prod_eq,Filter.tendsto_prod_iff'] at hconv;
simp at hconv
exact Tendsto.prod_mk_nhds hconv.1 (Tendsto.prod_mk_nhds hf hconv.2)
/- Definition of Φ_η, the family of desingularizing function -/
def desingularizing_function (η : ℝ) := {φ : ℝ → ℝ | (ConcaveOn ℝ (Ico 0 η) φ) -- ∧ (∀ x ∈ Ioo 0 η, φ x > 0)
∧ (φ 0 = 0) ∧ (ContDiffOn ℝ 1 φ (Ioo 0 η)) ∧ (ContinuousAt φ 0) ∧
(∀ x ∈ Ioo 0 η, deriv φ x > 0)}
lemma desingularizing_function_is_nonneg (φ : ℝ → ℝ) (η : ℝ) (h : φ ∈ desingularizing_function η) :
∀ x ∈ Ioo 0 η, φ x > 0 := by
simp [desingularizing_function] at h
intro x ⟨hx₁, hx₂⟩
rcases h with ⟨_,h₂,h₃,h₄,h₅⟩
have Cont_φ : ContinuousOn φ (Icc 0 x) := by
apply continuousOn_of_forall_continuousAt
intro y hy
by_cases hy0 : y = 0
rwa [hy0]
push_neg at hy0
-- have hy1: y ∈ Ioc 0 x := ⟨lt_of_le_of_ne hy.1 (id (Ne.symm hy0)), hy.2⟩
have cont_φ := ContDiffOn.continuousOn h₃
have isopen : IsOpen (Ioo 0 η) := isOpen_Ioo
by_cases hyx : y = x
· simp [hyx]
apply (IsOpen.continuousOn_iff isopen).1 cont_φ
exact ⟨hx₁, hx₂⟩
· push_neg at hyx
have hy2 : y ∈ Ioo 0 x := ⟨lt_of_le_of_ne hy.1 (id (Ne.symm hy0)), lt_of_le_of_ne hy.2 hyx⟩
apply (IsOpen.continuousOn_iff isopen).1 cont_φ
use hy2.1
rcases hy2 with ⟨_, hy2⟩
linarith
have Diff_φ : DifferentiableOn ℝ φ (Ioo 0 x) := by
have diff_φ := ContDiffOn.differentiableOn h₃ (by simp)
have subIoo: (Ioo 0 x) ⊆ (Ioo 0 η) := by
intro x hx; simp at hx; use hx.1; linarith
exact DifferentiableOn.mono diff_φ subIoo
have hhh: ∃ y ∈ Ioo 0 x, φ x = φ 0 + (deriv φ y) * (x - 0) := by
obtain h_lag := exists_deriv_eq_slope φ hx₁ Cont_φ Diff_φ
rcases h_lag with ⟨c, ⟨hc, hval⟩⟩
use c, hc
field_simp [hval]
choose y hy₁ hy₂ using hhh
simp [hy₂, h₂]; field_simp;
rcases hy₁ with ⟨hy₁,hy₁'⟩
have yleq: y < η := by linarith
exact h₅ y hy₁ yleq
-- Definition of KL property with specific desingularizing function
def KL_point_with_reparameter (σ : E → ℝ) (u : E) (φ : ℝ → ℝ) : Prop :=
∃ η ∈ Ioi 0, ∃ s ∈ 𝓝 u, (φ ∈ desingularizing_function η) ∧ (∀ x ∈ s ∩
{y ∈ active_domain σ | σ u < σ y ∧ σ y < σ u + η},
deriv φ (σ x - σ u) * (EMetric.infEdist 0 (subdifferential σ x)).toReal ≥ 1)
-- Definition of the KL property at one point
def KL_point (f : E → ℝ) (u : E) : Prop :=
∃ η ∈ Ioi 0, ∃ s ∈ 𝓝 u, ∃ φ ∈ desingularizing_function η, ∀ x ∈ s ∩
{y | f u < f y ∧ f y < f u + η},
(ENNReal.ofReal (deriv φ (f x - f u))) * (EMetric.infEdist 0 (subdifferential f x)) ≥ ENNReal.ofReal 1
-- Definition of the KL function
def KL_function (f : E → ℝ) : Prop :=
∀ u ∈ active_domain f, KL_point f u
-- /- Definition of the desingularizing function -/
-- def desingularizing_function (c θ : ℝ) (_ : θ ∈ Ico 0 1) (_ : 0 < c) : ℝ → ℝ :=
-- fun t ↦ c * t ^ (1 - θ)
/- KL inequality for critical points -/
def KL_property_with_regularization (f : E → ℝ) (u' : E) (φ : ℝ → ℝ) : Prop :=
∃ η ∈ Ioi 0, ∃ s ∈ 𝓝 u', (φ ∈ desingularizing_function η) ∧
(∀ x ∈ s ∩ {y ∈ active_domain f | f u' < f y ∧ f y < f u' + η},
(EMetric.infEdist 0 (subdifferential (λ u => φ (f u - f u')) x)).toReal ≥ 1)
-- deriv of function (fun t => c⁻¹ * t) is c⁻¹
lemma deriv_of_const_mul_func (c : ℝ) (x : ℝ) : deriv (fun (t : ℝ) => c⁻¹ * t) x = c⁻¹ := by
apply HasDerivAt.deriv
have : (fun (t : ℝ) => c⁻¹ * t) = (fun t => t * c⁻¹) := by ext t; ring
rw [this]
apply hasDerivAt_mul_const c⁻¹
-- Function (fun t => c⁻¹ * t) is a desingularizing function
lemma const_mul_special_concave : ∀ c > 0, (fun t => c⁻¹ * t) ∈ desingularizing_function (c / 2) := by
intro c cpos; let φ := (fun t => c⁻¹ * t)
simp [desingularizing_function]
have fun_smul_eq_mul: (fun t ↦ c⁻¹ * t) = (fun t ↦ c⁻¹ • t) := by
ext t; rw [smul_eq_mul]
have h₁: ConcaveOn ℝ (Ico 0 (c / 2)) φ := by
rw [ConcaveOn]; constructor; apply convex_Ico
intro x _ y _ a b _ _ _
show a • (c⁻¹ * x) + b • (c⁻¹ * y) ≤ c⁻¹ * (a • x + b • y)
rw [← smul_mul_assoc, ← smul_mul_assoc]; repeat rw [smul_eq_mul]
linarith
-- have h₂: ∀ (x : ℝ), 0 < x → x < c / 2 → 0 < φ x := by
-- intro x xpos _; show c⁻¹ * x > 0; field_simp; exact cpos
have h₃: ContDiffOn ℝ 1 (fun t ↦ c⁻¹ * t) (Ioo 0 (c / 2)) := by
rw [fun_smul_eq_mul]; apply ContDiff.contDiffOn; apply contDiff_const_smul
have h₄: ContinuousAt (fun t ↦ c⁻¹ * t) 0 := by
rw [fun_smul_eq_mul]; apply (continuousAt_const_smul_iff₀ _).2
apply continuousAt_id; field_simp
have h₅: ∀ (x : ℝ), 0 < x → x < c / 2 → 0 < deriv (fun t ↦ c⁻¹ * t) x := by
intro x _ _; rw [deriv_of_const_mul_func]; field_simp; exact cpos
exact ⟨h₁, h₃, h₄, h₅⟩
-- Type transformation: ENNReal.ofReal (1 / (↑n + 1)) = (1 / (↑n + 1))
lemma one_div_type_trans: ∀ n : ℕ, ENNReal.ofReal (1 / (↑n + 1)) = (1 / (↑n + 1)) := by
intro n
have : ENNReal.ofReal (1 / (↑n + 1)) = ENNReal.ofReal 1 / ENNReal.ofReal (↑n + 1) := by
apply ENNReal.ofReal_div_of_pos
exact Nat.cast_add_one_pos n
rw [this, ENNReal.ofReal_one]
simp only [one_div, inv_inj]
rw [← ENNReal.ofReal_one]
have : ↑n = ENNReal.ofReal (↑n) := Eq.symm (ENNReal.ofReal_natCast n)
rw [this]
refine ENNReal.ofReal_add ?hp ?hq
exact Nat.cast_nonneg' n
exact zero_le_one' ℝ
lemma const_mul_edist_ge_one {c : ℝ} {ed : ENNReal} (hpos : c > 0)
(hed : ed ≥ ENNReal.ofReal c) :
ENNReal.ofReal c⁻¹ * ed ≥ ENNReal.ofReal 1 := by
by_cases hed' : ed = ⊤
have : ENNReal.ofReal c⁻¹ * ed = ⊤ := by
rw [hed']; refine ENNReal.mul_top ?h; simpa
rw [this]; simp; push_neg at hed'
calc
_ ≥ ENNReal.ofReal c⁻¹ * ENNReal.ofReal c := mul_le_mul_left' hed (ENNReal.ofReal c⁻¹)
_ = ENNReal.ofReal 1 := by
rw [← ENNReal.ofReal_mul]; field_simp; simp; exact le_of_lt hpos
lemma edist_geq_const (h_noncrit : 0 ∉ subdifferential f x) :
∃ c > 0, ∀ u, ‖u - x‖ + ‖f u - f x‖ < c →
EMetric.infEdist 0 (subdifferential f u) ≥ ENNReal.ofReal c := by
by_contra! hc
have sqh: ∀ n : ℕ, ∃ u, ‖u - x‖ + ‖f u - f x‖ < 1 / (n + 1) ∧
(EMetric.infEdist 0 (subdifferential f u)) < ENNReal.ofReal (1 / (n + 1)) :=
fun n ↦ hc (1 / (n + 1)) (by simp; linarith)
choose u hu using sqh
have inequ_fun : ∀ n, (EMetric.infEdist 0 (subdifferential f (u n))).toReal ≤ 1 / (n + 1) := by
intro n
apply (ENNReal.toReal_le_of_le_ofReal _ (le_of_lt (hu n).right))
simp; linarith
have : Tendsto (fun n ↦ (EMetric.infEdist 0 (subdifferential f (u n))).toReal) atTop (𝓝 0) :=
squeeze_zero (by simp) inequ_fun tendsto_one_div_add_atTop_nhds_zero_nat
have h_contra : 0 ∈ subdifferential f x := by
have u_to_x : Tendsto u atTop (𝓝 x) := by
have : Tendsto (fun n => ‖u n - x‖) atTop (𝓝 0) := by
apply squeeze_zero (by simp) _ tendsto_one_div_add_atTop_nhds_zero_nat
intro n
have inequ₁: ‖u n - x‖ ≤ 1 / (n + 1) := by
rcases hu n with ⟨hu₁, _⟩
apply (le_of_add_le_of_nonneg_left (le_of_lt hu₁) (norm_nonneg (f (u n) - f x)))
exact inequ₁
apply tendsto_iff_norm_sub_tendsto_zero.2 this
have fu_to_fx : Tendsto (fun n ↦ f (u n)) atTop (𝓝 (f x)) := by
have : Tendsto (fun n => ‖f (u n) - f x‖) atTop (𝓝 0) := by
apply squeeze_zero (by simp) _ tendsto_one_div_add_atTop_nhds_zero_nat
intro n
have inequ₂: ‖f (u n) - f x‖ ≤ 1 / (n + 1) := by
rcases hu n with ⟨hu₁,_⟩
apply (le_of_add_le_of_nonneg_right (le_of_lt hu₁) (norm_nonneg (u n - x)))
exact inequ₂
apply tendsto_iff_norm_sub_tendsto_zero.2 this
have exist_v: ∀ n : ℕ, ∃ vn, vn ∈ subdifferential f (u n) ∧ dist 0 vn < 1 / (n + 1) := by
intro n
rcases hu n with ⟨_,hu₂⟩
have : ∃ vn ∈ subdifferential f (u n), edist 0 vn < 1 / (n + 1) := by
apply EMetric.infEdist_lt_iff.1
rw [← one_div_type_trans n]
exact hu₂
choose vn hvn using this
use vn, hvn.left
rw [← one_div_type_trans n] at hvn
apply edist_lt_ofReal.1 hvn.right
choose v hv using exist_v
have v_in_subdiff: ∀ n : ℕ, (u n, v n) ∈ subdifferential_Graph f := by
intro n
exact (hv n).1
have v_to_zero: Tendsto v atTop (𝓝 0) := by
rw [dist_zero_left] at hv
have : Tendsto (fun n => ‖v n‖) atTop (𝓝 0) := by
apply squeeze_zero (by simp) _ tendsto_one_div_add_atTop_nhds_zero_nat
intro n
apply le_of_lt (hv n).right
apply tendsto_zero_iff_norm_tendsto_zero.2 this
show (x, 0) ∈ subdifferential_Graph f
apply GraphOfSubgradientIsClosed v_in_subdiff
(Filter.Tendsto.prod_mk_nhds u_to_x v_to_zero) fu_to_fx
contradiction
/-- Non-critical KL property is naturally true -/
theorem KL_property_at_noncritical_point (h_noncrit : 0 ∉ subdifferential f x) : KL_point f x := by
obtain ⟨c, hc_pos, h⟩ := edist_geq_const h_noncrit
let φ := (fun (t : ℝ) => c⁻¹ * t)
rw [KL_point]
use c/2, (by simpa using hc_pos), Metric.ball x (c / 2)
constructor
apply Metric.ball_mem_nhds; simpa using hc_pos
use φ, const_mul_special_concave c hc_pos
intro u hu
rw [deriv_of_const_mul_func _ (f u - f x)]
have : ‖u - x‖ + ‖f u - f x‖ < c := by
rw [← add_halves c]
apply add_lt_add
· apply mem_ball_iff_norm.1 hu.left
· simp at *
rw [abs_eq_self.2] <;> linarith
exact const_mul_edist_ge_one hc_pos (h u this)
end
section aux_lemma_uniform_KL
lemma real_geq_ennreal_ofreal_geq {a b : ℝ} {c : ENNReal} (hgeq : a ≥ b) (apos: a > 0):
(ENNReal.ofReal a) * c ≥ (ENNReal.ofReal b) * c := by
by_cases hc : c = 0
rw [hc]
simp
push_neg at hc
by_cases hctop : c = ⊤
rw [hctop]
have ha : (ENNReal.ofReal a) * ⊤ = ⊤ := by
refine ENNReal.mul_top ?h
simpa
rw [ha]
simp
push_neg at hctop
refine (ENNReal.mul_le_mul_right ?_ ?_).mpr ?_
· exact hc
· exact hctop
· exact ENNReal.ofReal_le_ofReal hgeq
end aux_lemma_uniform_KL
variable {E : Type*}
variable {f : E → ℝ} {x : E}
-- Definition of functions constant on a set
def is_constant_on (f : E → ℝ) (Ω : Set E) : Prop :=
∀ x ∈ Ω, ∀ y ∈ Ω, f x = f y
-- If f is constant on an empty set, then a constant value can be chosen
lemma exist_constant_value (f : E → ℝ) {Ω : Set E} (h : is_constant_on f Ω)
(h_nonempty : Ω.Nonempty) :
∃ μ : ℝ, ∀ x ∈ Ω, f x = μ := by
rcases (Set.nonempty_def.1 h_nonempty) with ⟨x, hx⟩
exact ⟨f x, fun y hy => h y hy x hx⟩
section uniformized_KL
variable [NormedAddCommGroup E] [InnerProductSpace ℝ E]
/- Uniformized KL property -/
theorem uniformized_KL_property {f : E → ℝ} {Ω : Set E} (h_compact : IsCompact Ω)
(h_Ω1 : ∀ x ∈ Ω, KL_point f x) (h_Ω2: is_constant_on f Ω) :
∃ ε ∈ Ioi 0, ∃ η ∈ Ioi 0, ∃ φ ∈ desingularizing_function η, ∀ u ∈ Ω , ∀ x ∈
{y : E | (EMetric.infEdist y Ω).toReal < ε} ∩ {y | f u < f y ∧ f y < f u + η},
(ENNReal.ofReal (deriv φ (f x - f u))) * EMetric.infEdist 0 (subdifferential f x) ≥ 1 := by
-- case : Ω = ∅
by_cases h_nonempty : Ω = ∅
· push_neg at h_nonempty
use 1, (by simp), 1, (by simp), (fun t => 2⁻¹ * t)
constructor
rw [← div_self]
exact (const_mul_special_concave 2 (by simp))
simp
rw [h_nonempty]
tauto
-- case : Ω ≠ ∅
push_neg at h_nonempty
obtain ⟨μ, constant_value⟩ := exist_constant_value f h_Ω2 h_nonempty
have : ∀ x ∈ Ω, ∃ η ∈ Ioi 0, ∃ (O : Set E) (_: IsOpen O) (_: x ∈ O), ∃ φ ∈ desingularizing_function η,
∀ u ∈ O ∩ {y | f x < f y ∧ f y < f x + η},
(ENNReal.ofReal (deriv φ (f u - f x))) * EMetric.infEdist 0 (subdifferential f u) ≥ 1 := by
intro x hx; simp [KL_point] at h_Ω1
rcases h_Ω1 x hx with ⟨η, ⟨hη, ⟨s, ⟨hs, ⟨φ, hφ, h_Ω1⟩⟩⟩⟩⟩
rcases mem_nhds_iff.1 hs with ⟨O, hO1, hO2, hO3⟩
use η, hη, O, hO2, hO3, φ, hφ
intro u hu
simp at hu
rcases hu with ⟨hu1, hu2, hu3⟩
have : u ∈ s := by tauto
exact h_Ω1 u this hu2 hu3
choose! η h_exist using this
choose hη2 h_exist using h_exist
choose! O h_exist using h_exist
choose h_Ox h_exist using h_exist
choose h_Ox' h_exist using h_exist
choose! φ h_exist using h_exist
choose hφ h_exist using h_exist
-- All the neighborhoods of the KL points become an open cover of Ω
have exist_open_cover: Ω ⊆ ⋃ x ∈ Ω, O x := by
intro x hx; simp
exact ⟨x, ⟨hx, h_Ox' x hx⟩⟩
-- There exists a finite sub-cover of this open cover.
obtain exist_open_sub_finite_cover :=
IsCompact.elim_finite_subcover_image h_compact h_Ox exist_open_cover
rcases exist_open_sub_finite_cover with ⟨t, ht1, ht2, ht3⟩
have mem_t_in_Ω : ∀ x ∈ ht2.toFinset, x ∈ Ω := by
intro x hx
obtain := (Set.Finite.mem_toFinset ht2).1 hx
tauto
have t_nonempty : ht2.toFinset.Nonempty := by
simp; by_contra! h
have : ⋃ i ∈ t, O i = ∅ := by simp [h]
have Ω_subset: Ω ⊆ ∅ := by rwa [this] at ht3
have contra₁: Ω = ∅ := Set.subset_empty_iff.1 Ω_subset
have contra₂: Ω ≠ ∅ := Set.Nonempty.ne_empty h_nonempty
contradiction
let φ_sum := ∑' x : ht2.toFinset, φ x
have : ∃ η_min ∈ Ioi 0, ∀ x ∈ t, η x ≥ η_min := by
have nonempty: (Finset.image η ht2.toFinset).Nonempty := by
simpa using t_nonempty
let η_min := (Finset.image η ht2.toFinset).min' nonempty
use η_min
constructor
· simp [η_min]
intro c hc
exact hη2 c (mem_t_in_Ω c ((Set.Finite.mem_toFinset ht2).2 hc))
intro x xt
have min_le: ∀ s ∈ (Finset.image η ht2.toFinset), η_min ≤ s := by apply Finset.min'_le
have η_in_image: (η x) ∈ (Finset.image η ht2.toFinset) := by
rw [Finset.mem_image]
use x
constructor
simp [xt]
rfl
exact min_le (η x) η_in_image
rcases this with ⟨η_min, ηpos, hmin⟩
simp [desingularizing_function] at hφ
-- φ_sum is desingularizing_function
have h_special_concave: φ_sum ∈ desingularizing_function η_min := by
simp [desingularizing_function]
have h₁ : ConcaveOn ℝ (Ico 0 η_min) φ_sum := by
rw [ConcaveOn]
constructor
apply convex_Ico
intro x xpos y ypos a b apos bpos absum
simp [φ_sum]
have : ∀ d : ℝ, ∀ x : ℝ, d * ∑ c ∈ ht2.toFinset,
φ c x = ∑ c ∈ ht2.toFinset, d * (φ c x) := by
intro d x
let f c := φ c x
show d * ∑ c ∈ ht2.toFinset, f c = ∑ c ∈ ht2.toFinset, d * f c
rw [← Finset.tsum_subtype', ← Finset.tsum_subtype', ← tsum_mul_left]
rw [this a x, this b y, ← Finset.sum_add_distrib]
have : ∀ c ∈ t, (a * φ c x + b * φ c y) ≤ φ c (a * x + b * y) := by
intro c hc
simp at xpos ypos
have xleq : x < η c := by
obtain := hmin c hc
linarith
have yleq : y < η c := by
obtain := hmin c hc
linarith
obtain c_in_finset := (Set.Finite.mem_toFinset ht2).2 hc
obtain inequ_concave := (hφ c (mem_t_in_Ω c c_in_finset)).1
simp [ConcaveOn] at inequ_concave
apply inequ_concave.2 xpos.1 xleq ypos.1 yleq apos bpos absum
apply Finset.sum_le_sum
intro c hc
exact this c ((Set.Finite.mem_toFinset ht2).1 hc)
-- have h₂ : ∀ (x : ℝ), 0 < x → x < η_min → 0 < φ_sum x := by
-- intro x hx1 hx2; simp [φ_sum]
-- apply Finset.sum_pos
-- intro c hc
-- have xleq : x < η c := by
-- obtain := hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
-- linarith
-- exact (hφ c (mem_t_in_Ω c hc)).2.1 x hx1 xleq
-- exact t_nonempty
have h₃ : φ_sum 0 = 0 := by
simp [φ_sum]
have : ∀ x ∈ ht2.toFinset, φ x 0 = 0 := by
intro x xt
exact (hφ x (mem_t_in_Ω x xt)).2.1
apply Finset.sum_eq_zero this
have h₄ : ContDiffOn ℝ 1 φ_sum (Ioo 0 η_min) := by
have : φ_sum = (fun c => ∑ x ∈ ht2.toFinset, φ x c) := by ext c; simp [φ_sum]
rw [this]
apply ContDiffOn.sum
intro c hc
obtain φ_cont_diff := (hφ c (mem_t_in_Ω c hc)).2.2.1
apply ContDiffOn.mono φ_cont_diff
apply Set.Ioo_subset_Ioo_right
exact hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
have h₅ : ContinuousAt φ_sum 0 := by
rw [ContinuousAt]
have : φ_sum = (fun c => ∑ x ∈ ht2.toFinset, φ x c) := by ext c; simp [φ_sum]
rw [this]
simp [φ_sum]
apply tendsto_finset_sum
intro c hc
obtain cont := (hφ c (mem_t_in_Ω c hc)).2.2.2.1
rw [ContinuousAt] at cont
exact cont
have h₆ : ∀ (x : ℝ), 0 < x → x < η_min → 0 < deriv φ_sum x := by
intro y ypos yleq
have : φ_sum = (fun c => ∑ x ∈ ht2.toFinset, φ x c) := by ext c; simp [φ_sum]
rw [this]
have : deriv (fun c ↦ ∑ x ∈ ht2.toFinset, φ x c) y = ∑ x ∈ ht2.toFinset, deriv (φ x) y := by
apply deriv_sum
intro c hc
have η_inequ: y < η c := by
obtain := hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
linarith
specialize hφ c (mem_t_in_Ω c hc)
obtain contdiff:= ContDiffOn.contDiffAt hφ.2.2.1 (Ioo_mem_nhds ypos η_inequ)
apply ContDiffAt.differentiableAt contdiff (by simp)
rw [this]
apply Finset.sum_pos
· intro c hc
have : y < η c := by
obtain := hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
linarith
specialize hφ c (mem_t_in_Ω c hc)
exact hφ.2.2.2.2 y ypos this
· exact t_nonempty
exact ⟨h₁,h₃,h₄,h₅,h₆⟩
have uniform_ball: ∃ ε ∈ Ioi 0, {y| EMetric.infEdist y Ω < ENNReal.ofReal ε} ⊆ ⋃ x ∈ t, O x := by
have union_open : IsOpen (⋃ x ∈ t, O x) := by
have : ∀ x ∈ t, IsOpen (O x) := by
intro x hx
have : x ∈ Ω := by tauto
apply h_Ox
apply this
apply isOpen_biUnion this
obtain res_thickening := IsCompact.exists_thickening_subset_open h_compact union_open ht3
rcases res_thickening with ⟨ε, ⟨hε, h2⟩⟩
use ε, hε
have : {y| EMetric.infEdist y Ω < ENNReal.ofReal ε} = Metric.thickening ε Ω := by
ext x; exact Metric.mem_thickening_iff_infEdist_lt
rwa [this]
choose ε uniform_ball using uniform_ball
have : {y| EMetric.infEdist y Ω < ENNReal.ofReal ε} = {y| (EMetric.infEdist y Ω).toReal < ε} := by
ext x; apply ENNReal.lt_ofReal_iff_toReal_lt (Metric.infEdist_ne_top h_nonempty)
rw [this] at uniform_ball
-- There exists one open set in the finite cover
have exist_one_ball: ∀ u ∈ {y| (EMetric.infEdist y Ω).toReal < ε}
∩ {y | μ < f y ∧ f y < μ + η_min},
∃ x ∈ t, u ∈ O x := by
intro u hu
obtain u_in_union := Set.mem_of_subset_of_mem uniform_ball.2 hu.1
simpa using u_in_union
use ε, uniform_ball.1, η_min, ηpos, φ_sum, h_special_concave
intro baru hbaru
rw [constant_value baru hbaru]
intro u hu
-- u must fall into one ball
rcases exist_one_ball u hu with ⟨ui, ⟨hui₁, hui₂⟩⟩
simp at hu
rcases hu with ⟨_,hu2,hu3⟩
-- rcases hu with ⟨_, ⟨hu21 , ⟨hu221, hu222⟩⟩⟩
calc
_ ≥ (ENNReal.ofReal (deriv (φ ui) (f u - μ))) * EMetric.infEdist 0 (subdifferential f u) := by
have deriv_φ_pos: deriv φ_sum (f u - μ) > 0 := by
simp [desingularizing_function] at h_special_concave
obtain h_tmp := h_special_concave.2.2.2.2
apply h_tmp
· linarith [hu2]
· linarith [hu3]
apply real_geq_ennreal_ofreal_geq
simp [φ_sum]
have equ₁: deriv (fun c ↦ ∑ x ∈ ht2.toFinset, φ x c) (f u - μ) =
∑ x ∈ ht2.toFinset, deriv (φ x) (f u - μ) := by
apply deriv_sum
intro c hc
have σu_pos : f u - μ > 0 := by linarith [hu2]
have η_inequ: (f u - μ) < η c := by
obtain inequ_ηmin:= hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
linarith
specialize hφ c (mem_t_in_Ω c hc)
obtain contdiff:= ContDiffOn.contDiffAt hφ.2.2.1 (Ioo_mem_nhds σu_pos η_inequ)
apply ContDiffAt.differentiableAt contdiff (by simp)
have equ₂ : deriv (fun c ↦ ∑ x ∈ ht2.toFinset, φ x c) (f u - μ) =
deriv (∑ x ∈ ht2.toFinset, φ x) (f u - μ) := by
have : (fun c ↦ ∑ x ∈ ht2.toFinset, φ x c) = (∑ x ∈ ht2.toFinset, φ x) := by
ext c; exact Eq.symm (Finset.sum_apply c ht2.toFinset φ)
rw [this]
rw [← equ₂, equ₁]
-- have : (∑ x ∈ ht2.toFinset, deriv (φ x) (f u - μ)) ≥ deriv (φ ui) (f u - μ) := by
let g x := deriv (φ x) (f u - μ)
show (∑ x ∈ ht2.toFinset, g x) ≥ g ui
apply Finset.single_le_sum
intro c hc
have σu_pos : f u - μ > 0 := by linarith [hu2]
have η_inequ: (f u - μ) < η c := by
obtain inequ_ηmin:= hmin c ((Set.Finite.mem_toFinset ht2).1 hc)
linarith
simp [g]
specialize hφ c (mem_t_in_Ω c hc)
apply le_of_lt (hφ.2.2.2.2 (f u - μ) σu_pos η_inequ)
apply ((Set.Finite.mem_toFinset ht2).2 hui₁)
-- apply real_geq_ennreal_ofreal_geq
-- apply lt_of_lt_of_le _ this
exact deriv_φ_pos
_ ≥ 1 := by
obtain equ_μ := constant_value ui (mem_t_in_Ω ui ((Set.Finite.mem_toFinset ht2).2 hui₁))
specialize h_exist ui (mem_t_in_Ω ui ((Set.Finite.mem_toFinset ht2).2 hui₁))
specialize h_exist u ⟨hui₂, _⟩
simp [equ_μ]
use hu2
have : η_min ≤ η ui := hmin ui hui₁
linarith
rw [equ_μ] at h_exist
exact h_exist
-- theorem uniformly_KL_property' {f : E → ℝ} {Ω : Set E} (h_compact : IsCompact Ω)
-- (h_Ω1 : ∀ x ∈ Ω, KL_point f x) (h_Ω2: is_constant_on f Ω) :
-- ∃ ε ∈ Ioi 0, ∃ η ∈ Ioi 0, ∃ φ ∈ desingularizing_function η, ∀ u ∈ Ω , ∀ x ∈
-- {y : E | (EMetric.infEdist y Ω).toReal < ε} ∩ {y | f u < f y ∧ f y < f u + η},
-- (Real.toEReal (deriv φ (f x - f u))) * (EMetric.infEdist 0 (subdifferential f x))
-- ≥ Real.toEReal 1 := by
-- obtain h := uniformly_KL_property h_compact h_Ω1 h_Ω2
-- rcases h with ⟨ε, hε, η, hη, φ, hφ, h⟩
-- use ε, hε, η, hη, φ, hφ
-- intro u hu x hx
-- by_cases h_empty : EMetric.infEdist 0 (subdifferential f x) = ⊤
-- · rw [h_empty]
-- have hderiv: Real.toEReal (deriv φ (f x - f u)) > 0 := by sorry
-- have hh: (Real.toEReal (deriv φ (f x - f u))) * (ENNReal.toEReal ⊤) = ⊤ := by
-- sorry
-- rw [hh]
-- simp
-- · push_neg at h_empty
-- have h_not_bot: EMetric.infEdist 0 (subdifferential f x) ≠ ⊥ := by sorry
-- sorry
-- -- by_cases h_empty : EMetric.infEdist 0 (subdifferential f x) = ∅
end uniformized_KL