@@ -8,7 +8,6 @@ import LeanBandits.ForMathlib.IndepFun
88import LeanBandits.ForMathlib.IndepInfinitePi
99import LeanBandits.ForMathlib.KernelRepresentation
1010import LeanBandits.ForMathlib.StandardBorel
11- import LeanBandits.SequentialLearning.Deterministic
1211import LeanBandits.SequentialLearning.FiniteActions
1312import LeanBandits.SequentialLearning.StationaryEnv
1413
@@ -26,32 +25,6 @@ variable {α R : Type*} {mα : MeasurableSpace α} {mR : MeasurableSpace R}
2625
2726section MeasureSpace
2827
29- namespace Bandit
30-
31- /-- Kernel describing the distribution of the next action-reward pair given the history up to
32- time `n`. -/
33- noncomputable
34- def stepKernel (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) :
35- Kernel (Iic n → α × R) (α × R) :=
36- Learning.stepKernel alg (stationaryEnv ν) n
37- deriving IsMarkovKernel
38-
39- @[simp]
40- lemma fst_stepKernel (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) :
41- (stepKernel alg ν n).fst = alg.policy n := by
42- rw [stepKernel, Learning.fst_stepKernel]
43-
44- @[simp]
45- lemma snd_stepKernel (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) :
46- (stepKernel alg ν n).snd = ν ∘ₖ alg.policy n := by
47- rw [stepKernel, Learning.stepKernel, stationaryEnv_feedback, Kernel.snd_compProd_prodMkLeft]
48-
49- /-- Measure on the sequence of actions pulled and rewards observed generated by the bandit. -/
50- noncomputable
51- def trajMeasure (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] : Measure (ℕ → α × R) :=
52- Learning.trajMeasure alg (stationaryEnv ν)
53- deriving IsProbabilityMeasure
54-
5528/-- Measure of an infinite stream of rewards from each action. -/
5629noncomputable
5730def streamMeasure (ν : Kernel α R) : Measure (ℕ → α → R) :=
@@ -61,26 +34,6 @@ instance (ν : Kernel α R) [IsMarkovKernel ν] : IsProbabilityMeasure (streamMe
6134 unfold streamMeasure
6235 infer_instance
6336
64- /-- Joint distribution of the sequence of action pulled and rewards, and a stream of independent
65- rewards from all actions. -/
66- noncomputable
67- def measure (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] :
68- Measure ((ℕ → α × R) × (ℕ → α → R)) :=
69- (trajMeasure alg ν).prod (streamMeasure ν)
70- deriving IsProbabilityMeasure
71-
72- @[simp]
73- lemma fst_measure (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] :
74- (measure alg ν).fst = trajMeasure alg ν := by
75- rw [measure, Measure.fst_prod]
76-
77- @[simp]
78- lemma snd_measure (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν] :
79- (measure alg ν).snd = streamMeasure ν := by
80- rw [measure, Measure.snd_prod]
81-
82- end Bandit
83-
8437section StreamMeasure
8538
8639lemma _root_.hasLaw_eval_infinitePi {ι : Type *} {X : ι → Type *} {mX : ∀ i, MeasurableSpace (X i)}
@@ -90,15 +43,15 @@ lemma _root_.hasLaw_eval_infinitePi {ι : Type*} {X : ι → Type*} {mX : ∀ i,
9043 map_eq := by exact (measurePreserving_eval_infinitePi μ i).map_eq
9144
9245lemma hasLaw_eval_streamMeasure (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) :
93- HasLaw (fun h : ℕ → α → R ↦ h n) (Measure.infinitePi ν) (Bandit. streamMeasure ν) :=
46+ HasLaw (fun h : ℕ → α → R ↦ h n) (Measure.infinitePi ν) (streamMeasure ν) :=
9447 hasLaw_eval_infinitePi (fun _ ↦ Measure.infinitePi ν) n
9548
9649lemma hasLaw_eval_eval_streamMeasure (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) (a : α) :
97- HasLaw (fun h : ℕ → α → R ↦ h n a) (ν a) (Bandit. streamMeasure ν) :=
50+ HasLaw (fun h : ℕ → α → R ↦ h n a) (ν a) (streamMeasure ν) :=
9851 (hasLaw_eval_infinitePi ν a).comp (hasLaw_eval_streamMeasure ν n)
9952
10053lemma identDistrib_eval_eval_id_streamMeasure (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) (a : α) :
101- IdentDistrib (fun h : ℕ → α → R ↦ h n a) id (Bandit. streamMeasure ν) (ν a) where
54+ IdentDistrib (fun h : ℕ → α → R ↦ h n a) id (streamMeasure ν) (ν a) where
10255 aemeasurable_fst := Measurable.aemeasurable (by fun_prop)
10356 aemeasurable_snd := Measurable.aemeasurable (by fun_prop)
10457 map_eq := by
@@ -118,47 +71,40 @@ lemma Integrable.congr_identDistrib {Ω Ω' : Type*}
11871
11972lemma integrable_eval_streamMeasure (ν : Kernel α ℝ) [IsMarkovKernel ν] (n : ℕ) (a : α)
12073 (h_int : Integrable id (ν a)) :
121- Integrable (fun h : ℕ → α → ℝ ↦ h n a) (Bandit. streamMeasure ν) :=
74+ Integrable (fun h : ℕ → α → ℝ ↦ h n a) (streamMeasure ν) :=
12275 Integrable.congr_identDistrib h_int (identDistrib_eval_eval_id_streamMeasure ν n a).symm
12376
12477lemma integral_eval_streamMeasure (ν : Kernel α ℝ) [IsMarkovKernel ν] (n : ℕ) (a : α) :
125- ∫ h, h n a ∂(Bandit. streamMeasure ν) = (ν a)[id] := by
126- calc ∫ h, h n a ∂(Bandit. streamMeasure ν)
127- _ = ∫ x, x ∂((Bandit. streamMeasure ν).map (fun h ↦ h n a)) := by
78+ ∫ h, h n a ∂(streamMeasure ν) = (ν a)[id] := by
79+ calc ∫ h, h n a ∂(streamMeasure ν)
80+ _ = ∫ x, x ∂((streamMeasure ν).map (fun h ↦ h n a)) := by
12881 rw [integral_map (Measurable.aemeasurable (by fun_prop)) (by fun_prop)]
12982 _ = (ν a)[id] := by simp [(hasLaw_eval_eval_streamMeasure ν n a).map_eq]
13083
13184lemma iIndepFun_eval_streamMeasure' (ν : Kernel α R) [IsMarkovKernel ν] :
132- iIndepFun (fun n ω ↦ ω n) (Bandit. streamMeasure ν) :=
85+ iIndepFun (fun n ω ↦ ω n) (streamMeasure ν) :=
13386 iIndepFun_infinitePi (P := fun (_ : ℕ) ↦ Measure.infinitePi ν) (Ω := fun _ ↦ α → R)
13487 (X := fun i u ↦ u) (fun i ↦ by fun_prop)
13588
13689lemma iIndepFun_eval_streamMeasure'' (ν : Kernel α R) [IsMarkovKernel ν] (a : α) :
137- iIndepFun (fun n ω ↦ ω n a) (Bandit. streamMeasure ν) :=
90+ iIndepFun (fun n ω ↦ ω n a) (streamMeasure ν) :=
13891 (iIndepFun_eval_streamMeasure' ν).comp (g := fun i ω ↦ ω a) (by fun_prop)
13992
14093lemma iIndepFun_eval_streamMeasure (ν : Kernel α R) [IsMarkovKernel ν] :
141- iIndepFun (fun (p : ℕ × α) ω ↦ ω p.1 p.2 ) (Bandit. streamMeasure ν) :=
94+ iIndepFun (fun (p : ℕ × α) ω ↦ ω p.1 p.2 ) (streamMeasure ν) :=
14295 iIndepFun_uncurry_infinitePi' (X := fun _ _ ↦ id) (fun _ ↦ ν) (by fun_prop)
14396
14497lemma indepFun_eval_streamMeasure (ν : Kernel α R) [IsMarkovKernel ν] {n m : ℕ} {a b : α}
14598 (h : n ≠ m ∨ a ≠ b) :
146- IndepFun (fun ω ↦ ω n a) (fun ω ↦ ω m b) (Bandit. streamMeasure ν) := by
99+ IndepFun (fun ω ↦ ω n a) (fun ω ↦ ω m b) (streamMeasure ν) := by
147100 change IndepFun (fun ω ↦ ω (n, a).1 (n, a).2 ) (fun ω ↦ ω (m, b).1 (m, b).2 )
148- (Bandit. streamMeasure ν)
101+ (streamMeasure ν)
149102 exact (iIndepFun_eval_streamMeasure ν).indepFun (by grind)
150103
151104lemma indepFun_eval_streamMeasure' (ν : Kernel α R) [IsMarkovKernel ν] {a b : α} (h : a ≠ b) :
152- IndepFun (fun ω n ↦ ω n a) (fun ω n ↦ ω n b) (Bandit. streamMeasure ν) :=
105+ IndepFun (fun ω n ↦ ω n a) (fun ω n ↦ ω n b) (streamMeasure ν) :=
153106 indepFun_proj_infinitePi_infinitePi h
154107
155- lemma indepFun_eval_snd_measure (alg : Algorithm α R) (ν : Kernel α R) [IsMarkovKernel ν]
156- {a b : α} (h : a ≠ b) :
157- IndepFun (fun ω n ↦ ω.2 n a) (fun ω n ↦ ω.2 n b) (Bandit.measure alg ν) := by
158- refine indepFun_snd_prod ?_ ?_ (indepFun_eval_streamMeasure' ν h) (Bandit.trajMeasure alg ν)
159- · exact Measurable.aemeasurable (by fun_prop)
160- · exact Measurable.aemeasurable (by fun_prop)
161-
162108end StreamMeasure
163109
164110namespace ArrayModel
@@ -181,7 +127,7 @@ instance {α R : Type*} [Countable α] [MeasurableSpace R] [StandardBorelSpace R
181127/-- Probability measure for the array model of stochastic bandits. -/
182128noncomputable
183129def arrayMeasure (ν : Kernel α R) : Measure (probSpace α R) :=
184- (Measure.infinitePi fun _ ↦ volume).prod (Bandit. streamMeasure ν)
130+ (Measure.infinitePi fun _ ↦ volume).prod (streamMeasure ν)
185131
186132instance (ν : Kernel α R) [IsMarkovKernel ν] : IsProbabilityMeasure (arrayMeasure ν) :=
187133 Measure.prod.instIsProbabilityMeasure _ _
@@ -606,7 +552,7 @@ lemma map_snd_apply_arrayMeasure {ν : Kernel α R} [IsMarkovKernel ν] (n : ℕ
606552 rw [Measure.snd, Measure.map_map (by fun_prop) (by fun_prop)]
607553 rfl
608554 _ = ν a := by
609- rw [arrayMeasure, Measure.snd_prod, Bandit. streamMeasure]
555+ rw [arrayMeasure, Measure.snd_prod, streamMeasure]
610556 have : (fun ω ↦ ω n a) = (fun h : α → R ↦ h a) ∘ (fun ω : ℕ → α → R ↦ ω n) := rfl
611557 rw [this, ← Measure.map_map (by fun_prop) (by fun_prop), Measure.infinitePi_map_eval,
612558 Measure.infinitePi_map_eval]
@@ -629,7 +575,7 @@ omit [DecidableEq α] [Nonempty α] [StandardBorelSpace α] in
629575lemma indepFun_fst_add_one_aux (ν : Kernel α R) [IsMarkovKernel ν] (n : ℕ) :
630576 (fun ω ↦ ω.1 (n + 1 )) ⟂ᵢ[arrayMeasure ν] (fun ω ↦ (fun (i : Iic n) ↦ ω.1 i, ω.2 )) := by
631577 let μ₁ : Measure (ℕ → I) := Measure.infinitePi fun _ ↦ volume
632- let μ₂ : Measure (ℕ → α → R) := Bandit. streamMeasure ν
578+ let μ₂ : Measure (ℕ → α → R) := streamMeasure ν
633579 -- Coordinates of μ₁ are independent
634580 have h_indep : iIndepFun (fun i (ω : ℕ → I) ↦ ω i) μ₁ :=
635581 iIndepFun_infinitePi (fun _ ↦ measurable_id)
@@ -1016,10 +962,10 @@ lemma hasCondDistrib_action' (alg : Algorithm α R) (ν : Kernel α R) [IsMarkov
1016962 rw [h_indep']
1017963 congr
1018964 simp only [arrayMeasure]
1019- calc ((Measure.infinitePi fun x ↦ ℙ).prod (Bandit. streamMeasure ν)).map (fun ω ↦ ω.1 (n + 1 ))
965+ calc ((Measure.infinitePi fun x ↦ ℙ).prod (streamMeasure ν)).map (fun ω ↦ ω.1 (n + 1 ))
1020966 _ = (Measure.infinitePi fun x ↦ ℙ).map (Function.eval (n + 1 )) := by
1021967 nth_rw 2 [← Measure.fst_prod (μ := Measure.infinitePi fun x ↦ ℙ)
1022- (ν := Bandit. streamMeasure ν)]
968+ (ν := streamMeasure ν)]
1023969 rw [Measure.fst, Measure.map_map (by fun_prop) (by fun_prop)]
1024970 rfl
1025971 _ = ℙ := by rw [Measure.infinitePi_map_eval]
0 commit comments