From b2344bb494216b4a5661095308123b0a8e53aef5 Mon Sep 17 00:00:00 2001 From: Remy Degenne Date: Thu, 27 Aug 2026 16:01:47 +0200 Subject: [PATCH] delete blueprints --- .../workflows/{blueprint.yml => build.yml} | 6 +- .gitignore | 18 +- blueprint/lean_decls | 140 ---- .../src/appendix/conditional_independence.tex | 45 -- blueprint/src/biblio.bib | 278 ------- blueprint/src/blueprint.sty | 2 - blueprint/src/chapters/algorithm.tex | 601 --------------- blueprint/src/chapters/bandit.tex | 723 ------------------ blueprint/src/chapters/concentration.tex | 197 ----- blueprint/src/chapters/etc.tex | 161 ---- blueprint/src/chapters/intro.tex | 27 - .../src/chapters/practicalAlgorithms.tex | 32 - blueprint/src/chapters/sampling.tex | 1 - blueprint/src/chapters/ucb.tex | 185 ----- blueprint/src/content.tex | 22 - blueprint/src/extra_styles.css | 25 - blueprint/src/latexmkrc | 5 - blueprint/src/macros/common.tex | 21 - blueprint/src/macros/print.tex | 29 - blueprint/src/macros/web.tex | 5 - blueprint/src/plastex.cfg | 17 - blueprint/src/print.tex | 33 - blueprint/src/web.tex | 34 - docbuild/lakefile.toml | 15 - scripts/build_blueprint.sh | 13 - verso_blueprint/LMLBlueprint.lean | 1 - verso_blueprint/LMLBlueprint/Blueprint.lean | 31 - .../LMLBlueprint/Chapters/Algorithm.lean | 492 ------------ .../LMLBlueprint/Chapters/Bandit.lean | 543 ------------- .../LMLBlueprint/Chapters/BanditAlgs.lean | 332 -------- .../LMLBlueprint/Chapters/Concentration.lean | 189 ----- .../LMLBlueprint/Chapters/Intro.lean | 36 - verso_blueprint/LMLBlueprint/References.lean | 24 - verso_blueprint/LMLBlueprint/TeXPrelude.lean | 8 - verso_blueprint/Main.lean | 25 - verso_blueprint/lake-manifest.json | 163 ---- verso_blueprint/lakefile.lean | 15 - verso_blueprint/lean-toolchain | 1 - verso_blueprint/scripts/ci-pages.sh | 10 - .../static_files/LigaMenlo-Regular.ttf | Bin 523432 -> 0 bytes verso_blueprint/static_files/favicon.svg | 1 - verso_blueprint/static_files/scripts.js | 23 - verso_blueprint/static_files/style.css | 57 -- 43 files changed, 4 insertions(+), 4582 deletions(-) rename .github/workflows/{blueprint.yml => build.yml} (99%) delete mode 100644 blueprint/lean_decls delete mode 100644 blueprint/src/appendix/conditional_independence.tex delete mode 100644 blueprint/src/biblio.bib delete mode 100644 blueprint/src/blueprint.sty delete mode 100644 blueprint/src/chapters/algorithm.tex delete mode 100644 blueprint/src/chapters/bandit.tex delete mode 100644 blueprint/src/chapters/concentration.tex delete mode 100644 blueprint/src/chapters/etc.tex delete mode 100644 blueprint/src/chapters/intro.tex delete mode 100644 blueprint/src/chapters/practicalAlgorithms.tex delete mode 100644 blueprint/src/chapters/sampling.tex delete mode 100644 blueprint/src/chapters/ucb.tex delete mode 100644 blueprint/src/content.tex delete mode 100644 blueprint/src/extra_styles.css delete mode 100644 blueprint/src/latexmkrc delete mode 100644 blueprint/src/macros/common.tex delete mode 100644 blueprint/src/macros/print.tex delete mode 100644 blueprint/src/macros/web.tex delete mode 100644 blueprint/src/plastex.cfg delete mode 100644 blueprint/src/print.tex delete mode 100644 blueprint/src/web.tex delete mode 100644 docbuild/lakefile.toml delete mode 100755 scripts/build_blueprint.sh delete mode 100644 verso_blueprint/LMLBlueprint.lean delete mode 100644 verso_blueprint/LMLBlueprint/Blueprint.lean delete mode 100644 verso_blueprint/LMLBlueprint/Chapters/Algorithm.lean delete mode 100644 verso_blueprint/LMLBlueprint/Chapters/Bandit.lean delete mode 100644 verso_blueprint/LMLBlueprint/Chapters/BanditAlgs.lean delete mode 100644 verso_blueprint/LMLBlueprint/Chapters/Concentration.lean delete mode 100644 verso_blueprint/LMLBlueprint/Chapters/Intro.lean delete mode 100644 verso_blueprint/LMLBlueprint/References.lean delete mode 100644 verso_blueprint/LMLBlueprint/TeXPrelude.lean delete mode 100644 verso_blueprint/Main.lean delete mode 100644 verso_blueprint/lake-manifest.json delete mode 100644 verso_blueprint/lakefile.lean delete mode 100644 verso_blueprint/lean-toolchain delete mode 100644 verso_blueprint/scripts/ci-pages.sh delete mode 100644 verso_blueprint/static_files/LigaMenlo-Regular.ttf delete mode 100644 verso_blueprint/static_files/favicon.svg delete mode 100644 verso_blueprint/static_files/scripts.js delete mode 100644 verso_blueprint/static_files/style.css diff --git a/.github/workflows/blueprint.yml b/.github/workflows/build.yml similarity index 99% rename from .github/workflows/blueprint.yml rename to .github/workflows/build.yml index 7b5fd73d..46468445 100644 --- a/.github/workflows/blueprint.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Compile blueprint +name: Build on: push: @@ -356,7 +356,7 @@ jobs: run: | ./scripts/build_docs.sh - - name: Compile blueprint and documentation + - name: Build API documentation uses: leanprover-community/docgen-action@7b5b9a1822650bd45aaeb4182d94bceba2030f89 # 2026-04-14 with: homepage: home_page @@ -374,7 +374,7 @@ jobs: mkdir -p home_page/exposition cp -r referee-site/html-multi/. home_page/exposition/ - - name: "Upload website (API documentation, blueprint and any home page)" + - name: "Upload website (API documentation and home page)" if: github.event_name == 'push' uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 with: diff --git a/.gitignore b/.gitignore index acf454ad..a3a352df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,8 @@ -blueprint/src/print.pdf -blueprint/src/web.pdf - ## macOS .DS_Store ## Lake -.lake/* +.lake/ .cache/* -## Blueprint -/blueprint/print/print.log -/blueprint/web/ -/blueprint/src/web.paux -/blueprint/src/web.bbl -/blueprint/print/ ## TeX *.aux *.lof @@ -43,12 +34,5 @@ blueprint/src/web.pdf /exposition/ ## Tutorial and docs -/LMLTutorial/.lake/ /LMLTutorial/_out/ -/LMLDocs/.lake/ /LMLDocs/_out/ - -## Verso Blueprint -/verso_blueprint/.lake/ -/verso_blueprint/.build/ -/verso_blueprint/_out/ diff --git a/blueprint/lean_decls b/blueprint/lean_decls deleted file mode 100644 index dd0cdd5f..00000000 --- a/blueprint/lean_decls +++ /dev/null @@ -1,140 +0,0 @@ -Learning.Algorithm -Learning.Environment -Learning.detAlgorithm -Learning.stationaryEnv -Learning.IsAlgEnvSeq -Learning.IsAlgEnvSeq.hist -Learning.IsAlgEnvSeq.step -Learning.IsAlgEnvSeq.hasLaw_step_zero -Learning.IsAlgEnvSeq.hasCondDistrib_step -Learning.IsAlgEnvSeq.filtration -Learning.IsAlgEnvSeq.filtrationAction -Learning.IsAlgEnvSeq.adapted_step -Learning.IsAlgEnvSeq.adapted_hist -Learning.IsAlgEnvSeq.adapted_action -Learning.IsAlgEnvSeq.adapted_feedback -Learning.isAlgEnvSeq_unique -Learning.IsAlgEnvSeq.condDistrib_feedback_stationaryEnv -Learning.IsAlgEnvSeq.condIndepFun_feedback_hist_action -ProbabilityTheory.Kernel.traj -ProbabilityTheory.Kernel.trajMeasure -Learning.IT.step -Learning.IT.hist -Learning.IT.filtration -Learning.IT.adapted_step -Learning.IT.adapted_hist -ProbabilityTheory.Kernel.condDistrib_trajMeasure -Learning.IsAlgEnvSeq.hasLaw_step_zero -Learning.IT.action -Learning.IT.feedback -Learning.IT.adapted_action -Learning.IT.adapted_feedback -Learning.IT.condDistrib_action -Learning.IT.condDistrib_feedback -Learning.IT.hasLaw_action_zero -Learning.IT.condDistrib_feedback_zero -Learning.IT.isAlgEnvSeq_trajMeasure -Learning.pullCount -Learning.pullCount_zero -Learning.pullCount_mono -Learning.pullCount_add_one -Learning.pullCount_le -Learning.pullCount_congr -Learning.isPredictable_pullCount -Learning.stepsUntil -Learning.stepsUntil_zero_of_ne -Learning.stepsUntil_zero_of_eq -Learning.stepsUntil_pullCount_le -Learning.stepsUntil_pullCount_eq -Learning.action_stepsUntil -Learning.pullCount_stepsUntil_add_one -Learning.pullCount_stepsUntil -Learning.isStoppingTime_stepsUntil -Learning.rewardByCount -Learning.rewardByCount_pullCount_add_one_eq_reward -Learning.sumRewards -Learning.empMean -Learning.IsAlgEnvSeq.isPredictable_sumRewards -Learning.IsAlgEnvSeq.isPredictable_empMean -Learning.sum_rewardByCount_eq_sumRewards -Bandits.ArrayModel.probSpace -Bandits.ArrayModel.arrayMeasure -Bandits.ArrayModel.algFunction -Bandits.ArrayModel.initAlgFunction -Bandits.ArrayModel.hist -Bandits.ArrayModel.action -Bandits.ArrayModel.reward -Bandits.ArrayModel.measurable_hist -Bandits.ArrayModel.measurable_action -Bandits.ArrayModel.measurable_reward -Bandits.ArrayModel.hist_congr -Bandits.ArrayModel.stepsUntil_congr -Bandits.ArrayModel.truePast -Bandits.ArrayModel.measurable_hist_comap -Bandits.ArrayModel.measurable_hist_truePast -Bandits.ArrayModel.measurable_action_add_one_truePast -Bandits.ArrayModel.measurable_pullCount_add_one_truePast -Bandits.ArrayModel.measurable_stepsUntil -Bandits.ArrayModel.measurable_pullCount_action_add_one_hist -Bandits.ArrayModel.indepFun_fst_add_one_aux -Bandits.ArrayModel.indepFun_fst_add_one_hist -Bandits.ArrayModel.indepFun_snd_apply_aux -Bandits.ArrayModel.indepFun_snd_apply_pullCount_action -Bandits.ArrayModel.indepFun_snd_hist_cond -Bandits.ArrayModel.hasLaw_action_zero -Bandits.ArrayModel.hasCondDistrib_reward_zero -Bandits.ArrayModel.hasCondDistrib_action -Bandits.ArrayModel.hasCondDistrib_reward_pullCount_action -Bandits.ArrayModel.hasCondDistrib_reward_hist_action_pullCount -Bandits.ArrayModel.condIndepFun_reward_hist -Bandits.ArrayModel.hasCondDistrib_reward -Bandits.ArrayModel.isAlgEnvSeq_arrayMeasure -Learning.measurable_comap_indicator_stepsUntil_eq -Bandits.condIndepFun_reward_stepsUntil_action -Bandits.reward_cond_stepsUntil -ProbabilityTheory.condDistrib_ae_eq_cond -Bandits.condDistrib_rewardByCount_stepsUntil -Bandits.hasLaw_rewardByCount -Bandits.regret -Bandits.gap -Learning.sum_pullCount_mul -Bandits.regret_eq_sum_pullCount_mul_gap -Bandits.integral_regret_eq_sum_gap_mul_integral_pullCount -ProbabilityTheory.HasSubgaussianMGF -ProbabilityTheory.HasSubgaussianMGF.add_of_indepFun -ProbabilityTheory.HasSubgaussianMGF.measure_ge_le -ProbabilityTheory.HasSubgaussianMGF.measure_sum_range_ge_le_of_iIndepFun -ProbabilityTheory.HasSubgaussianMGF.measure_sum_le_sum_le' -Bandits.ArrayModel.identDistrib_sum_range_snd -Bandits.ArrayModel.prob_pullCount_prod_sumRewards_mem_le -Bandits.prob_pullCount_prod_sumRewards_mem_le -Bandits.ArrayModel.prob_sumRewards_le_sumRewards_le -Bandits.probReal_sumRewards_le_sumRewards_le -Bandits.probReal_sum_le_sum_streamMeasure -Bandits.prob_sum_le_sqrt_log -Bandits.prob_sum_ge_sqrt_log -Learning.RoundRobin.nextAction -Learning.roundRobinAlgorithm -Learning.RoundRobin.pullCount_mul -Bandits.ETC.nextArm -Bandits.etcAlgorithm -Bandits.ETC.isAlgEnvSeqUntil_roundRobinAlgorithm -Bandits.ETC.pullCount_of_ge -Bandits.ETC.sumRewards_bestArm_le_of_arm_mul_eq -Bandits.ETC.prob_arm_mul_eq_le -Bandits.ETC.regret_le -Bandits.UCB.nextArm -Bandits.ucbAlgorithm -Bandits.UCB.isAlgEnvSeqUntil_roundRobinAlgorithm -Bandits.UCB.ucbIndex_le_ucbIndex_arm -Bandits.UCB.gap_arm_le_two_mul_ucbWidth -Bandits.UCB.pullCount_arm_le -Bandits.UCB.prob_ucbIndex_le -Bandits.UCB.prob_ucbIndex_ge -Bandits.UCB.pullCount_le_add_three -Bandits.UCB.pullCount_le_add_three_ae -Bandits.UCB.some_sum_eq_zero -Bandits.UCB.expectation_pullCount_le -Bandits.UCB.regret_le -ProbabilityTheory.CondIndepFun.prod_right -ProbabilityTheory.iIndepFun_nat_iff_forall_indepFun diff --git a/blueprint/src/appendix/conditional_independence.tex b/blueprint/src/appendix/conditional_independence.tex deleted file mode 100644 index 14a678bd..00000000 --- a/blueprint/src/appendix/conditional_independence.tex +++ /dev/null @@ -1,45 +0,0 @@ -\chapter{Conditional independence} - - -\begin{lemma}\label{lem:CondIndepFun.prod_right} - \leanok - \lean{ProbabilityTheory.CondIndepFun.prod_right} -If $X \ind Y \mid Z$, then $X \ind (Y, Z) \mid Z$. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}[Contraction]\label{lem:indepFun_contraction} -If $X \ind Y \mid Z$ and $X \ind Z$, then $X \ind (Y, Z)$. -\end{lemma} - -\begin{proof} -It suffices to show that $\mathcal{L}(X \mid Y, Z) = \mathcal{L}(X)$. -By conditional independence, $\mathcal{L}(X \mid Y, Z) = \mathcal{L}(X \mid Z)$. -By independence, $\mathcal{L}(X \mid Z) = \mathcal{L}(X)$. -\end{proof} - - -\begin{lemma}\label{lem:condIndepFun_contraction} -If $X \ind Y \mid Z, W$ and $X \ind Z \mid W$, then $X \ind (Y, Z) \mid W$. -\end{lemma} - -\begin{proof} -It suffices to show that $\mathcal{L}(X \mid Y, Z, W) = \mathcal{L}(X \mid W)$. -By the first hypothesis, $\mathcal{L}(X \mid Y, Z, W) = \mathcal{L}(X \mid Z, W)$. -By the second hypothesis, $\mathcal{L}(X \mid Z, W) = \mathcal{L}(X \mid W)$. -\end{proof} - - -\begin{lemma}\label{lem:iIndepFun_nat_iff_forall_indepFun} - \leanok - \lean{ProbabilityTheory.iIndepFun_nat_iff_forall_indepFun} -A family of random variables $(X_i)_{i \in \mathbb{N}}$ is independent if and only if for all $n \in \mathbb{N}$, $X_{n+1}$ is independent of $(X_0, \ldots, X_n)$. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} diff --git a/blueprint/src/biblio.bib b/blueprint/src/biblio.bib deleted file mode 100644 index f6e1818e..00000000 --- a/blueprint/src/biblio.bib +++ /dev/null @@ -1,278 +0,0 @@ -@book{bogachev2007measure, - title = {Measure theory}, - author = {V. I. Bogachev and M. A. S. Ruas}, - volume = {1}, - year = {2007}, - publisher = {Springer} -} - -@book{Billingsley1995, - author = {Billingsley, P.}, - title = {{Probability and Measure. 3rd ed.}}, - publisher = {{Wiley Series in - Probability and Statistics}}, - year = 1995, - keywords = {{measure theory; probability theory; stochastic processes}} -} - -@inproceedings{ying2023formalization, - title = {A Formalization of {D}oob’s Martingale Convergence Theorems in mathlib}, - author = {K. Ying and R. Degenne}, - booktitle = {Proceedings of the 12th ACM SIGPLAN International Conference on Certified Programs and Proofs}, - pages = {334--347}, - year = {2023} -} - -@article{lean, - author = {Ebner, Gabriel and Ullrich, Sebastian and Roesch, Jared and Avigad, Jeremy and de Moura, Leonardo}, - title = {A {M}etaprogramming {F}ramework for {F}ormal {V}erification}, - year = {2017}, - issue_date = {September 2017}, - publisher = {Association for Computing Machinery}, - address = {New York, NY, USA}, - volume = {1}, - number = {ICFP}, - url = {https://doi.org/10.1145/3110278}, - doi = {10.1145/3110278}, - abstract = {We describe the metaprogramming framework currently used in Lean, an interactive theorem prover based on dependent type theory. This framework extends Lean's object language with an API to some of Lean's internal structures and procedures, and provides ways of reflecting object-level expressions into the metalanguage. We provide evidence to show that our implementation is performant, and that it provides a convenient and flexible way of writing not only small-scale interactive tactics, but also more substantial kinds of automation.}, - journal = {Proc. ACM Program. Lang.}, - month = {aug}, - articleno = {34}, - numpages = {29}, - keywords = {tactic language, theorem proving, dependent type theory, metaprogramming} -} - -@inproceedings{moura2021lean, - title={The lean 4 theorem prover and programming language}, - author={Moura, Leonardo de and Ullrich, Sebastian}, - booktitle={International Conference on Automated Deduction}, - pages={625--635}, - year={2021}, - organization={Springer} -} - -@inproceedings{mathlib, - author = {{\ignorespaces The} {mathlib Community}}, - booktitle = {Proceedings of the 9th ACM SIGPLAN International Conference on Certified Programs and Proofs}, - collection = {POPL '20}, - doi = {10.1145/3372885.3373824}, - month = jan, - year = {2020}, - title = {The {L}ean {M}athematical {L}ibrary}, - publisher = {Association for Computing Machinery}, - url = {https://doi.org/10.1145/3372885.3373824}, - doi = {10.1145/3372885.3373824}, - abstract = {This paper describes mathlib, a community-driven effort to build a unified library of mathematics formalized in the Lean proof assistant. Among proof assistant libraries, it is distinguished by its dependently typed foundations, focus on classical mathematics, extensive hierarchy of structures, use of large- and small-scale automation, and distributed organization. We explain the architecture and design decisions of the library and the social organization that has led to its development.}, - booktitle = {Proceedings of the 9th ACM SIGPLAN International Conference on Certified Programs and Proofs}, - pages = {367–381}, - numpages = {15}, - keywords = {formal library, Lean, formal proof, mathlib}, - location = {New Orleans, LA, USA}, - series = {CPP 2020} -} - -@book{kallenberg2021, - author = {Kallenberg, Olav}, - title = {Foundations of modern probability}, - series = {Probability Theory and Stochastic Modelling}, - volume = {99}, - publisher = {Springer Nature Switzerland}, - edition = {Third Edition}, - year = {2021}, - pages = {193}, - isbn = {978-3-030-61870-4; 978-3-030-61871-1}, - doi = {10.1007/978-3-030-61871-1}, - url = {https://doi.org/10.1007/978-3-030-61871-1} -} - -@article{Kolmogorov_Chentsov-AFP, - author = {Christian Pardillo-Laursen and Simon Foster}, - title = {The Kolmogorov-Chentsov theorem}, - journal = {Archive of Formal Proofs}, - month = {April}, - year = {2025}, - note = {\url{https://isa-afp.org/entries/Kolmogorov_Chentsov.html}, - Formal proof development}, - issn = {2150-914x} -} - -@misc{Immler2012, - author = {Immler, F.}, - title = {Generic - Construction of Probability Spaces for Paths of Stochastic Processes in Isabelle/HOL}, - journal = {Master’s Thesis in Informatik, TU Munich}, - year = {2012}, - url = {https://saloranta.de/immler/fabian/mastersthesis/thesis.pdf} -} - -@misc{defaultValues, - author = {Buzzard, Kevin}, - title = {Division by zero in type theory: A FAQ}, - year = {2020}, - url = {https://xenaproject.wordpress.com/2020/07/05/division-by-zero-in-type-theory-a-faq/}, - note = {Accessed: 2025-09-22} -} - -@article{holzl2017markov, - title = {Markov chains and Markov decision processes in Isabelle/HOL}, - author = {H{\"o}lzl, J.}, - journal = {Journal of Automated Reasoning}, - volume = {59}, - number = {3}, - pages = {345--387}, - year = {2017}, - publisher = {Springer} -} - -@software{Monticone_LeanProject_2025, - abstract = {A template for blueprint-driven formalization projects in Lean.}, - author = {Monticone, Pietro}, - institution = {University of Trento}, - keywords = {Lean4, Project Management, Formal Methods, Formal Verification, Theorem Proving, Interactive Theorem Proving, Proof Assistant, Mathematical Formalization, Formal Mathematics, Blueprint, Documentation, Template, Dependency Management, Continuous Integration, Automated Testing, Type Theory, Constructive Mathematics, Computer-Assisted Proof, Mathematical Software, Research Software Engineering}, - license = {Apache License 2.0}, - title = {LeanProject}, - year = {2025} -} - -@software{Anderson_Formalization_of_the_2023, -author = {Anderson, Aaron and Bakšys, Mantas and Bayer, Jonas and Collares, Mauricio and Degenne, Rémy and Dillies, Yaël and Eltschig, Ben and Gouëzel, Sébastien and Kytölä, Kalle and Lewis, Rob and Lez, Paul and Lorenzo, Luccioli and Macbeth, Heather and Massot, Patrick and Mellendijk, Arend and Miller, Kyle and Monticone, Pietro and Morrison, Kim and Nash, Oliver and Song, Utensil and Tao, Terence and van Doorn, Floris and Wilshaw, Sky and Wu, Lawrence}, -month = nov, -title = {{Formalization of the Polynomial Freiman-Ruzsa Conjecture of Marton}}, -url = {https://github.com/teorth/pfr}, -version = {0.1.0}, -year = {2023} -} - -@article{gowers2025conjecture, - title={On a conjecture of Marton}, - author={Gowers, William Timothy and Green, Ben and Manners, Freddie and Tao, Terence}, - journal={Annals of Mathematics}, - volume={201}, - number={2}, - pages={515--549}, - year={2025}, -} - -@article{faden1985existence, - title={The existence of regular conditional probabilities: necessary and sufficient conditions}, - author={Faden, Arnold M}, - journal={The Annals of Probability}, - pages={288--298}, - year={1985}, - publisher={JSTOR} -} - -@article{marion2025formalization, - title={A Formalization of the Ionescu-Tulcea Theorem in Mathlib}, - author={Marion, Etienne}, - journal={arXiv preprint arXiv:2506.18616}, - year={2025} -} - -@software{TestingLowerBounds, - author = {Luccioli, Lorenzo and Degenne, Rémy}, - title = {TestingLowerBounds}, - year = {2024}, - url = {https://github.com/RemyDegenne/testing-lower-bounds} -} - -@inproceedings{gouezel2022formalization, - title={A formalization of the change of variables formula for integrals in mathlib}, - author={Gou{\"e}zel, S{\'e}bastien}, - booktitle={International Conference on Intelligent Computer Mathematics}, - pages={3--18}, - year={2022}, - organization={Springer} -} - -@article{fritz2020synthetic, - title={A synthetic approach to Markov kernels, conditional independence and theorems on sufficient statistics}, - author={Fritz, Tobias}, - journal={Advances in Mathematics}, - volume={370}, - pages={107239}, - year={2020}, - publisher={Elsevier} -} - -@article{forre2021transitional, - title={Transitional conditional independence}, - author={Forr{\'e}, Patrick}, - journal={arXiv preprint arXiv:2104.11547}, - year={2021} -} - -@book{vershynin2018high, - title={High-dimensional probability: An introduction with applications in data science}, - author={Vershynin, Roman}, - volume={47}, - year={2018}, - publisher={Cambridge university press} -} - -@article{hoeffding1963probability, - title={Probability inequalities for sums of bounded random variables}, - author={Hoeffding, Wassily}, - journal={Journal of the American statistical association}, - volume={58}, - number={301}, - pages={13--30}, - year={1963}, - publisher={Taylor \& Francis} -} - -@inproceedings{clerc2017pointless, - title={Pointless learning}, - author={Clerc, Florence and Danos, Vincent and Dahlqvist, Fredrik and Garnier, Ilias}, - booktitle={International conference on foundations of software science and computation structures}, - pages={355--369}, - year={2017}, - organization={Springer} -} - -@book{polyanskiy2025information, - title={Information theory: From coding to learning}, - author={Polyanskiy, Yury and Wu, Yihong}, - year={2025}, - publisher={Cambridge university press} -} - -@article{vakar2018s, - title={On s-finite measures and kernels}, - author={V{\'a}k{\'a}r, Matthijs and Ong, Luke}, - journal={arXiv preprint arXiv:1810.01837}, - year={2018} -} - -@article{affeldt2025semantics, - title={Semantics of Probabilistic Programs using s-Finite Kernels in Dependent Type Theory}, - author={Affeldt, Reynald and Cohen, Cyril and Saito, Ayumu}, - journal={ACM Transactions on Probabilistic Machine Learning}, - year={2025}, - publisher={ACM New York, NY} -} - -@article{staton2020probabilistic, - title={Probabilistic programs as measures}, - author={Staton, Sam}, - journal={Foundations of Probabilistic Programming}, - pages={43}, - year={2020}, - publisher={Cambridge University Press} -} - -@inproceedings{hirata2023semantic, - title={Semantic foundations of higher-order probabilistic programs in Isabelle/HOL}, - author={Hirata, Michikazu and Minamide, Yasuhiko and Sato, Tetsuya}, - booktitle={14th International Conference on Interactive Theorem Proving (ITP 2023)}, - pages={18--1}, - year={2023}, - organization={Schloss Dagstuhl--Leibniz-Zentrum f{\"u}r Informatik} -} - -@book{lattimore2020bandit, - title={Bandit algorithms}, - author={Lattimore, Tor and Szepesv{\'a}ri, Csaba}, - year={2020}, - publisher={Cambridge University Press} -} diff --git a/blueprint/src/blueprint.sty b/blueprint/src/blueprint.sty deleted file mode 100644 index 1353f398..00000000 --- a/blueprint/src/blueprint.sty +++ /dev/null @@ -1,2 +0,0 @@ -\DeclareOption*{} -\ProcessOptions \ No newline at end of file diff --git a/blueprint/src/chapters/algorithm.tex b/blueprint/src/chapters/algorithm.tex deleted file mode 100644 index ccae536c..00000000 --- a/blueprint/src/chapters/algorithm.tex +++ /dev/null @@ -1,601 +0,0 @@ -\chapter{Iterative stochastic algorithms} - - -Warning: all times start at zero. - -TODO: notations - -All measurable spaces are assumed to be standard Borel. - - -\begin{definition}[Algorithm]\label{def:algorithm} - \leanok - \lean{Learning.Algorithm} -A sequential, stochastic algorithm with actions in a measurable space $\mathcal{A}$ and observations in a measurable space $\mathcal{R}$ is described by the following data: -\begin{itemize} - \item for all $t \in \mathbb{N}$, a policy $\pi_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow \mathcal{A}$, a Markov kernel which gives the distribution of the action of the algorithm at time $t+1$ given the history of previous actions and observations, - \item $P_0 \in \mathcal{P}(\mathcal{A})$, a probability measure that gives the distribution of the first action. -\end{itemize} -\end{definition} - -After the algorithm takes an action, the environment generates an observation according to a Markov kernel $\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}$. - - -\begin{definition}[Environment]\label{def:environment} - \leanok - \lean{Learning.Environment} -An environment with which an algorithm interacts is described by the following data: -\begin{itemize} - \item for all $t \in \mathbb{N}$, a feedback $\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}$, a Markov kernel which gives the distribution of the observation at time $t+1$ given the history of previous pulls and observations, and the action of the algorithm at time $t+1$, - \item $\nu'_0 \in \mathcal{A} \rightsquigarrow \mathcal{R}$, a Markov kernel that gives the distribution of the first observation given the first action. -\end{itemize} -\end{definition} - - -\begin{definition}[Deterministic algorithm]\label{def:detAlgorithm} - \uses{def:algorithm} - \leanok - \lean{Learning.detAlgorithm} -An algorithm is deterministic if its initial probability measure $P_0$ is a Dirac measure and if all its policies $\pi_t$ are deterministic kernels. -\end{definition} - - -\begin{definition}[Stationary environment]\label{def:stationaryEnv} - \uses{def:environment} - \leanok - \lean{Learning.stationaryEnv} -An environment is stationary if there exists a Markov kernel $\nu : \mathcal{A} \rightsquigarrow \mathcal{R}$ such that $\nu'_0 = \nu$ and for all $t \in \mathbb{N}$, for all $h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$, for all $a \in \mathcal{A}$, $\nu_t(h_t, a) = \nu(a)$. -\end{definition} - -TODO: possibly change the ``stationary'' name. - - -Let's detail four examples of interactions between an algorithm and an environment. -\begin{enumerate} - \item \textbf{First order optimization}. The objective of the algorithm is to find the minimum of a function $f : \mathbb{R}^d \to \mathbb{R}$. - The action space is $\mathcal{A} = \mathbb{R}^d$ (a point on which the function will be queried) and the observation space is $\mathcal{R} = \mathbb{R} \times \mathbb{R}^d$. - The environment is described by a function $g : \mathbb{R}^d \to \mathbb{R} \times \mathbb{R}^d$ such that for all $x \in \mathbb{R}^d$, $g(x) = (f(x), \nabla f(x))$. That is, the kernel $\nu_t$ is deterministic and depends only on the action: it is given by $\nu_t(h_t, x) = \delta_{g(x)}$ (the Dirac measure at $g(x)$). - An example of algorithm is gradient descent with fixed step size $\eta > 0$: this is a deterministic algorithm defined by $P_0 = \delta_{x_0}$ for some initial point $x_0 \in \mathbb{R}^d$ and for all $t \in \mathbb{N}$, $\pi_t(h_t) = \delta_{x_{t+1}}$ where $x_{t+1} = x_t - \eta \nabla g_2(x_t)$. - - \item \textbf{Stochastic bandits}. The action space is $\mathcal{A} = [K]$ for some $K \in \mathbb{N}$ (the set of arms) and the observation space is $\mathcal{R} = \mathbb{R}$ (the reward obtained after pulling an arm). - The kernel $\nu_t$ is stationary and depends only on the action: there are probability distributions $(P_a)_{a \in [K]}$ such that for all $t \in \mathbb{N}$, for all $h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$, for all $a \in \mathcal{A}$, $\nu_t(h_t, a) = P_a$. - - \item \textbf{Adversarial bandits}. The action space is $\mathcal{A} = [K]$ for some $K \in \mathbb{N}$ (the set of arms) and the observation space is $\mathcal{R} = \mathbb{R}$ (the reward obtained after pulling an arm). - The reward kernels are usually taken to be deterministic and in an \emph{oblivious} adversarial bandit they depend only on the time step: there is a sequence of vectors $(r_t)_{t \in \mathbb{N}}$ in $[0,1]^K$ such that for all $t \in \mathbb{N}$, for all $h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$, for all $a \in \mathcal{A}$, $\nu_t(h_t, a) = \delta_{r_{t,a}}$ (the Dirac measure at $r_{t,a}$). - - \item \textbf{Reinforcement learning in Markov decision processes}. - TODO: main feature is that $\mathcal{R} = \mathcal{S} \times \mathbb{R}$ where $\mathcal{S}$ is the state space, and the kernel $\nu_t$ depends on the last state only. -\end{enumerate} - - -We will want to make global probabilistic statements about the whole sequence of actions and observations. -For example, we may want to prove that an optimization algorithm converges to the minimum of a function almost surely. -For such a statement to make sense, we need a probability space on which the whole sequence of actions and observations is defined as a random variable. - -We denote by $P(X \mid Y)$ the conditional distribution of a random variable $X$ given another random variable $Y$ under a probability measure $P$. -When we write that $P(X \mid Y) = \kappa$, or that $X$ has conditional distribution $\kappa$ given $Y$, the equality should be understood as holding $Y_* P$-almost surely. - - -\begin{remark}[Lean remark: \texttt{HasCondDistrib}] -In the Lean implementation, we define a predicate to state those almost sure equalities of conditional distributions: \texttt{HasCondDistrib X Y k P} states that under the probability measure $P$, the random variable $X$ has conditional distribution $k$ given the random variable $Y$ (almost surely with respect to the law of $X$). -For convenience, the predicate also records that both random variables are almost everywhere measurable. -\end{remark} - - -\begin{definition}[Algorithm-environment interaction]\label{def:IsAlgEnvSeq} - \uses{def:environment,def:algorithm,def:history} - \leanok - \lean{Learning.IsAlgEnvSeq} -Let $\mathfrak{A}$ be an algorithm as in Definition~\ref{def:algorithm} and $\mathfrak{E}$ be an environment as in Definition~\ref{def:environment}. -A probability space $(\Omega, P)$ and two sequences of random variables $A : \mathbb{N} \to \Omega \to \mathcal{A}$ and $R : \mathbb{N} \to \Omega \to \mathcal{R}$ form an algorithm-environment interaction for $\mathfrak{A}$ and $\mathfrak{E}$ if the following conditions hold: -\begin{enumerate} - \item The law of $A_0$ is $P_0$. - \item $P \left( R_0 \mid A_0 \right) = \nu'_0$. - \item For all $t \in \mathbb{N}$, $P\left(A_{t+1} \mid A_0, R_0, \ldots, A_t, R_t \right) = \pi_t$. - \item For all $t \in \mathbb{N}$, $P\left(R_{t+1} \mid A_0, R_0, \ldots, A_t, R_t, A_{t+1}\right) = \nu_t$. -\end{enumerate} -\end{definition} - - -\begin{definition}[History]\label{def:history} - \leanok - \lean{Learning.IsAlgEnvSeq.hist, Learning.IsAlgEnvSeq.step} -For two sequences of random variables $A : \mathbb{N} \to \Omega \to \mathcal{A}$ and $R : \mathbb{N} \to \Omega \to \mathcal{R}$ (actions and observations), we call step of the interaction at time $t$ the random variable $X_t : \Omega \to \mathcal{A} \times \mathcal{R}$ defined by $X_t(\omega) = (A_t(\omega), R_t(\omega))$. -We call history up to time $t$ the random variable $H_t : \Omega \to (\mathcal{A} \times \mathcal{R})^{t+1}$ defined by $H_t(\omega) = (X_0(\omega), \ldots, X_t(\omega))$. -\end{definition} - - -\begin{lemma}\label{lem:law_step} - \uses{def:environment,def:IsAlgEnvSeq,def:algorithm,def:history} - \leanok - \lean{Learning.IsAlgEnvSeq.hasLaw_step_zero, Learning.IsAlgEnvSeq.hasCondDistrib_step} -In an algorithm-environment interaction $(A, R, P)$ as in Definition~\ref{def:IsAlgEnvSeq}, -\begin{itemize} - \item the law of the initial step $X_0$ is $P_0 \otimes \nu'_0$, - \item for all $t \in \mathbb{N}$, $P \left( X_{t+1} \mid H_t \right) = \pi_t \otimes \nu_t$. -\end{itemize} -\end{lemma} - -\begin{proof}\leanok -Immediate from the properties of an algorithm-environment interaction. -\end{proof} - - -\begin{definition}\label{def:IsAlgEnvSeq.filtration} - \uses{def:history} - \leanok - \lean{Learning.IsAlgEnvSeq.filtration, Learning.IsAlgEnvSeq.filtrationAction} -For an algorithm-environment interaction $(A, R, P)$ as in Definition~\ref{def:IsAlgEnvSeq}, we denote by $\mathcal{F}_t$ the sigma-algebra generated by the history up to time $t$: $\mathcal{F}_t = \sigma(H_t)$. -We denote by $\mathcal{F}^A_t$ the sigma-algebra generated by the history up to time $t-1$ and the action at time $t$: $\mathcal{F}^A_t = \sigma(H_{t-1}, A_t)$. -\end{definition} - - -\begin{lemma}\label{lem:IsAlgEnvSeq.adapted} - \uses{def:IsAlgEnvSeq.filtration,def:history} - \leanok - \lean{Learning.IsAlgEnvSeq.adapted_step, Learning.IsAlgEnvSeq.adapted_hist, Learning.IsAlgEnvSeq.adapted_action, Learning.IsAlgEnvSeq.adapted_feedback} -The history, step, action and observation processes are adapted to the filtration $(\mathcal{F}_t)_{t \in \mathbb{N}}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:history,def:IsAlgEnvSeq.filtration} -By definition of the filtration. -\end{proof} - - -\begin{theorem}[\cite{lattimore2020bandit}, Proposition 4.8]\label{thm:isAlgEnvSeq_unique} - \uses{def:environment,def:IsAlgEnvSeq,def:algorithm} - \leanok - \lean{Learning.isAlgEnvSeq_unique} -If $(A, R, P)$ and $(A', R', P')$ are two algorithm-environment interactions for the same algorithm $\mathfrak{A}$ and environment $\mathfrak{E}$, then the joint distributions of the sequences of actions and observations are equal: the law of $(A_i, R_i)_{i \in \mathbb{N}}$ under $P$ is equal to the law of $(A'_i, R'_i)_{i \in \mathbb{N}}$ under $P'$. -\end{theorem} - -\begin{proof}\leanok - \uses{thm:ionescu-tulcea,lem:law_step,def:trajMeasure} - -\end{proof} - - - -\section{Stationary environment} - -Recall that in a stationary environment, there exists a Markov kernel $\nu : \mathcal{A} \rightsquigarrow \mathcal{R}$ such that $\nu'_0 = \nu$ and for all $t \in \mathbb{N}$, for all $h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$, for all $a \in \mathcal{A}$, $\nu_t(h_t, a) = \nu(a)$. - -Let $(A, R, P)$ be an algorithm-environment interaction in a stationary environment with kernel $\nu$. - -\begin{lemma}\label{lem:condDistrib_reward_stationaryEnv} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:algorithm} - \leanok - \lean{Learning.IsAlgEnvSeq.condDistrib_feedback_stationaryEnv} -In a stationary environment, for any $t \in \mathbb{N}$, $P\left(R_t \mid A_t\right) = \nu$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,lem:law_step,def:history} - -\end{proof} - - -\begin{lemma}\label{lem:condIndepFun_reward_hist_action} - \uses{def:stationaryEnv,def:environment,def:IsAlgEnvSeq,def:algorithm,def:history} - \leanok - \lean{Learning.IsAlgEnvSeq.condIndepFun_feedback_hist_action} -In a stationary environment, for any $t \in \mathbb{N}$, the reward $R_{t+1}$ is conditionally independent of the history $H_t$ given the action $A_{t+1}$ (more succinctly, $R_{t+1} \ind H_t \mid A_{t+1}$). -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - - -\section{Probability space: Ionescu-Tulcea theorem} - -In Theorem~\ref{thm:isAlgEnvSeq_unique}, we saw that the distribution of the sequence of actions and observations in a suitable probability space is uniquely determined by the algorithm and the environment. -We now show that such a probability space actually exists: for any algorithm and environment, we build an algorithm-environment interaction as in Definition~\ref{def:IsAlgEnvSeq}. - - - -\subsection{Ionescu-Tulcea theorem} - -If we group together the policy of the algorithm and the kernel of the environment at each time step, we get a sequence of Markov kernels $(\kappa_t)_{t \in \mathbb{N}}$, with $\kappa_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow (\mathcal{A} \times \mathcal{R})$. - - -We now abstract that situation and consider a sequence of measurable spaces $(\Omega_t)_{t \in \mathbb{N}}$, a probability measure $\mu$ on $\Omega_0$ and a sequence of Markov kernels $\kappa_t : \prod_{s=0}^t \Omega_s \rightsquigarrow \Omega_{t+1}$. -The Ionescu-Tulcea theorem builds a probability space from the sequence of kernels and the initial measure. - - -\begin{theorem}[Ionescu-Tulcea]\label{thm:ionescu-tulcea} - \mathlibok - \lean{ProbabilityTheory.Kernel.traj} -Let $(\Omega_t)_{t \in \mathbb{N}}$ be a family of measurable spaces. Let $(\kappa_t)_{t \in \mathbb{N}}$ be a family of Markov kernels such that for any $t$, $\kappa_t$ is a kernel from $\prod_{i=0}^t \Omega_{i}$ to $\Omega_{t+1}$. -Then there exists a unique Markov kernel $\xi : \Omega_0 \rightsquigarrow \prod_{i = 1}^{\infty} \Omega_{i}$ such that for any $n \ge 1$, -$\pi_{[1,n]*} \xi = \kappa_0 \otimes \ldots \otimes \kappa_{n-1}$. -Here $\pi_{[1,n]} : \prod_{i=1}^{\infty} \Omega_i \to \prod_{i=1}^n \Omega_i$ is the projection on the first $n$ coordinates. -\end{theorem} - -\begin{proof}\leanok -\end{proof} - -The Ionescu-Tulcea theorem in Mathlib \cite{marion2025formalization} actually generates kernels $\xi_t : \prod_{s=0}^t \Omega_s \rightsquigarrow \prod_{s=0}^{\infty} \Omega_s$ for any $t$, with the property that the kernels are the identity on the first $t+1$ coordinates. - -\begin{definition}[Trajectory measure]\label{def:trajMeasure} - \uses{thm:ionescu-tulcea} - \leanok - \lean{ProbabilityTheory.Kernel.trajMeasure} -For $\mu \in \mathcal{P}(\Omega_0)$, we call trajectory measure the probability measure $\xi_0 \circ \mu$ on $\Omega_{\mathcal{T}} := \prod_{i=0}^{\infty} \Omega_i$. -We denote it by $P_{\mathcal{T}}$. -The $\mathcal{T}$ subscript stands for ``trajectory''. -\end{definition} - - -\begin{definition}[Step and history]\label{def:IT.history} - \leanok - \lean{Learning.IT.step, Learning.IT.hist} -For $t \in \mathbb{N}$, we denote by $X_t \in \Omega_t$ the random variable describing the time step $t$, and by $H_t \in \prod_{s=0}^t \Omega_s$ the history up to time $t$. -Formally, these are measurable functions on $\Omega_{\mathcal{T}}$, defined by $X_t(\omega) = \omega_t$ and $H_t(\omega) = (\omega_1, \ldots, \omega_t)$. -\end{definition} - -Note: $(X_t)_{t \in \mathbb{N}}$ is the canonical process on $\Omega_{\mathcal{T}}$. $H_t$ is equal to $\pi_{[0,t]}$. - - -\begin{definition}[Filtration]\label{def:IT.filtration} - \uses{def:IT.history} - \leanok - \lean{Learning.IT.filtration} -For $t \in \mathbb{N}$, we denote by $\mathcal{F}_t$ the sigma-algebra generated by the history up to time $t$: $\mathcal{F}_t = \sigma(H_t)$. -The family $(\mathcal{F}_t)_{t \in \mathbb{N}}$ is a filtration on $\Omega_{\mathcal{T}}$. -\end{definition} - -$(\mathcal{F}_t)_{t \in \mathbb{N}}$ is the canonical filtration on $\Omega_{\mathcal{T}}$, and is the natural filtration for the canonical process $(X_t)_{t \in \mathbb{N}}$. - - -\begin{lemma}\label{lem:IT.adapted_history} - \uses{def:IT.history, def:IT.filtration} - \leanok - \lean{Learning.IT.adapted_step, Learning.IT.adapted_hist} -The random variables $X_t$ and $H_t$ are $\mathcal{F}_t$-measurable. -Said differently, the processes $(X_t)_{t \in \mathbb{N}}$ and $(H_t)_{t \in \mathbb{N}}$ are adapted to the filtration $(\mathcal{F}_t)_{t \in \mathbb{N}}$. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}\label{lem:IT.condDistrib_X_add_one} - \uses{def:IT.history, thm:ionescu-tulcea, def:trajMeasure} - \leanok - \lean{ProbabilityTheory.Kernel.condDistrib_trajMeasure} -For any $t \in \mathbb{N}$, $P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \kappa_t$. -\end{lemma} - -\begin{proof}\leanok -This is proved through the defining property of the conditional distribution: it is the almost surely unique Markov kernel $\eta$ such that $((H_t)_* P_{\mathcal{T}}) \otimes \eta = (H_t, X_{t+1})_*P_{\mathcal{T}}$. - -TODO: complete proof. -\end{proof} - - -\begin{lemma}\label{lem:IT.law_X_zero} - \uses{def:IT.history, def:trajMeasure} - \leanok - \lean{Learning.IsAlgEnvSeq.hasLaw_step_zero} -The law of $X_0$ under $P_{\mathcal{T}}$ is $\mu$. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - - - -\subsection{Case of an algorithm-environment interaction} - -We now go back to the setting of an algorithm interacting with an environment and suppose that $\Omega_t = \mathcal{A} \times \mathcal{R}$ for some measurable spaces $\mathcal{A}$ and $\mathcal{R}$, and that for all $t \in \mathbb{N}$, $\kappa_t = \pi_t \otimes \nu_t$ for policy kernels $\pi_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow \mathcal{A}$ and feedback kernels $\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}$. -Likewise, $\mu = P_0 \otimes \nu'_0$ for a probability measure $P_0$ on $\mathcal{A}$ and a Markov kernel $\nu'_0 : \mathcal{A} \rightsquigarrow \mathcal{R}$. -The step random variable $X_t$ takes values in $\mathcal{A} \times \mathcal{R}$. - -\begin{definition}\label{def:IT.actionReward} - \uses{def:IT.history} - \leanok - \lean{Learning.IT.action, Learning.IT.feedback} -We write $A_t$ and $R_t$ for the projections of $X_t$ on $\mathcal{A}$ and $\mathcal{R}$ respectively. -$A_t$ is the action taken at time $t$ and $R_t$ is the reward received at time $t$. -Formally, $A_t(\omega) = \omega_{t,1}$ and $R_t(\omega) = \omega_{t,2}$ for $\omega = \prod_{t=0}^{+\infty}(\omega_{t,1}, \omega_{t,2}) \in \Omega_{\mathcal{T}} = \prod_{t=0}^{+\infty} \mathcal{A} \times \mathcal{R}$. -\end{definition} - - -\begin{lemma}\label{lem:IT.adapted_action_reward} - \uses{def:IT.actionReward, def:IT.filtration} - \leanok - \lean{Learning.IT.adapted_action, Learning.IT.adapted_feedback} -The random variables $A_t$ and $R_t$ are $\mathcal{F}_t$-measurable. -Said differently, the processes $(A_t)_{t \in \mathbb{N}}$ and $(R_t)_{t \in \mathbb{N}}$ are adapted to the filtration $(\mathcal{F}_t)_{t \in \mathbb{N}}$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:IT.adapted_history} - -\end{proof} - - -We need to check that the random variables $A_t$ and $R_t$ have the expected conditional distributions. - -\begin{lemma}\label{lem:IT.condDistrib_A_add_one} - \uses{def:environment,def:algorithm,thm:ionescu-tulcea,def:IT.actionReward,def:trajMeasure,def:IT.history} - \leanok - \lean{Learning.IT.condDistrib_action} -For any $t \in \mathbb{N}$, $P_{\mathcal{T}}\left(A_{t+1} \mid H_t\right) = \pi_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:IT.condDistrib_X_add_one,def:IT.history} -By Lemma~\ref{lem:IT.condDistrib_X_add_one}, $P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \kappa_t = \pi_t \otimes \nu_t$. -Since $A_{t+1}$ is the projection of $X_{t+1}$ on $\mathcal{A}$, $P_{\mathcal{T}}\left(A_{t+1} \mid H_t\right)$ is $((H_t)_* P_{\mathcal{T}})$-almost surely equal to the projection of $\kappa_t$ on $\mathcal{A}$, which is $\pi_t$. -\end{proof} - - -\begin{lemma}\label{lem:IT.condDistrib_R_add_one} - \uses{def:environment,def:algorithm,thm:ionescu-tulcea,def:IT.actionReward,def:trajMeasure,def:IT.history} - \leanok - \lean{Learning.IT.condDistrib_feedback} -For any $t \in \mathbb{N}$, $P_{\mathcal{T}}\left(R_{t+1} \mid H_t, A_{t+1}\right) = \nu_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:IT.condDistrib_X_add_one,def:IT.history,lem:IT.condDistrib_A_add_one} -It suffices to show that $((H_t, A_{t+1})_* P_{\mathcal{T}}) \otimes \nu_t = (H_t, A_{t+1}, R_{t+1})_* P_{\mathcal{T}} = (H_t, X_{t+1})_* P_{\mathcal{T}}$. -By Lemma~\ref{lem:IT.condDistrib_X_add_one}, $P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \pi_t \otimes \nu_t$. -Thus $((H_t)_* P_{\mathcal{T}}) \otimes (\pi_t \otimes \nu_t) = (H_t, X_{t+1})_* P_{\mathcal{T}}$. - -We thus have to prove that $((H_t)_* P_{\mathcal{T}}) \otimes (\pi_t \otimes \nu_t) = ((H_t, A_{t+1})_* P_{\mathcal{T}}) \otimes \nu_t$. - -By Lemma~\ref{lem:IT.condDistrib_A_add_one}, $(H_t, A_{t+1})_* P_{\mathcal{T}} = (H_t)_* P_{\mathcal{T}} \otimes \pi_t$, and replacing this in the right-hand side gives the left-hand side (using associativity of the composition-product). -\end{proof} - - -\begin{lemma}\label{lem:IT.law_A_zero} - \uses{def:environment,def:algorithm,def:IT.actionReward,def:trajMeasure} - \leanok - \lean{Learning.IT.hasLaw_action_zero} -The law of $A_0$ under $P_{\mathcal{T}}$ is $P_0$. -\end{lemma} - -\begin{proof}\leanok - \uses{thm:ionescu-tulcea,def:IT.history,lem:IT.law_X_zero} -$X_0$ has law $\mu = P_0 \otimes \nu'_0$. $A_0$ is the projection of $X_0$ on the first space $\mathcal{A}$ and $\nu_0'$ is Markov, so $A_0$ has law $P_0$. -\end{proof} - - -\begin{lemma}\label{lem:IT.condDistrib_R_zero} - \uses{def:environment,def:algorithm,thm:ionescu-tulcea,def:IT.actionReward,def:trajMeasure} - \leanok - \lean{Learning.IT.condDistrib_feedback_zero} -$P_{\mathcal{T}}\left(R_0 \mid A_0\right) = \nu'_0$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:IT.law_X_zero,lem:IT.law_A_zero,def:IT.history} -To prove almost sure equality, it is enough to prove that $(A_{0*} P_{\mathcal{T}}) \otimes P_{\mathcal{T}}\left(R_0 \mid A_0\right) = (A_{0*} P_{\mathcal{T}}) \otimes \nu'_0$. -By definition of the conditional distribution, we have $(A_{0*} P_{\mathcal{T}}) \otimes P_{\mathcal{T}}\left(R_0 \mid A_0\right) = (A_0, R_0)_* P_{\mathcal{T}} = X_{0*} P_{\mathcal{T}}$. -By Lemma~\ref{lem:IT.law_X_zero}, $X_{0*} P_{\mathcal{T}} = \mu = P_0 \otimes \nu'_0$. -By Lemma~\ref{lem:IT.law_A_zero}, $A_{0*} P_{\mathcal{T}} = P_0$. -Thus the two sides are equal. -\end{proof} - - -\begin{theorem}\label{thm:isAlgEnvSeq_trajMeasure} - \uses{def:environment,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea,def:IT.actionReward,def:trajMeasure} - \leanok - \lean{Learning.IT.isAlgEnvSeq_trajMeasure} -In the probability space $(\Omega_{\mathcal{T}}, P_{\mathcal{T}})$ constructed from an algorithm $\mathfrak{A}$ and an environment $\mathfrak{E}$ as above, the sequences of random variables $A : \mathbb{N} \to \Omega_{\mathcal{T}} \to \mathcal{A}$ and $R : \mathbb{N} \to \Omega_{\mathcal{T}} \to \mathcal{R}$ form an algorithm-environment interaction for $\mathfrak{A}$ and $\mathfrak{E}$. -\end{theorem} - -\begin{proof}\leanok - \uses{def:history,lem:IT.law_A_zero,lem:IT.condDistrib_R_zero,lem:IT.condDistrib_A_add_one,lem:IT.condDistrib_R_add_one} -The four conditions of Definition~\ref{def:IsAlgEnvSeq} are exactly the statements of Lemmas~\ref{lem:IT.law_A_zero}, \ref{lem:IT.condDistrib_R_zero}, \ref{lem:IT.condDistrib_A_add_one} and \ref{lem:IT.condDistrib_R_add_one}. -\end{proof} - - - -\section{Finitely many actions} - -When the number of actions is finite, it makes sense to count how many times each action was chosen up to a certain time. -We can also define the time step at which an action was chosen a certain number of times, and the value of the reward obtained when pulling an action for the $m$-th time. - -\begin{definition}[Pull counts]\label{def:pullCount} - \leanok - \lean{Learning.pullCount} -For an action $a \in \mathcal{A}$ and a time $t \in \mathbb{N}$, we denote by $N_{t,a}$ the number of times that action $a$ has been chosen before time $t$, that is $N_{t,a} = \sum_{s=0}^{t-1} \mathbb{I}\{A_s = a\}$. -\end{definition} - -Note that the sum goes up to $t-1$, so that $N_{t,a}$ counts the number of times action $a$ was chosen \emph{before} time $t$. - - -\begin{remark}[Building vs analyzing algorithms] -When we describe an algorithm, we give the data of the policies $\pi_t$, which are functions of the partial history up to time $t$, in $(\mathcal{A} \times \mathcal{R})^{t+1}$. -That means that any tool used to define a policy must be a function defined on $(\mathcal{A} \times \mathcal{R})^{t+1}$. -For example a definition of the empirical mean of an action must be a function $t : \mathbb{N} \to (\mathcal{A} \times \mathcal{R})^{t+1} \to \mathbb{R}$. - -When we analyze an algorithm, we work on the other hand on a probability space $(\Omega, P)$, in which $\Omega$ could be for example $(\mathcal{A} \times \mathcal{R})^{\mathbb{N}}$, the full history, which describes the whole sequence of actions and rewards. -As a stochastic process, the empirical mean of an action is a function $\mathbb{N} \to (\mathcal{A} \times \mathcal{R})^{\mathbb{N}} \to \mathbb{R}$. - -Thus there are two similar but still distinct types of objects: those defined on the partial history, which are used to build algorithms, and those defined on a generic probability space (the full history in the Ionescu-Tulcea construction), which are used to analyze algorithms. -\end{remark} - - -\begin{lemma}\label{lem:pullCount_basic} - \uses{def:pullCount, def:IT.actionReward} - \leanok - \lean{Learning.pullCount_zero, Learning.pullCount_mono, Learning.pullCount_add_one, Learning.pullCount_le, Learning.pullCount_congr} -We note the following basic properties of $N_{t,a}$: -\begin{itemize} - \item $N_{0,a} = 0$. - \item $N_{t,a}$ is non-decreasing in $t$. - \item $N_{t + 1, A_t} = N_{t, A_t} + 1$ and for $a \ne A_t$, $N_{t + 1, a} = N_{t, a}$. - \item $N_{t, a} \le t$. - \item If for all $s \le t$, $A_s(\omega) = A_s(\omega')$, then $N_{t+1, a}(\omega) = N_{t+1, a}(\omega')$. -\end{itemize} -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}\label{lem:predictable_pullCount} - \uses{def:IsAlgEnvSeq.filtration, def:pullCount} - \leanok - \lean{Learning.isPredictable_pullCount} -Let $a \in \mathcal{A}$. The process $(N_{t,a})_{t \in \mathbb{N}}$ is predictable with respect to the filtration $\mathcal{F}$ of the algorithm-environment interaction. -\end{lemma} - -\begin{proof}\leanok - \uses{def:history,lem:pullCount_basic} - -\end{proof} - - -\begin{definition}\label{def:stepsUntil} - \uses{def:pullCount} - \leanok - \lean{Learning.stepsUntil} -For an action $a \in \mathcal{A}$ and a time $n \in \mathbb{N}$, we denote by $T_{n,a} \in \mathbb{N} \cup \{+\infty\}$ the time at which action $a$ was chosen for the $n$-th time, that is $T_{n,a} = \min\{s \in \mathbb{N} \mid N_{s+1,a} = n\}$. -Note that $T_{n, a}$ can be infinite if the action is not chosen $n$ times. -\end{definition} - -By definition, $T_{n, a}$ is the hitting time of the set $\{n\}$ by the process $t \mapsto N_{t+1,a}$, which is adapted since $N_{t,a}$ is predictable. -Equivalently, $T_{n, a}$ is the hitting time of the set $[n, +\infty]$ by that process. - - -\begin{lemma}\label{lem:stepsUntil_basic} - \uses{def:stepsUntil, def:pullCount} - \leanok - \lean{Learning.stepsUntil_zero_of_ne, Learning.stepsUntil_zero_of_eq, Learning.stepsUntil_pullCount_le, Learning.stepsUntil_pullCount_eq, Learning.action_stepsUntil, Learning.pullCount_stepsUntil_add_one, Learning.pullCount_stepsUntil} -We note the following basic properties of $T_{n,a}$: -\begin{itemize} - \item $T_{0,a} = 0$ for $a \ne A_0$. $T_{0,A_0} = \infty$. - \item $T_{N_{t+1, a}, a} \le t$. - \item $T_{N_{t + 1, A_t}, A_t} = t$. - \item If $T_{n, a} \ne \infty$ and $n > 0$, then $A_{T_{n, a}} = a$. - \item If $T_{n, a} \ne \infty$, then $N_{T_{n, a} + 1, a} = n$. - \item If $T_{n, a} \ne \infty$ and $n > 0$, then $N_{T_{n, a}, a} = n - 1$. - \item If for all $s \le t$, $A_s(\omega) = A_s(\omega')$, then $T_{n, a}(\omega) = t \iff T_{n, a}(\omega') = t$. -\end{itemize} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:pullCount_basic,def:pullCount} - -\end{proof} - - -\begin{lemma}\label{lem:isStoppingTime_stepsUntil} - \uses{def:IsAlgEnvSeq.filtration, def:stepsUntil} - \leanok - \lean{Learning.isStoppingTime_stepsUntil} -Let $a \in \mathcal{A}$. For any $n > 0$, the random variable $T_{n,a}$ is a stopping time with respect to the filtration $\mathcal{F}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:history,lem:pullCount_basic,def:pullCount} -A hitting time of a set by an adapted process is a stopping time. -\end{proof} - - -Let $\Omega' = \mathcal{R}^{\mathbb{N} \times \mathcal{A}}$ and let $\Omega = \Omega_{\mathcal{T}} \times \Omega'$ (which will be an extension of the trajectory probability space once we choose a measure on $\Omega'$). -Let $Z_{n, a} : \Omega \to \mathcal{R}$ be the projection on the coordinate indexed by $(n,a)$ in $\Omega'$. -Extending the probability space in that way allows us to define without ambiguity the reward received when choosing an action for the $n$-th time, even if that action is never actually chosen $n$ times. - - -\begin{definition}[n\textsuperscript{th} reward]\label{def:rewardByCount} - \uses{def:stepsUntil} - \leanok - \lean{Learning.rewardByCount} -We define $Y_{n, a} = R_{T_{n,a}} \mathbb{I}\{T_{n, a} < \infty\} + Z_{n,a} \mathbb{I}\{T_{n, a} = \infty\}$, the reward received when choosing action $a$ for the $n$-th time if that time is finite, and equal to $Z_{n,a}$ otherwise. -In that expression, we see $R_{T_{n,a}}$ and $T_{n, a}$ as random variables on $\Omega$ instead of $\Omega_{\mathcal{T}}$. -\end{definition} - - -\begin{lemma}\label{lem:rewardByCount_pullCount} - \uses{def:rewardByCount, def:pullCount} - \leanok - \lean{Learning.rewardByCount_pullCount_add_one_eq_reward} -$Y_{N_{t, A_t} + 1, A_t} = R_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:stepsUntil_basic,def:stepsUntil} -This is perhaps hard to parse at first sight, but it follows directly from the definitions. -At time $t$, the action chosen is $A_t$ and we see a reward $R_t$. -That action had already been chosen $N_{t, A_t}$ times before time $t$, so the reward $R_t$ is the reward received when choosing action $A_t$ for the $(N_{t, A_t} + 1)$-th time, which is $Y_{N_{t, A_t} + 1, A_t}$ by definition. -\end{proof} - - -% \begin{lemma}\label{lem:measurable_rewardByCount_mul_indicator} -% \uses{def:rewardByCount, def:stepsUntil} -% $Y_{n, a} \mathbb{I}\{T_{n, a} < \infty\}$ is $\mathcal{F}_{T_{n, a}}$-measurable. -% \end{lemma} - -% \begin{proof} -% It is the stopped value of the adapted process $(R_t)_{t \in \mathbb{N}}$ at the stopping time $T_{n, a}$. -% \end{proof} - - -\section{Scalar rewards} - -TODO: change the name ``reward'' to ``observation'' throughout the chapter? - -We now focus on the case where the reward space is $\mathcal{R} = \mathbb{R}$. - - -\begin{definition}[Sum of rewards]\label{def:sumRewards} - \leanok - \lean{Learning.sumRewards} -Let $S_{t, a} = \sum_{s=0}^{t-1} R_s \mathbb{I}\{A_s = a\}$ be the sum of the rewards obtained by chosing action $a$ before time $t$. -\end{definition} - - -\begin{definition}[Empirical mean]\label{def:empMean} - \uses{def:sumRewards, def:pullCount} - \leanok - \lean{Learning.empMean} -Let $\hat{\mu}_{t, a} = \frac{S_{t, a}}{N_{t, a}} = \frac{1}{N_{t,a}} \sum_{s=0}^{t-1} R_s \mathbb{I}\{A_s = a\}$ if $N_{t, a} > 0$, and $\hat{\mu}_{t, a} = 0$ otherwise. -This is the empirical mean of the rewards obtained by choosing action $a$ before time $t$. -\end{definition} - -Note: in bandit papers it is common to (implicitly) define the empirical mean as $+\infty$ when the action was never chosen, but in Lean it has to be a real number, and the Lean default value for division by zero is $0$. - - -\begin{lemma}\label{lem:isPredictable_sumRewards} - \uses{def:IsAlgEnvSeq.filtration, def:sumRewards, def:empMean} - \leanok - \lean{Learning.IsAlgEnvSeq.isPredictable_sumRewards, Learning.IsAlgEnvSeq.isPredictable_empMean} -The processes $(S_{t,a})_{t \in \mathbb{N}}$ and $(\hat{\mu}_{t,a})_{t \in \mathbb{N}}$ are predictable with respect to the filtration $\mathcal{F}$ of the algorithm-environment interaction. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:predictable_pullCount,def:sumRewards,def:empMean} - -\end{proof} - - -The following lemma is very useful to relate the two ways of indexing the rewards: by time step and by pull count. - -\begin{lemma}\label{lem:sum_rewardByCount} - \uses{def:rewardByCount, def:pullCount, def:sumRewards} - \leanok - \lean{Learning.sum_rewardByCount_eq_sumRewards} -The sum of the first $N_{t, a}$ rewards received when choosing action $a$ is equal to the sum of the rewards obtained by choosing action $a$ before time $t$: -\begin{align*} - \sum_{n=1}^{N_{t, a}} Y_{n, a} = S_{t,a} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:rewardByCount_pullCount} - -\end{proof} diff --git a/blueprint/src/chapters/bandit.tex b/blueprint/src/chapters/bandit.tex deleted file mode 100644 index 8577f8b8..00000000 --- a/blueprint/src/chapters/bandit.tex +++ /dev/null @@ -1,723 +0,0 @@ -\chapter{Stochastic multi-armed bandits} - -\section{Algorithm, bandit and probability space} - -A bandit algorithm is an algorithm in the sense of Definition~\ref{def:algorithm}. -We call the actions \emph{arms} and the observations \emph{rewards}. - -The first arm pulled by the algorithm is sampled from $P_0$, the arm pulled at time $1$ is sampled from $\pi_0(H_0)$, where $H_0 \in \mathcal{A} \times \mathcal{R}$ is the data of the first arm pulled and the first observation received, and so on. - - -\begin{definition}[Bandit]\label{def:bandit} - \uses{def:stationaryEnv} - \leanok -A stochastic bandit is simply a reward distribution for each arm: a Markov kernel $\nu : \mathcal{A} \rightsquigarrow \mathbb{R}$, conditional distribution of the rewards given the arm pulled. -It is a stationary environment in which the observation space is $\mathcal{R} = \mathbb{R}$. -\end{definition} - -An algorithm can interact with a bandit to produce a sequence of arms and rewards: after a time $t$, the history $H_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$ contains the arms pulled and rewards received up to that time, -\begin{itemize} - \item the algorithm chooses an arm $A_{t+1}$ sampled according to its policy $\pi_t(H_t)$, - \item the bandit generates a reward $R_{t+1}$ according to the distribution $\nu(A_{t+1})$, - \item the history is updated to $H_{t+1} = ((A_0, R_0), \ldots, (A_{t+1}, R_{t+1}))$. -\end{itemize} - - -\section{The array model of rewards} - -We previously built a probability space on which we can define the sequence of arms and rewards generated by the interaction between the algorithm and the bandit, using the Ionescu-Tulcea theorem. -From Theorem~\ref{thm:isAlgEnvSeq_unique}, we know that the law of the sequence of arms and rewards is independent of the probability space used to define them. -Nonetheless, we now build an alternative model of the rewards, on which it will be easier to prove concentration inequalities. -By the uniqueness of the law, these statements will then transfer to any algorithm-environment interaction. - -In the ``array model'', we consider a probability space on which we have an infinite array of rewards from each arm, independent from each other. -When pulling an arm, the algorithm sees the next previously unseen reward from that arm in the array. - -\begin{definition}\label{def:arrayMeasure} - \uses{thm:ionescu-tulcea} % because it uses infinitePi - \leanok - \lean{Bandits.ArrayModel.probSpace, Bandits.ArrayModel.arrayMeasure} -Let $I = [0,1]$ and let $P_U$ be the uniform distribution on $I$. We define the probability space $(\Omega_{\mathcal{A}}, P_{\mathcal{A}})$, where -\begin{align*} - \Omega_{\mathcal{A}} &:= I^{\mathbb{N}} \times \mathcal{R}^{\mathbb{N} \times \mathcal{A}} - \: , \\ - P_{\mathcal{A}} &:= \left( \bigotimes_{n \in \mathbb{N}} P_U \right) \otimes \left( \bigotimes_{n \in \mathbb{N}, a \in \mathcal{A}} \nu(a) \right) - \: . -\end{align*} -\end{definition} - - -\begin{definition}\label{def:algFunction} - \uses{def:algorithm} - \leanok - \lean{Bandits.ArrayModel.algFunction, Bandits.ArrayModel.initAlgFunction} -Let $\mathfrak{A}$ be an algorithm with action space $\mathcal{A}$ and reward space $\mathcal{R}$, policy $\pi$ and initial distribution $P_0$. -For $\mathcal{A}$ and $\mathcal{R}$ standard Borel spaces, there exists jointly measurable functions $f'_0 : I \to \mathcal{A}$ and $f_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times I \to \mathcal{A}$ such that -\begin{itemize} - \item the law of $f'_0$ is $P_0$, - \item for all history $h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}$, the law of $f_t(h_t, \cdot)$ is $\pi_t(h_t)$. -\end{itemize} -\end{definition} - - -\begin{definition}\label{def:AM.history} - \uses{def:algFunction, def:arrayMeasure, def:pullCount} - \leanok - \lean{Bandits.ArrayModel.hist, Bandits.ArrayModel.action, Bandits.ArrayModel.reward} -The history, actions and rewards on the array model probability space $(\Omega_{\mathcal{A}}, P_{\mathcal{A}})$ are defined as follows: -\begin{itemize} - \item the action at time $0$ is $A_0(\omega) = f'_0(\omega_{1,0})$, the reward at time $0$ is $R_0(\omega) = \omega_{2,0,A_0(\omega)}$, and the history at time $0$ is $H_0(\omega) = (A_0(\omega), R_0(\omega))$, - \item for $t \ge 0$, the action at time $t+1$ is $A_{t+1}(\omega) = f_t(H_t(\omega), \omega_{1,t+1})$, the reward at time $t+1$ is $R_{t+1}(\omega) = \omega_{2,N_{t+1,A_{t+1}(\omega)},A_{t+1}(\omega)}$, and the history at time $t+1$ is $H_{t+1}(\omega) = (H_t(\omega), (A_{t+1}(\omega), R_{t+1}(\omega)))$. -\end{itemize} -\end{definition} - - -The goal of this section is to show that $(\Omega_{\mathcal{A}}, P_{\mathcal{A}})$ with the actions and rewards defined above is an algorithm-environment sequence as in Definition~\ref{def:IsAlgEnvSeq}. - - -\subsection{Measurability} - -TODO: some of those results are proved for $\mathcal{A}$ countable. Add that assumption where needed. - -\begin{remark}[Proving measurability with respect to a sub-sigma-algebra] -In this section, we often need to prove that a random variable $X$ is measurable with respect to the sigma-algebra generated by a subset of the independent random variables defining the probability space $\Omega_{\mathcal{A}}$. -We want to prove that $X : \Omega_{\mathcal{A}} \to \mathcal{X}$ is measurable with respect to the sigma-algebra $\sigma((\omega_p)_{p \in S})$, where $S$ is a subset of the indices of the independent random variables defining $\Omega_{\mathcal{A}}$. -In most cases, this is due to $X$ being defined (possibly recursively in a complicated way) only using those random variables. -However, it might be difficult to exhibit an explicit function $f$ such that $X = f((\omega_p)_{p \in S})$. - -Here is a general strategy to prove such measurability results in Lean: -\begin{enumerate} - \item Prove that $X$ is measurable with respect to the full sigma-algebra on $\Omega_{\mathcal{A}}$. - \item Prove a congruence lemma: for any $\omega, \omega' \in \Omega_{\mathcal{A}}$, if $\omega_p = \omega'_p$ for all $p \in S$, then $X(\omega) = X(\omega')$. - \item Define $g : (\prod_{p \in S} \Omega_p) \to \Omega$ by $g((\omega_p)_{p \in S}) = \omega'$, where $\omega'_p = \omega_p$ for $p \in S$ and $\omega'_p$ is some fixed value for $p \notin S$. - \item Write $X = X \circ g \circ \mathrm{proj}_S$, where $\mathrm{proj}_S : \Omega_{\mathcal{A}} \to \prod_{p \in S} \Omega_p$ is the projection on the coordinates in $S$. - \item Conclude that $X$ is the composition of a measurable function $(X \circ g)$ and the random variable generating the sub-sigma-algebra, and thus is measurable with respect to that sub-sigma-algebra. -\end{enumerate} -\end{remark} - -\begin{lemma}[Measurability]\label{lem:AM.measurable_hist} - \uses{def:AM.history,def:arrayMeasure,def:algorithm} -\leanok - \lean{Bandits.ArrayModel.measurable_hist, Bandits.ArrayModel.measurable_action, Bandits.ArrayModel.measurable_reward} -$H_t$, $N_{t,A_t}$, $A_t$ and $R_t$ are measurable for all $t \in \mathbb{N}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:algFunction,def:AM.history} - -\end{proof} - - -\begin{lemma}[Congruence for the history]\label{lem:AM.hist_congr} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:pullCount} - \leanok - \lean{Bandits.ArrayModel.hist_congr} -Let $\omega, \omega' \in \Omega_{\mathcal{A}}$ and $t \in \mathbb{N}$. -Suppose that -\begin{align*} - \forall s \le t, \ \omega_{1,s} &= \omega'_{1,s} - \: , \\ - \forall a \in \mathcal{A}, \forall s < N_{t+1,a}, \ \omega_{2,s,a} &= \omega'_{2,s,a} - \: . -\end{align*} -Then $H_t(\omega) = H_t(\omega')$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,def:algFunction,lem:pullCount_basic} - -\end{proof} - - -\begin{lemma}[Congruence for the number of pulls and action]\label{lem:AM.stepsUntil_congr} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:pullCount} -\leanok - \lean{Bandits.ArrayModel.stepsUntil_congr} -Let $\omega, \omega' \in \Omega_{\mathcal{A}}$, $t, m \in \mathbb{N}$ and $a \in \mathcal{A}$. -Suppose that -\begin{align*} - \omega_{1} &= \omega'_{1} - \: , \\ - \forall s < m, \ \omega_{2,s,a} &= \omega'_{2,s,a} - \: , \\ - \forall b \ne a, \forall s \in \mathbb{N}, \ \omega_{2,s,b} &= \omega'_{2,s,b} - \: . -\end{align*} -Then $(N_{t+1, a}(\omega) = m \wedge A_{t+1}(\omega) = a) \iff (N_{t+1, a}(\omega') = m \wedge A_{t+1}(\omega') = a)$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,def:algFunction,lem:AM.hist_congr} - -\end{proof} - - -\begin{definition}\label{def:AM.probSpaceSubsets} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:pullCount} - \leanok - \lean{Bandits.ArrayModel.truePast} -We define the following functions on $\Omega_{\mathcal{A}}$: -\begin{align*} - F_{1, t}(\omega) &= ((\omega_{1,s})_{s \le t}, (\omega_{2,s})_{s \in \mathbb{N}}) - \: , \\ - F_{2, a, t}(\omega) &= ((\omega_{1,s})_{s \in \mathbb{N}}, (\omega_{2, \min\{s,N_{t+1,a}(\omega)-1\}, a})_{s \in \mathbb{N}}, (\omega_{2, s, b})_{s \in \mathbb{N}, b \ne a}) - \: , \\ - F_{2, a}^m(\omega) &= ((\omega_{1,s})_{s \in \mathbb{N}}, (\omega_{2, \min\{s,m-1\}, a})_{s \in \mathbb{N}}, (\omega_{2, s, b})_{s \in \mathbb{N}, b \ne a}) - \: . -\end{align*} -In the definition of $F_{2, a, t}$ and $F_{2, a}^m$, if $N_{t+1,a}(\omega) = 0$ (resp. $m = 0$), then the second component is a constant sequence equal to an arbitrary value. - -$F_{1, t}(\omega)$ contains all the information in $\omega$ except for the action selection randomness after time $t$. - -$F_{2, a, t}(\omega)$ contains all the information in $\omega$ except the rewards for arm $a$ indexed by $N_{t+1,a}(\omega)$ or more. -$F_{2, a}^m(\omega)$ is similar, but removes the rewards for arm $a$ indexed by $m$ or more. -\end{definition} - - -\begin{lemma}\label{lem:AM.measurable_hist_comap} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:AM.probSpaceSubsets} -\leanok - \lean{Bandits.ArrayModel.measurable_hist_comap, Bandits.ArrayModel.measurable_hist_truePast} -For all $t \in \mathbb{N}$, $H_t$ is measurable with respect to the sigma-algebra generated by $F_{1, t}$, and with respect to the sigma-algebra generated by $F_{2, a, t}$ for any arm $a \in \mathcal{A}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:AM.measurable_hist,def:pullCount,lem:AM.hist_congr} - -\end{proof} - - -\begin{lemma}\label{lem:AM.measurable_action_add_one_truePast} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:AM.probSpaceSubsets} - \leanok - \lean{Bandits.ArrayModel.measurable_action_add_one_truePast} -$A_{t+1}$ is measurable with respect to the sigma-algebra generated by $F_{2, a, t}$ for any arm $a \in \mathcal{A}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:AM.measurable_hist_comap,def:algFunction} - -\end{proof} - - -\begin{lemma}\label{lem:AM.measurable_pullCount_add_one_truePast} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:AM.probSpaceSubsets,def:pullCount} - \leanok - \lean{Bandits.ArrayModel.measurable_pullCount_add_one_truePast} -$N_{t+1,a}$ is measurable with respect to the sigma-algebra generated by $F_{2, a, t}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:AM.measurable_hist_comap,def:algFunction} - -\end{proof} - - -\begin{lemma}\label{lem:AM.measurable_stepsUntil} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:pullCount,def:AM.probSpaceSubsets} -\leanok - \lean{Bandits.ArrayModel.measurable_stepsUntil} -For $t, m \in \mathbb{N}$ and $a \in \mathcal{A}$, the indicator function $\mathbb{I}\{N_{t+1,a} = m \wedge A_{t+1} = a\} : \Omega_{\mathcal{A}} \to \{0, 1\}$ is measurable with respect to the sigma-algebra generated by $F_{2, a}^m$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.measurable_hist,lem:AM.stepsUntil_congr} - -\end{proof} - - -\begin{lemma}\label{lem:AM.measurable_pullCount_action_add_one_hist} - \uses{def:AM.history,def:arrayMeasure,def:algorithm,def:pullCount} -\leanok - \lean{Bandits.ArrayModel.measurable_pullCount_action_add_one_hist} -For $t \in \mathbb{N}$, the function $N_{t+1, A_{t+1}}$ is measurable with respect to the sigma-algebra generated by $H_t$ and $A_{t+1}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:algFunction} - -\end{proof} - - -\subsection{Independence} - - -\begin{lemma}\label{lem:AM.indepFun_fst_add_one_aux} - \uses{def:AM.probSpaceSubsets, def:arrayMeasure} - \leanok - \lean{Bandits.ArrayModel.indepFun_fst_add_one_aux} -$\omega \mapsto \omega_{1, t+1}$ is independent of $F_{1, t}$. -\end{lemma} - -\begin{proof}\leanok - \uses{thm:ionescu-tulcea} - -\end{proof} - - -\begin{lemma}\label{lem:AM.indepFun_fst_add_one_hist} - \uses{def:AM.history,def:AM.probSpaceSubsets, def:arrayMeasure,def:algorithm} - \leanok - \lean{Bandits.ArrayModel.indepFun_fst_add_one_hist} -$\omega \mapsto \omega_{1, t+1}$ is independent of $H_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.measurable_hist_comap,lem:AM.indepFun_fst_add_one_aux} - -\end{proof} - - -\begin{lemma}\label{lem:AM.indepFun_snd_apply_aux} - \uses{def:arrayMeasure,def:AM.probSpaceSubsets} - \leanok - \lean{Bandits.ArrayModel.indepFun_snd_apply_aux} -For $a \in \mathcal{A}$ and $m \in \mathbb{N}$, $\omega \mapsto \omega_{2, m, a}$ is independent of $F_{2, a}^m$. -\end{lemma} - -\begin{proof}\leanok - \uses{thm:ionescu-tulcea} - -\end{proof} - - -\begin{lemma}\label{lem:AM.indepFun_snd_apply_pullCount_action} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,def:pullCount,def:AM.probSpaceSubsets} - \leanok - \lean{Bandits.ArrayModel.indepFun_snd_apply_pullCount_action} -For $a \in \mathcal{A}$, $\omega \mapsto \omega_{2, m, a}$ is independent of the indicator function $\mathbb{I}\{N_{t+1,a} = m \wedge A_{t+1} = a\}$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.indepFun_snd_apply_aux,lem:AM.measurable_stepsUntil} - -\end{proof} - - -\begin{lemma}\label{lem:AM.indepFun_snd_hist_cond} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,def:pullCount} - \leanok - \lean{Bandits.ArrayModel.indepFun_snd_hist_cond} -For $a \in \mathcal{A}$ and $t, m \in \mathbb{N}$, $\omega \mapsto \omega_{2, m, a}$ is independent of $H_t$ given that $N_{t+1,a} = m$ and $A_{t+1} = a$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.measurable_hist_comap,lem:AM.measurable_hist,lem:AM.indepFun_snd_apply_aux,lem:AM.measurable_stepsUntil,def:AM.probSpaceSubsets} - -\end{proof} - - -\subsection{Laws} - - -\begin{lemma}\label{lem:AM.hasLaw_action_zero} - \uses{def:arrayMeasure,def:AM.history,def:algorithm} -\leanok - \lean{Bandits.ArrayModel.hasLaw_action_zero} -The law of $A_0$ in the array model is $P_0$. -\end{lemma} - -\begin{proof}\leanok - \uses{thm:ionescu-tulcea,def:algFunction,lem:AM.measurable_hist} - -\end{proof} - - -\begin{lemma}\label{lem:AM.hasCondDistrib_reward_zero} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea} - \leanok - \lean{Bandits.ArrayModel.hasCondDistrib_reward_zero} -In the array model, $P_{\mathcal{A}}(R_0 \mid A_0) = \nu$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:algFunction,lem:AM.measurable_hist,lem:condDistrib_ae_eq_cond} - -\end{proof} - - -\begin{lemma}\label{lem:AM.hasCondDistrib_action} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea} - \leanok - \lean{Bandits.ArrayModel.hasCondDistrib_action} -In the array model, $P_{\mathcal{A}}(A_{t+1} \mid H_t) = \pi_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,def:algFunction,lem:AM.measurable_hist,lem:AM.indepFun_fst_add_one_hist} - -\end{proof} - - -\begin{lemma}\label{lem:AM.hasCondDistrib_reward_pullCount_action} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea,def:pullCount} -\leanok - \lean{Bandits.ArrayModel.hasCondDistrib_reward_pullCount_action} -In the array model, $P_{\mathcal{A}}(R_{t+1} \mid N_{t+1,A_{t+1}}, A_{t+1}) = \nu$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:AM.indepFun_snd_apply_pullCount_action,def:algFunction,lem:AM.measurable_hist,lem:pullCount_basic,lem:condDistrib_ae_eq_cond} - -\end{proof} - - -\begin{lemma}\label{lem:AM.hasCondDistrib_reward_hist_action_pullCount} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea,def:pullCount} -\leanok - \lean{Bandits.ArrayModel.hasCondDistrib_reward_hist_action_pullCount} -In the array model, $P_{\mathcal{A}}(R_{t+1} \mid H_t, A_{t+1}, N_{t+1,A_{t+1}}) = \nu$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.indepFun_snd_apply_pullCount_action,lem:AM.indepFun_snd_hist_cond,def:algFunction,lem:AM.measurable_hist,lem:pullCount_basic} - -\end{proof} - - -\begin{lemma}\label{lem:AM.condIndepFun_reward_hist} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea,lem:AM.measurable_hist,def:pullCount} - \leanok - \lean{Bandits.ArrayModel.condIndepFun_reward_hist} -For $t \ge 0$, $R_{t+1} \ind H_t \mid A_{t+1}, N_{t+1, A_{t+1}}$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.measurable_hist,lem:AM.hasCondDistrib_reward_hist_action_pullCount} - -\end{proof} - - -\begin{lemma}\label{lem:AM.hasCondDistrib_reward} - \uses{def:arrayMeasure,def:AM.history,def:stationaryEnv,def:environment,def:algorithm,thm:ionescu-tulcea} - \leanok - \lean{Bandits.ArrayModel.hasCondDistrib_reward} -In the array model, $P_{\mathcal{A}}(R_{t+1} \mid H_t, A_{t+1}) = \nu$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:AM.measurable_pullCount_action_add_one_hist,lem:AM.hasCondDistrib_reward_pullCount_action,def:algFunction,lem:AM.measurable_hist,lem:AM.condIndepFun_reward_hist,def:pullCount} - -\end{proof} - -\begin{theorem}\label{thm:isAlgEnvSeq_arrayMeasure} - \uses{def:arrayMeasure,def:AM.history,def:stationaryEnv,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea} - \leanok - \lean{Bandits.ArrayModel.isAlgEnvSeq_arrayMeasure} -The actions and rewards defined on the array model probability space $(\Omega_{\mathcal{A}}, P_{\mathcal{A}})$ form an algorithm-environment sequence for the algorithm $\mathfrak{A}$ and bandit $\nu$. -\end{theorem} - -\begin{proof}\leanok - \uses{lem:AM.hasCondDistrib_action,def:environment,lem:AM.hasCondDistrib_reward,lem:AM.measurable_hist,def:history,lem:AM.hasLaw_action_zero,lem:AM.hasCondDistrib_reward_zero} -The four conditions of Definition~\ref{def:IsAlgEnvSeq} are satisfied by Lemmas~\ref{lem:AM.hasLaw_action_zero}, \ref{lem:AM.hasCondDistrib_reward_zero}, \ref{lem:AM.hasCondDistrib_action} and \ref{lem:AM.hasCondDistrib_reward}. -\end{proof} - - - - -\section{Law of the n\textsuperscript{th} pull}\label{sec:alt_model} - -This section describes the law of $Y_{n, a}$ the $n^{th}$ reward obtained from an arm $a \in \mathcal{A}$ (Definition~\ref{def:rewardByCount}). - -We augment the probability space $\Omega$ on which we have an algorithm-environment sequence with $\Omega' = \mathbb{R}^{\mathbb{N} \times \mathcal{A}}$, on which we put the product measure $\bigotimes_{n \in \mathbb{N}, a \in \mathcal{A}} \nu(a)$. -With that measure, the law of $Z_{n,a}$ is $\nu(a)$. - - -\begin{lemma}\label{lem:measurable_comap_indicator_stepsUntil_eq} - \uses{def:history,def:stepsUntil} - \leanok - \lean{Learning.measurable_comap_indicator_stepsUntil_eq} -The function $\mathbb{I}\{T_{n,a} = t\} : \Omega \to \{0, 1\}$ is measurable with respect to the sigma-algebra generated by $(H_{t-1}, A_t)$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:stepsUntil_basic,lem:pullCount_basic,def:pullCount,def:IsAlgEnvSeq.filtration} - -\end{proof} - - -\begin{lemma}\label{lem:condIndepFun_reward_stepsUntil_arm} - \uses{def:stationaryEnv,def:environment,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea,def:stepsUntil} - \leanok - \lean{Bandits.condIndepFun_reward_stepsUntil_action} -For $t > 0$, $R_t \ind \mathbb{I}\{T_{n, a} = t\} \mid A_t$. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:condIndepFun_reward_hist_action,lem:CondIndepFun.prod_right,lem:stepsUntil_basic,lem:measurable_comap_indicator_stepsUntil_eq,def:history,def:pullCount} -$\mathbb{I}\{T_{n, a} = t\}$ is measurable with respect to the sigma-algebra generated by $(H_{t-1}, A_t)$ by Lemma~\ref{lem:measurable_comap_indicator_stepsUntil_eq}. - -It thus suffices to show that $R_t \ind (H_{t-1}, A_t) \mid A_t$, which is implied by $R_t \ind H_{t-1} \mid A_t$ (Lemma~\ref{lem:CondIndepFun.prod_right}), which is Lemma~\ref{lem:condIndepFun_reward_hist_action}. -\end{proof} - - -\begin{lemma}\label{lem:reward_cond_stepsUntil} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea,def:stepsUntil} - \leanok - \lean{Bandits.reward_cond_stepsUntil} -Let $n > 0$, $t \in \mathbb{N}$ and suppose that $P(T_{n, a} = t) > 0$. -Then $P(R_t \mid T_{n, a} = t) = \nu(a)$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,lem:stepsUntil_basic,lem:condIndepFun_reward_stepsUntil_arm,def:pullCount,lem:condDistrib_ae_eq_cond,lem:condDistrib_reward_stationaryEnv} -First, if $T_{n, a} = t$, then $A_t = a$ (Lemma~\ref{lem:stepsUntil_basic}), such that $P(R_t \mid T_{n, a} = t) = P(R_t \mid T_{n, a} = t, A_t = a)$. - -Then, using first the independence from Lemma~\ref{lem:condIndepFun_reward_stepsUntil_arm} and then the conditional distribution from Lemma~\ref{lem:condDistrib_reward_stationaryEnv}, we have -\begin{align*} - P(R_t \mid T_{n, a} = t, A_t = a) - &= P(R_t \mid A_t = a) - = \nu(a) - \: . -\end{align*} -\end{proof} - - -\begin{lemma}\label{lem:condDistrib_ae_eq_cond} - \leanok - \lean{ProbabilityTheory.condDistrib_ae_eq_cond} -For a random variable $X$ on a countable space with the discrete sigma algebra, $P(Y \mid X) = (x \mapsto P(Y \mid X = x))$, $(X_*P)$-almost surely. -Furthermore, that almost sure equality means that for all $x$ such that $P(X = x) > 0$, we have $P(Y \mid X = x) = P(Y \mid X)(x)$. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}\label{lem:condDistrib_rewardByCount_stepsUntil} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea,def:rewardByCount,def:stepsUntil} -\leanok - \lean{Bandits.condDistrib_rewardByCount_stepsUntil} -For $n > 0$ and $t \in \mathbb{N}$, $P(Y_{n,a} \mid T_{n,a}) = \nu(a)$ (in which the measure on the r.h.s. is seen as a constant kernel). -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,lem:reward_cond_stepsUntil,def:pullCount,lem:condDistrib_ae_eq_cond} -It suffices to show that for all $t \in \mathbb{N} \cup \{\infty\}$ such that $P(T_{n, a} = t) > 0$, the law of $Y_{n,a}$ conditioned on $T_{n,a} = t$ is $\nu(a)$. - -If $t < \infty$, then $P(Y_{n, a} \mid T_{n, a} = t) = P(R_t \mid T_{n, a} = t) = \nu(a)$ by Lemma~\ref{lem:reward_cond_stepsUntil}. - -If $t = \infty$, then $P(Y_{n, a} \mid T_{n, a} = \infty) = P(Z_{n, a} \mid T_{n, a} = \infty)$. By independence of $Z_{n,a}$ and $T_{n, a}$, this is just $\nu(a)$, the law of $Z_{n,a}$. -\end{proof} - - -\begin{lemma}\label{lem:hasLaw_rewardByCount} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:algorithm,thm:ionescu-tulcea,def:rewardByCount} - \leanok - \lean{Bandits.hasLaw_rewardByCount} -For $n > 0$ and $a \in \mathcal{A}$, $(Y_{n,a})_*P = \nu(a)$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,lem:condDistrib_rewardByCount_stepsUntil,def:stepsUntil,def:pullCount} -The law of $Y_{n,a}$ is given by $(Y_{n, a})_*P = P(Y_{n, a} \mid T_{n, a}) \circ (T_{n, a})_*P$. -By Lemma~\ref{lem:condDistrib_rewardByCount_stepsUntil}, $P(Y_{n, a} \mid T_{n, a}) = \nu(a)$, a constant kernel. -Thus the composition is just $\nu(a)$. -\end{proof} - - -% \begin{lemma}\label{lem:indepFun_rewardByCount_stepsUntil} -% \uses{def:stepsUntil, def:rewardByCount, def:Bandit.measure} -% For $n > 0$, $Y_{n, a} \ind T_{n,a}$. -% \end{lemma} - -% \begin{proof} -% \uses{lem:condDistrib_rewardByCount_stepsUntil, lem:hasLaw_rewardByCount} -% It suffices to prove that $\mathcal{L}(Y_{n,a} \mid T_{n,a}) = \mathcal{L}(Y_{n,a})$. - -% By Lemma~\ref{lem:hasLaw_rewardByCount}, $\mathcal{L}(Y_{n,a}) = \nu(a)$. -% By Lemma~\ref{lem:condDistrib_rewardByCount_stepsUntil}, $\mathcal{L}(Y_{n,a} \mid T_{n,a}) = \nu(a)$. -% \end{proof} - - -% \begin{lemma}\label{lem:condIndepFun_rewardByCount_hist} -% \uses{def:rewardByCount, def:stepsUntil, def:Bandit.measure} -% For $n > 0$, $Y_{n, a} \ind H_{T_{n,a}-1} \mid T_{n,a}$, in which $H_{\infty}$ is interpreted as the whole history. -% \end{lemma} - -% \begin{proof} -% \uses{lem:condDistrib_rewardByCount_stepsUntil, lem:condIndepFun_reward_hist_action} -% By Lemma~\ref{lem:condDistrib_rewardByCount_stepsUntil}, $\mathcal{L}(Y_{n,a} \mid T_{n,a}) = \nu(a)$. -% We need to prove that $\mathcal{L}(Y_{n,a} \mid H_{T_{n,a}-1}, T_{n,a}) = \nu(a)$. -% By Lemma~\ref{lem:stepsUntil_basic}, if $T_{n,a} = t \in \mathbb{N}$, then $A_t = a$. -% We get -% \begin{align*} -% \mathcal{L}(Y_{n,a} \mid H_{T_{n,a}-1}, T_{n,a} = t) -% &= \mathcal{L}(R_t \mid H_{t-1}, T_{n,a} = t, A_t = a) -% \: . -% \end{align*} -% Then, $\mathbb{I}\{T_{n,a} = t\}$ is a function of $(H_{t-1}, A_t)$ by Lemma~\ref{lem:measurable_comap_indicator_stepsUntil_eq}, such that - -% \begin{align*} -% \mathcal{L}(R_t \mid H_{t-1}, T_{n,a} = t, A_t = a) -% &= \mathcal{L}(R_t \mid H_{t-1}, A_t = a) -% \: . -% \end{align*} -% Thus, using Lemma~\ref{lem:condIndepFun_reward_hist_action}, we have -% \begin{align*} -% \mathcal{L}(R_t \mid H_{t-1}, A_t = a) -% = \nu(a) -% \: . -% \end{align*} - -% If $T_{n,a} = \infty$, then $\mathcal{L}(Y_{n,a} \mid H_{T_{n,a}-1}, T_{n,a} = \infty) = \mathcal{L}(Z_{n,a} \mid H_{\infty}, T_{n,a} = \infty) = \nu(a)$ by independence of $Z_{n,a}$ from the history and $T_{n,a}$. - -% \end{proof} - - -% \begin{lemma}\label{lem:indepFun_rewardByCount_hist_stepsUntil} -% \uses{def:rewardByCount, def:stepsUntil, def:Bandit.measure} -% For $n > 0$, $Y_{n, a} \ind (H_{T_{n,a}-1}, T_{n,a})$. -% \end{lemma} - -% \begin{proof} -% \uses{lem:condIndepFun_rewardByCount_hist} -% By Lemma~\ref{lem:condIndepFun_rewardByCount_hist}, $Y_{n, a} \ind H_{T_{n,a}-1} \mid T_{n,a}$. -% By Lemma~\ref{lem:indepFun_rewardByCount_stepsUntil}, $Y_{n, a} \ind T_{n,a}$. -% By the contraction property of conditional independence (Lemma~\ref{lem:indepFun_contraction}), we have $Y_{n, a} \ind (H_{T_{n,a}-1}, T_{n,a})$. -% \end{proof} - - -% \begin{lemma}\label{lem:iIndepFun_rewardByCount} -% \uses{def:rewardByCount} -% The rewards $(Y_{n,a})_{n \in \mathbb{N}}$ are independent. -% \end{lemma} - -% \begin{proof} -% \uses{lem:iIndepFun_nat_iff_forall_indepFun, lem:indepFun_contraction, lem:indepFun_rewardByCount_stepsUntil} -% By Lemma~\ref{lem:iIndepFun_nat_iff_forall_indepFun}, it suffices to show that for all $n \in \mathbb{N}$, $Y_{n+1, a}$ is independent of $(Y_{1,a}, \ldots, Y_{n,a})$. - -% By the contraction property of conditional independence (Lemma~\ref{lem:indepFun_contraction}), it suffices to show that $Y_{n+1, a}$ is independent of $(Y_{1,a}, \ldots, Y_{n,a})$ conditionally on $T_{n+1, a}$ and that $Y_{n+1, a}$ is independent of $T_{n+1, a}$. - -% The fact that $Y_{n+1, a}$ is independent of $T_{n+1, a}$ is Lemma~\ref{lem:indepFun_rewardByCount_stepsUntil}. - -% TODO - -% \end{proof} - - -% \begin{lemma}\label{lem:independent_rewardByCount} -% \uses{def:rewardByCount} -% For $a \in \mathcal{A}$, let $Y^{(a)} = (Y_{n,a})_{n \in \mathbb{N}} \in \mathbb{R}^{\mathbb{N}}$ be the sequence of rewards obtained from pulling arm $a$. Then the sequences $(Y^{(a)})_{a \in \mathcal{A}}$ are independent. -% \end{lemma} - -% \begin{proof} - -% \end{proof} - - -% \begin{lemma}\label{lem:identDistrib_rewardByCount_stream} -% \uses{def:rewardByCount} -% The random sequences $(Y_{n+1,a})_{n \in \mathbb{N}}$ and $(Z_{n,a})_{n \in \mathbb{N}}$ are identically distributed. -% \end{lemma} - -% \begin{proof} -% \uses{lem:hasLaw_rewardByCount, lem:iIndepFun_rewardByCount} - -% \end{proof} - - -% \begin{lemma}\label{lem:identDistrib_sum_Icc_rewardByCount} -% \uses{def:rewardByCount} -% The random variables $\sum_{i=1}^n Y_{i,a}$ and $\sum_{i=0}^{n-1} Z_{i,a}$ are identically distributed. -% \end{lemma} - -% \begin{proof} -% \uses{lem:identDistrib_rewardByCount_stream} -% Immediate consequence of Lemma~\ref{lem:identDistrib_rewardByCount_stream}. -% \end{proof} - - -\section{Regret and other bandit quantities} - -\begin{definition}[Arm means]\label{def:armMean} - \uses{def:bandit} - \leanok % no actual Lean def, but we don't need one -For an arm $a \in \mathcal{A}$, we denote by $\mu_a$ the mean of the rewards for that arm, that is $\mu_a = \nu(a)[\mathrm{id}]$. -We denote by $\mu^*$ the mean of the best arm, that is $\mu^* = \max_{a \in \mathcal{A}} \mu_a$. -\end{definition} - - -\begin{definition}[Regret]\label{def:regret} - \uses{def:armMean} - \leanok - \lean{Bandits.regret} -The regret $R_T$ of a sequence of arms $A_0, \ldots, A_{T-1}$ after $T$ pulls is the difference between the cumulative reward of always playing the best arm and the cumulative reward of the sequence: -\begin{align*} - R_T = T \mu^* - \sum_{t=0}^{T-1} \mu_{A_t} \: . -\end{align*} -\end{definition} - -TODO: the $R_T$ notation clashes with the random variable $R_t$. - -\begin{definition}\label{def:gap} - \uses{def:armMean} - \leanok - \lean{Bandits.gap} -For an arm $a \in \mathcal{A}$, its gap is defined as the difference between the mean of the best arm and the mean of that arm: $\Delta_a = \mu^* - \mu_a$. -\end{definition} - - -\begin{lemma}\label{lem:sum_pullCount_mul} - \uses{def:pullCount} - \leanok - \lean{Learning.sum_pullCount_mul} -Let $f : \mathcal{A} \to \mathbb{R}$ be a function on the arms. For all $t \in \mathbb{N}$, -\begin{align*} - \sum_{a \in \mathcal{A}} N_{t,a} f(a) = \sum_{s=0}^{t-1} f(A_s) \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok -\begin{align*} - \sum_{a \in \mathcal{A}} N_{t,a} f(a) - &= \sum_{a \in \mathcal{A}} \sum_{s=0}^{t-1} \mathbb{I}\{A_s = a\} f(a) - \\ - &= \sum_{s=0}^{t-1} \sum_{a \in \mathcal{A}} \mathbb{I}\{A_s = a\} f(a) - \\ - &= \sum_{s=0}^{t-1} f(A_s) - \: . -\end{align*} -\end{proof} - - -\begin{lemma}\label{lem:regret_eq_sum_pullCount_mul_gap} - \uses{def:regret,def:gap,def:pullCount} - \leanok - \lean{Bandits.regret_eq_sum_pullCount_mul_gap} -For $\mathcal{A}$ finite, the regret $R_T$ can be expressed as a sum over the arms and their gaps: -\begin{align*} - R_T = \sum_{a \in \mathcal{A}} N_{T,a} \Delta_a \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:sum_pullCount_mul} -Apply Lemma~\ref{lem:sum_pullCount_mul} with $f(a) = \Delta_a$ to obtain: -\begin{align*} - \sum_{a \in \mathcal{A}} N_{T,a} \Delta_a - &= \sum_{s=0}^{T-1} \Delta_{A_s} - \\ - &= \sum_{s=0}^{T-1} \mu^* - \sum_{s=0}^{T-1} \mu_{A_s} - \\ - &= R_T - \: . -\end{align*} -\end{proof} - - -\begin{corollary}\label{cor:integral_regret_eq_sum_mul} - \uses{def:regret,def:gap,def:pullCount} - \leanok - \lean{Bandits.integral_regret_eq_sum_gap_mul_integral_pullCount} -For $\mathcal{A}$ finite, the expected regret can be expressed as a sum over the arms and their gaps: -\begin{align*} - P[R_T] = \sum_{a \in \mathcal{A}}P[N_{T,a}] \Delta_a \: . -\end{align*} -\end{corollary} - -\begin{proof}\leanok - \uses{lem:regret_eq_sum_pullCount_mul_gap} - -\end{proof} diff --git a/blueprint/src/chapters/concentration.tex b/blueprint/src/chapters/concentration.tex deleted file mode 100644 index eaf2eb37..00000000 --- a/blueprint/src/chapters/concentration.tex +++ /dev/null @@ -1,197 +0,0 @@ -\chapter{Concentration inequalities} - - -\section{Sub-Gaussian random variables} - -\begin{definition}[Sub-Gaussian]\label{def:subGaussian} - \mathlibok - \lean{ProbabilityTheory.HasSubgaussianMGF} -A real valued random variable $X$ is $\sigma^2$-sub-Gaussian if for any $\lambda \in \mathbb{R}$, -\begin{align*} - P\left[e^{\lambda X}\right] - &\le e^{\frac{\lambda^2 \sigma^2}{2}} - \: . -\end{align*} -\end{definition} - - -\begin{lemma}\label{lem:subGaussian_add_of_indepFun} - \uses{def:subGaussian} - \mathlibok - \lean{ProbabilityTheory.HasSubgaussianMGF.add_of_indepFun} -If $X$ is $\sigma_1^2$-sub-Gaussian and $Y$ is $\sigma_2^2$-sub-Gaussian, and $X$ and $Y$ are independent, then $X + Y$ is $(\sigma_1^2 + \sigma_2^2)$-sub-Gaussian. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}\label{lem:hoeffding_one} - \uses{def:subGaussian} - \mathlibok - \lean{ProbabilityTheory.HasSubgaussianMGF.measure_ge_le} -For $X$ a $\sigma^2$-sub-Gaussian random variable, for any $t \ge 0$, -\begin{align*} - P(X \ge t) - &\le \exp\left(- \frac{t^2}{2 \sigma^2}\right) - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{theorem}\label{thm:hoeffding} - \uses{def:subGaussian} - \mathlibok - \lean{ProbabilityTheory.HasSubgaussianMGF.measure_sum_range_ge_le_of_iIndepFun} -Let $X_1, \ldots, X_n$ be independent random variables such that $X_i$ is $\sigma_i^2$-sub-Gaussian for $i \in [n]$. -Then for any $t \ge 0$, -\begin{align*} - P\left(\sum_{i=1}^n X_i \ge t\right) - &\le \exp\left(- \frac{t^2}{2 \sum_{i=1}^n \sigma_i^2}\right) - \: . -\end{align*} -\end{theorem} - -\begin{proof}\leanok - \uses{lem:subGaussian_add_of_indepFun, lem:hoeffding_one} - -\end{proof} - - -\begin{lemma}\label{lem:measure_sum_le_sum_le'} - \uses{def:subGaussian} - \leanok - \lean{ProbabilityTheory.HasSubgaussianMGF.measure_sum_le_sum_le'} -Let $X_1, \ldots, X_n$ be random variables such that $X_i - P[X_i]$ is $\sigma_{X,i}^2$-sub-Gaussian for $i \in [n]$. -Let $Y_1, \ldots, Y_m$ be random variables such that $Y_i - P[Y_i]$ is $\sigma_{Y,i}^2$-sub-Gaussian for $i \in [m]$. -Suppose further that the vectors $X$ and $Y$ are independent and that $\sum_{i = 1}^m P[Y_i] \le \sum_{i = 1}^n P[X_i]$. -Then -\begin{align*} - P\left(\sum_{i=1}^m Y_i \ge \sum_{i=1}^n X_i\right) - &\le \exp\left(- \frac{\left(\sum_{i = 1}^n P[X_i] - \sum_{i=1}^m P[Y_i]\right)^2}{2 \sum_{i=1}^n (\sigma_{X,i}^2 + \sigma_{Y,i}^2)}\right) - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:subGaussian_add_of_indepFun, lem:hoeffding_one} - -\end{proof} - - - - -\section{Concentration of the sums of rewards in bandit models} - - -% TODO: this was removed, adapt the blueprint -\begin{lemma}\label{lem:AM.identDistrib_pullCount_prod_sumRewards} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,def:sumRewards,def:pullCount} -In the array model, for $t \in \mathbb{N}$, the random variable $(N_{t,a}, S_{t, a})_{a \in \mathcal{A}}$ has the same distribution as $(N_{t,a}, \sum_{s=0}^{N_{t,a}-1} \omega_{2, s, a})_{a \in \mathcal{A}}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:AM.history,lem:stepsUntil_basic,thm:ionescu-tulcea,def:algFunction,lem:AM.measurable_hist,def:rewardByCount,lem:pullCount_basic,def:stepsUntil,lem:sum_rewardByCount} - -\end{proof} - - -\begin{lemma}\label{lem:AM.identDistrib_sum_range_snd} - \uses{def:arrayMeasure,thm:ionescu-tulcea} - \leanok - \lean{Bandits.ArrayModel.identDistrib_sum_range_snd} -In the array model, for $k \in \mathbb{N}$, the random variable $\sum_{s=0}^{k-1} \omega_{2, s, a}$ has the same distribution as a sum of $k$ i.i.d. random variables with law $\nu(a)$. -\end{lemma} - -\begin{proof}\leanok -By definition of $P_{\mathcal{A}}$ (Definition~\ref{def:arrayMeasure}). -\end{proof} - - -\begin{lemma}\label{lem:prob_pullCount_prod_sumRewards_mem_le} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea,def:sumRewards,def:pullCount,def:stationaryEnv,def:IsAlgEnvSeq} - \leanok - \lean{Bandits.ArrayModel.prob_pullCount_prod_sumRewards_mem_le, Bandits.prob_pullCount_prod_sumRewards_mem_le} -In the array model, for $t \in \mathbb{N}$, $a \in \mathcal{A}$, and a measurable set $B \subseteq \mathbb{N} \times \mathbb{R}$, -\begin{align*} - P_{\mathcal{A}}\left((N_{t,a}, S_{t, a}) \in B\right) - &\le \sum_{k < t, \exists r, (k, r) \in B} \nu(a)^{\otimes \mathbb{N}} \left(\sum_{s=0}^{k-1} \omega_{s} \in \{x \mid \exists n, (n, x) \in B\}\right) - \: . -\end{align*} -As a consequence, this also holds for any algorithm-environment sequence. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.identDistrib_sum_range_snd,lem:AM.identDistrib_pullCount_prod_sumRewards,lem:AM.measurable_hist,lem:pullCount_basic,def:arrayMeasure,def:AM.history,def:environment,thm:isAlgEnvSeq_arrayMeasure,lem:AM.measurable_hist,thm:isAlgEnvSeq_unique} - -\end{proof} - - -\begin{lemma}\label{lem:prob_sumRewards_le_sumRewards_le} - \uses{def:arrayMeasure,def:AM.history,def:algorithm,thm:ionescu-tulcea,def:sumRewards,def:pullCount,def:stationaryEnv,def:IsAlgEnvSeq} - \leanok - \lean{Bandits.ArrayModel.prob_sumRewards_le_sumRewards_le, Bandits.probReal_sumRewards_le_sumRewards_le} -In the array model, -\begin{align*} - P_{\mathcal{A}}\left( N_{t, a^*} = m_1 \wedge N_{t, a} = m_2 \wedge S_{t, a^*} \le S_{t, a}\right) - &\le (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m_1-1} \omega_{s, a^*} \le \sum_{s=0}^{m_2-1} \omega_{s, a} \right) - \: . -\end{align*} -As a consequence, this also holds for any algorithm-environment sequence. -\end{lemma} - -\begin{proof}\leanok - \uses{lem:AM.identDistrib_pullCount_prod_sumRewards,lem:AM.measurable_hist,lem:pullCount_basic,def:arrayMeasure,def:AM.history,def:environment,thm:isAlgEnvSeq_arrayMeasure,lem:AM.measurable_hist,thm:isAlgEnvSeq_unique} - -\end{proof} - - - -\subsection{Sub-Gaussian rewards} - -\begin{lemma}\label{lem:probReal_sum_le_sum_streamMeasure} - \uses{thm:ionescu-tulcea,def:subGaussian,def:gap} - \leanok - \lean{Bandits.probReal_sum_le_sum_streamMeasure} -Let $\nu(a)$ be a $\sigma^2$-sub-Gaussian distribution on $\mathbb{R}$ for each arm $a \in \mathcal{A}$. -\begin{align*} - (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m-1} \omega_{s, a^*} \le \sum_{s=0}^{m-1} \omega_{s, a} \right) - &\le \exp\left( -m \frac{\Delta_a^2}{4 \sigma^2} \right) -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:measure_sum_le_sum_le'} - -\end{proof} - - -\begin{lemma}\label{lem:prob_sum_le_sqrt_log} - \uses{thm:ionescu-tulcea,def:subGaussian} - \leanok - \lean{Bandits.prob_sum_le_sqrt_log, Bandits.prob_sum_ge_sqrt_log} -Let $\nu(a)$ be a $\sigma^2$-sub-Gaussian distribution on $\mathbb{R}$ for each arm $a \in \mathcal{A}$. -Let $c \ge 0$ be a real number and $k$ a positive natural number. -Then -\begin{align*} - \nu(a)^{\otimes \mathbb{N}} \left( \sum_{s=0}^{k-1} (\omega_{s} - \mu_a) \le - \sqrt{2 c k \sigma^2 \log(n + 1)} \right) - &\le \frac{1}{(n + 1)^{c}} - \: . -\end{align*} -The same upper bound holds for the upper tail: -\begin{align*} - \nu(a)^{\otimes \mathbb{N}} \left( \sum_{s=0}^{k-1} (\omega_{s} - \mu_a) \ge \sqrt{2 c k \sigma^2 \log(n + 1)} \right) - &\le \frac{1}{(n + 1)^{c}} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{thm:hoeffding} - -\end{proof} diff --git a/blueprint/src/chapters/etc.tex b/blueprint/src/chapters/etc.tex deleted file mode 100644 index 0525c179..00000000 --- a/blueprint/src/chapters/etc.tex +++ /dev/null @@ -1,161 +0,0 @@ -\chapter{Bandit algorithms} - -\section{Round-Robin} - -This is not an interesting bandit algorithm per se, but it is used as a subroutine in other algorithms and can be a simple baseline. -This algorithm simply cycles through the arms in order. - -\begin{definition}\label{def:roundRobinAlgorithm} - \uses{def:detAlgorithm,def:algorithm} - \leanok - \lean{Learning.RoundRobin.nextAction, Learning.roundRobinAlgorithm} -The Round-Robin algorithm is defined as follows: at time $t \in \mathbb{N}$, $A_t = t \mod K$. -\end{definition} - - -\begin{lemma}\label{lem:pullCount_roundRobinAlgorithm} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:pullCount,def:roundRobinAlgorithm} - \leanok - \lean{Learning.RoundRobin.pullCount_mul} -For the Round-Robin algorithm, for any arm $a \in [K]$, at time $Km$ we have -\begin{align*} - N_{Km,a} - &= m - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:history,lem:pullCount_basic,def:roundRobinAlgorithm} - -\end{proof} - - -TODO: regret. - - - - -\section{Explore-Then-Commit} - -Note: times start at 0 to be consistent with Lean. - -Note: we will describe the algorithm by writing $A_t = ...$, but our formal bandit model needs a policy $\pi_t$ that gives the distribution of the arm to pull. What me mean is that $\pi_t$ is a Dirac distribution at that arm. - -\begin{definition}[Explore-Then-Commit algorithm]\label{def:etcAlgorithm} - \uses{def:detAlgorithm,def:algorithm} - \leanok - \lean{Bandits.ETC.nextArm, Bandits.etcAlgorithm} -The Explore-Then-Commit (ETC) algorithm with parameter $m \in \mathbb{N}$ is defined as follows: -\begin{enumerate} - \item for $t < Km$, $A_t = t \mod K$ (pull each arm $m$ times), - \item compute $\hat{A}_m^* = \arg\max_{a \in [K]} \hat{\mu}_a$, where $\hat{\mu}_a = \frac{1}{m} \sum_{t=0}^{Km-1} \mathbb{I}(A_t = a) X_t$ is the empirical mean of the rewards for arm $a$, - \item for $t \ge Km$, $A_t = \hat{A}_m^*$ (pull the empirical best arm). -\end{enumerate} -\end{definition} - - -\begin{lemma}\label{lem:ETC.isAlgEnvSeqUntil_roundRobinAlgorithm} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:etcAlgorithm,def:roundRobinAlgorithm} - \leanok - \lean{Bandits.ETC.isAlgEnvSeqUntil_roundRobinAlgorithm} -An algorithm-environment sequence for the Explore-Then-Commit algorithm with parameter $m$ is an algorithm-environment sequence for the Round-Robin algorithm until time $Km - 1$. -That is, ETC plays the same as Round-Robin until time $Km - 1$. -\end{lemma} - -\begin{proof} - \leanok - -\end{proof} - - -\begin{lemma}\label{lem:pullCount_etcAlgorithm} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:pullCount,def:etcAlgorithm} - \leanok - \lean{Bandits.ETC.pullCount_of_ge} -For the Explore-Then-Commit algorithm with parameter $m$, for any arm $a \in [K]$ and any time $t \ge Km$, we have -\begin{align*} - N_{t,a} - &= m + (t - Km) \mathbb{I}\{\hat{A}_m^* = a\} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:history,lem:pullCount_basic,def:etcAlgorithm,lem:pullCount_roundRobinAlgorithm,lem:ETC.isAlgEnvSeqUntil_roundRobinAlgorithm} - -\end{proof} - - -\begin{lemma}\label{lem:sumRewards_bestArm_le_of_arm_mul_eq} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:sumRewards,def:etcAlgorithm} - \leanok - \lean{Bandits.ETC.sumRewards_bestArm_le_of_arm_mul_eq} -If $\hat{A}_m^* = a$, then we have $S_{Km, a^*} \le S_{Km, a}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:history,def:pullCount,def:empMean,def:etcAlgorithm} - -\end{proof} - - -\begin{lemma}\label{lem:prob_etc_error_le_exp} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:subGaussian,def:gap,def:etcAlgorithm} - \leanok - \lean{Bandits.ETC.prob_arm_mul_eq_le} -Suppose that $\nu(a)$ is $\sigma^2$-sub-Gaussian for all arms $a \in [K]$. -Then for the Explore-Then-Commit algorithm with parameter $m$, for any arm $a \in [K]$ with $\Delta_a > 0$, we have $P(\hat{A}_m^* = a) \le \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right)$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,lem:probReal_sum_le_sum_streamMeasure,lem:prob_sumRewards_le_sumRewards_le,def:detAlgorithm,def:algorithm,thm:ionescu-tulcea,def:sumRewards,def:history,lem:sumRewards_bestArm_le_of_arm_mul_eq,def:pullCount,def:etcAlgorithm} -By Lemma~\ref{lem:sumRewards_bestArm_le_of_arm_mul_eq}, -\begin{align*} - P(\hat{A}_m^* = a) - &\le P(S_{Km, a} \ge S_{Km, a^*}) - \: . -\end{align*} -By Lemma~\ref{lem:prob_sumRewards_le_sumRewards_le}, and then the concentration inequality of Lemma~\ref{lem:probReal_sum_le_sum_streamMeasure} we have -\begin{align*} - P\left(S_{Km, a^*} \le S_{Km, a}\right) - &\le (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m-1} \omega_{s, a^*} \le \sum_{s=0}^{m-1} \omega_{s, a} \right) - \\ - &\le \exp\left( -m \frac{\Delta_a^2}{4 \sigma^2} \right) - \: . -\end{align*} -\end{proof} - - -\begin{theorem}\label{thm:regret_etc_le} - \uses{def:stationaryEnv,def:regret,def:IsAlgEnvSeq,def:subGaussian,def:gap,def:etcAlgorithm} - \leanok - \lean{Bandits.ETC.regret_le} -Suppose that $\nu(a)$ is $\sigma^2$-sub-Gaussian for all arms $a \in [K]$. -Then for the Explore-Then-Commit algorithm with parameter $m$, the expected regret after $T$ pulls with $T \ge Km$ is bounded by -\begin{align*} - P[R_T] - &\le m \sum_{a=1}^K \Delta_a + (T - Km) \sum_{a=1}^K \Delta_a \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right) - \: . -\end{align*} -\end{theorem} - -\begin{proof}\leanok - \uses{lem:pullCount_etcAlgorithm,def:environment,def:algorithm,cor:integral_regret_eq_sum_mul,lem:prob_etc_error_le_exp,lem:pullCount_basic,def:pullCount} -By Lemma~\ref{lem:regret_eq_sum_pullCount_mul_gap}, we have $P[R_T] = \sum_{a=1}^K P\left[N_{T,a}\right] \Delta_a$~. -It thus suffices to bound $P[N_{T,a}]$ for each arm $a$ with $\Delta_a > 0$. -It suffices to prove that -\begin{align*} - P[N_{T,a}] - &\le m + (T - Km) \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right) - \: . -\end{align*} -By Lemma~\ref{lem:pullCount_etcAlgorithm}, -\begin{align*} - N_{T,a} - &= m + (T - Km) \mathbb{I}\{\hat{A}_m^* = a\} - \: . -\end{align*} -It thus suffices to prove the inequality $P(\hat{A}_m^* = a) \le \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right)$ for $\Delta_a > 0$. -This is done in Lemma~\ref{lem:prob_etc_error_le_exp}. -\end{proof} diff --git a/blueprint/src/chapters/intro.tex b/blueprint/src/chapters/intro.tex deleted file mode 100644 index 46a51908..00000000 --- a/blueprint/src/chapters/intro.tex +++ /dev/null @@ -1,27 +0,0 @@ -\chapter{Introduction} - -A bandit algorithm sequentially chooses actions and then observes rewards, whose distribution depends on the action chosen. -The algorithm does not know the distribution of the rewards and sees only a reward from the chosen action at any given time. -A key part of the interaction is that the algorithm can choose the next action based on all the previous actions and rewards. -The goal of the algorithm is typically to maximize the cumulative reward over time. -The researcher studying bandit algorithms is interested in the performance of the algorithm, which is measured by the ``regret'' $R_T$ after choosing $T$ actions, that is the difference between the cumulative reward of always playing the best action and the cumulative reward of the algorithm. -A theoretical guarantee will be of the form $\mathbb{E}[R_T] \le f(T)$ for some function $f$. -Here the expectation is taken over the randomness of the algorithm and the rewards. -In parallel to the theoretical study, the researcher may also be interested in the practical performance of the algorithm, which is usually measured by the average regret over several runs of the algorithm with rewards sampled from standard probability distributions. - -From that description, we highlight three key components of research work on bandit algorithms: -\begin{enumerate} - \item A bandit algorithm is both a subject of theoretical study and a practical tool, that we should be able to implement and run, - \item the bandit model defines a probability space, on which we want to take expectations, and the theoretical study deals with random variables on that space using tools like concentration inequalities, - \item for the experimental part, we need to be able to sample rewards from a range of probability distributions. -\end{enumerate} - -\section{Notations} - -$P(E)$ is the probability of event $E$ under the probability distribution $P$. - -$P[X]$ is the expectation of random variable $X$. - -$P[X \mid Y]$ is the conditional expectation of random variable $X$ given random variable $Y$. - -$P(X \mid Y)$ is the conditional distribution of random variable $X$ given random variable $Y$. diff --git a/blueprint/src/chapters/practicalAlgorithms.tex b/blueprint/src/chapters/practicalAlgorithms.tex deleted file mode 100644 index 6b59808d..00000000 --- a/blueprint/src/chapters/practicalAlgorithms.tex +++ /dev/null @@ -1,32 +0,0 @@ -\chapter{Practical Algorithms} - -The algorithms presented in the previous chapters are theoretical algorithms, in the very basic sense that they perform operations on real numbers to decide what they will sample, and those numbers are not representable in a computer. In practice, we need to use floating point numbers (or bounded integers or rationals), both for the algorithm and for the rewards that are sampled from the environment. - -We will want to perform experiments about the algorithms for which we have theoretical guarantees, and that means using an implementation of the algorithms that can actually run on a computer. -However if we use \texttt{float} in the specification of the algorithms, we won't be able to prove anything, because those numbers lack any good algebraic properties. - -Our strategy to resolve that conflict is to describe first the algorithm as a function of real numbers, and then automatically generate a version of the algorithm that uses floating point numbers, by using a translation tactic (similar to \texttt{to\_additive}). -The result is that we have only one hand-written algorithm, and even though the theorems don't directly apply to the floating point version, we are assured that the only difference between the experimental and theoretical algorithms is the result of the translation tactic. -This is in stark contrast with the situation in the literature, where the theoretical algorithm is specified in pseudo-code in LaTeX and the experiments are done on a separately written implementation, typically in Python. The experimental version may or may not be also implementing a series of tricks or optimizations of constants. - -TODO: describe the translation tactic. It should basically be like \texttt{to\_additive}. - - -\paragraph{Alternative strategy: atomic typeclasses} - -The ETC algorithm makes sense for any reward type on which we can define addition and the maximum. -As written, it also requires division by natural numbers but we could equivalently compare sums of rewards instead of empirical means. The UCB algorithm also requires multiplication, a square root and a logarithm. - -We can write the algorithm under typeclasses stating that those operations exist. Those typeclasses would be satisfied by both the real numbers and floating point numbers. -That way, the algorithm is only written once. -We would still only get theorems about the real number version because proving theorems will actually require algebraic properties on the reward type, but we don't need to write a translation tactic. - - -\paragraph{Error sensitivity analysis} - -A more theoretically satisfying but more involved method to link the Float and Real worlds is to assume in the theoretical analysis that each of the operations performed by the algorithm is imprecise: it is only supposed to give the expected result up to a specified error margin. -Then we could prove regret bounds on the algorithm that apply under that imprecise assumption. - -Finally, we need to prove such error bounds for Float operations. The bounds might depend on the magnitude of the numbers involved. - -This method would give theoretical guarantees about the algorithm that is actually running, but the theoretical analysis would depart from the standard literature on bandits and would be more tedious because of the need to track error terms. diff --git a/blueprint/src/chapters/sampling.tex b/blueprint/src/chapters/sampling.tex deleted file mode 100644 index d6a7fe56..00000000 --- a/blueprint/src/chapters/sampling.tex +++ /dev/null @@ -1 +0,0 @@ -\chapter{Sampling} diff --git a/blueprint/src/chapters/ucb.tex b/blueprint/src/chapters/ucb.tex deleted file mode 100644 index 1290d450..00000000 --- a/blueprint/src/chapters/ucb.tex +++ /dev/null @@ -1,185 +0,0 @@ -\section{UCB} - -\begin{definition}[UCB algorithm]\label{def:ucbAlgorithm} - \uses{def:detAlgorithm,def:algorithm} - \leanok - \lean{Bandits.UCB.nextArm, Bandits.ucbAlgorithm} -The UCB algorithm with parameter $c \in \mathbb{R}_+$ is defined as follows: -\begin{enumerate} - \item for $t < K$, $A_t = t \mod K$ (pull each arm once), - \item for $t \ge K$, $A_t = \arg\max_{a \in [K]} \left( \hat{\mu}_{t,a} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a}}} \right)$, where $\hat{\mu}_{t,a} = \frac{1}{N_{t,a}} \sum_{s=0}^{t-1} \mathbb{I}(A_s = a) X_s$ is the empirical mean of the rewards for arm $a$. -\end{enumerate} -\end{definition} - -Note: the argmax in the second step is chosen in a measurable way. - - -\begin{lemma}\label{lem:UCB.isAlgEnvSeqUntil_roundRobinAlgorithm} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:ucbAlgorithm,def:roundRobinAlgorithm} - \leanok - \lean{Bandits.UCB.isAlgEnvSeqUntil_roundRobinAlgorithm} -An algorithm-environment sequence for the UCB algorithm is an algorithm-environment sequence for the Round-Robin algorithm until time $K - 1$. -That is, UCB plays the same as Round-Robin until time $K - 1$. -\end{lemma} - -\begin{proof} - \leanok - -\end{proof} - - -\begin{lemma}\label{lem:ucbIndex_le_ucbIndex_arm} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:ucbAlgorithm,def:pullCount,def:empMean} - \leanok - \lean{Bandits.UCB.ucbIndex_le_ucbIndex_arm} -For the UCB algorithm, for all time $t \ge K$ and arm $a \in [K]$, we have -\begin{align*} - \hat{\mu}_{t,a} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a}}} - &\le \hat{\mu}_{t,A_t} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:sumRewards,def:ucbAlgorithm,def:history} -By definition of the algorithm. -\end{proof} - - -\begin{lemma}\label{lem:gap_arm_le_two_mul_ucbWidth} - \uses{def:pullCount,def:gap,def:empMean,def:pullCount,def:gap,def:empMean} - \leanok - \lean{Bandits.UCB.gap_arm_le_two_mul_ucbWidth, Bandits.UCB.pullCount_arm_le} -Suppose that we have the 3 following conditions: -\begin{enumerate} - \item $\mu^* \le \hat{\mu}_{t, a^*} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a^*}}}$, - \item $\hat{\mu}_{t,A_t} - \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} \le \mu_{A_t}$, - \item $\hat{\mu}_{t, a^*} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a^*}}} \le \hat{\mu}_{t,A_t} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}}$. -\end{enumerate} -Then if $N_{t,A_t} > 0$ we have -\begin{align*} - \Delta_{A_t} - &\le 2 \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} - \: . -\end{align*} -And in turn, if $\Delta_{A_t} > 0$ we get -\begin{align*} - N_{t,A_t} - &\le \frac{8 c \log(t + 1)}{\Delta_{A_t}^2} - \: . -\end{align*} - -Note that the third condition is always satisfied for UCB by Lemma~\ref{lem:ucbIndex_le_ucbIndex_arm}, but this lemma, as stated, is independent of the UCB algorithm. -\end{lemma} - -\begin{proof}\leanok - -\end{proof} - - -\begin{lemma}\label{lem:prob_ucbIndex_le} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:subGaussian,def:ucbAlgorithm,def:pullCount,def:empMean} - \leanok - \lean{Bandits.UCB.prob_ucbIndex_le, Bandits.UCB.prob_ucbIndex_ge} -Suppose that $\nu(a)$ is $\sigma^2$-sub-Gaussian for all arms $a \in [K]$. -Let $c \ge 0$ be a real number. -Then for any time $n \in \mathbb{N}$ and any arm $a \in [K]$, we have -\begin{align*} - P\left(0 < N_{n, a} \ \wedge \ \hat{\mu}_{n, a} + \sqrt{\frac{2 c \sigma^2 \log(n + 1)}{N_{n,a}}} \le \mu_a\right) - &\le \frac{1}{(n + 1)^{c - 1}} - \: . -\end{align*} -And also, -\begin{align*} - P\left(0 < N_{n, a} \ \wedge \ \hat{\mu}_{n, a} - \sqrt{\frac{2 c \sigma^2 \log(n + 1)}{N_{n,a}}} \ge \mu_a\right) - &\le \frac{1}{(n + 1)^{c - 1}} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{lem:prob_sum_le_sqrt_log,thm:ionescu-tulcea,lem:prob_pullCount_prod_sumRewards_mem_le} - -\end{proof} - - -\begin{lemma}\label{lem:pullCount_le_add_three} - \uses{def:pullCount,def:empMean,def:stationaryEnv,def:IsAlgEnvSeq,def:ucbAlgorithm} - \leanok - \lean{Bandits.UCB.pullCount_le_add_three, Bandits.UCB.pullCount_le_add_three_ae} -For $C$ a natural number, for any time $n \in \mathbb{N}$ and any arm $a \in [K]$, we have -\begin{align*} - N_{n,a} - &\le C + 1 - \\&\quad + - \sum_{s=1}^{n-1} \mathbb{I}\{A_s = a \ \wedge \ C < N_{s,a} \ \wedge \ - \mu^* \le \hat{\mu}_{s, a^*} + \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a^*}}} \ \wedge \ - \hat{\mu}_{s, A_s} - \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,A_s}}} \le \mu_{A_s}\} - \\&\quad + - \sum_{s=1}^{n-1} - \mathbb{I}\{0 < N_{s, a^*} \ \wedge \ \hat{\mu}_{s, a^*} + \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a^*}}} < - \mu^*\} - \\&\quad + - \sum_{s=1}^{n-1} - \mathbb{I}\{0 < N_{s, a} \ \wedge \ \mu_a < - \hat{\mu}_{s, a} - \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a}}}\} -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:ucbAlgorithm,def:history,lem:pullCount_basic} - -\end{proof} - - -\begin{lemma}\label{lem:some_sum_eq_zero} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:ucbAlgorithm,def:pullCount,def:gap,def:empMean} - \leanok - \lean{Bandits.UCB.some_sum_eq_zero} -For the UCB algorithm with parameter $c \sigma^2 \ge 0$, for any time $n \in \mathbb{N}$ and any arm $a \in [K]$ with positive gap, the first sum in Lemma~\ref{lem:pullCount_le_add_three} is equal to zero for positive $C$ such that $C \ge \frac{8 c \sigma^2 \log(n + 1)}{\Delta_a^2}$. -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:detAlgorithm,def:algorithm,def:ucbAlgorithm,lem:ucbIndex_le_ucbIndex_arm,def:history,lem:pullCount_basic,lem:gap_arm_le_two_mul_ucbWidth} - -\end{proof} - - -\begin{lemma}\label{lem:expectation_pullCount_le} - \uses{def:stationaryEnv,def:IsAlgEnvSeq,def:subGaussian,def:ucbAlgorithm,def:pullCount,def:gap} - \leanok - \lean{Bandits.UCB.expectation_pullCount_le} -Suppose that $\nu(a)$ is $\sigma^2$-sub-Gaussian for all arms $a \in [K]$. -For the UCB algorithm with parameter $c \sigma^2 > 0$, for any time $n \in \mathbb{N}$ and any arm $a \in [K]$ with positive gap, we have -\begin{align*} - P[N_{n,a}] - &\le \frac{8 c \sigma^2 \log(n + 1)}{\Delta_a^2} + 2 + 2 \sum_{s=0}^{n-1} \frac{1}{(s + 1)^{c - 1}} - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:algorithm,def:sumRewards,lem:some_sum_eq_zero,lem:prob_ucbIndex_le,lem:pullCount_basic,def:empMean,lem:pullCount_le_add_three} - -\end{proof} - - -\begin{lemma}\label{lem:ucb_regret_le} - \uses{def:stationaryEnv,def:regret,def:IsAlgEnvSeq,def:subGaussian,def:ucbAlgorithm,def:gap} - \leanok - \lean{Bandits.UCB.regret_le} -Suppose that $\nu(a)$ is $\sigma^2$-sub-Gaussian for all arms $a \in [K]$. -For the UCB algorithm with parameter $c \sigma^2 > 0$, for any time $n \in \mathbb{N}$, we have -\begin{align*} - P[R_n] - &\le \sum_{a : \Delta_a > 0} \left(\frac{8 c \sigma^2 \log(n + 1)}{\Delta_a} + 2 \Delta_a\left(1 + \sum_{s=0}^{n-1} \frac{1}{(s + 1)^{c - 1}}\right)\right) - \: . -\end{align*} -\end{lemma} - -\begin{proof}\leanok - \uses{def:environment,def:algorithm,cor:integral_regret_eq_sum_mul,lem:pullCount_basic,lem:expectation_pullCount_le,def:pullCount} - -\end{proof} - -TODO: for $c > 2$, the sum converges to a constant, so we get a logarithmic regret bound. diff --git a/blueprint/src/content.tex b/blueprint/src/content.tex deleted file mode 100644 index 79e62c88..00000000 --- a/blueprint/src/content.tex +++ /dev/null @@ -1,22 +0,0 @@ -% In this file you should put the actual content of the blueprint. -% It will be used both by the web and the print version. -% It should *not* include the \begin{document} -% -% If you want to split the blueprint content into several files then -% the current file can be a simple sequence of \input. Otherwise It -% can start with a \section or \chapter for instance. - -\input{chapters/intro.tex} -\input{chapters/algorithm.tex} -\input{chapters/bandit.tex} -\input{chapters/concentration.tex} -\input{chapters/etc.tex} -\input{chapters/ucb.tex} -\input{chapters/practicalAlgorithms.tex} - -\bibliographystyle{amsalpha} -\bibliography{biblio} - -\appendix - -\input{appendix/conditional_independence.tex} diff --git a/blueprint/src/extra_styles.css b/blueprint/src/extra_styles.css deleted file mode 100644 index b96c7767..00000000 --- a/blueprint/src/extra_styles.css +++ /dev/null @@ -1,25 +0,0 @@ -/* This file contains CSS tweaks for this blueprint. - * As an example, we included CSS rules that put - * a vertical line on the left of theorem statements - * and proofs. - * */ - -div.theorem_thmcontent { - border-left: .15rem solid black; -} - -div.proposition_thmcontent { - border-left: .15rem solid black; -} - -div.lemma_thmcontent { - border-left: .1rem solid black; -} - -div.corollary_thmcontent { - border-left: .1rem solid black; -} - -div.proof_content { - border-left: .08rem solid grey; -} diff --git a/blueprint/src/latexmkrc b/blueprint/src/latexmkrc deleted file mode 100644 index 38d59630..00000000 --- a/blueprint/src/latexmkrc +++ /dev/null @@ -1,5 +0,0 @@ -# This file configures the latexmk command you can use to compile -# the pdf version of the blueprint -$pdf_mode = 1; -$pdflatex = 'xelatex -synctex=1'; -@default_files = ('print.tex'); \ No newline at end of file diff --git a/blueprint/src/macros/common.tex b/blueprint/src/macros/common.tex deleted file mode 100644 index 76c6969c..00000000 --- a/blueprint/src/macros/common.tex +++ /dev/null @@ -1,21 +0,0 @@ -% In this file you should put all LaTeX macros and settings to be used both by -% the pdf version and the web version. -% This should be most of your macros. - -% The theorem-like environments defined below are those that appear by default -% in the dependency graph. See the README of leanblueprint if you need help to -% customize this. -% The configuration below use the theorem counter for all those environments -% (this is what the [theorem] arguments mean) and never resets it. -% If you want for instance to number them within chapters then you can add -% [chapter] at the end of the next line. -\newtheorem{theorem}{Theorem}[chapter] -\newtheorem{proposition}[theorem]{Proposition} -\newtheorem{lemma}[theorem]{Lemma} -\newtheorem{corollary}[theorem]{Corollary} - -\theoremstyle{definition} -\newtheorem{definition}[theorem]{Definition} -\newtheorem{remark}[theorem]{Remark} - -\newcommand{\ind}{\perp\!\!\!\!\perp} diff --git a/blueprint/src/macros/print.tex b/blueprint/src/macros/print.tex deleted file mode 100644 index 78708343..00000000 --- a/blueprint/src/macros/print.tex +++ /dev/null @@ -1,29 +0,0 @@ -% In this file you should put macros to be used only by -% the printed version. Of course they should have a corresponding -% version in macros/web.tex. -% Typically the printed version could have more fancy decorations. -% This should be a very short file. -% -% This file starts with dummy macros that ensure the pdf -% compiler will ignore macros provided by plasTeX that make -% sense only for the web version, such as dependency graph -% macros. - - -% Dummy macros that make sense only for web version. -\newcommand{\lean}[1]{} -\newcommand{\discussion}[1]{} -\newcommand{\leanok}{} -\newcommand{\mathlibok}{} -\newcommand{\notready}{} -% Make sure that arguments of \uses and \proves are real labels, by using invisible refs: -% latex prints a warning if the label is not defined, but nothing is shown in the pdf file. -% It uses LaTeX3 programming, this is why we use the expl3 package. -\ExplSyntaxOn -\NewDocumentCommand{\uses}{m} - {\clist_map_inline:nn{#1}{\vphantom{\ref{##1}}}% - \ignorespaces} -\NewDocumentCommand{\proves}{m} - {\clist_map_inline:nn{#1}{\vphantom{\ref{##1}}}% - \ignorespaces} -\ExplSyntaxOff diff --git a/blueprint/src/macros/web.tex b/blueprint/src/macros/web.tex deleted file mode 100644 index ceee9755..00000000 --- a/blueprint/src/macros/web.tex +++ /dev/null @@ -1,5 +0,0 @@ -% In this file you should put macros to be used only by -% the web version. Of course they should have a corresponding -% version in macros/print.tex. -% Typically the printed version could have more fancy decorations. -% This will probably be a very short file. \ No newline at end of file diff --git a/blueprint/src/plastex.cfg b/blueprint/src/plastex.cfg deleted file mode 100644 index de3dbae2..00000000 --- a/blueprint/src/plastex.cfg +++ /dev/null @@ -1,17 +0,0 @@ -[general] -renderer=HTML5 -copy-theme-extras=yes -plugins=plastexdepgraph plastexshowmore leanblueprint - -[document] -toc-depth=3 -toc-non-files=True - -[files] -directory=../web/ -split-level= 0 - -[html5] -localtoc-level=0 -extra-css=extra_styles.css -mathjax-dollars=False \ No newline at end of file diff --git a/blueprint/src/print.tex b/blueprint/src/print.tex deleted file mode 100644 index 2ecf7ed1..00000000 --- a/blueprint/src/print.tex +++ /dev/null @@ -1,33 +0,0 @@ -% This file makes a printable version of the blueprint -% It should include all the \usepackage needed for the pdf version. -% The template version assume you want to use a modern TeX compiler -% such as xeLaTeX or luaLaTeX including support for unicode -% and Latin Modern Math font with standard bugfixes applied. -% It also uses expl3 in order to support macros related to the dependency graph. -% It also includes standard AMS packages (and their improved version -% mathtools) as well as support for links with a sober decoration -% (no ugly rectangles around links). -% It is otherwise a very minimal preamble (you should probably at least -% add cleveref and tikz-cd). - -\documentclass[a4paper]{report} - -\usepackage{geometry} - -\usepackage{expl3} - -\usepackage{amssymb, amsthm, mathtools} -\usepackage[unicode,colorlinks=true,linkcolor=blue,urlcolor=magenta, citecolor=blue]{hyperref} - -\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math} - -\input{macros/common} -\input{macros/print} - -\title{Lean Machine Learning\\ \Large{A Lean package for machine learning algorithms}} -\author{Rémy Degenne, Paulo Rauber} - -\begin{document} -\maketitle -\input{content} -\end{document} diff --git a/blueprint/src/web.tex b/blueprint/src/web.tex deleted file mode 100644 index 15f39f04..00000000 --- a/blueprint/src/web.tex +++ /dev/null @@ -1,34 +0,0 @@ -% This file makes a web version of the blueprint -% It should include all the \usepackage needed for this version. -% The template includes standard AMS packages. -% It is otherwise a very minimal preamble (you should probably at least -% add cleveref and tikz-cd). - -\documentclass{report} - -\usepackage{amssymb, amsthm, amsmath} -\usepackage{hyperref} -\usepackage[showmore, dep_graph]{blueprint} - - -\input{macros/common} -\input{macros/web} - -\graphcolor{mathlib}{purple}{The statement of this result is in Mathlib} - -\home{https://leanmachinelearning.github.io} -\github{https://github.com/LeanMachineLearning/LML} -\dochome{https://leanmachinelearning.github.io/LML/docs} - -\title{Lean Machine Learning} -\author{Rémy Degenne, Paulo Rauber} - -\begin{document} -\maketitle - -\begin{center} - \Large{A Lean package for machine learning algorithms} -\end{center} - -\input{content} -\end{document} diff --git a/docbuild/lakefile.toml b/docbuild/lakefile.toml deleted file mode 100644 index cddfcc16..00000000 --- a/docbuild/lakefile.toml +++ /dev/null @@ -1,15 +0,0 @@ -name = "docbuild" -reservoir = false -version = "0.1.0" -packagesDir = "../.lake/packages" - -[[require]] -name = "LeanMachineLearning" -path = "../" - -[[require]] -scope = "leanprover" -name = "doc-gen4" -# If you are developing against a release candidate or a stable version `v4.x`, replace `main` below by `v4.x`. -# If you do not use `main` keep in mind to update this field as you update your Lean version. -rev = "main" diff --git a/scripts/build_blueprint.sh b/scripts/build_blueprint.sh deleted file mode 100755 index 3b5213c1..00000000 --- a/scripts/build_blueprint.sh +++ /dev/null @@ -1,13 +0,0 @@ -set -x -e - -cd verso_blueprint -lake exe cache get -lake build -lake exe blueprint-gen --output _out/site -mkdir -p _out/site/html-multi/static -cp static_files/* _out/site/html-multi/static -cd .. - -# Copy outputs to home_page -mkdir -p home_page/verso_blueprint -cp -r verso_blueprint/_out/site/html-multi/* home_page/verso_blueprint diff --git a/verso_blueprint/LMLBlueprint.lean b/verso_blueprint/LMLBlueprint.lean deleted file mode 100644 index df46b6c8..00000000 --- a/verso_blueprint/LMLBlueprint.lean +++ /dev/null @@ -1 +0,0 @@ -import LMLBlueprint.Blueprint diff --git a/verso_blueprint/LMLBlueprint/Blueprint.lean b/verso_blueprint/LMLBlueprint/Blueprint.lean deleted file mode 100644 index 869ff0bd..00000000 --- a/verso_blueprint/LMLBlueprint/Blueprint.lean +++ /dev/null @@ -1,31 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint -import VersoBlueprint.Commands.Graph -import VersoBlueprint.Commands.Summary -import LMLBlueprint.Chapters.Algorithm -import LMLBlueprint.Chapters.Bandit -import LMLBlueprint.Chapters.BanditAlgs -import LMLBlueprint.Chapters.Concentration -import LMLBlueprint.Chapters.Intro - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -set_option verso.blueprint.foldProofs true -set_option verso.blueprint.summary.debugDiagnostics false - -#doc (Manual) "Lean Machine Learning" => - -Blueprint for the bandit parts of the [Lean Machine Learning](https://leanmachinelearning.org) library. - -{include 0 LMLBlueprint.Chapters.Intro} -{include 0 LMLBlueprint.Chapters.Algorithm} -{include 0 LMLBlueprint.Chapters.Bandit} -{include 0 LMLBlueprint.Chapters.Concentration} -{include 0 LMLBlueprint.Chapters.BanditAlgs} - -{blueprint_graph} -{blueprint_summary} -{blueprint_bibliography} diff --git a/verso_blueprint/LMLBlueprint/Chapters/Algorithm.lean b/verso_blueprint/LMLBlueprint/Chapters/Algorithm.lean deleted file mode 100644 index f8495655..00000000 --- a/verso_blueprint/LMLBlueprint/Chapters/Algorithm.lean +++ /dev/null @@ -1,492 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint -import LeanMachineLearning.SequentialLearning.Deterministic -import LeanMachineLearning.SequentialLearning.FiniteActions -import LeanMachineLearning.SequentialLearning.IonescuTulceaSpace -import LeanMachineLearning.SequentialLearning.StationaryEnv -import LMLBlueprint.References -import LMLBlueprint.TeXPrelude - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -#doc (Manual) "Iterative stochastic algorithms" => - -:::group "algorithm_environment" -Stochastic algorithms and environments -::: - -Warning: all times start at zero. - -TODO: notations - -All measurable spaces are assumed to be standard Borel. - -:::definition "algorithm" (parent := "algorithm_environment") (lean := "Learning.Algorithm") -A sequential, stochastic algorithm with actions in a measurable space $`\mathcal{A}` and observations in a measurable space $`\mathcal{R}` is described by the following data: -- for all $`t \in \mathbb{N}`, a policy $`\pi_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow \mathcal{A}`, a Markov kernel which gives the distribution of the action of the algorithm at time $`t+1` given the history of previous actions and observations, -- $`P_0 \in \mathcal{P}(\mathcal{A})`, a probability measure that gives the distribution of the first action. -::: - -After the algorithm takes an action, the environment generates an observation according to a Markov kernel $`\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}`. - -:::definition "environment" (parent := "algorithm_environment") (lean := "Learning.Environment") -An environment with which an algorithm interacts is described by the following data: -- for all $`t \in \mathbb{N}`, a feedback $`\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}`, a Markov kernel which gives the distribution of the observation at time $`t+1` given the history of previous pulls and observations, and the action of the algorithm at time $`t+1`, -- $`\nu'_0 \in \mathcal{A} \rightsquigarrow \mathcal{R}`, a Markov kernel that gives the distribution of the first observation given the first action. -::: - - -:::definition "detAlgorithm" (parent := "algorithm_environment") (lean := "Learning.detAlgorithm") -An algorithm ({uses "algorithm"}[]) is deterministic if its initial probability measure $`P_0` is a Dirac measure and if all its policies $`\pi_t` are deterministic kernels. -::: - - -:::definition "stationaryEnv" (parent := "algorithm_environment") (lean := "Learning.stationaryEnv") -An environment ({uses "environment"}[]) is stationary if there exists a Markov kernel $`\nu : \mathcal{A} \rightsquigarrow \mathcal{R}` such that $`\nu'_0 = \nu` and for all $`t \in \mathbb{N}`, for all $`h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}`, for all $`a \in \mathcal{A}`, $`\nu_t(h_t, a) = \nu(a)`. -::: - -TODO: possibly change the _stationary_ name. - - -Let's detail four examples of interactions between an algorithm and an environment. -- *First order optimization*. The objective of the algorithm is to find the minimum of a function $`f : \mathbb{R}^d \to \mathbb{R}`. - The action space is $`\mathcal{A} = \mathbb{R}^d` (a point on which the function will be queried) and the observation space is $`\mathcal{R} = \mathbb{R} \times \mathbb{R}^d`. - The environment is described by a function $`g : \mathbb{R}^d \to \mathbb{R} \times \mathbb{R}^d` such that for all $`x \in \mathbb{R}^d`, $`g(x) = (f(x), \nabla f(x))`. That is, the kernel $`\nu_t` is deterministic and depends only on the action: it is given by $`\nu_t(h_t, x) = \delta_{g(x)}` (the Dirac measure at $`g(x)`). - An example of algorithm is gradient descent with fixed step size $`\eta > 0`: this is a deterministic algorithm defined by $`P_0 = \delta_{x_0}` for some initial point $`x_0 \in \mathbb{R}^d` and for all $`t \in \mathbb{N}`, $`\pi_t(h_t) = \delta_{x_{t+1}}` where $`x_{t+1} = x_t - \eta \nabla g_2(x_t)`. -- *Stochastic bandits*. The action space is $`\mathcal{A} = [K]` for some $`K \in \mathbb{N}` (the set of arms) and the observation space is $`\mathcal{R} = \mathbb{R}` (the reward obtained after pulling an arm). - The kernel $`\nu_t` is stationary and depends only on the action: there are probability distributions $`(P_a)_{a \in [K]}` such that for all $`t \in \mathbb{N}`, for all $`h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}`, for all $`a \in \mathcal{A}`, $`\nu_t(h_t, a) = P_a`. -- *Adversarial bandits*. The action space is $`\mathcal{A} = [K]` for some $`K \in \mathbb{N}` (the set of arms) and the observation space is $`\mathcal{R} = \mathbb{R}` (the reward obtained after pulling an arm). - The reward kernels are usually taken to be deterministic and in an _oblivious_ adversarial bandit they depend only on the time step: there is a sequence of vectors $`(r_t)_{t \in \mathbb{N}}` in $`[0,1]^K` such that for all $`t \in \mathbb{N}`, for all $`h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}`, for all $`a \in \mathcal{A}`, $`\nu_t(h_t, a) = \delta_{r_{t,a}}` (the Dirac measure at $`r_{t,a}`). -- *Reinforcement learning in Markov decision processes*. - TODO: main feature is that $`\mathcal{R} = \mathcal{S} \times \mathbb{R}` where $`\mathcal{S}` is the state space, and the kernel $`\nu_t` depends on the last state only. - - -We will want to make global probabilistic statements about the whole sequence of actions and observations. -For example, we may want to prove that an optimization algorithm converges to the minimum of a function almost surely. -For such a statement to make sense, we need a probability space on which the whole sequence of actions and observations is defined as a random variable. - -We denote by $`P(X \mid Y)` the conditional distribution of a random variable $`X` given another random variable $`Y` under a probability measure $`P`. -When we write that $`P(X \mid Y) = \kappa`, or that $`X` has conditional distribution $`\kappa` given $`Y`, the equality should be understood as holding $`Y_* P`-almost surely. - -*Lean remark*: `HasCondDistrib` - -In the Lean implementation, we define a predicate to state those almost sure equalities of conditional distributions: `HasCondDistrib X Y k P` states that under the probability measure $`P`, the random variable $`X` has conditional distribution $`k` given the random variable $`Y` (almost surely with respect to the law of $`X`). -For convenience, the predicate also records that both random variables are almost everywhere measurable. - - -:::definition "history" (parent := "algorithm_environment") (lean := "Learning.IsAlgEnvSeq.hist, Learning.IsAlgEnvSeq.step") -For two sequences of random variables $`A : \mathbb{N} \to \Omega \to \mathcal{A}` and $`R : \mathbb{N} \to \Omega \to \mathcal{R}` (actions and observations), we call step of the interaction at time $`t` the random variable $`X_t : \Omega \to \mathcal{A} \times \mathcal{R}` defined by $`X_t(\omega) = (A_t(\omega), R_t(\omega))`. -We call history up to time $`t` the random variable $`H_t : \Omega \to (\mathcal{A} \times \mathcal{R})^{t+1}` defined by $`H_t(\omega) = (X_0(\omega), \ldots, X_t(\omega))`. -::: - - -:::definition "IsAlgEnvSeq" (parent := "algorithm_environment") (lean := "Learning.IsAlgEnvSeq") -Let $`\mathfrak{A}` be an algorithm ({uses "algorithm"}[]) and $`\mathfrak{E}` be an environment ({uses "environment"}[]). -A probability space $`(\Omega, P)` and two sequences of random variables $`A : \mathbb{N} \to \Omega \to \mathcal{A}` and $`R : \mathbb{N} \to \Omega \to \mathcal{R}` form an algorithm-environment interaction for $`\mathfrak{A}` and $`\mathfrak{E}` if the following conditions hold: -1. The law of $`A_0` is $`P_0`. -2. $`P \left( R_0 \mid A_0 \right) = \nu'_0`. -3. For all $`t \in \mathbb{N}`, $`P\left(A_{t+1} \mid A_0, R_0, \ldots, A_t, R_t \right) = \pi_t`. -4. For all $`t \in \mathbb{N}`, $`P\left(R_{t+1} \mid A_0, R_0, \ldots, A_t, R_t, A_{t+1}\right) = \nu_t`. - -Uses: {uses "history"}[] -::: - - -:::lemma_ "law_step" (parent := "algorithm_environment") (lean := "Learning.IsAlgEnvSeq.hasLaw_step_zero, Learning.IsAlgEnvSeq.hasCondDistrib_step") -In an algorithm-environment interaction $`(A, R, P)` as in {uses "IsAlgEnvSeq"}[], -- the law of the initial step $`X_0` is $`P_0 \otimes \nu'_0`, -- for all $`t \in \mathbb{N}`, $`P \left( X_{t+1} \mid H_t \right) = \pi_t \otimes \nu_t`. -::: - -:::proof "law_step" -Immediate from the properties of an algorithm-environment interaction. -::: - - -:::definition "IsAlgEnvSeq.filtration" (parent := "algorithm_environment") (lean := "Learning.IsAlgEnvSeq.filtration, Learning.IsAlgEnvSeq.filtrationAction") -For an algorithm-environment interaction $`(A, R, P)` as in {uses "IsAlgEnvSeq"}[], we denote by $`\mathcal{F}_t` the sigma-algebra generated by the history up to time $`t`: $`\mathcal{F}_t = \sigma(H_t)`. -We denote by $`\mathcal{F}^A_t` the sigma-algebra generated by the history up to time $`t-1` and the action at time $`t`: $`\mathcal{F}^A_t = \sigma(H_{t-1}, A_t)`. -::: - - -:::lemma_ "IsAlgEnvSeq.adapted" (parent := "algorithm_environment") (lean := "Learning.IsAlgEnvSeq.adapted_step, Learning.IsAlgEnvSeq.adapted_hist, Learning.IsAlgEnvSeq.adapted_action, Learning.IsAlgEnvSeq.adapted_feedback") -The history, step, action and observation processes ({uses "history"}[]) are adapted to the filtration $`(\mathcal{F}_t)_{t \in \mathbb{N}}` ({uses "IsAlgEnvSeq.filtration"}[]). -::: - -:::proof "IsAlgEnvSeq.adapted" -By definition of the filtration. -::: - - -:::theorem "isAlgEnvSeq_unique" (parent := "algorithm_environment") (lean := "Learning.isAlgEnvSeq_unique") -If $`(A, R, P)` and $`(A', R', P')` are two {uses "IsAlgEnvSeq"}[algorithm-environment interactions] for the same {uses "algorithm"}[algorithm] $`\mathfrak{A}` and {uses "environment"}[environment] $`\mathfrak{E}`, then the joint distributions of the sequences of actions and observations are equal: the law of $`(A_i, R_i)_{i \in \mathbb{N}}` under $`P` is equal to the law of $`(A'_i, R'_i)_{i \in \mathbb{N}}` under $`P'`. - -This is Proposition 4.8 in {Informal.citep lattimore2020bandit}[]. -::: - -:::proof "isAlgEnvSeq_unique" -Uses: {uses "ionescu-tulcea"}[], {uses "law_step"}[], {uses "trajMeasure"}[] -::: - - - - -# Stationary environment - -:::group "stationary_environment" -Stationary environments -::: - -Recall that in a stationary environment, there exists a Markov kernel $`\nu : \mathcal{A} \rightsquigarrow \mathcal{R}` such that $`\nu'_0 = \nu` and for all $`t \in \mathbb{N}`, for all $`h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}`, for all $`a \in \mathcal{A}`, $`\nu_t(h_t, a) = \nu(a)`. - -Let $`(A, R, P)` be an algorithm-environment interaction in a stationary environment with kernel $`\nu`. - -:::lemma_ "condDistrib_feedback_stationaryEnv" (parent := "stationary_environment") (lean := "Learning.IsAlgEnvSeq.condDistrib_feedback_stationaryEnv") -In a {uses "stationaryEnv"}[stationary environment], an {uses "IsAlgEnvSeq"}[algorithm-environment interaction] satisfies for any $`t \in \mathbb{N}`, $`P\left(R_t \mid A_t\right) = \nu`. -::: - -:::proof "condDistrib_feedback_stationaryEnv" -Uses: {uses "law_step"}[] -::: - - -::: lemma_ "condIndepFun_feedback_hist_action" (parent := "stationary_environment") (lean := "Learning.IsAlgEnvSeq.condIndepFun_feedback_hist_action") -For an {uses "IsAlgEnvSeq"}[algorithm-environment interaction] in a {uses "stationaryEnv"}[stationary environment], for any $`t \in \mathbb{N}`, the reward $`R_{t+1}` is conditionally independent of the history $`H_t` given the action $`A_{t+1}` (more succinctly, $`R_{t+1} \ind H_t \mid A_{t+1}`). -::: - -:::proof "condIndepFun_feedback_hist_action" -::: - - - -# Probability space: Ionescu-Tulcea theorem - -We saw that the distribution of the sequence of actions and observations in a suitable probability space is uniquely determined by the algorithm and the environment. -We now show that such a probability space actually exists: for any algorithm and environment, we build an algorithm-environment interaction. - -:::group "ionescu_tulcea" -Ionescu-Tulcea theorem -::: - -## Ionescu-Tulcea theorem - -If we group together the policy of the algorithm and the kernel of the environment at each time step, we get a sequence of Markov kernels $`(\kappa_t)_{t \in \mathbb{N}}`, with $`\kappa_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow (\mathcal{A} \times \mathcal{R})`. - - -We now abstract that situation and consider a sequence of measurable spaces $`(\Omega_t)_{t \in \mathbb{N}}`, a probability measure $`\mu` on $`\Omega_0` and a sequence of Markov kernels $`\kappa_t : \prod_{s=0}^t \Omega_s \rightsquigarrow \Omega_{t+1}`. -The Ionescu-Tulcea theorem builds a probability space from the sequence of kernels and the initial measure. - - -:::theorem "ionescu-tulcea" (parent := "ionescu_tulcea") (lean := "ProbabilityTheory.Kernel.traj") -Let $`(\Omega_t)_{t \in \mathbb{N}}` be a family of measurable spaces. Let $`(\kappa_t)_{t \in \mathbb{N}}` be a family of Markov kernels such that for any $`t`, $`\kappa_t` is a kernel from $`\prod_{i=0}^t \Omega_{i}` to $`\Omega_{t+1}`. -Then there exists a unique Markov kernel $`\xi : \Omega_0 \rightsquigarrow \prod_{i = 1}^{\infty} \Omega_{i}` such that for any $n \ge 1$, -$`\pi_{[1,n]*} \xi = \kappa_0 \otimes \ldots \otimes \kappa_{n-1}`. -Here $`\pi_{[1,n]} : \prod_{i=1}^{\infty} \Omega_i \to \prod_{i=1}^n \Omega_i` is the projection on the first $`n` coordinates. -::: - -The Ionescu-Tulcea theorem in Mathlib {Informal.citep marion2025formalization}[] actually generates kernels $`\xi_t : \prod_{s=0}^t \Omega_s \rightsquigarrow \prod_{s=0}^{\infty} \Omega_s` for any $`t`, with the property that the kernels are the identity on the first $`t+1` coordinates. - -:::definition "trajMeasure" (parent := "ionescu_tulcea") (lean := "ProbabilityTheory.Kernel.trajMeasure") -For $`\mu \in \mathcal{P}(\Omega_0)`, we call trajectory measure the probability measure $`\xi_0 \circ \mu` on $`\Omega_{\mathcal{T}} := \prod_{i=0}^{\infty} \Omega_i`. -We denote it by $`P_{\mathcal{T}}`. -The $`\mathcal{T}` subscript stands for _trajectory_. -::: - - -:::definition "IT.history" (parent := "ionescu_tulcea") (lean := "Learning.IT.hist, Learning.IT.step") -For $`t \in \mathbb{N}`, we denote by $`X_t \in \Omega_t` the random variable describing the time step $`t`, and by $`H_t \in \prod_{s=0}^t \Omega_s` the history up to time $`t`. -Formally, these are measurable functions on $`\Omega_{\mathcal{T}}`, defined by $`X_t(\omega) = \omega_t` and $`H_t(\omega) = (\omega_1, \ldots, \omega_t)`. -::: - -Note: $`(X_t)_{t \in \mathbb{N}}` is the canonical process on $`\Omega_{\mathcal{T}}`. $`H_t` is equal to $`\pi_{[0,t]}`. - - -:::definition "IT.filtration" (parent := "ionescu_tulcea") (lean := "Learning.IT.filtration") -For $`t \in \mathbb{N}`, we denote by $`\mathcal{F}_t` the sigma-algebra generated by the {uses "IT.history"}[history] up to time $`t`: $`\mathcal{F}_t = \sigma(H_t)`. -The family $`(\mathcal{F}_t)_{t \in \mathbb{N}}` is a filtration on $`\Omega_{\mathcal{T}}`. -::: - -$`(\mathcal{F}_t)_{t \in \mathbb{N}}` is the canonical filtration on $`\Omega_{\mathcal{T}}`, and is the natural filtration for the canonical process $`(X_t)_{t \in \mathbb{N}}`. - -:::lemma_ "IT.adapted_history" (parent := "ionescu_tulcea") (lean := "Learning.IT.adapted_step, Learning.IT.adapted_hist") -The random variables $`X_t` and $`H_t` ({uses "IT.history"}[]) are $`\mathcal{F}_t`-measurable. -Said differently, the processes $`(X_t)_{t \in \mathbb{N}}` and $`(H_t)_{t \in \mathbb{N}}` are adapted to the {uses "IT.filtration"}[filtration] $`(\mathcal{F}_t)_{t \in \mathbb{N}}`. -::: - - -:::lemma_ "IT.condDistrib_X_add_one" (parent := "ionescu_tulcea") (lean := "ProbabilityTheory.Kernel.condDistrib_trajMeasure") -For any $`t \in \mathbb{N}`, $`P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \kappa_t`. - -Uses: {uses "IT.history"}[], {uses "ionescu-tulcea"}[], {uses "trajMeasure"}[] -::: - -:::proof "IT.condDistrib_X_add_one" -This is proved through the defining property of the conditional distribution: it is the almost surely unique Markov kernel $`\eta` such that $`((H_t)_* P_{\mathcal{T}}) \otimes \eta = (H_t, X_{t+1})_*P_{\mathcal{T}}`. - -TODO: complete proof. -::: - - -:::lemma_ "IT.law_X_zero" (parent := "ionescu_tulcea") (lean := "Learning.IsAlgEnvSeq.hasLaw_step_zero") -The law of $`X_0` under $`P_{\mathcal{T}}` is $`\mu`. - -Uses: {uses "IT.history"}[], {uses "trajMeasure"}[]. -::: - - - -## Case of an algorithm-environment interaction - -We now go back to the setting of an algorithm interacting with an environment and suppose that $`\Omega_t = \mathcal{A} \times \mathcal{R}` for some measurable spaces $`\mathcal{A}` and $`\mathcal{R}`, and that for all $`t \in \mathbb{N}`, $`\kappa_t = \pi_t \otimes \nu_t` for policy kernels $`\pi_t : (\mathcal{A} \times \mathcal{R})^{t+1} \rightsquigarrow \mathcal{A}` and feedback kernels $`\nu_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times \mathcal{A} \rightsquigarrow \mathcal{R}`. -Likewise, $`\mu = P_0 \otimes \nu'_0` for a probability measure $`P_0` on $`\mathcal{A}` and a Markov kernel $`\nu'_0 : \mathcal{A} \rightsquigarrow \mathcal{R}`. -The step random variable $`X_t` takes values in $`\mathcal{A} \times \mathcal{R}`. - -:::definition "IT.actionReward" (parent := "ionescu_tulcea") (lean := "Learning.IT.action, Learning.IT.feedback") -We write $`A_t` and $`R_t` for the projections of $`X_t` ({uses "IT.history"}[]) on $`\mathcal{A}` and $`\mathcal{R}` respectively. -$`A_t` is the action taken at time $`t` and $`R_t` is the reward received at time $`t`. -Formally, $`A_t(\omega) = \omega_{t,1}` and $`R_t(\omega) = \omega_{t,2}` for $`\omega = \prod_{t=0}^{+\infty}(\omega_{t,1}, \omega_{t,2}) \in \Omega_{\mathcal{T}} = \prod_{t=0}^{+\infty} \mathcal{A} \times \mathcal{R}`. -::: - - -:::lemma_ "IT.adapted_action_feedback" (parent := "ionescu_tulcea") (lean := "Learning.IT.adapted_action, Learning.IT.adapted_feedback") -The random variables $`A_t` and $`R_t` ({uses "IT.actionReward"}[]) are $`\mathcal{F}_t`-measurable. -Said differently, the processes $`(A_t)_{t \in \mathbb{N}}` and $`(R_t)_{t \in \mathbb{N}}` are adapted to the {uses "IT.filtration"}[filtration] $`(\mathcal{F}_t)_{t \in \mathbb{N}}`. -::: - -:::proof "IT.adapted_action_feedback" -Uses: {uses "IT.adapted_history"}[]. -::: - - -We need to check that the random variables $`A_t` and $`R_t` have the expected conditional distributions. - -:::lemma_ "IT.condDistrib_A_add_one" (parent := "ionescu_tulcea") (lean := "Learning.IT.condDistrib_action") -For any $`t \in \mathbb{N}`, $`P_{\mathcal{T}}\left(A_{t+1} \mid H_t\right) = \pi_t`. - -Uses: {uses "environment"}[], {uses "algorithm"}[], {uses "ionescu-tulcea"}[], {uses "IT.actionReward"}[], {uses "trajMeasure"}[], {uses "IT.history"}[]. -::: - -:::proof "IT.condDistrib_A_add_one" -By {uses "IT.condDistrib_X_add_one"}[], $`P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \kappa_t = \pi_t \otimes \nu_t`. -Since $`A_{t+1}` is the projection of $`X_{t+1}` on $`\mathcal{A}`, $`P_{\mathcal{T}}\left(A_{t+1} \mid H_t\right)` is $`((H_t)_* P_{\mathcal{T}})`-almost surely equal to the projection of $`\kappa_t` on $`\mathcal{A}`, which is $`\pi_t`. -::: - - -:::lemma_ "IT.condDistrib_R_add_one" (parent := "ionescu_tulcea") (lean := "Learning.IT.condDistrib_feedback") -For any $`t \in \mathbb{N}`, $`P_{\mathcal{T}}\left(R_{t+1} \mid H_t, A_{t+1}\right) = \nu_t`. - -Uses: {uses "environment"}[], {uses "algorithm"}[], {uses "ionescu-tulcea"}[], {uses "IT.actionReward"}[], {uses "trajMeasure"}[], {uses "IT.history"}[]. -::: - -:::proof "IT.condDistrib_R_add_one" -It suffices to show that $`((H_t, A_{t+1})_* P_{\mathcal{T}}) \otimes \nu_t = (H_t, A_{t+1}, R_{t+1})_* P_{\mathcal{T}} = (H_t, X_{t+1})_* P_{\mathcal{T}}`. -By {uses "IT.condDistrib_X_add_one"}[], $`P_{\mathcal{T}}\left(X_{t+1} \mid H_t\right) = \pi_t \otimes \nu_t`. -Thus $`((H_t)_* P_{\mathcal{T}}) \otimes (\pi_t \otimes \nu_t) = (H_t, X_{t+1})_* P_{\mathcal{T}}`. - -We thus have to prove that $`((H_t)_* P_{\mathcal{T}}) \otimes (\pi_t \otimes \nu_t) = ((H_t, A_{t+1})_* P_{\mathcal{T}}) \otimes \nu_t`. - -By {uses "IT.condDistrib_A_add_one"}[], $`(H_t, A_{t+1})_* P_{\mathcal{T}} = (H_t)_* P_{\mathcal{T}} \otimes \pi_t`, and replacing this in the right-hand side gives the left-hand side (using associativity of the composition-product). -::: - - -:::lemma_ "IT.law_A_zero" (parent := "ionescu_tulcea") (lean := "Learning.IT.hasLaw_action_zero") -The law of $`A_0` under $`P_{\mathcal{T}}` is $`P_0`. - -Uses: {uses "environment"}[], {uses "algorithm"}[], {uses "IT.actionReward"}[], {uses "trajMeasure"}[]. -::: - -:::proof "IT.law_A_zero" -$`X_0` has law $`\mu = P_0 \otimes \nu'_0`. $`A_0` is the projection of $`X_0` on the first space $`\mathcal{A}` and $`\nu_0'` is Markov, so $`A_0` has law $`P_0`. - -Uses: {uses "ionescu-tulcea"}[], {uses "IT.history"}[], {uses "IT.law_X_zero"}[]. -::: - - -:::lemma_ "IT.condDistrib_R_zero" (parent := "ionescu_tulcea") (lean := "Learning.IT.condDistrib_feedback_zero") -$`P_{\mathcal{T}}\left(R_0 \mid A_0\right) = \nu'_0`. - -Uses: {uses "environment"}[], {uses "algorithm"}[], {uses "IT.actionReward"}[], {uses "trajMeasure"}[], {uses "ionescu-tulcea"}[]. -::: - -:::proof "IT.condDistrib_R_zero" -To prove almost sure equality, it is enough to prove that $`(A_{0*} P_{\mathcal{T}}) \otimes P_{\mathcal{T}}\left(R_0 \mid A_0\right) = (A_{0*} P_{\mathcal{T}}) \otimes \nu'_0`. -By definition of the conditional distribution, we have $`(A_{0*} P_{\mathcal{T}}) \otimes P_{\mathcal{T}}\left(R_0 \mid A_0\right) = (A_0, R_0)_* P_{\mathcal{T}} = X_{0*} P_{\mathcal{T}}`. -By {uses "IT.law_X_zero"}[], $`X_{0*} P_{\mathcal{T}} = \mu = P_0 \otimes \nu'_0`. -By {uses "IT.law_A_zero"}[], $`A_{0*} P_{\mathcal{T}} = P_0`. -Thus the two sides are equal. -::: - - -:::theorem "isAlgEnvSeq_trajMeasure" (parent := "ionescu_tulcea") (lean := "Learning.IT.isAlgEnvSeq_trajMeasure") -In the {uses "trajMeasure"}[probability space $`(\Omega_{\mathcal{T}}, P_{\mathcal{T}})`] constructed from an algorithm $`\mathfrak{A}` and an environment $`\mathfrak{E}` as above, the sequences of random variables $`A : \mathbb{N} \to \Omega_{\mathcal{T}} \to \mathcal{A}` and $`R : \mathbb{N} \to \Omega_{\mathcal{T}} \to \mathcal{R}` form an {uses "IsAlgEnvSeq"}[algorithm-environment interaction] for $`\mathfrak{A}` and $`\mathfrak{E}`. - -Uses: {uses "ionescu-tulcea"}[], {uses "IT.actionReward"}[]. -::: - -:::proof "isAlgEnvSeq_trajMeasure" -The four conditions of {uses "IsAlgEnvSeq"}[] are exactly the statements of {uses "IT.law_A_zero"}[], {uses "IT.condDistrib_R_zero"}[], {uses "IT.condDistrib_A_add_one"}[] and {uses "IT.condDistrib_R_add_one"}[]. -::: - - - -# Finitely many actions - -:::group "finite_actions" -Finite action space -::: - -When the number of actions is finite, it makes sense to count how many times each action was chosen up to a certain time. -We can also define the time step at which an action was chosen a certain number of times, and the value of the reward obtained when pulling an action for the $m$-th time. - -:::definition "pullCount" (parent := "finite_actions") (lean := "Learning.pullCount") -For an action $`a \in \mathcal{A}` and a time $`t \in \mathbb{N}`, we denote by $`N_{t,a}` the number of times that action $`a` has been chosen before time $`t`, that is $`N_{t,a} = \sum_{s=0}^{t-1} \mathbb{I}\{A_s = a\}`. -::: - -Note that the sum goes up to $`t-1`, so that $`N_{t,a}` counts the number of times action $`a` was chosen _before_ time $`t`. - - -*Remark: Building vs analyzing algorithms* - -When we describe an algorithm, we give the data of the policies $`\pi_t`, which are functions of the partial history up to time $`t`, in $`(\mathcal{A} \times \mathcal{R})^{t+1}`. -That means that any tool used to define a policy must be a function defined on $`(\mathcal{A} \times \mathcal{R})^{t+1}`. -For example a definition of the empirical mean of an action must be a function $`t : \mathbb{N} \to (\mathcal{A} \times \mathcal{R})^{t+1} \to \mathbb{R}`. - -When we analyze an algorithm, we work on the other hand on a probability space $`(\Omega, P)`, in which $`\Omega` could be for example $`(\mathcal{A} \times \mathcal{R})^{\mathbb{N}}`, the full history, which describes the whole sequence of actions and rewards. -As a stochastic process, the empirical mean of an action is a function $`\mathbb{N} \to (\mathcal{A} \times \mathcal{R})^{\mathbb{N}} \to \mathbb{R}`. - -Thus there are two similar but still distinct types of objects: those defined on the partial history, which are used to build algorithms, and those defined on a generic probability space (the full history in the Ionescu-Tulcea construction), which are used to analyze algorithms. - - -:::lemma_ "pullCount_basic" (parent := "finite_actions") (lean := "Learning.pullCount_zero, Learning.pullCount_mono, Learning.pullCount_add_one, Learning.pullCount_le, Learning.pullCount_congr") -We note the following basic properties of {uses "pullCount"}[$`N_{t,a}`]: -- $`N_{0,a} = 0`. -- $`N_{t,a}` is non-decreasing in $`t`. -- $`N_{t + 1, A_t} = N_{t, A_t} + 1` and for $`a \ne A_t`, $`N_{t + 1, a} = N_{t, a}`. -- $`N_{t, a} \le t`. -- If for all $`s \le t`, $`A_s(\omega) = A_s(\omega')`, then $`N_{t+1, a}(\omega) = N_{t+1, a}(\omega')`. -::: - - -:::lemma_ "predictable_pullCount" (parent := "finite_actions") (lean := "Learning.isPredictable_pullCount") -Let $`a \in \mathcal{A}`. The process {uses "pullCount"}[$`(N_{t,a})_{t \in \mathbb{N}}`] is predictable with respect to the {uses "IsAlgEnvSeq.filtration"}[filtration $`\mathcal{F}`] of the algorithm-environment interaction. -::: - -:::proof "predictable_pullCount" -Uses: {uses "history"}[], {uses "pullCount_basic"}[] -::: - - -:::definition "stepsUntil" (parent := "finite_actions") (lean := "Learning.stepsUntil") -For an action $`a \in \mathcal{A}` and a time $`n \in \mathbb{N}`, we denote by $`T_{n,a} \in \mathbb{N} \cup \{+\infty\}` the time at which action $`a` was chosen for the $`n`-th time, that is $`T_{n,a} = \min\{s \in \mathbb{N} \mid N_{s+1,a} = n\}`. -Note that $`T_{n, a}` can be infinite if the action is not chosen $`n` times. - -Uses: {uses "pullCount"}[] -::: - -By definition, $`T_{n, a}` is the hitting time of the set $`\{n\}` by the process $`t \mapsto N_{t+1,a}`, which is adapted since $`N_{t,a}` is predictable. -Equivalently, $`T_{n, a}` is the hitting time of the set $`[n, +\infty]` by that process. - - -:::lemma_ "stepsUntil_basic" (parent := "finite_actions") (lean := "Learning.stepsUntil_zero_of_ne, Learning.stepsUntil_zero_of_eq, Learning.stepsUntil_pullCount_le, Learning.stepsUntil_pullCount_eq, Learning.action_stepsUntil, Learning.pullCount_stepsUntil_add_one, Learning.pullCount_stepsUntil") -We note the following basic properties of {uses "stepsUntil"}[$`T_{n,a}`]: -- $`T_{0,a} = 0` for $`a \ne A_0`. $`T_{0,A_0} = \infty`. -- $`T_{N_{t+1, a}, a} \le t`. -- $`T_{N_{t + 1, A_t}, A_t} = t`. -- If $`T_{n, a} \ne \infty` and $`n > 0`, then $`A_{T_{n, a}} = a`. -- If $`T_{n, a} \ne \infty`, then $`N_{T_{n, a} + 1, a} = n`. -- If $`T_{n, a} \ne \infty` and $`n > 0`, then $`N_{T_{n, a}, a} = n - 1`. -- If for all $`s \le t`, $`A_s(\omega) = A_s(\omega')`, then $`T_{n, a}(\omega) = t \iff T_{n, a}(\omega') = t`. -::: - -:::proof "stepsUntil_basic" -Uses: {uses "pullCount_basic"}[] -::: - - -:::lemma_ "isStoppingTime_stepsUntil" (parent := "finite_actions") (lean := "Learning.isStoppingTime_stepsUntil") -Let $`a \in \mathcal{A}`. For any $`n > 0`, the random variable {uses "stepsUntil"}[$`T_{n,a}`] is a stopping time with respect to the {uses "IsAlgEnvSeq.filtration"}[filtration $`\mathcal{F}`]. -::: - -:::proof "isStoppingTime_stepsUntil" -A hitting time of a set by an adapted process is a stopping time. - -Uses: {uses "pullCount_basic"}[] -::: - - -Let $`\Omega' = \mathcal{R}^{\mathbb{N} \times \mathcal{A}}` and let $`\Omega = \Omega_{\mathcal{T}} \times \Omega'` (which will be an extension of the trajectory probability space once we choose a measure on $`\Omega'`). -Let $`Z_{n, a} : \Omega \to \mathcal{R}` be the projection on the coordinate indexed by $`(n,a)` in $`\Omega'`. -Extending the probability space in that way allows us to define without ambiguity the reward received when choosing an action for the $`n`-th time, even if that action is never actually chosen $`n` times. - - -:::definition "rewardByCount" (parent := "finite_actions") (lean := "Learning.rewardByCount") -We define $`Y_{n, a} = R_{T_{n,a}} \mathbb{I}\{T_{n, a} < \infty\} + Z_{n,a} \mathbb{I}\{T_{n, a} = \infty\}`, the reward received when choosing action $`a` for the $`n`-th time if {uses "stepsUntil"}[that time] is finite, and equal to $`Z_{n,a}` otherwise. -In that expression, we see $`R_{T_{n,a}}` and $`T_{n, a}` as random variables on $`\Omega` instead of $`\Omega_{\mathcal{T}}`. -::: - - -:::lemma_ "rewardByCount_pullCount" (parent := "finite_actions") (lean := "Learning.rewardByCount_pullCount_add_one_eq_reward") -$`Y_{N_{t, A_t} + 1, A_t} = R_t`. - -Uses: {uses "rewardByCount"}[], {uses "pullCount"}[] -::: - -:::proof "rewardByCount_pullCount" -This is perhaps hard to parse at first sight, but it follows directly from the definitions. -At time $t$, the action chosen is $`A_t` and we see a reward $`R_t`. -That action had already been chosen $`N_{t, A_t}` times before time $t$, so the reward $`R_t` is the reward received when choosing action $`A_t` for the $`(N_{t, A_t} + 1)`-th time, which is $`Y_{N_{t, A_t} + 1, A_t}` by definition. - -Uses: {uses "stepsUntil_basic"}[]. -::: - - - -# Scalar rewards - -TODO: change the name _reward_ to _observation_ throughout the chapter? - -We now focus on the case where the reward space is $`\mathcal{R} = \mathbb{R}`. - -:::group "scalar_rewards" -Scalar rewards -::: - -:::definition "sumRewards" (parent := "scalar_rewards") (lean := "Learning.sumRewards") -Let $`S_{t, a} = \sum_{s=0}^{t-1} R_s \mathbb{I}\{A_s = a\}` be the sum of the rewards obtained by chosing action $`a` before time $`t`. -::: - - -:::definition "empMean" (parent := "scalar_rewards") (lean := "Learning.empMean") -Let $`\hat{\mu}_{t, a} = \frac{S_{t, a}}{N_{t, a}} = \frac{1}{N_{t,a}} \sum_{s=0}^{t-1} R_s \mathbb{I}\{A_s = a\}` if $`N_{t, a} > 0`, and $`\hat{\mu}_{t, a} = 0` otherwise. -This is the empirical mean of the rewards obtained by choosing action $`a` before time $`t`. - -Uses: {uses "sumRewards"}[], {uses "pullCount"}[] -::: - -Note: in bandit papers it is common to (implicitly) define the empirical mean as $`+\infty` when the action was never chosen, but in Lean it has to be a real number, and the Lean default value for division by zero is $`0`. - - -:::lemma_ "isPredictable_sumRewards" (parent := "scalar_rewards") (lean := "Learning.IsAlgEnvSeq.isPredictable_sumRewards, Learning.IsAlgEnvSeq.isPredictable_empMean") -The processes {uses "sumRewards"}[$`(S_{t,a})_{t \in \mathbb{N}}`] and {uses "empMean"}[$`(\hat{\mu}_{t,a})_{t \in \mathbb{N}}`] are predictable with respect to the {uses "IsAlgEnvSeq.filtration"}[filtration $`\mathcal{F}`] of the algorithm-environment interaction. -::: - -:::proof "isPredictable_sumRewards" -Uses: {uses "predictable_pullCount"}[], {uses "sumRewards"}[], {uses "empMean"}[] -::: - - -The following lemma is very useful to relate the two ways of indexing the rewards: by time step and by pull count. - -:::lemma_ "sum_rewardByCount" (parent := "scalar_rewards") (lean := "Learning.sum_rewardByCount_eq_sumRewards") -The sum of the first {uses "pullCount"}[$`N_{t, a}`] rewards received when choosing action $`a` is equal to the sum of the rewards obtained by choosing action $`a` before time $`t`: -$$`\sum_{n=1}^{N_{t, a}} Y_{n, a} = S_{t,a} \: .` - -Uses: {uses "rewardByCount"}[], {uses "sumRewards"}[]. -::: - -:::proof "sum_rewardByCount" -Uses: {uses "rewardByCount_pullCount"}[]. -::: diff --git a/verso_blueprint/LMLBlueprint/Chapters/Bandit.lean b/verso_blueprint/LMLBlueprint/Chapters/Bandit.lean deleted file mode 100644 index c3a5c74b..00000000 --- a/verso_blueprint/LMLBlueprint/Chapters/Bandit.lean +++ /dev/null @@ -1,543 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint -import LeanMachineLearning.SequentialLearning.Deterministic -import LeanMachineLearning.SequentialLearning.FiniteActions -import LeanMachineLearning.SequentialLearning.IonescuTulceaSpace -import LeanMachineLearning.SequentialLearning.StationaryEnv -import LeanMachineLearning.Online.Bandit.ArrayProbSpace -import LeanMachineLearning.Online.Bandit.Regret -import LeanMachineLearning.Online.Bandit.RewardByCountMeasure -import LMLBlueprint.References -import LMLBlueprint.TeXPrelude - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -#doc (Manual) "Stochastic multi-armed bandits" => - -A bandit algorithm is an algorithm in the sense of Definition TODO FIND OUT HOW TO REFERENCE OUTSIDE OF ENVIRONMENTS. -We call the actions _arms_ and the observations _rewards_. - -The first arm pulled by the algorithm is sampled from $`P_0`, the arm pulled at time $`1` is sampled from $`\pi_0(H_0)`, in which $`H_0 \in \mathcal{A} \times \mathcal{R}` is the data of the first arm pulled and the first observation received, and so on. - -A stochastic bandit is simply a reward distribution for each arm: a Markov kernel $`\nu : \mathcal{A} \rightsquigarrow \mathbb{R}`, conditional distribution of the rewards given the arm pulled. -It is a stationary environment in which the observation space is $`\mathcal{R} = \mathbb{R}`. - -An algorithm can interact with a bandit to produce a sequence of arms and rewards: after a time $`t`, the history $`H_t \in (\mathcal{A} \times \mathcal{R})^{t+1}` contains the arms pulled and rewards received up to that time, -- the algorithm chooses an arm $`A_{t+1}` sampled according to its policy $`\pi_t(H_t)`, -- the bandit generates a reward $`R_{t+1}` according to the distribution $`\nu(A_{t+1})`, -- the history is updated to $`H_{t+1} = ((A_0, R_0), \ldots, (A_{t+1}, R_{t+1}))`. - - - -# The array model of rewards - -:::group "bandit_space" -Probability space for stochastic multi-armed bandits -::: - -We previously built a probability space on which we can define the sequence of arms and rewards generated by the interaction between the algorithm and the bandit, using the Ionescu-Tulcea theorem. -From Theorem isAlgEnvSeq\_unique (TODO REF), we know that the law of the sequence of arms and rewards is independent of the probability space used to define them. -Nonetheless, we now build an alternative model of the rewards, on which it will be easier to prove concentration inequalities. -By the uniqueness of the law, these statements will then transfer to any algorithm-environment interaction. - -In the _array model_, we consider a probability space on which we have an infinite array of rewards from each arm, independent from each other. -When pulling an arm, the algorithm sees the next previously unseen reward from that arm in the array. - -:::definition "arrayMeasure" (parent := "bandit_space") (lean := "Bandits.ArrayModel.arrayMeasure, Bandits.ArrayModel.probSpace") -Let $`I = [0,1]` and let $`P_U` be the uniform distribution on $`I`. We define the probability space $`(\Omega_{\mathcal{A}}, P_{\mathcal{A}})`, where -- $` \Omega_{\mathcal{A}} := I^{\mathbb{N}} \times \mathcal{R}^{\mathbb{N} \times \mathcal{A}}` , -- $`P_{\mathcal{A}} := \left( \bigotimes_{n \in \mathbb{N}} P_U \right) \otimes \left( \bigotimes_{n \in \mathbb{N}, a \in \mathcal{A}} \nu(a) \right)` . - -Uses: {uses "ionescu-tulcea"}[]. -::: - - -:::definition "algFunction" (parent := "bandit_space") (lean := "Bandits.ArrayModel.algFunction, Bandits.ArrayModel.initAlgFunction") -Let $`\mathfrak{A}` be an {uses "algorithm"}[algorithm] with action space $`\mathcal{A}` and reward space $`\mathcal{R}`, policy $`\pi` and initial distribution $`P_0`. -For $`\mathcal{A}` and $`\mathcal{R}` standard Borel spaces, there exists jointly measurable functions $`f'_0 : I \to \mathcal{A}` and $`f_t : (\mathcal{A} \times \mathcal{R})^{t+1} \times I \to \mathcal{A}` such that -- the law of $`f'_0` is $`P_0`, -- for all history $`h_t \in (\mathcal{A} \times \mathcal{R})^{t+1}`, the law of $`f_t(h_t, \cdot)` is $`\pi_t(h_t)`. -::: - - -:::definition "AM.history" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hist, Bandits.ArrayModel.action, Bandits.ArrayModel.reward") -The history, actions and rewards on the {uses "arrayMeasure"}[array model probability space] $`(\Omega_{\mathcal{A}}, P_{\mathcal{A}})` are defined as follows: -- the action at time $`0` is $`A_0(\omega) = f'_0(\omega_{1,0})`, the reward at time $`0` is $`R_0(\omega) = \omega_{2,0,A_0(\omega)}`, and the history at time $`0` is $`H_0(\omega) = (A_0(\omega), R_0(\omega))`, -- for $`t \ge 0`, the action at time $`t+1` is $`A_{t+1}(\omega) = f_t(H_t(\omega), \omega_{1,t+1})`, the reward at time $`t+1` is $`R_{t+1}(\omega) = \omega_{2,N_{t+1,A_{t+1}(\omega)},A_{t+1}(\omega)}`, and the history at time $`t+1` is $`H_{t+1}(\omega) = (H_t(\omega), (A_{t+1}(\omega), R_{t+1}(\omega)))`. - -Uses: {uses "algFunction"}[], {uses "pullCount"}[]. -::: - - -The goal of this section is to show that $`(\Omega_{\mathcal{A}}, P_{\mathcal{A}})` with the actions and rewards defined above is an algorithm-environment sequence. - - - -## Measurability - -TODO: some of those results are proved for $`\mathcal{A}` countable. Add that assumption where needed. - -*Remark: Proving measurability with respect to a sub-sigma-algebra* - -In this section, we often need to prove that a random variable $`X` is measurable with respect to the sigma-algebra generated by a subset of the independent random variables defining the probability space $`\Omega_{\mathcal{A}}`. -We want to prove that $`X : \Omega_{\mathcal{A}} \to \mathcal{X}` is measurable with respect to the sigma-algebra $`\sigma((\omega_p)_{p \in S})`, where $`S` is a subset of the indices of the independent random variables defining $`\Omega_{\mathcal{A}}`. -In most cases, this is due to $`X` being defined (possibly recursively in a complicated way) only using those random variables. -However, it might be difficult to exhibit an explicit function $`f` such that $`X = f((\omega_p)_{p \in S})`. - -Here is a general strategy to prove such measurability results in Lean: -1. Prove that $`X` is measurable with respect to the full sigma-algebra on $`\Omega_{\mathcal{A}}`. -2. Prove a congruence lemma: for any $`\omega, \omega' \in \Omega_{\mathcal{A}}`, if $`\omega_p = \omega'_p` for all $`p \in S`, then $`X(\omega) = X(\omega')`. -3. Define $`g : (\prod_{p \in S} \Omega_p) \to \Omega` by $`g((\omega_p)_{p \in S}) = \omega'`, where $`\omega'_p = \omega_p` for $`p \in S` and $`\omega'_p` is some fixed value for $`p \notin S`. -4. Write $`X = X \circ g \circ \mathrm{proj}_S`, where $`\mathrm{proj}_S : \Omega_{\mathcal{A}} \to \prod_{p \in S} \Omega_p` is the projection on the coordinates in $`S`. -5. Conclude that $`X` is the composition of a measurable function $`(X \circ g)` and the random variable generating the sub-sigma-algebra, and thus is measurable with respect to that sub-sigma-algebra. - - -:::lemma_ "AM.measurable_hist" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_hist, Bandits.ArrayModel.measurable_action, Bandits.ArrayModel.measurable_reward") -$`H_t`, $`N_{t,A_t}`, $`A_t` and $`R_t` are measurable for all $`t \in \mathbb{N}`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[]. -::: - -:::proof "AM.measurable_hist" -Uses: {uses "AM.history"}[]. -::: - - -:::lemma_ "AM.hist_congr" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hist_congr") -Let $`\omega, \omega' \in \Omega_{\mathcal{A}}` and $`t \in \mathbb{N}`. -Suppose that -- $`\forall s \le t, \ \omega_{1,s} = \omega'_{1,s}` , -- $`\forall a \in \mathcal{A}, \forall s < N_{t+1,a}, \ \omega_{2,s,a} = \omega'_{2,s,a}` . - -Then $`H_t(\omega) = H_t(\omega')`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.hist_congr" -Uses: {uses "AM.history"}[], {uses "pullCount_basic"}[]. -::: - - -:::lemma_ "AM.stepsUntil_congr" (parent := "bandit_space") (lean := "Bandits.ArrayModel.stepsUntil_congr") -Let $`\omega, \omega' \in \Omega_{\mathcal{A}}`, $`t, m \in \mathbb{N}` and $`a \in \mathcal{A}`. -Suppose that -- $` \omega_{1} = \omega'_{1}` , -- $`\forall s < m, \ \omega_{2,s,a} = \omega'_{2,s,a}` , -- $`\forall b \ne a, \forall s \in \mathbb{N}, \ \omega_{2,s,b} = \omega'_{2,s,b}` . - -Then $`(N_{t+1, a}(\omega) = m \wedge A_{t+1}(\omega) = a) \iff (N_{t+1, a}(\omega') = m \wedge A_{t+1}(\omega') = a)`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.stepsUntil_congr" -Uses: {uses "AM.history"}[], {uses "AM.hist_congr"}[]. -::: - - -:::definition "AM.probSpaceSubsets" (parent := "bandit_space") (lean := "Bandits.ArrayModel.truePast") -We define the following functions on $`\Omega_{\mathcal{A}}`: -- $`F_{1, t}(\omega) = ((\omega_{1,s})_{s \le t}, (\omega_{2,s})_{s \in \mathbb{N}})` , -- $`F_{2, a, t}(\omega) = ((\omega_{1,s})_{s \in \mathbb{N}}, (\omega_{2, \min\{s,N_{t+1,a}(\omega)-1\}, a})_{s \in \mathbb{N}}, (\omega_{2, s, b})_{s \in \mathbb{N}, b \ne a})` , -- $`F_{2, a}^m(\omega) = ((\omega_{1,s})_{s \in \mathbb{N}}, (\omega_{2, \min\{s,m-1\}, a})_{s \in \mathbb{N}}, (\omega_{2, s, b})_{s \in \mathbb{N}, b \ne a})` . - -In the definition of $`F_{2, a, t}` and $`F_{2, a}^m`, if $`N_{t+1,a}(\omega) = 0` (resp. $`m = 0`), then the second component is a constant sequence equal to an arbitrary value. - -$`F_{1, t}(\omega)` contains all the information in $`\omega` except for the action selection randomness after time $`t`. - -$`F_{2, a, t}(\omega)` contains all the information in $`\omega` except the rewards for arm $`a` indexed by $`N_{t+1,a}(\omega)` or more. -$`F_{2, a}^m(\omega)` is similar, but removes the rewards for arm $`a` indexed by $`m` or more. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - - -:::lemma_ "AM.measurable_hist_todo" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_hist_todo, Bandits.ArrayModel.measurable_hist_truePast") -For all $`t \in \mathbb{N}`, $`H_t` is measurable with respect to the sigma-algebra generated by $`F_{1, t}`, and with respect to the sigma-algebra generated by $`F_{2, a, t}` for any arm $`a \in \mathcal{A}`. - -Uses : {uses "algorithm"}[], {uses "AM.probSpaceSubsets"}[]. -::: - -:::proof "AM.measurable_hist_todo" -Uses: {uses "AM.measurable_hist"}[], {uses "pullCount"}[], {uses "AM.hist_congr"}[]. -::: - - -:::lemma_ "AM.measurable_action_add_one_truePast" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_action_add_one_truePast") -$`A_{t+1}` is measurable with respect to the sigma-algebra generated by $`F_{2, a, t}` for any arm $`a \in \mathcal{A}`. - -Uses : {uses "algorithm"}[], {uses "AM.probSpaceSubsets"}[]. -::: - -:::proof "AM.measurable_action_add_one_truePast" - Uses: {uses "AM.measurable_hist_todo"}[], . -::: - - -:::lemma_ "AM.measurable_pullCount_add_one_truePast" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_pullCount_add_one_truePast") -$`N_{t+1,a}` is measurable with respect to the sigma-algebra generated by $`F_{2, a, t}`. - -Uses: {uses "AM.history"}[], {uses "arrayMeasure"}[], {uses "algorithm"}[], {uses "AM.probSpaceSubsets"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.measurable_pullCount_add_one_truePast" - Uses: {uses "AM.measurable_hist_todo"}[]. -::: - - -:::lemma_ "AM.measurable_stepsUntil" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_stepsUntil") -For $`t, m \in \mathbb{N}` and $`a \in \mathcal{A}`, the indicator function $`\mathbb{I}\{N_{t+1,a} = m \wedge A_{t+1} = a\} : \Omega_{\mathcal{A}} \to \{0, 1\}` is measurable with respect to the sigma-algebra generated by $`F_{2, a}^m`. - -Uses: {uses "AM.history"}[], {uses "arrayMeasure"}[], {uses "algorithm"}[], {uses "pullCount"}[], {uses "AM.probSpaceSubsets"}[]. -::: - -:::proof "AM.measurable_stepsUntil" - Uses: {uses "AM.measurable_hist"}[], {uses "AM.stepsUntil_congr"}[]. -::: - - -:::lemma_ "AM.measurable_pullCount_action_add_one_hist" (parent := "bandit_space") (lean := "Bandits.ArrayModel.measurable_pullCount_action_add_one_hist") -For $`t \in \mathbb{N}`, the function $`N_{t+1, A_{t+1}}` is measurable with respect to the sigma-algebra generated by $`H_t` and $`A_{t+1}`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.measurable_pullCount_action_add_one_hist" -::: - - - -## Independence - - -:::lemma_ "AM.indepFun_fst_add_one_aux" (parent := "bandit_space") (lean := "Bandits.ArrayModel.indepFun_fst_add_one_aux") -$`\omega \mapsto \omega_{1, t+1}` is independent of $`F_{1, t}`. - -Uses: {uses "AM.probSpaceSubsets"}[]. -::: - - -:::lemma_ "AM.indepFun_fst_add_one_hist" (parent := "bandit_space") (lean := "Bandits.ArrayModel.indepFun_fst_add_one_hist") -$`\omega \mapsto \omega_{1, t+1}` is independent of $`H_t`. - -Uses: {uses "algorithm"}[], {uses "AM.probSpaceSubsets"}[]. -::: - -:::proof "AM.indepFun_fst_add_one_hist" - Uses: {uses "AM.measurable_hist_todo"}[], {uses "AM.indepFun_fst_add_one_aux"}[] -::: - - -:::lemma_ "AM.indepFun_snd_apply_aux" (parent := "bandit_space") (lean := "Bandits.ArrayModel.indepFun_snd_apply_aux") -For $`a \in \mathcal{A}` and $`m \in \mathbb{N}`, $`\omega \mapsto \omega_{2, m, a}` is independent of $`F_{2, a}^m`. - -Uses: {uses "AM.probSpaceSubsets"}[]. -::: - - - -:::lemma_ "AM.indepFun_snd_apply_pullCount_action" (parent := "bandit_space") (lean := "Bandits.ArrayModel.indepFun_snd_apply_pullCount_action") -For $`a \in \mathcal{A}` and $`m \in \mathbb{N}`, $`\omega \mapsto \omega_{2, m, a}` is independent of the indicator function $`\mathbb{I}\{N_{t+1,a} = m \wedge A_{t+1} = a\}`. - -Uses: {uses "algorithm"}[], {uses "pullCount"}[], {uses "AM.probSpaceSubsets"}[]. -::: - -:::proof "AM.indepFun_snd_apply_pullCount_action" - Uses: {uses "AM.indepFun_snd_apply_aux"}[], {uses "AM.measurable_stepsUntil"}[] -::: - - -:::lemma_ "AM.indepFun_snd_hist_cond" (parent := "bandit_space") (lean := "Bandits.ArrayModel.indepFun_snd_hist_cond") -For $`a \in \mathcal{A}` and $`t, m \in \mathbb{N}`, $`\omega \mapsto \omega_{2, m, a}` is independent of $`H_t` given that $`N_{t+1,a} = m` and $`A_{t+1} = a`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.indepFun_snd_hist_cond" - Uses: {uses "AM.measurable_hist_todo"}[], {uses "AM.measurable_hist"}[], {uses "AM.indepFun_snd_apply_aux"}[], {uses "AM.measurable_stepsUntil"}[], {uses "AM.probSpaceSubsets"}[]. -::: - - - - -## Laws - - -:::lemma_ "AM.hasLaw_action_zero" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasLaw_action_zero") -The law of $`A_0` in the array model is $`P_0`. - -Uses : {uses "AM.history"}[], {uses "algorithm"}[]. -::: - -:::proof "AM.hasLaw_action_zero" - Uses: {uses "AM.measurable_hist"}[] -::: - - -:::lemma_ "AM.hasCondDistrib_reward_zero" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasCondDistrib_reward_zero") -In the array model, $`P_{\mathcal{A}}(R_0 \mid A_0) = \nu`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[]. -::: - -:::proof "AM.hasCondDistrib_reward_zero" - Uses: {uses "AM.measurable_hist"}[], {uses "condDistrib_ae_eq_cond"}[] -::: - - -:::lemma_ "AM.hasCondDistrib_action" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasCondDistrib_action") -In the array model, $`P_{\mathcal{A}}(A_{t+1} \mid H_t) = \pi_t`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[]. -::: - -:::proof "AM.hasCondDistrib_action" - Uses: {uses "AM.measurable_hist"}[], {uses "AM.indepFun_fst_add_one_hist"}[] -::: - - -:::lemma_ "AM.hasCondDistrib_reward_pullCount_action" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasCondDistrib_reward_pullCount_action") -In the array model, $`P_{\mathcal{A}}(R_{t+1} \mid N_{t+1,A_{t+1}}, A_{t+1}) = \nu`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.hasCondDistrib_reward_pullCount_action" - Uses: {uses "AM.indepFun_snd_apply_pullCount_action"}[], {uses "AM.measurable_hist"}[], {uses "pullCount_basic"}[], {uses "condDistrib_ae_eq_cond"}[] -::: - - -:::lemma_ "AM.hasCondDistrib_reward_hist_action_pullCount" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasCondDistrib_reward_hist_action_pullCount") -In the array model, $`P_{\mathcal{A}}(R_{t+1} \mid H_t, A_{t+1}, N_{t+1,A_{t+1}}) = \nu`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[]. -::: - -:::proof "AM.hasCondDistrib_reward_hist_action_pullCount" - Uses: {uses "AM.indepFun_snd_apply_pullCount_action"}[], {uses "AM.indepFun_snd_hist_cond"}[], {uses "AM.measurable_hist"}[], {uses "pullCount_basic"}[] -::: - - -:::lemma_ "AM.condIndepFun_reward_hist" (parent := "bandit_space") (lean := "Bandits.ArrayModel.condIndepFun_reward_hist") -For $`t \ge 0`, $`R_{t+1} \ind H_t \mid A_{t+1}, N_{t+1, A_{t+1}}`. - -Uses: {uses "AM.history"}[], {uses "algorithm"}[], {uses "pullCount"}[], {uses "AM.measurable_hist"}[]. -::: - -:::proof "AM.condIndepFun_reward_hist" - Uses: {uses "AM.measurable_hist"}[], {uses "AM.hasCondDistrib_reward_hist_action_pullCount"}[] -::: - - -:::lemma_ "AM.hasCondDistrib_reward" (parent := "bandit_space") (lean := "Bandits.ArrayModel.hasCondDistrib_reward") -In the array model, $`P_{\mathcal{A}}(R_{t+1} \mid H_t, A_{t+1}) = \nu`. - -Uses: {uses "AM.history"}[], {uses "stationaryEnv"}[], {uses "environment"}[], {uses "algorithm"}[]. -::: - -:::proof "AM.hasCondDistrib_reward" - Uses: {uses "AM.measurable_pullCount_action_add_one_hist"}[], {uses "AM.hasCondDistrib_reward_pullCount_action"}[], {uses "AM.measurable_hist"}[], {uses "AM.condIndepFun_reward_hist"}[], {uses "pullCount"}[] -::: - - -:::theorem "isAlgEnvSeq_arrayMeasure" (parent := "bandit_space") (lean := "Bandits.ArrayModel.isAlgEnvSeq_arrayMeasure") -The actions and rewards defined on the array model probability space $`(\Omega_{\mathcal{A}}, P_{\mathcal{A}})` form an algorithm-environment sequence for the algorithm $`\mathfrak{A}` and bandit $`\nu`. - -Uses: {uses "AM.history"}[], {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[]. -::: - -:::proof "isAlgEnvSeq_arrayMeasure" -The four conditions of {uses "IsAlgEnvSeq"}[] are satisfied by {uses "AM.hasLaw_action_zero"}[], {uses "AM.hasCondDistrib_reward_zero"}[], {uses "AM.hasCondDistrib_action"}[] and {uses "AM.hasCondDistrib_reward"}[]. -::: - - - -# Law of the n-th pull - -:::group "rewardByCount_law" -Law of the n-th pull -::: - -This section describes the law of $`Y_{n, a}` the $`n^{th}` reward obtained from an arm $`a \in \mathcal{A}`. - -We augment the probability space $`\Omega` on which we have an algorithm-environment sequence with $`\Omega' = \mathbb{R}^{\mathbb{N} \times \mathcal{A}}`, on which we put the product measure $`\bigotimes_{n \in \mathbb{N}, a \in \mathcal{A}} \nu(a)`. -With that measure, the law of $`Z_{n,a}` is $`\nu(a)`. - - -:::lemma_ "measurable_comap_indicator_stepsUntil_eq" (parent := "rewardByCount_law") (lean := "Learning.measurable_comap_indicator_stepsUntil_eq") -The function $`\mathbb{I}\{T_{n,a} = t\} : \Omega \to \{0, 1\}` is measurable with respect to the sigma-algebra generated by $`(H_{t-1}, A_t)`. - -Uses: {uses "history"}[], {uses "stepsUntil"}[]. -::: - -:::proof "measurable_comap_indicator_stepsUntil_eq" - Uses: {uses "stepsUntil_basic"}[], {uses "pullCount_basic"}[], {uses "pullCount"}[], {uses "IsAlgEnvSeq.filtration"}[]. -::: - - -:::lemma_ "CondIndepFun.prod_right" (lean := "ProbabilityTheory.CondIndepFun.prod_right") -If $`X \ind Y \mid Z`, then $`X \ind (Y, Z) \mid Z`. -::: - - -:::lemma_ "condIndepFun_reward_stepsUntil_arm" (parent := "rewardByCount_law") (lean := "Bandits.condIndepFun_reward_stepsUntil_action") -For $`t > 0`, $`R_t \ind \mathbb{I}\{T_{n, a} = t\} \mid A_t`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ionescu-tulcea"}[], {uses "stepsUntil"}[]. -::: - -:::proof "condIndepFun_reward_stepsUntil_arm" -$`\mathbb{I}\{T_{n, a} = t\}` is measurable with respect to the sigma-algebra generated by $`(H_{t-1}, A_t)` by {uses "measurable_comap_indicator_stepsUntil_eq"}[]. - -It thus suffices to show that $`R_t \ind (H_{t-1}, A_t) \mid A_t`, which is implied by $`R_t \ind H_{t-1} \mid A_t` ({uses "CondIndepFun.prod_right"}[]), which is {uses "condIndepFun_reward_hist_action"}[]. - -Uses: {uses "condIndepFun_reward_hist_action"}[], {uses "CondIndepFun.prod_right"}[], {uses "stepsUntil_basic"}[], {uses "measurable_comap_indicator_stepsUntil_eq"}[], {uses "history"}[], {uses "pullCount"}[]. -::: - - -:::lemma_ "reward_cond_stepsUntil" (parent := "rewardByCount_law") (lean := "Bandits.reward_cond_stepsUntil") -Let $`n > 0`, $`t \in \mathbb{N}` and suppose that $`P(T_{n, a} = t) > 0`. -Then $`P(R_t \mid T_{n, a} = t) = \nu(a)`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ionescu-tulcea"}[], {uses "stepsUntil"}[]. -::: - -:::proof "reward_cond_stepsUntil" -First, if $`T_{n, a} = t`, then $`A_t = a` ({uses "stepsUntil_basic"}[]), such that $`P(R_t \mid T_{n, a} = t) = P(R_t \mid T_{n, a} = t, A_t = a)`. - -Then, using first the independence from {uses "condIndepFun_reward_stepsUntil_arm"}[] and then the conditional distribution from {uses "condDistrib_reward_stationaryEnv"}[], we have -$$` - P(R_t \mid T_{n, a} = t, A_t = a) - = P(R_t \mid A_t = a) - = \nu(a) - \: . -` - -Uses: {uses "environment"}[], {uses "stepsUntil_basic"}[], {uses "condIndepFun_reward_stepsUntil_arm"}[], {uses "pullCount"}[], {uses "condDistrib_ae_eq_cond"}[], {uses "condDistrib_reward_stationaryEnv"}[] -::: - - -:::lemma_ "condDistrib_ae_eq_cond" (lean := "ProbabilityTheory.condDistrib_ae_eq_cond") -For a random variable $`X` on a countable space with the discrete sigma algebra, $`P(Y \mid X) = (x \mapsto P(Y \mid X = x))`, $`(X_*P)`-almost surely. -Furthermore, that almost sure equality means that for all $`x` such that $`P(X = x) > 0`, we have $`P(Y \mid X = x) = P(Y \mid X)(x)`. -::: - - -:::lemma_ "condDistrib_rewardByCount_stepsUntil" (parent := "rewardByCount_law") (lean := "Bandits.condDistrib_rewardByCount_stepsUntil") -For $`n > 0` and $`t \in \mathbb{N}`, $`P(Y_{n,a} \mid T_{n,a}) = \nu(a)` (in which the measure on the r.h.s. is seen as a constant kernel). - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ionescu-tulcea"}[], {uses "rewardByCount"}[], {uses "stepsUntil"}[]. -::: - -:::proof "condDistrib_rewardByCount_stepsUntil" -It suffices to show that for all $`t \in \mathbb{N} \cup \{\infty\}` such that $`P(T_{n, a} = t) > 0`, the law of $`Y_{n,a}` conditioned on $`T_{n,a} = t` is $`\nu(a)`. - -If $`t < \infty`, then $`P(Y_{n, a} \mid T_{n, a = t}) = P(R_t \mid T_{n, a} = t) = \nu(a)` by {uses "reward_cond_stepsUntil"}[]. - -If $`t = \infty`, then $`P(Y_{n, a} \mid T_{n, a} = \infty) = P(Z_{n, a} \mid T_{n, a} = \infty)`. By independence of $`Z_{n,a}` and $`T_{n, a}`, this is just $`\nu(a)`, the law of $`Z_{n,a}`. - -Uses: {uses "environment"}[], {uses "reward_cond_stepsUntil"}[], {uses "pullCount"}[], {uses "condDistrib_ae_eq_cond"}[] -::: - - -:::lemma_ "hasLaw_rewardByCount" (parent := "rewardByCount_law") (lean := "Bandits.hasLaw_rewardByCount") -For $`n > 0` and $`a \in \mathcal{A}`, $`(Y_{n,a})_*P = \nu(a)`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ionescu-tulcea"}[], {uses "rewardByCount"}[] -::: - -:::proof "hasLaw_rewardByCount" -The law of $`Y_{n,a}` is given by $`(Y_{n, a})_*P = P(Y_{n, a} \mid T_{n, a}) \circ (T_{n, a})_*P`. -By {uses "condDistrib_rewardByCount_stepsUntil"}[], $`P(Y_{n, a} \mid T_{n, a}) = \nu(a)`, a constant kernel. -Thus the composition is just $`\nu(a)`. - -Uses: {uses "environment"}[], {uses "condDistrib_rewardByCount_stepsUntil"}[], {uses "stepsUntil"}[], {uses "pullCount"}[]. -::: - - - -# Regret and other bandit quantities - -:::group "regret" -Regret and other bandit quantities -::: - -For an arm $`a \in \mathcal{A}`, we denote by $`\mu_a` the mean of the rewards for that arm, that is $`\mu_a = \nu(a)[\mathrm{id}]`. -We denote by $`\mu^*` the mean of the best arm, that is $`\mu^* = \max_{a \in \mathcal{A}} \mu_a`. - - -:::definition "regret" (parent := "regret") (lean := "Bandits.regret") -The regret $`R_T` of a sequence of arms $`A_0, \ldots, A_{T-1}` after $`T` pulls is the difference between the cumulative reward of always playing the best arm and the cumulative reward of the sequence: -$$` - R_T = T \mu^* - \sum_{t=0}^{T-1} \mu_{A_t} \: . -` -::: - -TODO: the $`R_T` notation clashes with the random variable $`R_t`. - -:::definition "gap" (parent := "regret") (lean := "Bandits.gap") -For an arm $`a \in \mathcal{A}`, its gap is defined as the difference between the mean of the best arm and the mean of that arm: $`\Delta_a = \mu^* - \mu_a`. -::: - - -:::lemma_ "sum_pullCount_mul" (parent := "regret") (lean := "Learning.sum_pullCount_mul") -Let $`f : \mathcal{A} \to \mathbb{R}` be a function on the arms. For all $`t \in \mathbb{N}`, -$$` - \sum_{a \in \mathcal{A}} N_{t,a} f(a) = \sum_{s=0}^{t-1} f(A_s) \: . -` - -Uses: {uses "pullCount"}[]. -::: - -:::proof "sum_pullCount_mul" -$$` - \sum_{a \in \mathcal{A}} N_{t,a} f(a) - &= \sum_{a \in \mathcal{A}} \sum_{s=0}^{t-1} \mathbb{I}\{A_s = a\} f(a) - \\ - &= \sum_{s=0}^{t-1} \sum_{a \in \mathcal{A}} \mathbb{I}\{A_s = a\} f(a) - \\ - &= \sum_{s=0}^{t-1} f(A_s) - \: . -` -::: - - -:::lemma_ "regret_eq_sum_pullCount_mul_gap" (parent := "regret") (lean := "Bandits.regret_eq_sum_pullCount_mul_gap") -For $`\mathcal{A}` finite, the {uses "regret"}[regret] $`R_T` can be expressed as a sum over the arms and their {uses "gap"}[gaps]: -$$` - R_T = \sum_{a \in \mathcal{A}} N_{T,a} \Delta_a \: . -` - -Uses: {uses "pullCount"}[]. -::: - -:::proof "regret_eq_sum_pullCount_mul_gap" -Apply {uses "sum_pullCount_mul"}[] with $`f(a) = \Delta_a` to obtain: -$$` - \sum_{a \in \mathcal{A}} N_{T,a} \Delta_a - &= \sum_{s=0}^{T-1} \Delta_{A_s} - \\ - &= \sum_{s=0}^{T-1} \mu^* - \sum_{s=0}^{T-1} \mu_{A_s} - \\ - &= R_T - \: . -` -::: - - -:::lemma_ "integral_regret_eq_sum_mul" (parent := "regret") (lean := "Bandits.integral_regret_eq_sum_gap_mul_integral_pullCount") -For $`\mathcal{A}` finite, the expected {uses "regret"}[regret] can be expressed as a sum over the arms and their {uses "gap"}[gaps]: -$$` - P[R_T] = \sum_{a \in \mathcal{A}}P[N_{T,a}] \Delta_a \: . -` - -Uses: {uses "pullCount"}[]. -::: - -:::proof "integral_regret_eq_sum_mul" -Uses: {uses "regret_eq_sum_pullCount_mul_gap"}[]. -::: diff --git a/verso_blueprint/LMLBlueprint/Chapters/BanditAlgs.lean b/verso_blueprint/LMLBlueprint/Chapters/BanditAlgs.lean deleted file mode 100644 index 61b21a58..00000000 --- a/verso_blueprint/LMLBlueprint/Chapters/BanditAlgs.lean +++ /dev/null @@ -1,332 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint -import LeanMachineLearning.SequentialLearning.Algorithms.RoundRobin -import LeanMachineLearning.SequentialLearning.Deterministic -import LeanMachineLearning.SequentialLearning.FiniteActions -import LeanMachineLearning.SequentialLearning.IonescuTulceaSpace -import LeanMachineLearning.SequentialLearning.StationaryEnv -import LeanMachineLearning.Online.Bandit.Algorithms.ETC -import LeanMachineLearning.Online.Bandit.Algorithms.UCB -import LeanMachineLearning.Online.Bandit.ArrayProbSpace -import LeanMachineLearning.Online.Bandit.Regret -import LeanMachineLearning.Online.Bandit.RewardByCountMeasure -import LeanMachineLearning.Online.Bandit.SumRewards -import LeanMachineLearning.Probability.Moments.SubGaussian -import LMLBlueprint.References -import LMLBlueprint.TeXPrelude -import Mathlib.Probability.Moments.SubGaussian - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -#doc (Manual) "Bandit algorithms" => - -:::group "banditAlgorithms" -Bandit algorithms -::: - - -# Round-Robin - -This is not an interesting bandit algorithm per se, but it is used as a subroutine in other algorithms and can be a simple baseline. -This algorithm simply cycles through the arms in order. - -:::definition "roundRobinAlgorithm" (parent := "banditAlgorithms") (lean := "Learning.RoundRobin.nextAction, Learning.roundRobinAlgorithm") -The Round-Robin algorithm is the {uses "detAlgorithm"}[deterministic algorithm] defined as follows: at time $`t \in \mathbb{N}`, $`A_t = t \mod K`. -::: - - -:::lemma_ "pullCount_roundRobinAlgorithm" (parent := "banditAlgorithms") (lean := "Learning.RoundRobin.pullCount_mul") -For the Round-Robin algorithm, for any arm $`a \in [K]`, at time $`Km` we have -$$` - N_{Km,a} = m \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[] , {uses "pullCount"}[], {uses "roundRobinAlgorithm"}[]. -::: - -:::proof "pullCount_roundRobinAlgorithm" - Uses {uses "environment"}[], {uses "history"}[], {uses "pullCount_basic"}[], {uses "roundRobinAlgorithm"}[] -::: - - -TODO: regret. - - - - -# Explore-Then-Commit - -Note: times start at 0 to be consistent with Lean. - -Note: we will describe the algorithm by writing $`A_t = ...`, but our formal bandit model needs a policy $`\pi_t` that gives the distribution of the arm to pull. What me mean is that $`\pi_t` is a Dirac distribution at that arm. - -:::definition "etcAlgorithm" (parent := "banditAlgorithms") (lean := "Bandits.ETC.nextArm, Bandits.etcAlgorithm") -The Explore-Then-Commit (ETC) algorithm with parameter $`m \in \mathbb{N}` is the {uses "detAlgorithm"}[deterministic algorithm] defined as follows: -1. for $`t < Km`, $`A_t = t \mod K` (pull each arm $`m` times), -2. compute $`\hat{A}_m^* = \arg\max_{a \in [K]} \hat{\mu}_a`, where $`\hat{\mu}_a = \frac{1}{m} \sum_{t=0}^{Km-1} \mathbb{I}(A_t = a) X_t` is the empirical mean of the rewards for arm $`a`, -3. for $`t \ge Km`, $`A_t = \hat{A}_m^*` (pull the empirical best arm). -::: - -:::lemma_ "ETC.isAlgEnvSeqUntil_roundRobinAlgorithm" (parent := "banditAlgorithms") (lean := "Bandits.ETC.isAlgEnvSeqUntil_roundRobinAlgorithm") - -An {uses "IsAlgEnvSeq"}[algorithm-environment sequence] for the {uses "etcAlgorithm"}[Explore-Then-Commit algorithm] with parameter $`m` is an algorithm-environment sequence for the {uses "roundRobinAlgorithm"}[Round-Robin algorithm] until time $`Km - 1`. -That is, ETC plays the same as Round-Robin until time $`Km - 1`. - -Uses {uses "stationaryEnv"}[]. -::: - - -:::lemma_ "pullCount_etcAlgorithm" (parent := "banditAlgorithms") (lean := "Bandits.ETC.pullCount_of_ge") -For the {uses "etcAlgorithm"}[Explore-Then-Commit algorithm] with parameter $`m`, for any arm $`a \in [K]` and any time $`t \ge Km`, we have -$$` - N_{t,a} - = m + (t - Km) \mathbb{I}\{\hat{A}_m^* = a\} - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "pullCount"}[]. -::: - -:::proof "pullCount_etcAlgorithm" - Uses: {uses "pullCount_roundRobinAlgorithm"}[], {uses "ETC.isAlgEnvSeqUntil_roundRobinAlgorithm"}[] -::: - -:::lemma_ "sumRewards_bestArm_le_of_arm_mul_eq" (parent := "banditAlgorithms") (lean := "Bandits.ETC.sumRewards_bestArm_le_of_arm_mul_eq") -If $`\hat{A}_m^* = a`, then we have $`S_{Km, a^*} \le S_{Km, a}`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "sumRewards"}[], {uses "etcAlgorithm"}[] -::: - -:::proof "sumRewards_bestArm_le_of_arm_mul_eq" - Uses: {uses "environment"}[], {uses "history"}[], {uses "pullCount"}[], {uses "empMean"}[], {uses "etcAlgorithm"}[] -::: - - -:::lemma_ "prob_etc_error_le_exp" (parent := "banditAlgorithms") (lean := "Bandits.ETC.prob_arm_mul_eq_le") -Suppose that $`\nu(a)` is $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] for all arms $`a \in [K]`. -Then for the {uses "etcAlgorithm"}[Explore-Then-Commit algorithm] with parameter $`m`, for any arm $`a \in [K]` with $`\Delta_a > 0`, we have $`P(\hat{A}_m^* = a) \le \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right)`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "gap"}[] -::: - -:::proof "prob_etc_error_le_exp" -By {uses "sumRewards_bestArm_le_of_arm_mul_eq"}[], -$$` - P(\hat{A}_m^* = a) - \le P(S_{Km, a} \ge S_{Km, a^*}) - \: . -` -By {uses "prob_sumRewards_le_sumRewards_le"}[], and then the concentration inequality of {uses "probReal_sum_le_sum_streamMeasure"}[] we have -$$` - P\left(S_{Km, a^*} \le S_{Km, a}\right) - &\le (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m-1} \omega_{s, a^*} \le \sum_{s=0}^{m-1} \omega_{s, a} \right) - \\ - &\le \exp\left( -m \frac{\Delta_a^2}{4 \sigma^2} \right) - \: . -` - -Uses: {uses "environment"}[], {uses "pullCount"}[], {uses "etcAlgorithm"}[] -::: - - -:::theorem "regret_etc_le" (parent := "banditAlgorithms") (lean := "Bandits.ETC.regret_le") -Suppose that $`\nu(a)` is $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] for all arms $`a \in [K]`. -Then for {uses "etcAlgorithm"}[Explore-Then-Commit algorithm] with parameter $`m`, the expected regret after $`T` pulls with $`T \ge Km` is bounded by -$$` - P[R_T] - \le m \sum_{a=1}^K \Delta_a + (T - Km) \sum_{a=1}^K \Delta_a \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right) - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "regret"}[], {uses "IsAlgEnvSeq"}[], {uses "gap"}[] -::: - -:::proof "regret_etc_le" -By {uses "regret_eq_sum_pullCount_mul_gap"}[], we have $`P[R_T] = \sum_{a=1}^K P\left[N_{T,a}\right] \Delta_a`~. -It thus suffices to bound $`P[N_{T,a}]` for each arm $`a` with $`\Delta_a > 0`. -It suffices to prove that -$$` - P[N_{T,a}] - \le m + (T - Km) \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right) - \: . -` - -By {uses "pullCount_etcAlgorithm"}[], -$$` - N_{T,a} - = m + (T - Km) \mathbb{I}\{\hat{A}_m^* = a\} - \: . -` - -It thus suffices to prove the inequality $`P(\hat{A}_m^* = a) \le \exp\left(- \frac{m \Delta_a^2}{4 \sigma^2}\right)` for $`\Delta_a > 0`. -This is done in {uses "prob_etc_error_le_exp"}[]. - - -Uses: {uses "integral_regret_eq_sum_mul"}[], {uses "pullCount_basic"}[], -::: - - -# UCB - -:::definition "ucbAlgorithm" (parent := "banditAlgorithms") (lean := "Bandits.UCB.nextArm, Bandits.ucbAlgorithm") -The UCB algorithm with parameter $`c \in \mathbb{R}_+` is the {uses "detAlgorithm"}[deterministic algorithm] defined as follows: -1. for $`t < K`, $`A_t = t \mod K` (pull each arm once), -2. for $`t \ge K`, $`A_t = \arg\max_{a \in [K]} \left( \hat{\mu}_{t,a} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a}}} \right)`, where $`\hat{\mu}_{t,a} = \frac{1}{N_{t,a}} \sum_{s=0}^{t-1} \mathbb{I}(A_s = a) X_s` is the empirical mean of the rewards for arm `a`. -::: - - -Note: the argmax in the second step is chosen in a measurable way. - - -:::lemma_ "UCB.isAlgEnvSeqUntil_roundRobinAlgorithm" (parent := "banditAlgorithms") (lean := "Bandits.UCB.isAlgEnvSeqUntil_roundRobinAlgorithm") -An {uses "IsAlgEnvSeq"}[algorithm-environment sequence] for the {uses "ucbAlgorithm"}[UCB algorithm] is an algorithm-environment sequence for the {uses "roundRobinAlgorithm"}[Round-Robin algorithm] until time $`K - 1`. -That is, UCB plays the same as Round-Robin until time $`K - 1`. - -Uses: {uses "stationaryEnv"}[]. -::: - - -:::lemma_ "ucbIndex_le_ucbIndex_arm" (parent := "banditAlgorithms") (lean := "Bandits.UCB.ucbIndex_le_ucbIndex_arm") -For the {uses "ucbAlgorithm"}[UCB algorithm], for all time $`t \ge K` and arm $`a \in [K]`, we have -$$` - \hat{\mu}_{t,a} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a}}} - \le \hat{\mu}_{t,A_t} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "pullCount"}[], {uses "empMean"}[] -::: - -:::proof "ucbIndex_le_ucbIndex_arm" -By definition of the algorithm. -::: - - -:::lemma_ "gap_arm_le_two_mul_ucbWidth" (parent := "banditAlgorithms") (lean := "Bandits.UCB.gap_arm_le_two_mul_ucbWidth, Bandits.UCB.pullCount_arm_le") -Suppose that we have the 3 following conditions: -1. $`\mu^* \le \hat{\mu}_{t, a^*} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a^*}}}`, -2. $`\hat{\mu}_{t,A_t} - \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} \le \mu_{A_t}`, -3. $`\hat{\mu}_{t, a^*} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,a^*}}} \le \hat{\mu}_{t,A_t} + \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}}`. - -Then if $`N_{t,A_t} > 0` we have -$$` - \Delta_{A_t} - \le 2 \sqrt{\frac{2 c \log(t + 1)}{N_{t,A_t}}} - \: . -` - -And in turn, if $`\Delta_{A_t} > 0` we get -$$` - N_{t,A_t} - \le \frac{8 c \log(t + 1)}{\Delta_{A_t}^2} - \: . -` - -Note that the third condition is always satisfied for UCB by {uses "ucbIndex_le_ucbIndex_arm"}[], but this lemma, as stated, is independent of the UCB algorithm. - -Uses: {uses "pullCount"}[], {uses "gap"}[], {uses "empMean"}[]. -::: - - -:::lemma_ "prob_ucbIndex_le" (parent := "banditAlgorithms") (lean := "Bandits.UCB.prob_ucbIndex_le") -Suppose that $`\nu(a)` is $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] for all arms $`a \in [K]`. -Let $`c \ge 0` be a real number. -Then for any time $`n \in \mathbb{N}` and any arm $`a \in [K]`, we have -$$` - P\left(0 < N_{n, a} \ \wedge \ \hat{\mu}_{n, a} + \sqrt{\frac{2 c \sigma^2 \log(n + 1)}{N_{n,a}}} \le \mu_a\right) - \le \frac{1}{(n + 1)^{c - 1}} - \: . -` - -And also, -$$` - P\left(0 < N_{n, a} \ \wedge \ \hat{\mu}_{n, a} - \sqrt{\frac{2 c \sigma^2 \log(n + 1)}{N_{n,a}}} \ge \mu_a\right) - \le \frac{1}{(n + 1)^{c - 1}} - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "pullCount"}[], {uses "empMean"}[] -::: - -:::proof "prob_ucbIndex_le" - Uses: {uses "prob_sum_le_sqrt_log"}[], {uses "ionescu-tulcea"}[], {uses "prob_pullCount_prod_sumRewards_mem_le"}[]. -::: - - -:::lemma_ "pullCount_le_add_three" (parent := "banditAlgorithms") -For $`C` a natural number, for any time $`n \in \mathbb{N}` and any arm $`a \in [K]`, we have -$$` - N_{n,a} - &\le C + 1 - \\&\quad + - \sum_{s=1}^{n-1} \mathbb{I}\{A_s = a \ \wedge \ C < N_{s,a} \ \wedge \ - \mu^* \le \hat{\mu}_{s, a^*} + \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a^*}}} \ \wedge \ - \hat{\mu}_{s, A_s} - \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,A_s}}} \le \mu_{A_s}\} - \\&\quad + - \sum_{s=1}^{n-1} - \mathbb{I}\{0 < N_{s, a^*} \ \wedge \ \hat{\mu}_{s, a^*} + \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a^*}}} < - \mu^*\} - \\&\quad + - \sum_{s=1}^{n-1} - \mathbb{I}\{0 < N_{s, a} \ \wedge \ \mu_a < - \hat{\mu}_{s, a} - \sqrt{\frac{2 c \sigma^2 \log(s + 1)}{N_{s,a}}}\} -` - -Uses: {uses "pullCount"}[], {uses "empMean"}[], {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ucbAlgorithm"}[]. -::: - -:::proof "pullCount_le_add_three" - Uses: {uses "environment"}[], {uses "ucbAlgorithm"}[], {uses "pullCount_basic"}[] -::: - - -:::lemma_ "some_sum_eq_zero" (parent := "banditAlgorithms") -For the {uses "ucbAlgorithm"}[UCB algorithm] with parameter $`c \sigma^2 \ge 0`, for any time $`n \in \mathbb{N}` and any arm $`a \in [K]` with positive gap, the first sum in {uses "pullCount_le_add_three"}[] is equal to zero for positive $`C` such that $`C \ge \frac{8 c \sigma^2 \log(n + 1)}{\Delta_a^2}`. - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "ucbAlgorithm"}[], {uses "pullCount"}[], {uses "gap"}[], {uses "empMean"}[]. - -The Lean declaration is "Bandits.UCB.some\_sum\_eq\_zero" but adding it causes a strange error, so I removed it. -::: - -:::proof "some_sum_eq_zero" - Uses: {uses "environment"}[], {uses "ucbAlgorithm"}[], {uses "ucbIndex_le_ucbIndex_arm"}[], {uses "pullCount_basic"}[], {uses "gap_arm_le_two_mul_ucbWidth"}[] -::: - - -:::lemma_ "expectation_pullCount_le" (parent := "banditAlgorithms") (lean := "Bandits.UCB.expectation_pullCount_le") -Suppose that $`\nu(a)` is $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] for all arms $`a \in [K]`. -For the {uses "ucbAlgorithm"}[UCB algorithm] with parameter $`c \sigma^2 > 0`, for any time $`n \in \mathbb{N}` and any arm $`a \in [K]` with positive {uses "gap"}[gap], we have -$$` - P[N_{n,a}] - \le \frac{8 c \sigma^2 \log(n + 1)}{\Delta_a^2} + 2 + 2 \sum_{s=0}^{n-1} \frac{1}{(s + 1)^{c - 1}} - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[], {uses "pullCount"}[]. -::: - -:::proof "expectation_pullCount_le" - Uses: {uses "some_sum_eq_zero"}[], {uses "prob_ucbIndex_le"}[], {uses "pullCount_basic"}[], {uses "pullCount_le_add_three"}[] -::: - - -:::lemma_ "ucb_regret_le" (parent := "banditAlgorithms") (lean := "Bandits.UCB.regret_le") -Suppose that $`\nu(a)` is $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] for all arms $`a \in [K]`. -For the {uses "ucbAlgorithm"}[UCB algorithm] with parameter $`c \sigma^2 > 0`, for any time $`n \in \mathbb{N}`, we have -$$` - P[R_n] - \le \sum_{a : \Delta_a > 0} \left(\frac{8 c \sigma^2 \log(n + 1)}{\Delta_a} + 2 \Delta_a\left(1 + \sum_{s=0}^{n-1} \frac{1}{(s + 1)^{c - 1}}\right)\right) - \: . -` - -Uses: {uses "stationaryEnv"}[], {uses "regret"}[], {uses "IsAlgEnvSeq"}[], {uses "gap"}[]. -::: - -:::proof "ucb_regret_le" - Uses: {uses "integral_regret_eq_sum_mul"}[], {uses "pullCount_basic"}[], {uses "expectation_pullCount_le"}[] -::: - -TODO: for $`c > 2`, the sum converges to a constant, so we get a logarithmic regret bound. diff --git a/verso_blueprint/LMLBlueprint/Chapters/Concentration.lean b/verso_blueprint/LMLBlueprint/Chapters/Concentration.lean deleted file mode 100644 index 21ed82c3..00000000 --- a/verso_blueprint/LMLBlueprint/Chapters/Concentration.lean +++ /dev/null @@ -1,189 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint -import LeanMachineLearning.SequentialLearning.Deterministic -import LeanMachineLearning.SequentialLearning.FiniteActions -import LeanMachineLearning.SequentialLearning.IonescuTulceaSpace -import LeanMachineLearning.SequentialLearning.StationaryEnv -import LeanMachineLearning.Online.Bandit.ArrayProbSpace -import LeanMachineLearning.Online.Bandit.Regret -import LeanMachineLearning.Online.Bandit.RewardByCountMeasure -import LeanMachineLearning.Online.Bandit.SumRewards -import LeanMachineLearning.Probability.Moments.SubGaussian -import LMLBlueprint.References -import LMLBlueprint.TeXPrelude -import Mathlib.Probability.Moments.SubGaussian - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -#doc (Manual) "Concentration inequalities" => - -# Sub-Gaussian random variables - -:::group "subGaussian" -Sub-Gaussian random variables -::: - -:::definition "subGaussian" (parent := "subGaussian") (lean := "ProbabilityTheory.HasSubgaussianMGF") -A real valued random variable $`X` is $`\sigma^2`-sub-Gaussian if for any $`\lambda \in \mathbb{R}`, -$$` - P\left[e^{\lambda X}\right] - \le e^{\frac{\lambda^2 \sigma^2}{2}} - \: . -` -::: - - -:::lemma_ "subGaussian_add_of_indepFun" (parent := "subGaussian") (lean := "ProbabilityTheory.HasSubgaussianMGF.add_of_indepFun") -If $`X` is $`\sigma_1^2`-{uses "subGaussian"}[sub-Gaussian] and $`Y` is $`\sigma_2^2`-sub-Gaussian, and $`X` and $`Y` are independent, then $`X + Y` is $`(\sigma_1^2 + \sigma_2^2)`-sub-Gaussian. -::: - - -:::lemma_ "hoeffding_one" (parent := "subGaussian") (lean := "ProbabilityTheory.HasSubgaussianMGF.measure_ge_le") -For $`X` a $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] random variable, for any $`t \ge 0`, -$$` - P(X \ge t) - \le \exp\left(- \frac{t^2}{2 \sigma^2}\right) - \: . -` -::: - - -:::theorem "hoeffding" (parent := "subGaussian") (lean := "ProbabilityTheory.HasSubgaussianMGF.measure_sum_range_ge_le_of_iIndepFun") -Let $`X_1, \ldots, X_n` be independent random variables such that $`X_i` is $`\sigma_i^2`-{uses "subGaussian"}[sub-Gaussian] for $`i \in [n]`. -Then for any $`t \ge 0`, -$$` - P\left(\sum_{i=1}^n X_i \ge t\right) - \le \exp\left(- \frac{t^2}{2 \sum_{i=1}^n \sigma_i^2}\right) - \: . -` -::: - -:::proof "hoeffding" -Uses: {uses "subGaussian_add_of_indepFun"}[], {uses "hoeffding_one"}[]. -::: - - -:::lemma_ "measure_sum_le_sum_le'" (parent := "subGaussian") -Let $`X_1, \ldots, X_n` be random variables such that $`X_i - P[X_i]` is $`\sigma_{X,i}^2`-{uses "subGaussian"}[sub-Gaussian] for $`i \in [n]`. -Let $`Y_1, \ldots, Y_m` be random variables such that $`Y_i - P[Y_i]` is $`\sigma_{Y,i}^2`-{uses "subGaussian"}[sub-Gaussian] for $`i \in [m]`. -Suppose further that the vectors $`X` and $`Y` are independent and that $`\sum_{i = 1}^m P[Y_i] \le \sum_{i = 1}^n P[X_i]`. -Then -$$` - P\left(\sum_{i=1}^m Y_i \ge \sum_{i=1}^n X_i\right) - \le \exp\left(- \frac{\left(\sum_{i = 1}^n P[X_i] - \sum_{i=1}^m P[Y_i]\right)^2}{2 \sum_{i=1}^n (\sigma_{X,i}^2 + \sigma_{Y,i}^2)}\right) - \: . -` - -This is "ProbabilityTheory.HasSubgaussianMGF.measure\_sum\_le\_sum\_le'" in Lean, but I get a strange error if I add that information. -::: - -:::proof "measure_sum_le_sum_le'" -Uses: {uses "subGaussian_add_of_indepFun"}[], {uses "hoeffding_one"}[]. -::: - - - -# Concentration of the sums of rewards in bandit models - -:::group "concentrationBandits" -Concentration of the sums of rewards in bandit models -::: - -:::lemma_ "identDistrib_pullCount_prod_sumRewards" (parent := "concentrationBandits") (lean := "Bandits.ArrayModel.identDistrib_pullCount_prod_sumRewards") -In the array model, for $`t \in \mathbb{N}`, the random variable $`(N_{t,a}, S_{t, a})_{a \in \mathcal{A}}` has the same distribution as $`(N_{t,a}, \sum_{s=0}^{N_{t,a}-1} \omega_{2, s, a})_{a \in \mathcal{A}}`. - -Uses: {uses "arrayMeasure"}[] ,{uses "AM.history"}[], {uses "algorithm"}[], {uses "sumRewards"}[], {uses "pullCount"}[]. -::: - -:::proof "identDistrib_pullCount_prod_sumRewards" -Uses: {uses "AM.history"}[], {uses "stepsUntil_basic"}[], {uses "ionescu-tulcea"}[], {uses "algFunction"}[], {uses "AM.measurable_hist"}[], {uses "rewardByCount"}[], {uses "pullCount_basic"}[], {uses "stepsUntil"}[], {uses "sum_rewardByCount"}[]. -::: - - -:::lemma_ "AM.identDistrib_sum_range_snd" (parent := "concentrationBandits") (lean := "Bandits.ArrayModel.identDistrib_sum_range_snd") -In the {uses "arrayMeasure"}[array model], for $`k \in \mathbb{N}`, the random variable $`\sum_{s=0}^{k-1} \omega_{2, s, a}` has the same distribution as a sum of $`k` i.i.d. random variables with law $`\nu(a)`. -::: - -:::proof "AM.identDistrib_sum_range_snd" -By definition of {uses "arrayMeasure"}[$`P_{\mathcal{A}}`]. -::: - - -:::lemma_ "prob_pullCount_prod_sumRewards_mem_le" (parent := "concentrationBandits") (lean := "Bandits.ArrayModel.prob_pullCount_prod_sumRewards_mem_le, Bandits.prob_pullCount_prod_sumRewards_mem_le") -In the {uses "arrayMeasure"}[array model], for $`t \in \mathbb{N}`, $`a \in \mathcal{A}`, and a measurable set $`B \subseteq \mathbb{N} \times \mathbb{R}`, -$$` - P_{\mathcal{A}}\left((N_{t,a}, S_{t, a}) \in B\right) - \le \sum_{k < t, \exists r, (k, r) \in B} \nu(a)^{\otimes \mathbb{N}} \left(\sum_{s=0}^{k-1} \omega_{s} \in \{x \mid \exists n, (n, x) \in B\}\right) - \: . -` -As a consequence, this also holds for any algorithm-environment sequence. - -Uses: {uses "AM.history"}[], {uses "sumRewards"}[], {uses "pullCount"}[], {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[]. -::: - -:::proof "prob_pullCount_prod_sumRewards_mem_le" - Uses: {uses "AM.identDistrib_sum_range_snd"}[], {uses "identDistrib_pullCount_prod_sumRewards"}[], {uses "AM.measurable_hist"}[], {uses "pullCount_basic"}[], {uses "isAlgEnvSeq_arrayMeasure"}[], {uses "AM.measurable_hist"}[], {uses "isAlgEnvSeq_unique"}[] -::: - - -:::lemma_ "prob_sumRewards_le_sumRewards_le" (parent := "concentrationBandits") (lean := "Bandits.ArrayModel.prob_sumRewards_le_sumRewards_le, Bandits.probReal_sumRewards_le_sumRewards_le") -In the array model, -$$` - P_{\mathcal{A}}\left( N_{t, a^*} = m_1 \wedge N_{t, a} = m_2 \wedge S_{t, a^*} \le S_{t, a}\right) - \le (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m_1-1} \omega_{s, a^*} \le \sum_{s=0}^{m_2-1} \omega_{s, a} \right) - \: . -` -As a consequence, this also holds for any algorithm-environment sequence. - -Uses: {uses "AM.history"}[], {uses "sumRewards"}[], {uses "pullCount"}[], {uses "stationaryEnv"}[], {uses "IsAlgEnvSeq"}[] -::: - -:::proof "prob_sumRewards_le_sumRewards_le" - Uses: {uses "identDistrib_pullCount_prod_sumRewards"}[], {uses "AM.measurable_hist"}[], {uses "pullCount_basic"}[], {uses "isAlgEnvSeq_arrayMeasure"}[], {uses "AM.measurable_hist"}[], {uses "isAlgEnvSeq_unique"}[] -::: - - - -## Sub-Gaussian rewards - -:::lemma_ "probReal_sum_le_sum_streamMeasure" (parent := "concentrationBandits") (lean := "Bandits.probReal_sum_le_sum_streamMeasure") -Let $`\nu(a)` be a $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] distribution on $`\mathbb{R}` for each arm $`a \in \mathcal{A}`. -$$` - (\otimes_a \nu(a))^{\otimes \mathbb{N}} \left( \sum_{s=0}^{m-1} \omega_{s, a^*} \le \sum_{s=0}^{m-1} \omega_{s, a} \right) - \le \exp\left( -m \frac{\Delta_a^2}{4 \sigma^2} \right) -` - -Uses: {uses "ionescu-tulcea"}[], {uses "gap"}[] -::: - -:::proof "probReal_sum_le_sum_streamMeasure" - Uses: {uses "measure_sum_le_sum_le'"}[] -::: - - -:::lemma_ "prob_sum_le_sqrt_log" (parent := "concentrationBandits") (lean := "Bandits.prob_sum_le_sqrt_log, Bandits.prob_sum_ge_sqrt_log") -Let $`\nu(a)` be a $`\sigma^2`-{uses "subGaussian"}[sub-Gaussian] distribution on $`\mathbb{R}` for each arm $`a \in \mathcal{A}`. -Let $`c \ge 0` be a real number and $`k` a positive natural number. -Then -$$` - \nu(a)^{\otimes \mathbb{N}} \left( \sum_{s=0}^{k-1} (\omega_{s} - \mu_a) \le - \sqrt{2 c k \sigma^2 \log(n + 1)} \right) - \le \frac{1}{(n + 1)^{c}} - \: . -` - -The same upper bound holds for the upper tail: -$$` - \nu(a)^{\otimes \mathbb{N}} \left( \sum_{s=0}^{k-1} (\omega_{s} - \mu_a) \ge \sqrt{2 c k \sigma^2 \log(n + 1)} \right) - \le \frac{1}{(n + 1)^{c}} - \: . -` - -Uses: {uses "ionescu-tulcea"}[] -::: - -:::proof "prob_sum_le_sqrt_log" - Uses: {uses "hoeffding"}[]. -::: diff --git a/verso_blueprint/LMLBlueprint/Chapters/Intro.lean b/verso_blueprint/LMLBlueprint/Chapters/Intro.lean deleted file mode 100644 index ced3462c..00000000 --- a/verso_blueprint/LMLBlueprint/Chapters/Intro.lean +++ /dev/null @@ -1,36 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint - -open Verso.Genre -open Verso.Genre.Manual -open Informal - -#doc (Manual) "Introduction" => -%%% -htmlSplit := .never -%%% - -A bandit algorithm sequentially chooses actions and then observes rewards, whose distribution depends on the action chosen. -The algorithm does not know the distribution of the rewards and sees only a reward from the chosen action at any given time. -A key part of the interaction is that the algorithm can choose the next action based on all the previous actions and rewards. -The goal of the algorithm is typically to maximize the cumulative reward over time. -The researcher studying bandit algorithms is interested in the performance of the algorithm, which is measured by the _regret_ $`R_T` after choosing $`T` actions, that is the difference between the cumulative reward of always playing the best action and the cumulative reward of the algorithm. -A theoretical guarantee will be of the form $`\mathbb{E}[R_T] \le f(T)` for some function $`f`. -Here the expectation is taken over the randomness of the algorithm and the rewards. -In parallel to the theoretical study, the researcher may also be interested in the practical performance of the algorithm, which is usually measured by the average regret over several runs of the algorithm with rewards sampled from standard probability distributions. - -From that description, we highlight three key components of research work on bandit algorithms: -- A bandit algorithm is both a subject of theoretical study and a practical tool, that we should be able to implement and run, -- the bandit model defines a probability space, on which we want to take expectations, and the theoretical study deals with random variables on that space using tools like concentration inequalities, -- for the experimental part, we need to be able to sample rewards from a range of probability distributions. - -# Notations - -$`P(E)` is the probability of event $`E` under the probability distribution $`P`. - -$`P[X]` is the expectation of random variable $`X`. - -$`P[X \mid Y]` is the conditional expectation of random variable $`X` given random variable $`Y`. - -$`P(X \mid Y)` is the conditional distribution of random variable $`X` given random variable $`Y`. diff --git a/verso_blueprint/LMLBlueprint/References.lean b/verso_blueprint/LMLBlueprint/References.lean deleted file mode 100644 index 61f45e1e..00000000 --- a/verso_blueprint/LMLBlueprint/References.lean +++ /dev/null @@ -1,24 +0,0 @@ -import VersoManual.Bibliography -import VersoBlueprint.Cite - -open Verso.Genre.Manual -open Verso.Genre.Manual.Bibliography - -@[bib "lattimore2020bandit"] -def lattimore2020bandit : Verso.Genre.Manual.Bibliography.Citable := .article { - title := inlines!"Bandit algorithms" - authors := #[inlines!"Tor Lattimore", inlines!"Csaba Szepesvári"] - year := 2020 - journal := inlines!"Cambridge University Press" - month := none - volume := inlines!"0" - number := inlines!"0" -} - -@[bib "marion2025formalization"] -def marion2025formalization : Verso.Genre.Manual.Bibliography.Citable := .arXiv { - title := inlines!"A Formalization of the Ionescu-Tulcea Theorem in Mathlib" - authors := #[inlines!"Etienne Marion"] - year := 2025 - id := "2506.18616" -} diff --git a/verso_blueprint/LMLBlueprint/TeXPrelude.lean b/verso_blueprint/LMLBlueprint/TeXPrelude.lean deleted file mode 100644 index 92f0bc1e..00000000 --- a/verso_blueprint/LMLBlueprint/TeXPrelude.lean +++ /dev/null @@ -1,8 +0,0 @@ -import Verso -import VersoManual -import VersoBlueprint - -open Informal - -tex_prelude - r#"\providecommand{\ind}{\perp\!\!\!\!\perp}"# diff --git a/verso_blueprint/Main.lean b/verso_blueprint/Main.lean deleted file mode 100644 index f9acc76c..00000000 --- a/verso_blueprint/Main.lean +++ /dev/null @@ -1,25 +0,0 @@ -import VersoManual -import VersoBlueprint.PreviewManifest -import LMLBlueprint.Blueprint - -open Verso Doc -open Verso.Genre Manual Verso.Output.Html - - -def extraHead : Array Verso.Output.Html := #[ - {{}}, - {{}}, -] - -def config : RenderConfig := { - extraHead := extraHead, - sourceLink := some "https://github.com/LeanMachineLearning/LML", - issueLink := some "https://github.com/LeanMachineLearning/LML/issues", -} - -def main (args : List String) : IO UInt32 := - Informal.PreviewManifest.manualMainWithSharedPreviewManifest - (%doc LMLBlueprint.Blueprint) - args - (extensionImpls := by exact extension_impls%) - (config := config) diff --git a/verso_blueprint/lake-manifest.json b/verso_blueprint/lake-manifest.json deleted file mode 100644 index 640b9b3a..00000000 --- a/verso_blueprint/lake-manifest.json +++ /dev/null @@ -1,163 +0,0 @@ -{"version": "1.2.0", - "packagesDir": ".lake/packages", - "packages": - [{"type": "path", - "scope": "", - "name": "LeanMachineLearning", - "manifestFile": "lake-manifest.json", - "inherited": false, - "dir": "../", - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover/verso-blueprint", - "type": "git", - "subDir": null, - "scope": "", - "rev": "11c82ed5b84417b0aecc4a22b89ee536ee832ff4", - "name": "VersoBlueprint", - "manifestFile": "lake-manifest.json", - "inputRev": "v4.30.0", - "inherited": false, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover-community/mathlib4", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "1ccad003f48319848becd773bde09f17729eec3e", - "name": "mathlib", - "manifestFile": "lake-manifest.json", - "inputRev": "1ccad003f48319848becd773bde09f17729eec3e", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover/verso", - "type": "git", - "subDir": null, - "scope": "", - "rev": "4c6b02ee232211811f9ad1c148ac336122e256d7", - "name": "verso", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover-community/ProofWidgets4", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "1537e3fc7e680d64e06fe5fb95c4c9edee7941c2", - "name": "proofwidgets", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover/verso-slides.git", - "type": "git", - "subDir": null, - "scope": "", - "rev": "2b5ce1ffa9f22743057068128e20aee96a798976", - "name": "«verso-slides»", - "manifestFile": "lake-manifest.json", - "inputRev": "2b5ce1ffa9f22743057068128e20aee96a798976", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover-community/plausible", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "744117af710b1c0400cd297c9ce91f8d0ad3a347", - "name": "plausible", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover-community/LeanSearchClient", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "c5d5b8fe6e5158def25cd28eb94e4141ad97c843", - "name": "LeanSearchClient", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover-community/import-graph", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "99c763c8a96d3d44fb4994e96eaa51ca4568449d", - "name": "importGraph", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover-community/aesop", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "7897ea6e5cfc6522d355083bdfa798377ab35e11", - "name": "aesop", - "manifestFile": "lake-manifest.json", - "inputRev": "master", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover-community/quote4", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "94346b7b49c36ae871639d1434232f057c193d60", - "name": "Qq", - "manifestFile": "lake-manifest.json", - "inputRev": "master", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover-community/batteries", - "type": "git", - "subDir": null, - "scope": "leanprover-community", - "rev": "5dd219c775e402f818b42cd3997b5cf21017babf", - "name": "batteries", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.toml"}, - {"url": "https://github.com/leanprover/illuminate", - "type": "git", - "subDir": null, - "scope": "", - "rev": "c7a8de81e102ee2a42a7395f98d1ed12a861a43b", - "name": "illuminate", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/acmepjz/md4lean", - "type": "git", - "subDir": null, - "scope": "", - "rev": "6a3fb240133bcb7e1a066fdc784b3fdc304e3fc5", - "name": "MD4Lean", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover/subverso", - "type": "git", - "subDir": null, - "scope": "", - "rev": "a86770a5eba721c8554d1d7fce741bc4dde3bb61", - "name": "subverso", - "manifestFile": "lake-manifest.json", - "inputRev": "main", - "inherited": true, - "configFile": "lakefile.lean"}, - {"url": "https://github.com/leanprover/lean4-cli", - "type": "git", - "subDir": null, - "scope": "leanprover", - "rev": "baf3e62fbb3502305076ca077e004aea78157c63", - "name": "Cli", - "manifestFile": "lake-manifest.json", - "inputRev": "v4.31.0-rc2", - "inherited": true, - "configFile": "lakefile.toml"}], - "name": "LMLBlueprint", - "lakeDir": ".lake", - "fixedToolchain": false} diff --git a/verso_blueprint/lakefile.lean b/verso_blueprint/lakefile.lean deleted file mode 100644 index c08d41ab..00000000 --- a/verso_blueprint/lakefile.lean +++ /dev/null @@ -1,15 +0,0 @@ -import Lake -open Lake DSL - -require VersoBlueprint from git "https://github.com/leanprover/verso-blueprint"@"v4.30.0" -require LeanMachineLearning from "../" - -package LMLBlueprint where - precompileModules := false - leanOptions := #[⟨`experimental.module, true⟩] - -@[default_target] -lean_lib LMLBlueprint where - -lean_exe «blueprint-gen» where - root := `Main diff --git a/verso_blueprint/lean-toolchain b/verso_blueprint/lean-toolchain deleted file mode 100644 index 6af09a89..00000000 --- a/verso_blueprint/lean-toolchain +++ /dev/null @@ -1 +0,0 @@ -leanprover/lean4:v4.31.0-rc2 \ No newline at end of file diff --git a/verso_blueprint/scripts/ci-pages.sh b/verso_blueprint/scripts/ci-pages.sh deleted file mode 100644 index 0d1309e7..00000000 --- a/verso_blueprint/scripts/ci-pages.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - - -lake build -lake exe blueprint-gen --output _out/site -mkdir -p _out/site/html-multi/static -cp static_files/* _out/site/html-multi/static - -test -f _out/site/html-multi/index.html -test -f _out/site/html-multi/-verso-data/blueprint-preview-manifest.json diff --git a/verso_blueprint/static_files/LigaMenlo-Regular.ttf b/verso_blueprint/static_files/LigaMenlo-Regular.ttf deleted file mode 100644 index b1ca21e217dc1a54b354128c4243794b1ee06f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523432 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⁣1oqy|mxAUFO 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

0HtD zNYPZQXl9{kwi3}i$s1B3+E8yG?VTjrFs7cv$n!~tYSD)C%zJo~Xuk1KCEAE|(MD3A z$Mf2#G*}7L9cAT}Lc3^wQKF6Zgf`Jmi35C{(f}=@jUj)GKV(1=ltYbZ{&q+LZ2Dt! ztS@AXb}DvH#qO#7q6MJC97zkrRuDFVdPED3fdXh1%^nTZvFAfEVB1~|_0TL@h=3nt zLJ3re78(NyPz>mYwm`3FVeya(l|Wv20Hg!)gqK0JXyXk)XFS^zQUDthh$A8#(2J-M zEz%p%iOh$3(M}`A)6xK&r*(;TI(ARb6Kx`OCT0M(CgMLTQM5^sfZa*tPs#;s@`sn_9AJA&5;TbxjlJkfXaIafcZ+sL9ApCVoq^67=%3Le+Eh=l12Iiagml2( z)FP;WIzX3spLV8zFJwU;pmS!KXfg4S4Czn<4S?UXVgZ|Hr9vjO0E zc2NSfiiZ) zmyn-^ZRS|omARrV#mCY#z~<6IC>QOjN~jkteI=liPJVh7)QPq%U9_vQvz&U%skfYZ z%#*Z?7$7gB5n4sN#t*P{O|@t%@__cQ=ojr;@~;ht0w{qBAQt9ATBbJyKor!9b{*x{ zQGOj|*W;JDk9Gs)H(+a}FXW513f)z$qTQGS*t{tPx<$*vM^+_Z=VtP6#?~zcQ2!R{ z+=7i;{b42K0&Tms3ED)H%XKlG?cjZDcR6@OIcV|OBkau^BXn6rZ`X1`sQ!CoN z>7uPm5-mR#k|7hYd0(Mu_oI71cJ9Z{{jH)skN|8yK)nLmSWqI`dOxTTZ9^2$#tl8f zZ7)#1F&eN{*eKeA_<68bw1=ui+eCU3F>J!_ChQhrqlo%NagYQVkPC%S3e+jWMo~NT zi?$j4&FF7Ne>3`<(cg^zW^8V*1oR&E1v?PK!}R0B_be(Q2q$gT1$i@hxK9l?80?Hbkq9<{vYu7i~{D)B-;D5YIdK zeJ32K`%Vh1gnYo?JJo=lciN#}v^xCMML`0jiS{o3|K`c(qUi2LcQ3m84AI`}6YYIp zpikb9g+w6c_cI{}3PfulwhvlF`>+hEpbnZu`>2S|PUA)UxQn0ucZ>FE2A`1Px4B%j z1JS%IPv;$ZifAq5ed#OOSLlA7E!sCVqJ7&ZS{t_i5dc-9wG(G2@g5@GRUz6xvH35` zer)Db)>hGej)7!8Ma_kNK5NBhFFub(iuP+bpSF_!TeN7u8&E9Tu?9e|pI96zPzz0> zIekUvExE46i>{Z6uJS}TGDSB@dywbpC;E^$(Y+ExAG%U>?+nq0fsbAE;ZdUd`inlo zTlA6WjY<~X51rBFqMuSD`j`^Y{Yj6-)~U#Gy`l%Si5?UwdT@*AcK&U?-l(9bXOAhsy5MY#Q%*eMZYOP^ekWK7X9XYCjWK@BtkezHBm4zZ97nUDu1Pz4Rp27RKh z_Jv4@hg8Ud0w{wTXo4=`g9Y%1Xh;O&ye$t(pb8qG4f;gC-4`Mu9#SC-3ZM*Xpb5G} z&k^v4Xh?)~$bllLfI4V_9?|dchDeBqRLFt?D1#bk2K4Uq1Utk+GGsy?lt2|UKpXUl zzQz|KAs$j83kskNYM=?aM9&rQhiFKIbjX1ssDL_XfgaJY-hDeF5x4cgH{y(C>HW0{hY3HP8fIqUWKP=MUJ*OMz@C zhH7YrUeWLIgBVDGm5>h=&4N&6ku~JHn&o?wGnzne>4E7_h=Gi0(BoPg=*lq zc(hCO5&@2jl4ziaJNj)?}x9E>~LpUS=F+7H!$BLm6(0i;EdPRTS7a}1Zu=98p z6hRd3DO5uvSbF`UKj8=A zfZr$Z`$RSrLIu=83-pNoq$k(`-%nEhzoG_x{B8FJV%nYt#Iv1vwqw7H7|N2N0MOe( zEIZ0Xf65m!p5vTtK-=G_f_i8He7;%3PnrBg-$fj|@V6U#wZyO|NAx<< zew2Z4`$7YB+HC@y= zKPV9uK%4<}q5`u-1z|rpT9h3fd$XvJ1W}>>uo4RVyk! z4Je=8Cu&X!R6z@{eV#v%mk=&$F8cFULbIs((ZKe6bP|dG{3KBeOGPD7c0np&|3dOF zB!-J3As^aACC5RJsEdhZ5wE7MolE_JdY2`Ox}3VH+0ZR&ai*v%*j_@MOR7Yr zQ75fX)RlfvCu%8nt|EO^t*CT#mtp5>Pf^R!Tizfl1N+xt_gc1jPNuH&1@x|~6LmfD zTu;4~X`)s&in=LDR920sTWD{#x2V+xqL^Q+9JX`XL@^gucl7YHMd~xhRdg{XTH0UONq)Vc(I=1AFno`8+}sm~lt-H)yN*?u4f zNIy_7ssMWh_$#0d1(dC)Y&~V`iF<k!wo!LmwJ5HYsHc{^e0CB!cop;&(8@hk17q!<9 zu(7v9RDBfWLY1g}NkAO?u=Sn*W$#h{J@Vd96VND(rRxPU80O~b2i#iYvSmYDs}gz~-0nfXy#^M14g} zUy=W{KjZ`Dt=MR76ZH*szG)HlZ5p(S`VRRWKDjokHtc?nzwe6yoqrI=KeB;14tfGM z4%UlmkA*5x9prToXGgoJPJDLa^APn9QRfi8x>BJ|)Zuu*-anE5Wcvqv{!q)$abp16 z|B8fiQ9ok$M{NCsot{Ey74`2Z$N}{J-6!hja43Qr=oa;hKO_Mk>oK#LzP!2MVDE z8lg=LB@h5{kPg{^j;e$fF%0qzbd7c~O!RG}y?Vs(P84HUl^Dax_w@yA`<9C_!V_Yk z6dJ_fdTNZs#z@LXQqHy28081KKz%=dNP=phY;*u%dvre3h;d3Jqyc`%2xLJS;MYGE zTE!R}4V7Z>JkA)0jR0%~^otRg4)tOLMM1F`!NeAv3Dgg65yOsOuF*yaG6cO)%0o$q z76JKTsbYlNArbH!UIKMujHhfuB#<|uR*VRNd@&-a8(9F@IxQZW#5kSUPwy6EVy+lb zeo!gKqy%UcV{!mw0(nz>Ar8ucdeM}fLD^JqG0w#Pxm{w+#O^FR;Gb)+!8cXLoD?w< z=!d!J&n*>W9x*Sd72|?3F)oZ0<09-{)FMVQdW)jPNFgsJ4;sa|jJ(S$#7Hd=V{w)k zR}_k|q+N_FJ;hj>EygvJuZR)jTFS4B6C;Z}o`o5=qL-Z@#%g~tZbRqxL@{_)W88(W zyPCzwOA_PWNHNxRi*aAS7zO07PZxu0j8RCe+&dfG0~p-yxuFuo7Ac46Jr;7yR*cojRoqxjqaW(G2Su6s9Oox<(zHoEfb@@U5tIS z?Y%g_#{1|tREY6Gxfma1i@`b8__$PzPcy~%ELx0aV*EnHXsHu}bD7bKZ|42Rca*gi zi}8;%F*pwyop6YBm#-LyJ;nHEf*9TS`w2fklm82`{L(5$ZwmB?al{|e#W+g-(G2Jl zqpwtq-&4gn9xsL?9NNTiR){HJ#E9vcCFamZF}=IQ9F_n%&?e^aW-&*Kn0~->Y;#<^ zn1MZF2DOM8jBc2>m=hp^`jORQp6(~+MC?s$5;F=rQMF<+4>c!ci#a)0%qi$Z_ln8B zYEDfO^UQQWH>OU^v#@(Mx;(o!&%u5ic4wxDnUF8$TwgKg*`ZO)`8i@HMvJ*1M$GfW z#au{Pk^%K%UXU&3h1j?dTNky9c`-gO?h|tn=}Yp&OlcPLvUo8UM~RshAm&mL^Xfz~ zuSpOyGfB*w3^8x65OXzka?-_IgU(vY^CHE(w@u7^eBPHYW&u9d$3nH38;E5?5#V!U zDilH;bcz=ZQS16Z1)IJ&Elnsk7Y< z*xcSIW|=?Kh`A#b8pM1m1}emSIvyx5C%?Q+%xCk(d=4AWm5EsqE9Udqc)nZA7n;O; zu~N*+Trpp&74v2K;*~lvt9r$Jl|Fct{8#b$D!Q*x|Fu>zUyp(~C>8S!0owEi@xRe7 z=9}1lvk=hRwNlL8t1Be?J|t@jiO*W49p*@Y#UwhXGJ4=0^#T z2H8*ulWJ3ao^DD1~Zhgm&l` z^J71Vf&@r|Y$$|ssD)FZD1 zpij)d`$8ndiuoD!KPwlrnYzvRIZ!L+=bn%Q1yBN2K>g2Kfd1rMXMT|YDUbog@kJqE z=Zk7+1nhm$D`txU0T2b$X-R`@K)(h3mRe|rZZW?^_e*rYjDaLT_sdGChgQJeSKbf~ zagYKlAssK7d(iJezX$!ERLFt?C!$Us{3xEV*jiy|cOjLS_S5(2#kz(=4(;{f;wgrNKZh$G0N%S~{A*jywa zEt=ifJ;mmt1PLMdcY*H^3)*B6T0KB362ig<$VOVUxd{&tn~O}OMd<+jNElB&7gL2*9|4incaed#z`hIoN5W~u?}C_4v#4@&dV$z1Ci)Lhj)bU~ z0f;RMCRMtbOxrD{7;d7Y#O8t+qAkh>=tjaB*mlu^gsJuctTdcSTPh{Af5Cejid*N4-nf4@E<=&GwA_l+r@T* zWYU9_kse@9rPu~J4;v@wBRxPutk_OaNP2*|sbV_;vCkb~o}buGfX#V>bdw%neze$5 zP(XSR`eyzBiAiERK{e?C7SOH}^UvXHtbAg+Z2B>9T%1i7RKX(2tp1yN!< z!AjDD6p8}(TWqIM zNBF;FiYR`r&Yjp0nPmN20J|`1lc7j#ipPkN=hTQy;q$0gu@Y9XC&kfcXlIU4VM8_k zrBXfgqtQD?2WcLT-^>HYZ+7h0&OBb@aM_ny^_<#i8|sSnY|B1iZHUWa4KJS9_N@_H z6OhMs23J-BEVsrKJdFsW6=5UP&NjzKZMLDuOZ5y3;%5=#YyP#Yar}!Td|cr}6%2_ADE#JzK5Ksm5_co9L=$E2{BK(dN*6O2Pr{eYrx7#nRYN zQGZ;p)Cjh2$cdLTWAmKe7?!y*W3|6ol`nQ>%xYF;5BQw2nqh3A2o^OdMroF62h#Yw z4#|-3JmW2^_ZBvk)jJz5Tr3ds-YBfQc=@99;v1JQV%1%xF1Hs~X+CpxWW}wsvR!r- z7wf^uTCwb6AM?6e;c=Ui;vz48iNiye4-HgiO*o0$a$DO$Qt>f<> z9LEN18GOfc1K;__H?N6Zwf@or<3`yZk4mAV`q^a_wQZ*%&YeA zzEgaOFXraS+HL;B8#cUSqVX%JDI>^xl&7(>iKsHuTqtFH)%RohbNOPoMimKK^f->i zostBP&>Hn;S_^G(b;mUX*92U%aV^EQ9@jQpdvU#i>jPZ2QJoawOMLhRmpE#_Kou=o zb6T+G;ZNV!*vYTN4Nm53xo1w zP<{-`k3sn{C_e_}$DsTe6pp|c)yaa{@MAXom<>N>!;jhU3yMBkKSt{Z3?Kj?b^CKj zgrU7nn#@*0Gk$k~OVICW$baQLAl6e<*apavo~9aFw<#+002hD*>1kOkn|U+;_|IbP zr2hS;+}pSRq-C{BgEL#TD%`(p`Ccupg*>A0>ZM5o`rUhPzkXAe)h-LpYT2@2|I%f( zti1o^DgFB0J9)seefh2O9w=Y3|8I=l#}3^0uK|HlZ0as8YacluL30@y(JP0XfFl%pFKF+MG$P+;MH4=j!Vk z>YQ(Yh=_bZL-do#sFdjI!sUw}yn{dKbmj7v=A#aa!D;^<9~*DV_XejzPll(Na7Jfw z>pWIOROL<2wzKp!fk=)M9!)l=4l@s`G;rF)T9kBTC1N_;oSh}Ht-bryob7-6{>lH) zzIuFRVg8#hc3RxM{rqls&1lzVD-?B4D^lQK9RIfje480leb$D%cduDc%-DFP+9 zj35rKb8Ydf&s0x%jX0gY!z#6(q@k)CoC`Qc-=UK5mRwGw60lMNR!YE130Nrsoh6{N z1ay|DgbdJG0y;}TX9?&mMQKz5)=I!yyqN@uKyOyXxLCJ0JxeTZ?JkjqE?K;I$>z|y zbs^P#L2Lijms-28F0vz^eah$S2^KiA6Yzh-ZIae-kkj0t5zF{;z=L!GR< z_3=_6Eej+d2@@NHhl0D~T|iFK&JKyiz~Ssb8IoDiPlm=%=EhI9#!t@3Cyd(044IIU zN_I(ZTVsbX8Cdw%@SLszv{?7gcG{pZJdSJ``7 ztE&X>y~vJVC2s(4Ex!?7f|CR%!EGjZNir*d7s>m4KopN)Km!qX6G=lC)B=*)#Q~T2 zF1>m?fg*3vy6w=qu~&DnSAh?GwO!&*Y!XJ$h(p449O9Bc;F1h6Y(H!J&$p(rN!qX4 zZH(!$d+Z*3={W}aA z5?jK?Xq(wO?Oxvhwa#)0^dfM;phXmx%giT;K1t?U6_DXl9gqQneeQvViwBjn|DB4K zOTcgXD&JxLVxW(FN^n70z*ME+lAv%T^XbvGADS|U&iox<{*EZ~cYygj!2BIx{thsI z2bjMD%%6^Zb%6Oh!2BIx{thsI2bjMDgs>kdW)dVWpG@f2dydnT7c}JsP0_h~UeJ^m zH01?Nc|lWN(3BT6EPS{RE(!WtL4!BNxG zM3>VYgU_wAnI{In#d=wmIPr&He)-{tOP79Fy)stI=u^3BWej@{bE7?^J&J!1v86as z^AWc6%F{T0{W5-n`l7__{Sy7=(oZHUWEb*m=S+BDA;&I*AE*$aJjCl0=f zKCbQAnwpxUtX0Q{LIdWn?%d^MLE$%lA9Lt|PG1qcD}YZWfVY{@1MtR#;>;^e+iW4# zzcO`OawvVhS{=6|#}gw+u?fB`r%y`r$C~^(fENItsfP#wp4MLg!1Ye9*g=&e=`2G! zlLDtp?p#)UU4%CREg9Et(!TrUo)7Ms@W$9}yLUgmVZ+KzYnBc_FmdkRdwtB56_P*u z&8Ob^E-T|$aqIP~9n)=Br^R^P*iNH2No(>uk!SOo>{mdrW1WB@W zhQ(nBDNI^!Vpg-@Gs>#NnqhY~G@L0TUW;kIK%by`a``A9!z3RgaR}wwRTP)b8H@O- zmcu>_eEa5`$HL2$l!ou5w;PJKYMa=&gEV(ln7fvEcZ$#>pO6Tg>kWCB; z%Wc($8lU77pskqG1gGCei(H3k!i-(OjPd!>>Hq<86X?H1g+g4caKpsWBA*g3h3j&M zw)mPkwJ(01bF}}+{dYb8%B#=cwxPRnwnkgybZ8g9t=E1`O?|ttVAqz-yE8K}8#Eo3oCtEzPjI`H}Y$y{p0&f=e35PSUQXCy-qv7Xx+L+ zOP4QK_UzBh);`t#J#LEj>(4*I9+}0~;27^!{_wr~w{G44*B4&`%f+0o#Cj4>RE6ST zf|4mpqLe8sa%TlIDk&0^S(@NC0MA1{Z1sHINa2d2JIzfgaJ|VCWJWb6qQ?jgWI&UOX`-Nt6PK-hYRU4oPie;&t@-KQ z(?6|QwEj<;cHx3{?N9v{&V6X%f_ZZnibq3_KVBWGT=Deaz@7!WPoLhsU{4_M)}M}F z_~O{+V{Gh$k390=Lkkz__`d*S>dwcMA+!&s#i&Ba^Mcd1(z@CiN>fA0>(i<;V^oRx z(@Z{VRst>ag?g;CzRVm4f5Eu&SyaV_q9<{}b;A||=Y@JxlnO44^1@l-;6-cKVmX(6 zPOE)1k5>EVe=_+e?Y#C~uXW=3=u(DPV7XaXsRw6@w?bjf#WAsh&@j?V`h zs{Kp+34N2Vp(x7LuWLl4VbD9tv?kM>9UA+_L9 z_K0*%3())k6a}iE*r$$#WZC zk_KJsfqOFP7c zy3Dx&7FCf%?03J!UNm5LKo$s=vie3?Vv2EyZZYHCNQ0!;_iCfJX`}zfIslGKpgkvW z$p_nOUa+&pY%&@YtD2dRm>|ibsAMK4CUj0oR76=#a0q_qO2;Z|C}zEXX+TX)@R$@P zB&I@?GgFSo!BQoEIux0@GiSi*AlUT(xq!QPS-W)6`8KF2YM#itdBShQ(^xvlrkool z-00&H!vnH%K=7u(3lf(u?mW<8a7D+w#Z&w59y|Kr#Qo>Hj2_l4>*$FSY|VzTD+Ud3 zKdfN*v~FErD{Xt|xxR}>4(U9&Lmm!!!P<#JlJ<(cL753Y&|3Ie$B_WcPck}Hu6U3l zV&nK|1D@zO!?hh1+KvisM}@YdLfcUxe^h8YDzqJ(D~f9yuD!V4!1V#Hh?TEG+acQ< zIyrhwe3$nYKyLx`7C>(S^cFyG0rVC?ZvpfcKyLx`7C>(S^cINr7C>(S-kTM@wIM6I z0INm=FhNbDyBF9*cRQ(VnEUv>@X0`xoS3HF! zadwuSLB9kF-Ep#g;gl(h7EPJ5u=0t_#e<%E|NZ9%F3s4r=CXF4^=AGyb^SWMU8?;> z8^s=EWv8!*fkhiPE_!t1M(ykA!D_A##qo0hBAG-|_W21tJW+=T? z_$Q;rs3=QT*2~PpcIfGLuBXGO6FgXGGM{*#3i?!{eJbcvL7xix zRM4k_J{9z-pic#TD(F)|p9=a^(5HevVO5+XJ>4xN^M0|*M0S~<55mp$Wb%X(3#Vp+ zVAk=>718>n=!Zh!tvB2My4YJMW|;p-|5G}Qb|pnIy0)DhnX85aPwL@wyJWrX&*c7&C)lo4C{^{yFm zw65;xupPaMb8^^vHUkHWR_ElL>JZf4)!x?L(cTSq;5fSiYdk2j#?69pYRI%)2su>2 zVKPXC)&hginePT54fWu7q(S6CTh7l+ZR2ug1=3wH9GV>FVta&Z$B$hT#*AY_SXb>e ztwuY&?JCX_?{oF)93@X%r!9n8^Aui$@gK!I`{Sb}DnSvo$Z<(Gld(R$k~Y>umz=+s zBqU9aO0&a*#ns{a#e)rVNSmBi6MnUZ`u_&~4@3VZflMHDb5s9#$bAXqkhw+Q>EB4x z!z0D<;f*J#+Zi=s2jD}$6R>Urv2H0sSul{0D0rmAQ1T6H=SxcPS%o$+g=#TWW~g2b zb&Wcyc1Cv_|1YcPN-qw`18+MqTf3muu^>wsy>sAgHFq98dhm@d<8wY@8|L-t$3kp6 zEoO0>Q~i2rr?8aAw6p#ITLWqZjI^FT`P>emv7=@)GzN0`6Ss|O5Dd09@p1)s3Tq?R z1Zgd%sP96?7sy*=#ym-p{froxkMNrCt%emR#GDf+!XILS!gXTVm0a7I%sdQ(uO0fRC^Ose|14k zjm&jLCQQBdh4dQwbqOtkUaP^#gxzw;VGNm-Lyf~s)~GPaX?Nj=mah7rjk&T=}+!1sDUleG%>=(t39WXE+~ zv%v2hkBFsW`+;*<6&OXjuvy;`BOR64Irfr(P0;TI0nJEjjea7(9X%sW5k@Rf3?p-; zXFy{TVKg~j)h<_SzwB4u4V%TwSMrtgh94#8mGgXTF@TZ$ASU5<9Y!;Mk-qU1#dq4o zB3!54G=j`wn z+c91tJs4vOIiyhBdPjAoLYaxTWns=lp!X45LIFWYm4 ziQ2WR-yT=;!l%|PS+aK97oVK}S9m*KNn_T2;$wDk4??QobGjT!At{cFFqh92@3cCE zcsC{>KFSP9guv}j>U7b{l26>>&r zC`n`sp?vX4(B^6%Yt=mujFW!7akcomCTY$NVZGnghJU>5Nq~X^Wo&e+||+KVFZ!=iZYr+8bVYzBckV< z6)*#^<;QmdX--{ydez417JutMZP1C2cK4fi_vj36^Dl}KDu<#3eYj>4ZVS9*}`MN4mPW3w`BVKKBGxAm^1x;UuUz$ z=a*UB%dyYLhg|Gs;dwcfx!zUX%xAXvlMF&uQmMTl)=-+3-weZn59|VHjtljO*90mC z#`gP77igA79J@R!Xf_B2W)LNV$ViiH++FeC!f%!b$7ONr3@GN(rIGtaS8bd6)a3UL zX}>j0Ix}VF+Y_s6X05sR-Pf4y(;)|xEpN9kTXNss6Vu}h-h1WjXDwTP*sJS`c{66G zCgdI1{MLW6G4?#H;})!=K}ZhTRh@~ogNLe}VuVO(AU1ZXJ|a#q;d$~*t>pwrE|gq$F@c-@E$Fooi)oouK+gUoUUpu3h_%AXb6}fi?2efJGJh26GtsiiAuR)&OqYYT(vFXF*|mBv=Hn(8W9@ zpGX&E-@?6twOFEF#Rg}c&e+t1!KU!7u{?4kSpB_AM9D5O0apHT!Ir+eqTxm`N(UlwX zasX3g5#9*)F=b*tjF<^b$aUEd&jh*h#7ri_ilfOv=maK5uynRSD?r}O9+PUp?1>7J zJJdX(y_qzF3k?@AF~H5TM$G`8K7Do~mfTIhV~R@PkQo(hYg1%PypqkDNjXZEWtinb zajr7QVgXMR9Y%*SR!lSoU|Z%IGcCo?D25w{S;pgN6Xz%f^}xi{1JV$Nd;~4L|3_LU z_UT93liIA0*(K-*Z;M6Y&JEv)H~?1i5^i89+;%kz!-K7E9;;C>(pZh1MT`?_iloTQ zAjoBkPbf2(IQ@Z@(Er>*_#@=xU=cse{E*$trhKFYNL`sKu5CCL9xFb}>0%S$ScA1N z3EhIpM%{-Btn6$gA8JT3;oBe0Cj;ZfvMCH0a8c1y<^ zE@9;@;;&)9a(2Vj=`|bVH5j{Cq^*`dQFej1++;71u0Xo-A9(ZNX-7bdSj4vf_@g#V z*;V!528bK76PoOeF|KZj!i{@lv@$GHavx~;o;JtSwfG)urmYs=<#0fUxxQzt>*l1V z)ApfCo<&ql;(S z`aSIgn^?Aq!SDAv`|hl^MtkxDRu3&}Cu1wLIZQ+iCPC1imfyMt7e(VfB8`yVsbE&+ zx30E5P*Vfgz4ArzvN{3nGJ__zU)U$JGQJx~j>JB@OoRLEvJW0HY#$am*mih*KA(W| zEMbH8syYGtQ4a#I$?u;o&jTIi2-AYiA#D;?nus7aN=?<(+J(yCNall<2Z)5Rt zf*nVgcTJVmxQ@-?s)RTz)c2wDpjE74xouk4W@ir? zREU)({pod#br|B5EYM5xgNgAt8KKf)s*J0497x&-Z-u)@yj4{byQg4mg;3iF&AHM< zR!vhU7+j4|Bl%8aRyJXzw0`-LrH?vdrwC}W|LvLRNAh4oG08b|7K0(L}CR$h84mpLD35PtDlC#oufSeL;>~D5Y z#J+CSC*dSV=r6Z&N>IQBcS>aTer6C(sQ!dyGWoU*{d=t)_2T|lcaC|wQ)zB4Ys+Hs zuWj=duXk$q*}JDcZ{LyTWgg&g10<(DFNzSGSZR-~G*;UWu#J*ehLzOA<+k*sd7&l0 zab6&u^|jOWNe^qXe<4-W*0!o1cjB9GkB{G=IhHS3vU25;CCjDLVweBcueyCGYY*?T zil?csH51YjpgJ4oro5K?8 zJX2N&>0HS9QfkAOV>J;LPq@ETB$b~9rpT4^vTcj~Qn!1cbEr zP~Gl8PY@{fq4;WH`>;+YPUl(jhd^Z9h|e+DrEA=O?I02%Mi$dsTqIR2TeNI-)$#?) zYA^n~@3z~=Ztn8b@)l1|t^4-dx_j5>)rzI3KK$_1sgFL^&NpZc$w_-#wb-)DIDhm= z)(&jW$l4950LPEcUlO0c7QuKEqW&bNR=N&YH<}T_8)Y$OWF?WAXcytl#wGbza znt&&LqTF5gdXeYF0Pb!EF41QT?!@Vl4?x}*nd1|kD@S<6xHkqiH5#ZCNdmu#?ma;m zR5~kTAF`O#~|iKtW1rer8q`fp^g7)Z|?gk%$=M~qkE zjm2VXrH!#W4uP8`&Q`!~jm8A_brqb$_tf+>O#Xp<3iIy^Fm9Nr^;IuUzJdmSd~Wl2JFa6q7f?hz#O`j`ZO?8J86-}ueBz19RZl#z>YHCL zfBVhl%hIPGe{lAbPtJbu@g~Ik{0n&XK5L2NY<#R0@sR`C5P2}(OY*TOnA|8I57?{O z5$SLWWMdC5C7Wmtpx;K-fg<3F_&6gv!wtH`oPGO9ME?8h;}fdckIQsDV%e(jG1Xjk z`%vu-?OUh~$A+?BBB})8A?89GB>STDNApIK9DrX5q0SwpVy z#vrFWF&h6Ny**&_?epi2{9Er8tLopoeedLZUK{+-(qD|-{`BO>$1AqUrF&Yny6yHp zz0>W9o91tOH9h@6aq->57Z!+i|Jnu5{ZD|8bus4Ns5}c=EC|Ni6{ADiE4Wa~cCXoJ zF~KFNI^FggHIw>FWmpcb3XnL1$E67ibm3^BE!ybOvrc_}s)ke(78$oy&7*Ay64F=-!>EdxzYhjjChTk=iLU9({b@ zzJeY1?cC0`lRzhNF3!EWW&2&@AkAq#kz659mB&Eu8z0Pp9D!57tNR8Z(^O=ez^Ycs zUOo&*3r;dqmK8Bm6r(0ROCNWTbz|KRYWIH+ z-EpwA^Xg{6g8$^xfW^vO!EP3aQM1VmISM}pz%s#Kp+d$Q6aYz%9l%G99d8rI&f!0D z>|j|)3J^N|&TYXxI#CA?B(B3uZi`BbNw)X}KT8o4rDPc=&6$$Si59;#OUPn5VwRGl z<`~kAEv%(t8>Lh&H53`ktlf;gOx-QLtwXRYGSo8MIzgNyO^_!klTG6-v$0F^pz&eT z{g##vbAm{YqXflo_M3CXT&1JfQ7JR`G!HjV7AGka&GWVbDX)I+}d0r4>21tMw6HhbDFz+ zwZcaE2e{niea{Old6^|J7+sZqs!<{uqN2D>{*Vsu3oNQ?%_5w z`I?b71Fx&Dbe52F3${S39(Sj;dVJ)%ske>np$#~~`m!EJ*u+@}wcpzH@4sPmo!q}+ zorGv*qSq5xSEoD{`uDJ4vPAS?^kTT3jeCW|(q8f_$*dRh@yx_qBaVdM`<2>~Unv;Z zMrv#9CiONBm4+F|OOuVWq=$^=Ca$J0q?Y0N;^Kx^;a_`79=pBa-1-^`4m7}V9+^Ft zpbKXRIouz!pFbu2FBUc?-K~I;?kTui$#+o@(FR**>BH~9TDRfs5eA$dt_OZuBwY&r zcgK{6_ z4T0~gotA<;g%sEsjj`X6JO%O-@oWJ|I`ONWYRYdgJ^o+}3{i;$vm22obf2Ab5 zk&hvU^H`pn0r>TicmTi7=pjzYqB!4m)sTwm(?$$g)wSb)w@+CW46d58{l6Wxe-2y4 zMs8Z2l(71l-&PH)T6_M-_4ijj5Yk>ekH|SD*w}dab!2SKUT4c9(@zk^##m_aYp ziYzh908dUfRLwR5z>&)z9kOj$<>w=N^&8k?NxRxnJD6qEfN_#@SY4Ho#mr=DX7t^+ zOVsXtQQ&!iBF^B$JedR^b|8eMY`KiE8c~vw<3`33H?c1@oXkhSaGd0dDT;B4@(IfP zlRwn7t2ts78?S8)-$!#O3TL%9a!)_Bp(?xzZSG zeQoV`w7x4ryTh>Wl_YcwrW!oVZQdJev?3N58(azNoz@UyhfEfO&k+;nN+yp7xjfDw z@EUB?*NzLiEM356YOBPAhNAj6-~8m$PAinXwJln_ zeCVSpEw84Aovym5T}k2V_qK3E?kjhOoX8Uv1rt*}NnU%imbQ3blBv11Wp*IWAxoxf zes2;TcbY9-%dxf0_vd7!+PrRiAUi{K#JQXM;;phOJm|5z=c*4jOU*#aA-ro1xWF9A z03-KER;1C_^@B(^=VuY&|8aB)i1R4J~Qh!y_u@&#xHq zaQwE4ZN3zrfBWcdtwt2)kICOUa+^QJum4`uYP7hxV&1%pk@Fv64{RH?tzcAs;fR*o zMnCWOr6m8kVq4LuR)wQlZo6|kekZ)XzK;+uEC_bRK7xtwnV9G%iLpW~?IXl?77dEi z`fs<{tNc68APLLu@yvx?4MoCcSD8f}Z!`HkuJJ-yj3a?)3tkuySUr?m+F~G=|Aj&# zIl73uaCP@a1qIR6BqZPz2^ipli@Le8vF6d;hrJEj(IIS&HvNQlAFHa+PW-IzMubmI z52a5JUlOg;(?ioi`)+NEcmT9YF~0#60inGQjMeZrL;@n(MZ^vy0HGDqchwOWMLhGs z&Ye4zrzvKkL7<-;Z{EDtLAC;y3x$r@k1k8k@Rb%>Tp7(}mQEPKnutTuOKm*aI8>dsuKuj8&6J~y-%4LIte zISs%gjzaMF=~hduHg_2hcsjW6gn9M{t0#=8DrhmI+oOL<37>6Qkp~-(el8~*5?Q&@U0S0$`Fy9) zZZE31oHr_W$?Ps|@mP@_v+frsMmCr+XVl#@d9@EevgAQw?p0cg_1sJL=TF zEaa&Ua52*!zf%ie`~W6=bPgNcxzW(mY={+owtR47@O@(B1A{$A^F13kjKOQLi!6<4 zH@)4gWtES%y{EAC{T=q4diUiH_t#B+rB9!J{rdEMWzytV`u6S9w@;r}rY!ilqGIHT z5hFf+Wd6svjjX8nSkAjQIq9i|kF8Efoaptuwe!W}p67b^=~Fv-;@|r8rT_5#+CF`H z-&0XB;++09>R|pO=SEai(A;2Q&q}WY2N8gZotAOIHYQa_@LRl)YR!Jm62A9l{YU-Y z>Pr2=e=+%c*N^Gzn`ikUTTN24?0B1LvSo^2njAZ+xgJDNSjcmKh*1IaE?uClm%5AJ ze?Z$WgpRPSL7|Pw1|8T<+bi4$6xm+k$?`j&cz9^fNsFth3KkDqwEoqdd*{q5n%|}C zvhv!U;VI&#@Hly3*Z#qNRWnmMXu%nsIxl}{-asAVtT-b=1pD@e zWzuLZj**Y>G34rv6;TbcagQyUF+kZhk4gV*NE5&QJB z(>e;f`Ib>;v#GPyta?ml&xelK4+WR`gHC61gtNtGa^6ol-On5ApsF)YQ=$~-9O+IR zX_iLxFr>SOwKt>>&jap%2|q#|mX6peI4v2gEvd~osRaF=M*do(oG&(eYS zJm|%n9!EMKn8zPbf%gxnMjW>GiD3g{+GX8eHKm|K%aTXGo-m=JckiyZpoK?nK{ImS zvEzG;vMXKM?|*4vbL}7E-oanDDeqX!hTMuE?zt7|U`=KzW91RbwdJ-)>Ec1gLO_Ad*$C=YWG7U=sA*GE9^> zvD2&;E%T7fy{C4`fay~Q47_iK@?$}(miKpl>~DLPE#1Fp`oMwrPU}Bl2H^s7FMtqp z6{;QK5W46(q#ih{M`e?~NaYvo6xAtnEl!VkMcE3jU{WFpZ8oU5+pw2V0&HX4|HAi# zTs+Z29M_nhT2rG~w5l4dl08tvxE{+`XK|A>A7hUf?h3{TL*a1nc*VH*q3}9%R^shK zClfOPR6Bkmg_9wlnVEui_xc17iQTw>#n~l@cxY=pz?fs(1#nzSSJK6LB)x(RV!n}2 zK{!o$28Cp^FW83g(SMJ>ZQP)O`^r1bZNGYF?>UnF{%QZZ>!G3!eKRuVCnqnNQaWcA z%^PFg#Z}TKz}!q2*$JDULJWY56U_K&VitU|;gbp%h6$cP3tTy7AsIl&q_0OZAu{x0 z6BcAS7f47Z%mL)6CBkzFbxPrWRuqUphLxU7c!QrUV!+)Dzxc`MyAS-e-Tm#m-Pdyb z>}gXw_Z~HN%+MAy+IO2(xMuq>c}(2B10P-*7dtm8@wTqL``%k#*0wy}JJ;o&eRq#h z7|$p2MQML@?_K;q@4Zuuka+10?bQvm_0H!+IHC=fpM@_V74b;TV-oz5N0m%giMiEE z$I4_+wQvNkv_OKzlZ5>tY!w31tPegrxyjlE4YXi4$hdoG^aY%zJ819Dkwa_=y+9t>KZ%yiF@tZg^(- z%1yIAd+pUvKYjJJ&l<)=WbW&bxg)R3T&rT1xXe|I%xYk>5lBAUY=F!yqeRw5NOYOY zMXd>e0?6<(F>x6?tK~xKzOS{5ev;F*(Sx+n2eA=uJ$U`&wQIU>pyHWwXq*W zOrxLJJ&Mg`Hsl6PsjfV1M>}jXb=uhH=*ITNyuEXek{(O#l>zC&Sn-Co{TtgB@wUl( z6qlXax@OoHxbp4gu2g%TORzg!Mh-Y4l=#@Df^O_s)7OJTt(i7!QgV_#GdanJD9D&Z(BxKiyY|>kCrYCI2Qj=4X<5L5En_KnSvB{Mr42*ZE z1Ksg`lJnes0%^{3i2s8wMe0#<90kJ}&jE%Bq=a+P(VZJ~XkPl5lp=@y;=>0Qyy94;EuC1iR@!tnCo&|&4}!=I*< zuXXJ@ZNC5h=Ys9oPCfHWttcNpv{U)8VGUuUG%zr?*Zt2ucYm+h8CO>5xnLCBFUXrf z0}kx4+!HLZWjgFuT&_&J!|u#BN@$G_f39sF zU&}T;c$^_ox<>0>6aJ!xEzlO>7w~3Mm4Q#-&6I29&JuTy6P%O-sXsr8@$~2T-Hdnv z@Y~I1q5aLzTi@`U@K|qOa>H}NLH&7AKwi-7Z3N`uFL5dOIEGjeD5eAsBM0kq951o?m5!_1iue@M7aF2CHI2fdnoFC)P7UWMw7k7qfd$RuAJ7hz_i?_!k=TDF@UYRVJzSWtQaTJ_gulb zM^1|Y{Gji&U`&+0d0qvd!@`?*P<$f~y1C7D9&~dXnp?e}C=aqG`rLS@Db<&UVp)#F zC=b&6Bp#%3T*Z3yWhey{D9cd1_JBFGaFrUcvN z=43&b39>!KpBihInrHc>P@+AQwLY;L`2;Oe(_PJDvAu;BYD&5*N6l3Wy=`2D>BTL$ zHgSl{aFDX@tBiQ&Aipjia#B4ISpWJTNfo9bMJO32zI~1=C?1AVL6rQ$-IFLqM2UEze0Ce>Xte(2V6y|qy{3lGo7vd_St8ic~}z4!Up)5;Tu1PkE%hF9B`igOY?E4_)8G0iKb zjWN}&tR`DZY5?n>k*%sJYKGI(QgwC}y62M#aS}Db&OizPEb=grgIBxg)Xq{o1L3@$ z;LSB2J=f$$vr5l3A=jlInep0t|2X-cxN&<)mv*7)pVf6+*17MJ_V+IA^kA2fBerZ3 z=iWE>{#WJu&c1X0ANGgG74&PKIcn1uvdo?N50i9wXtLx1z#5n^RM)+N-|cam8@)Y(9z1WH1G41ccs-AnT?Uy}m`^ z68!}`9vpuA$lmPxenW@$W#7SD#>USWu&A))u^!W&O3hw!*QP(eb#T_*quV~#vEO55 zBOcBSJU0BLHEe&+iu;D&wS-l*4lP;!Om3AUJ?*(Cii&pTZ5jD}T?=H{jRJ&!hNq!*iF)@yircg64cP7fsjuq<5lEdS^Ux zIQB?Rn@XBOB!&%in<(T6D}w{v-WWGFQ|%6??4ke%kJlUTjq}FF#m9R)Cnm(l#m1-} zhtDl|e3jOWO10YR+1T727cXVU#(1QF36(Y+LLl2Mbq%;pJSd;@87>@vBHWi)f0D#Q zR5a*H-}OWogalATKvXhB<9^{tSF%g8i@cd$)YfdoEFg{e_R+mpzr1ku>St-`jzG^W z?Hk|sdp}vg0)dy(2eo{%dfoCB>)I)KXSB!Og3tCJtQm|)6Kf`lEr+)lIdakNUMcDDS~@>Z#-d99qO{#I&}_OzzFJ?9hgdrZD0iP|sl z%}Bb_H!x{{FPMb(;1k1y^{DkS9iQOy6SARPX@ab&#?6A+imE4bu!BV^2JM)F$j{Wl zZ9>tC*i)gKM{gtsrB3r&Ui_d#2yrW#v^Xm^$L}vT4{e5*lz~jz1UJSbdFK&Jw#fuxBH{ylGlSo>C;_wKGI$r4QXr0k7 z(JsdebD~$|>zp{lduQT6?|{UhSH}w;%fsOq$>HGd1C8@|QPqDvUNjNO6iBJ4HXcB{ z=+Rrpi`L&1FRIti(sN9j8k_77<3$a}!n}12L|$ zKJ*-|o3zJVik191-qNIh(ofM6@U*=(JmNhOcrc6dAj3UqpRKpQ_A;9ecp(3jRMi7G z3&nQVb^#N6-~~24k1HrG5F+v`VspAx;Ys{m&*M1_*+MnkdIn84AuZV;{oBN9nKhW4 zR_RHubXI!~C>t%J--_%>)o50GB)DUGW)c?wJMt1giljV+;WQv~0@)Xos!|k3-06SG z^U+SRg4%-zZ=LPKiswG{)Z8mq{vhLr)_4XX+ ze&1f@xMlx+d%l*pXwTR3#`eHD)Jx$w2di0!h}H(rk()%%h0FXoAZmo4))J8Owa!{8O#`S`*@Y=s_f~P;8hY(NPN{0yJCEV?K9e&_wE&z(%V--~c zagJ0q4|}l=;v5`KF5_=#-v{mEg+9C7w?#7)gN7Nx7-0ZvQ0L=ssMCaZyaO962EO+4 zU_ce!s2Sk0hT{GzBYeeduzF>mNhxsKVwuk=hnw(NNLgX2q=;e|a#?8fI*=l zH>NXDC=?)rdxyseMbjYW&#z^7X@B}%a+7>{>q8H1)ea*g0&8##FsX*oz#;A}!5Y9n z1x>~uZ}Ji69S|QhmB;6s^5RoXq?r(&?#6ezlCDKs4^|UeDu1r`mER}_s3&-U5o(8? zlmTK;(q$z7eiIpRdyx@g_q+u?}y$;>%`%c$3Q7lM@YkigX${fXDEUHeKtsr&TwJV6Ujpn#s%JlpyMz-sm*IoX*a|_9`iTJStAC z?C@BRyRx&iFk98L=k`vWg5j3ps0$auf4*=bh?+UQ`$UW8%$nu#C`X#q>XENq)%wVf z13xLxjLseC70fbMnvSH3NqgNcf1N#fqvSpu8^70Umh4P*$bq<&n0R+`Vk#-3C(o6g zbe=1N4A7wl-2iU#qGOVNpM0i7r!5^+l`g&4G!?C35_^=j2)kMCci)9V{-%j(hxBO` zyL^LnrP@NrBm5wr^S_pSy(wRA`*r@uzM^GC`xW8OsXh?!_JzsUfVZt8&+G9Vd2XC< zJ#mfx(jR|`rRXhZzi-h?0j3AJ1z{22Xyh`B~h zBU*zAG}F{8t<8^kj(j_M-ayZ(Cwl%N!9gv&<7VTs`w!b1YUO|xE8b61*^h*h60n& z8ijl*qOlb;8d7RN{}=R1BdAF3g@yzEi+IfsPq6m=wK-IeY0bdT5t#V&C)2fy*x?Y{ zPo74l5`b6WLb4gUeH`Lq1F^`^MhOq>Gu!t%k0PYqV)Zy;BsErcLH5~99&#Wzz=y0y z1k!tHLzr(eM#Hd?a)^QxoF@PjaX}>Y@a#Y~kLMq@AE?b@>mPn()0x98pC``CvhDcElIEWMeip8&)0(#VxLLsu%5Yi#XIYUY7J zXkwq-Z*@Hv%q@2qUh$W=pRZ`y;(>=(J$?Lmo7zWS-6#FKK{+yM@}`a*pOpTyXUE4U z8ip!o-Cf{6cu`ro=hO^14zhH?%oY)%7X{bd|~h%$ZKk&L-mMwJhXbmNF*#%f@5L9 zeKYj=)AvEH%i%&ij@{!FB@g7NX#nJK9xO859^-zDs4NDR4?@b5gjtpk8@9oQAnqDkl~Sbjr%^<4qWC^f1EeN-s;JD_7nU$ z!GZ6P#w))L{mseu#QgS<)nyJDmwSbf^{+Up#VE!)EWUWyDJ^4tN+K$6qDnX-13{pi zL_x5adw51N;{vJVm&#$FQ=(NwHoBb1VsOc?hySd7^vfl;N8#txE|~bObV73=J9AuZ&s?Mtyf50>0f0L z_Ii^omFeEsU20`<-hrI->QX@}%!)Vlv(NHN{k&ab`?Z)^3gqBboj~Ba(}X)~_5EkK zY;|@M`3W>`9XXaHg;DurXBOOQ7zcEK-$m&}-EdqhbjeG=wJj@C{3CmRVZiI-eEN;Z<7 zH_CYlS`sg5Vz2j(@U{dFPaEFPS*)L`^R`5SW=N!eUaRZ6je);3ZGYXSYHSbP61BYm z=T45dXs!28x+sTVf8N+0@9mBLv#4Lr3-$eF9Uj`JKudx@(oY`xLH(@8{;^-h`(KRb z$kn9h*oIYwq0#o3=PkT{w8TDbTg1W50!1^MN#AG28ZAZ}qxuNmg>M0dLPqxf^;%sH zp=Ho3TSLgcb&w=v?G%HA`k3v^b|<7!J&7aIe?eLJ4R#UH6J2`vpo5T_hTlYGw4x6aLzp2J0#CVe^ zF@$G^;0H*A#2>O7BRK@RZvnOsbVv|@o_yMYkwrubvYvqY<(GO2>X%Gd{~DLN2xpbI~)114%>A;tizTN zX?L9u^Ztx?00+>M(}4XcGaG<;(7*pNp5vRq!v}Cu_4WBdTv3E?)BEYU-k#_}=iBr? z-d>wPHQOTn!xl^akKP`5yGy1$dg|W*Z(N8!$G5;YbibOw9>%P;!z1G!JNE_X^Um84 z&BCu?Kno)A#uk7@_aQdz1ADJ%VQJEb?!)ALSc&f8$>i_Xzf1eP_zvi%2m+qyMs`>m z>1GpPTod6XNt~BJhT**@@Z72Mk|EURs7RlB`+?;9tt+Z@Z4vRK3;$IcXK;()YL0wy=S|E^% z+<8F$xM((_xGhpR<~-`i$VaYr(CfxjLn#x5?%-Ec?G#;k-AA#@F^F9bz>02~VJLy>DM>DX#x^9$xpAk2I7)zvr@AO4t(ufY(w!Sc;4X08 zk+9=(j?HaSA!**cT9G^*qL>n?pd_8Xp;D6W@o2c4?c{}&um}=taU539_ugIDMJo?x zBnTn1Ddb+xLgv5vU6urYj8QZQcArNnOh)RUJCKo`>pXMrOlf`LIX!ZiSP`5uJY+ap zkyDC(xT)&2i>mfeiFq;kK`KA}-~+t;^kLSyN%`pm9mj3jAs!2#pSSAC72*V~O@&G7ZeK+(K1?bmm z9w~Lc-c+4K2YU7SgJRs;?n#f0#43zD%Pk_??G8D7+6 z=t#*pw;&n1WHPd1lM$7b42nobR%|k|Vv~^-n;gxGO~$zeDC$M$s5vmleqcMTw+SPr z^=?v{-3!AD8U)U!NzsFy;`AEr(!ZM2Xs;OHZC>%0*uh0DeqXA+IjfE>DulgQysSGF zZ2zILUON*;V{9{()xd-#8XKUYbJ2VeX!MnjLPLii+zd=4Dx*X?)TB0B_bxFV01QmT zn@Y5a%~)IK{XNKZePmsy#xiZ-8!*K9o3RVCHkz}Ay8OeU5j0UvU3mE!7!YdEe+xaQ(ofvXzV4qW?i9mDkzE~@HJhn1#K{UpQ< z^4AFbHG1kx0!e@fR;9c6N)Xd*jA3NmzlqkV|E5h@{-#6hZasuC@p|~8l9!ite?j+G z{u~WqygCQ8NIECgt~UaVRXXqSg4e|3@&Y0!Xwiw!vVOvt3~ZBuZ8ES;2DZt-HW}C^ z1KVU^n+$A|fo(FdO$N5fQEZceZ89bZJ)>7EIG7Pv9C2ME_yA3-IWnzrQI4Yvwf2lb zV-2L@_@0tBIPyzc{KNKV*YElv+)Y}lbqBM#Ts)r5`%XNz;>lI>+nqb^z{j8D%o*X6aJRsb0^93sHQ?tc6Cr0t)@AN4IeR3F;dLQ=HBybK?kUwcD+zF~uq`ORTnu62-mz;?C> zCBlDoSWR%o(&RX??MNUv0fMBjg$Zk6!djTH7ACBP32R}(T9~jFCai@CYhl7#n6MTm ztc5AM7AC9(a+v54&~MT06Q;hKwU1+HpbJ8xacf8 zEAAvYNQSiH2b|Ojt+BcUYbnjAA6f+sqJYmM&2Mx5yOnm@@Woo3UqfmBRC*A!9+_IA zY{jEXn)I|hR*cU@g+(Pu3*d4nJB$AD^CG}tallTr@)UbMrdh|?bB<0Z40Z0_rz$5pY+|_hp8ylJpY1dQL4VCW*tT@A2i6C@nXEg!NlC;_*Q|K_&6Jr)`buz z;pa&kpKJdLWdZJ{XFcQw%|;onHH#`0p)@WX!iJpbpj8bS&9DyTknyi#L=l2&NoJRR zp^C>G@gRPcS> z#^Rg?W`5bEhHUFoJRz2VybSs~;teldIs;7>wVz^0jYTYKq|T=T(|BKllaZ;#{V#Hu)`?`qlKtJt`}xc{|#=vYZ{H6d}8|fbRB~h z96g7i>x9Cre4IcB#SfWd0L}xzaAMv19KjQc`D>2<_b*NA~Pg|n! z*v1rOy#Pp4XAPa##cCI?V9Lk6{yul&f#FNnY+AWt!_&KWZyWo@1e{d&i}u|n$)C1m z-Ye%*Q};J(HgD$ChqhHex@vvv;$s%ED8lsznY!mo(d@Fn;lcRdaPLy`JDYr^Rf&m+eX@_&;3ks*xGso085R-#@yv%&y0 zC(cUMEt06xW(fQq|sw(Xp zpL6eICWIt2lgy-$LVAag3@H#uLdQ@;4MlpFUZshmAXQKh0TGc!L`2pX0Rt)`x{9DK zDzd1!_H|cT*R`!ea{2#$=iHmZy6^k_Kl%Pez23>4JNKURoaa2f2+0XJ&IV)Dr4Ca> zrmdj_rUtJUi(ppvJJL08a$1^Z{7GaCPHoq9bQ2iUw`FFqBxcNoQKNRW%G(B)Qt!jV z(|yh4Xj)^vAA;PGVcVqU5pQnb3Oc}ZVvxt<@(tY^KER(X`tBd~@+&7_={OF%-)_Lm z4S2Z$FE`-j2E5#WmmBbM172>x%MEzB0WUY;<+kAE2E5!7UK-xyRhoboblhvvaWCk& z7j)bUI_?D>_kxalLC3wI<6h8lFX*@zbleL%?gbr(Ym;&yo3saG(5l)DFwExhCMFcP zWhExRK#;pXzrd}%kA^s-jP4@MXmwG{6?5OO-TlhN*R?f9nKAG3Wps1-T&u2qSIe&1 zi*&c=)~pd-fY}`&XKcitfNf3TQY;uUaY*3pJgah%U;&s@^K-}HJczS}NajHOEQ8n( zkMU6$iNzRGOr0PBpoqt9)KHS45D@QGQG2?88#**R_=YtZzZXeqMd5|Hk8Rz)tm3AT z9lI^vySJC8$H4hpwWG$z+wxl5wVOKb5DyyTKmTOZs0$*YzV_+L;Ji;TVEO>tf~I(^ z8khmtF6dRth3?{rhVc zEo)!;#FPoI;CbeI*n7rj!HkWtNJmH#EXgIDGL-dRi-uVl(QFhFdJaSfXNq#njHXFK zA`ZqSEtJxTKuTw^DA~6LNu9>OG_!lnFTyE1*uY$AOosjc0U9jj7^edkFJX+)wiaq# zeGnu$M)nksq6Wup;lbgT5 zcAoH#)Anep70g-tj{U*HCZDqIv-*#0kMY~G|6cs z#}kIJL|`lmMt}hYOUZtqQa0#AbJ=n;1vIRPs(-cFB=v@;p=+4ywF_gQ|1#2|`yL=C zVd25MX%XU?6_B9W*4IfzDj#mD-vAtNL$eVVn-kzUlDO2!o-2h4j6S>0y@>{vsIA)M z!w->9BVC&>-=jUYvF5dV(h$wUf2w`n?rbXNVwb(1gdd zYhTEIut~OA3OAUB&Z$~uwPGOX@NXN26DIdMcR!h349+Rs^G=M6dp;VY3pP0c?NqEJ zrWmRZ#Dev{)D_kdP5_jszb2(cBLPJEe- z*F_MEv+6%x$(F@gg)I*JJsL0!v-RP;XwU;4#u1K}bDfEUUVQ$KJ$guGkqafIUv>^s zpMZ;g*jbRNV)AoZTu%H&yz=|M7$udJn`0_7GSKe9Z-3)Tw*8H(%_SnXUnXJw5_l4Q zuHm+u)R;IP%W6cf#PKx6*qY*cki%1ZRacE1 zW_pPz;gVSZJKdV}T0)%FHAO*mR06^RgZ|rx|I2X5ZbRn-+jic*ty4*$Xws(Bw(XsZ zA>=mhH)Omn0vE4ezu5S>`pW$E>*qn#y=HSl?s?4NL)^01u1+-;V&_j{x6~0N;-Q z-;V&_j{x6~0N;-Q-;V&_j{x7Nc>t=~7x?fa4$4Us1*NUP4hT~g3U{Z1w?!hqKG_2g zK!PSfRh0}>)I#(wD1CFrroa6D@C>8)Lv2<2HER|wT(hRV_BUZ`ZC^fhWcoW_%^395pTd31 zI&@g}W=0b&R~(*``at${0_CCFpC5ScKEs%oq)*dUPBT93h}i)y#h{_vu>T_=o32)H zQ8s0ZsgR6M{YpFd*pJ6TLb4f;#|l96$ieJOm&lCWJ=_X}3kG4v&4C zaeC17o6pcfG-}jsB3(StFWj)dQy#Hn{mu4BV^6P$+I^Ops9&XVsf%&nL&cp}Y^wdE zoVSd<57-K_k!5?4^RBjKV_kA^WMdHV06%wl9Ck6OU=FTD;ImUns7}DaX~Dq>I5+_Z zC*a@&9GrlI6L4?>4o<+q2{5S$=`Os5=M0=P*gZH7@JX>z zKOlyv&IRbXD&fRULjp)994_HSj6kSBdJ=I0;$eQhhXr5+5?NA#SnyU{(u%vUHVM4Y zGI-c2r&Cpw&N+6rtoIwo9!GtLTw`^<^Zg5Acc}4?uHvRWj=I{?{cB$fI3QZ~iQe&H zs7v9`2IFVhw-y*?41Zu3fZN6~<`GtQg3Br7G7 zuE#0}|7J`B1St&!0E%v@vQlEh76&x3t!>d51n>-Wwm~m2WLV0!_jC|Qn;5!*6&3ck z+JT*Yw?R8Fam-s(^qA@gW}qvM@pGe&V3ZkToB?QQx}{lVU_hBT*oBXJAyr^{MnaSp z6#^O)0vZzn8WRE<69O6&0vZzn8WRE<69O6&0vZzn8WRE<6JpVr5YU(qNn^_Nz|lnDXd-Yl5jcuXk7FB-$8j9P@fwczaL^hS4knriKpn>vnn?`? zvYrJ^9oQ-9HNAOgQTK0UFKF~=&~5pX$tMPVBto7$H}&3m`?pPcW6mw-C)XH1pL~1D z{nPet7;$WP!0z<)f1ciTA~!l={>;UzJKyxD7A-!0_sH9MQOT3W&RWq9Nh1wwb$_U^ z?f)5=hGV5D8Qoa;{x?un75NEO&2kG|S4)JBQl|**yLafB_wReSOW=M@HqM7kI1KtnAke_HGY3I&BY`I0QalWp;FA36I3xvC(Y3irooE3i(WK}| zN)kGuKT6*fZrw+bUIrxO} zoya}XuORG&0DFtbRvrA?ueP6N3?>GjDZ_GLNw`KiO~Yr(W=+g9DLke1=HyQ{P!3DDS0WGPTzZxi7)Y=vp;NG< z4jRu{DkB>-W0cRW3q?e*irF!uzFfMckY!w7Hr;EgWZwGv>A6@R_SbW(N@7X{rRqoW zudFj_ZgjMVVh%1!7W6$SU0M-XwIW;zI=|?0p|T9-ApUS?*SsAkFK8d4Eg!=Dij-@` zYR+fI@&F&=tnMgqg-9^a&%?)(mV0pa&;}SNv4EYzqi_?ABCKqtU_||$%B!2Ol2!zO zs;-|#L*@0ly7E~TyzHYIRF{vpER~3B!uk_Nb#@H96tgiNYwa42gYTF2f`+)LVwz~g z_~_B0LsWml7jG*q-7#hIO95rrCqa;nPdlQeEWKUqLzSZ9YYT{e_$~wA?YGa8-$7-> zcU9NM^E=GH0_%5oz+o5$e^1;z&b=f-6CedYr7x)EA&SMBy;_Nxda0k=4Cuhg|%eNL+E?Ku_bDKmUcnVt@IwxT)s>z-2q& zfyD6Vr)`bBtStCD`pPtO?rUliS69XqXMi@rUgy9Fg> z#5VWa=Neh;(5DyGP80W@&I)T2z7p z6)rCmEZpAcmD=>mZWT*5P3<|rpJxzZ(DQYkbRQfg=2{ND}j9$H3aBXwBO$9+TEQVdMJ?P*eW5y&tbejV8Q5 z90o;^_-DNZ_))R3bI5nBApeQ+qqs*jmu2LQgL{m(x9k_q_6US^3R|;lpTn;HE~Mgz z6mB<^iY+aW_5<>#Xq<19Wc5+;1E-@vhVOg2{Or)v|$?1OuU4_Dw3PjkX+ zCQZ#Q7RUDOH@fYuxM`&X3~^zp(Gz`vMnN_iuV_KA43Lxa3dX$9l^#b|9D{I7z%d`k zN*r5o?8R{u$16B4;4rCqFyyJDS>>OKgMJ#ug*rMCp%$T_ms(D!04} z%u(?xlxdWMhqiz6OA268|E8@@f!NbJ6^c)CE07DUf=KYel;QJg&kpF-r*d%LL8FZX zl!l7^+W52hq85u_>=ZMMR-YQ*_NGPU#;dR|)ywE;aw_+~W#pnjL8V4ne%-$#m2MR!J2vEHscF%XmWhSmNuP_{5fF# z*uOnLYE;F*{bj~J=~h`jpk3*)b`dKY(SZcpqm6Nfd>s)vv@Y3!GYqW3#^6@X#L))F zO*n?&n2ci~j@3A};dmU!F&wYqcn=4yOO)s}Fga3HO7(ODQX-}r5{JLzD4{ZcjgqP5 zX;PgiR5%Y?xyFJfq?$xAS^3SSj-qIyo>t%o(L@{PcI`tz7maTEj@n$2H2IFP0~J~9 zwuEx)ipb)~l*Q@B!h;s2dN};b z+(V@W4m7awe2WS#9*~q?5TQ9lQJHJ_&5s)A84S8_;+NHO^df<+f1>L3NOb5p4b- zl)L~@p|m`rsviDD#(`voP6s5z0?3452E8hVJX!k17iYfw^3kdDrmr!+d1C91ho2tX zMm#gS&q(3gBfQ4tJxk-JFL>(MZ4Y%lFlcrM+F6%^W=@3tITSR+jEiMl8YNzudo8>r zSES_2SlJNR%L4FIp&L;N}6`Jb;@AaPt6e z9>C25xOo6K58wva&{x6=%TgMI;OX~C84EzmSXD(#~1*s<1kSH4}{t9Q*Gwb^Zo zZ@u*7BIBGRXn)6kc{68iGX@)b9+obaUqe=l+bNdY&fqKJ&>qk}1gC&tPgJx|;IgHzkoFNa zTy?4~}-)Y*J6^Fz_a06GJQV{hW%AE8mQ=bo$5&;!?{tJ+R4Dw%$m*x6+ zoH2HZQ9NMwo4W7Y{e}?N_J6w%^Wfa|ri|GJL84xmim@M%xjHGFRb9OQbv4U02#xZ7 zAT@IJnIDkT=>9{v-k=6m-Tf-pj`!y`y1!A4BP*W(*_IJ|Em1WDm=eFXGuM07xGDwMPd8JZRMC?lZyR#563mknU8Tz!SBpW z5Zf$#+fL3?{r;Ehe~;``o2KLUGUvp(`?}xHzwY-}|Lymf)qnmyq4qz#zwo->r?Z-z zXlKqq)%xMOF2eivYKJa3*&piycl)8 zpLt#0kMYa;LT>9@{0gv>zp0yp^&NhR@1%aw@cja;0@tO?EptufJT%Z0d7X6w&a%!5 zE3CL3!m1mf;Gy!PQ61>t;Q^Vv4j!OMrGV=u(4;sko+XU(B!mh`VDhX~Y>*R>6ox#w zaHeEQl7q-xI6FxCL485WUunV%C*YNW%eV6W26!cNF%?`aypnZH&HL5!x69|tdSngm z=e+q|h4;)kE0yoXZjsmP=%cn-UbpbPj-Cd${gwNf6St+&{m)|jvX-#<{0#H?b+rSv z&5i5%$ooN0&F441Up~Ll{d~Ry^R>ngsx8NV2-hXOHpl&FlJET2=KQ>fM#+(llm<4@-J8{c0)e(V0VwV#@~ zxlhP-2Ug4Hyo>89H&HwoeQp90v1#DW~_d4}jj)QhAAK z$76_-)K_kR9Wo0~V@xGtL_rQ>lw21Bxh}?%>tZ0+#Xzo$fm{~@xh@8BT@2*97|3-o zkn3U~*Tq1ti-BAh1Gz3n=|LbOtw?18L1EJ1$Dw>D>>h6@sw_GS3RBEZ9WGH&RH_%W zZmGlGQ2-qfMftp;nw}t9&p39?W_-2nw8%R)eCf=QbAI=8y9txpCl~eTo>u++Ki<6a z?2^c~)3x25j1OkMxog#^q+LbpwmsBm{9XR;PfTgnVeHy|MT7iF!PO`B3_5yyy9u-A zDtI0=`q+~p2e-E1i7v?&Jb!cC=W(zZuW3Ec2RxG$Jd*&=BnzHNfM*imnFM$y0iH-i z!m$v?Y8=~eJdWcSj@NL!hlBbBjgy6hCp+%7L=>@vXS@zz1)xEaT_#XSVB#ZziD>l{ z1x<$@+I41WV#ldlAA0)!irqi%9Gfx!=903DA0>4dT-Ks_UZ)PpUG{AfK`Uog&z&gV z2<$wxDz(R&siV8LPj@YEIcnILVg9O_(Sz0w3`uC$WkQ>ru30fbB}2Eb=yu=e=}?D2 zL&=*}jVlDh1vkz%sN($;B$mLw$l@9xI%7PU%;E zu5>yOh_-UgWazBSoo@a}eNs$47NJ6E=6B%Q5k=tJN$K85=utj5yqpeaa#30?nxs1F zay%j;J$@wK$QT2};{@E$%h$cf)Uf_L07eldEgD zO+7zj#`%q5;=$6=xye5W?S11_PoFlYLWZOcE$A+^2X_h|+H4mM?yq&K`KOtkL;AG? zdM9%RB5fr~cXGnEO5KTaNS%)bpQC9lVi2A3*)i~yaVKU>7A#pzz;Ec&gi${6kp5cD z4|&GGhdjXLDFODlfPJ-K# z_BZ(QFg}zAXy9|@_{?Unf!6qHm(+KCt#h=h_OErah|J~w71^Rbm)nv>{(wAp*8W3% z2ATU^CoAAOYyVl-yL0+@zT(ZlrXzq$o8MDss@D;~rNN89TkF0b?%ZYSda|0E?MLL- zOHBj6UkI6Wr1^Wh)LG>3wfT*HUq3&*RX$hA67}=LuNuA2(q$~2#QL43jIOBGf7y6-fwhY>)wX0@NyC-&M)ycrf>G}p3`e94S#T}!oQ`uAepm+^Mfp&f+U+!HUwRt5 z3Nr&z+LstEgdAtRwF1_$h(!}04!F`S&jeb*(3{#k_E_TBvK4KL6}_9?vPRS1bU2LD zf+UX+{F>3swae_I5XC%sym5($h5S#zkue|+bUc36qIN29?nZMGxR)?#a*}8hZnW6Z z!YuVWoN1>^B_CnfP<#VE5+@D!WJlpL+XFwttqJ%E-Q3KE`VTzB!Z+xE=m7P?zjFZbx<3T+ywHPP%2 zlzljV`Q?{UP(l`ZR!sn|EA*#T)tB}2)|K(Y^L5*;phrW%+XFGvJli(4BEk5|lx<&1V$IOTs-fq#l^$XkG+-yc&nr!VN zvqS<@^br+-6n*0lgZr;Bv$#5`N2U8+4>N#D*69G_ zgIQc95QjGe63Ue}1feHc|6BsCc4%eazWw|6l|Wm#t`X4M4{tU@7BskY{@o9>l@Mb- zc=!CJnuGnSL=mJLpD0m4GyVVo{=;}}aR1upfoE3l6eM22k}WG^VC8k}J4)*w)AkEP zx=ojx)=~F~buiU6M9Iicv`vSzg$w-tE|H9Ce@LH5Zz@n}eUxZ2&UjIjyfxkEw7hsw z-o)18FCwNgdkA`u8?TDR6-M#Zt766Rvt7GZhz~{LgQC1Pnsmt;Um%w2af>cVttSSA z*9qy-2@kLn9$+Utz)pC8ov=1J;Q@9+mv+Jf?1Tr{2@kLn9$~#P~gRP1Ycn-)5TE=tZXSABl1>DJ3W5 zBD*OZ8OkhMz)mnuUs^h&XX#rOGqu)X0|))#W$hhVMPX-?Lle(eiZT&5tg@uI>$qiZ zPwiT_Z_FR69=}P`^b|(|d`EBGR(mEh^K8>=T}AHG!ihMcZC+QiaTP~y3JI>cEj?i? z>qTgFb?lwc4@{ZBA%#-uJ!h?LR_|g@2-f#<0CuS3jbkN_Ejae#IEv#H92anyuyX)* z$YxX(BN!Zb9F{00`$hnx2stM5&?(FaHtSP--KPxm6X7IzTSG7v{5qKK7ne%AJ$YQ) zCCfY97x>cfi=ELD$X?kiBV**vvyu{PKM!$@I528!2eCyf3j6q6f8*xt>>W-1+EZwE zJugs+&DYd3yVuGU@e#Gld||UnU@{{e_d)-A4l;g-)oJv4{|KpK6Xg$~NTFixEnf(I zA3>mo^nC<_8p7mAzlS^!^pbEE`EtLo)+M4{;Mu5+V4w}keDU2H@<@)`Uqjy_G@ex1 zG1S^rkR&-EquTgj>5T~lZZZp&IYJ7;*qeZ`B1u#LNXG3DJ{Y0FZ!nthWSvqLF%G#z zh>S|t-uV9evqlShV9Rmo6~?@?#>$EMIWesEE^W#FjupjIYTu|06c=hg?@HLbYq;&v zpr-}4@454!#bXdfIOrA5Q1*cg(9{fzre*r5;YU`$~p6LT-cN_9||M>jHi#nGsTKQvOmq)tY^!}Nld+luww`^J2zeh!K zXtNzl_m1cnwDq=>?d{WseP595J`pg=HFn7Dd0J>!{lJv54BXevz`RwXY;LPJ3@7+9ilF; zrJ1tNbBinD$OsPyAnCy0bO19;FAQh;4QZ=q-j-#v=eZg8O&G=)1bipf`lJL5%(QY- z5J$_<2|H?qGj9MDti*g-xCB`#SA=F%qjy4;AGwYHW1eWWX!N<|(l+QZ`XDY?995p#0!>W=c z!6cObXSZn#wQ1@6rlUcY+++WA1TdqEM|*+Nn&>+p&&D2X_UpUttmZqjY+0MG9rsU} zyuVYIw%W(FUkAGq77iMGYoaTd)d0V$jo`80{>6)BC2iZ5l>XsU`>1I*N0+o~R}wvZ zDn``?^b5XU5ac)$CpdB%0~njh)g+H5r9~4gw8x!nJo1(}@}oHNRzUWZcTFEM;fUv; z&Llkj=p3ow$O!Oc97%u)X%QXJ)Nt(3`J8yPU6LQtN5WArc+iJ<(1&=?hj`G3c+iJ<(1&=?hj`G3c+iJ<&AKrPEjt5h_v5XvgoD*!+Hg4 zqPF(frAx#57mPST)=1qh6mw^J4Mq(!qu(cS2R5@fQ&nfkBIyI-ZgEyY2~8zGHN|5@ z-8-$>Be5g9agSJRFJYAK+Ouft)~Bkg+a0?7!0R>N{k-bF5hsUFc&=*AEA7$}wCq_k z$IpD{cxF#++1_y@U)=rdskoI33tLyGr}yiZ4^jd+(XSN-I6<pB|Bpsmcd z&=ca69*K&ZS~pKv)9$RYf+8=d@?tjfK(*;ssGMvj6q~9J^0Os(poF6jt^W0{9qX^| zZm7r@O)tpWK<~@(oV@l4{NxL0Z|)Vx4}%tlQ=`&;ahoZ+@k4 zn^Msn&gzOC{e&F_FWxt5`fl&tee>{x$Df1DS#D3w&NfaPm+|lEteh7+SQW)I#A3{` zx5YS^MD}&#y~o{RaZ~apMu4U%s+k6=nPySVH2gFTR5J}!GYwQT4OBA?R5J}!GYwQT z4OBA?R5J}!GYwQTO-fZEAd_j5LOby6a3xKJ*mOAS8?B6 zJoj|v;yOb{sMhJ1i)Kp9BmHx-1>`j8cBrF0MHqV!R;ZKWC{X|= zi6JSdeomb!X))$a)fdGoAEp#>#;W2NT?}T5t%f7Sh7Pr zK2!GM5F;Q%gy6>!br{N+Mzu2F3vOv`V&%qzc%8kNJ4DK560h(SF^L9X;Xaq z8OMelPeBuFJpM9SZ!64wQPiZ<6byeb#mI|mxhS|kdcqSz3{JUkm3Vw%{J8W%<1Ab z&w!4+iZT9RoD@l~?B4&>4va4zwCrin5IW&*SGWNew**WmplDjRG|&vqq8S=))j%^e z&4uP>6@5$*Bw(LKQ%Uw z?dH|Gy1Z?TQ=7J5So6oyVq-^_N!o%!wVJ*An)z>1ErN&^3 zHA{|Jsv2k!%rJ@-nK~0<&8g8@;pog~Lg}#=7j!89;jPMH!zWJ~JgDcI&E31-z4zfQ z`-TpCa_q2Sy+#imHpp1JX0tXjx>t;0M?PsWCZ z4jaCA8p1Ui&LhLtt~?Qy@K46BOFofl^B(nOHdz~VG6XFsGo!=O++n&eAt=**i52_F zx!gb0fRCPM^|YE=FjB@F*r{E}t~X>-Dj!KY)XkD_Y)d!LDoeKIL|@|eo$8wag(l zQd0*u(tRmGfzMn*hTlqP)CJ)KAZB>3MB6$&xxiU~qJaTpi;E{sdZBz(_con7_gLPk zOL^I>`Aa4g7UFVohYr2_bnen_=dd23kFSY~?UT^z&JOM03CIKBDk`S!9X^bp^Mti7 z7*knPv@s{UeMNS5a0mbx9NeeFggZBH%R`}sp{I8XM+efIr>?zgPl8T zCZ{Jo{hV^3Yl>%U;0PLcwg#S!S{yhg;FynNC5|mP_To5-;}skiaF}*F4Lq9!L21GX zfMB4KE&@R*0xe2G!)hQXMIb0eASgv3C`BMBMIb0eASgv3C`BMBMIb0eASgwkq!bAl zXER9kad2WKVD+&ocDWi95R|TO)zgcE;7^Ac^qB;YJF)TFv`%Be5+W&ET6(dB=_%;P zxYKx2^q=3Zq$F|es#R+fOBNdcHSm#LuiY|c%q?ekJv`9(yMECaVRR@d>DjX|{-OAy z?Q`a|d~)-|dtzemnYj62`%|JytWkIiKaG7B#8;n{f9r)DLq^GZ3A7II%vuU=)?%^> z6M0Pyle^W@N2r;RbxF+(8X2_^bW1UNP0^WYpJhD!^rOaCLx&o7h-Gx`Xp{CB8B!<} z7m?hy!GIxza!Pkui!=?CESb9rG6=QxDD$l?p&}_8pBXFDh=E&(E)5CoHQE<6B$z_A z1=o=d1?}(MyRXb^);2D7(xf*_S9a>NyztiP$&0HFo;!E&Ul*p$nKOOjbo+<|GXePO znX7j$kBvFnGH3TwflEgW7j1>}Z=zl82ja1d#+di0ieStSam;`t-JdcmkwzV*tWh2z zj}O8b@)R9=WJ;6`RV71}KZo`AB$^`(_sRz8if+}-0SRP@`V!;kyYJbsYT4b@-+b9~ zZ~rm7I^Dl2XX~_=znVAewD_CW#vGOLVU1C9-Kal#^kIxu*cL%Iud;6i6gwzdWjC#= zv`g3^d3f=+vR?3t%=JuwZu(m=Zlw*pqSxE%=IWI32Q-jDBc`=-9og z_n8{wg2)k$(n*tUzjfxI?uW*W88hzC!9$|iy4r7(ykSsvLPeNp8|LY8pjS-9>{-Ty zS+f;vCm^P13Si3`!++w4m9>pB6e~8-%0{`5CIblBX3QHcSCHzN`xB1+OyOMGSi-TN z!?B+cpoC)xj>$L{;#iGi8;-|u9K-P%j`wiT2Ft8!6-!53MWmuUk)S-0pgfVFJdvP0 zk)S-0pgfVFJdvP0k)S-0pgfVFJdvP0krw5N1m%HQo3bZYg(IW3LaLYEWph@htKlpZ&z+Rl{Jv7>0&bzcQJI zJ*%EU%c@3m(xkmHA9K>NRTp5i7*2q6SSXt{vw>;5rXz@F>blJAp#@GcEp`6YDv_2~ zONEmH)$l`R_RtPV^CiPFRAvu5XImaFkVP`RL@l_w+W1sl5Mz*!IlX4Om})FXdgG@K z@88}qg7z3^H*63Ed&Fe5HYjOn4+74IS~WA9K%yXvrA0nK#nCDGLGj{Nd5NmpiHsJ4 zu3-;)eecjJ<708LYUuGP6JF6u*4Gx_wuCsl3(wBSvzyXVO$gbg8i^GQklHbkQ`OTT zhypP)644-OFZRiKaX!2B`;7a{iEOrySYLBOHL4W0Dm;H7Vys||T2D zt35|s=Jr{CQ}6rwXTm5Y{yckl*VPq0HuM=dS!~&qQHFkYuLPBp9c)+V&{l7(d90v) z>A{jBG=T&^$6Q)tF45qUkJ+HTRy-(1622>~p~iiu)1XlEvbNXbYSSn-5-NdR!= z;VI&BkzkV<(F4c8HC1!U1-k-Kgy7{5C}_xDD3H$v*aR{`7adaUTeujXU z^5xWnn-D*(QK~|8;vS1#w3WKw1|uljkSdkzK&N?kusibU`>nzarnwAbsP zQtc9nVqf>}2cEs_-pk^4?YQyGfQfy&lz;zmk3M||cG@*~>#mB5yVi-S+RNrbAga&k zu+K;_>mP)Lr@oYzzh%Q+Jx~~d*&M>goQf&Zj%xP4utasM%uq83PedAq9;h0k${D24 zCYg3VtA;2uhpw+7dK@^`uy!ab>HTW$P?ML+pr$k}KWS3Ms_FY$ckSD5U-9PReftu| zmG+#lURDm(R@W|Ltetj8?J`yl)$X{uOI8k*^N}(i?ZPHCzkWW^rXX5BAIjM=(7D+4 zgC*FMMew?rVY)Y9c1lwCzd5^K{-kBLD?{V}=Qk1iXfoC-+v=K;2n6H$D61yd2{V+q z9c+G5!i*Etf!W82m~9GXn~LA5=t{Do7Q|EwL)oQBEjjq21PBGEIQb*%3IixI=t+`d zMzpBc+UmrOx(~{`hV=BEvLNguTaNGR-@Bk|-;#Z8D$Kyj{y7EuH&|WcquQ~j&hJ=q zn|8knr_}D?5+kf~#E9~eWaJP428RHHUVuS!TNg!PZ6<+>kSsw_K=KPx!e9(L1m7!* zXaue#5@&TOaT2vjX_U$dlSYGFV^eZM#SQV*;#CD&=h)ced7V2A-ZyB_vEd_TbSU>; zILVss_Spx<=jSiD^{=(VwVe;|9653i$G8e(jK>&FT?uamwWjBn^}MVaD@yxNyp0jB z40Y!?F+SGd_Q+{rd>)na+$dPp*T8D7{k3K8%`?k8966G|vI^siiz~CYUe&JDs~vi{ zPalj3ojOMx7(b4K>@JNaqd3Nm*!vwY#wJz`SsLtR{aQfDlHn+{(92JaiSTq1dK3ic z4`+c{X7gwmDLYNjfvrB#SIkI(htnuS0H-OB>CqQJ85Yii#KZQXs{`tGgmi;cI9PmNEE zcSH+xsffRC+Q_G#8ab`@4DCkd7mi`n4 z{V9t26XhSPf~2wvST&5u%>!Xr7D@!8cnN;OvYURCNC#R=iO7D3u~v*Tc8J?+_kDjG z{`o#3@&Q)Qc_7k0YQORK2aP=k?%4qUP}n^iHcguN$8(b?aB8;w*FLqUVcjASAO0cd z&LV57Yk_5`Qe}NQkhA{gs9LFQ1_D}vfL0)&6$oer0$PE9Rv@4i2xtWYT7iI8AfOcp zXwjsG*METzKjNU5tvU9XN0K!1XGD-wDpCwC+Z6jLN>RKgn@c8zvo@cb_RsdH|0J#1 z;nH3N1}$wEFloDs!Wf6B-`=M0y?1u6Sdx?(F)uPRVd>shMXN`4igCMRI*pv)xww3a z@O^#jP+{zt^~j7lUmBtkG&4!pq1??OlJBc*5n>+_eGojK_h;iJj+#?jp<3U>}lFG`#T#sZ(I?0x#lMG2G z8In#iB%NePI?0f9k|F6NL()lxq>~IuCmE7XG9;a3NIJ;?t9pJqo||Dkm-c`hj4%f) zl!Fz@!3yPIg>tY$Iar|_tWXYCC)%b z&`(?p!u~9h21gc9H|wUSZ)Fh5(PL)t$(Jp&(ETC%>TVTwV!aPCZ{7Q>mL}Ztq&k%R zf7|=?%fEb5_r3|hzuPgtXls5ATW7I24c`|@YXl`gOO99iSOYn}J%e`Zy(%8RzHG?Q z-eVqpS_RptNqd(r-SN&#|6qj8b86xe#$pP_z_=if4WJ{nQOdOiW4xPDWucP(*TYsu z`ZQphR)kL-a2eTi@%5TaN8o!hsE6xW_pTUAS7C8pE*bY!Ff}Sm2UT@vIY-m&f%F?I zmPm#<0`;`yoSb1_8IL|~uBVJJ8s=SER*H$*XUq3us#B-FPF&gro{}%;nXcy96ho4| zFRT*S>fK7Ak@XN8v{xXJM^%u(e*F%={oIta6fqNagGt&K=f|M^O#ar|{Tntkc!%4X zpO9)i=4BNGw3>yGWijtxs0YK8ByIE9OsB;ZJbHTfsmIS9?$=NIf{)e)Z6CE`)EEpH zzF*8^FmNUUlK3&sL`gqZ+?&M{8TY1YFo&8onC<7Fqk&sWkyF`W<3O$AENT@8Y83}+ z6$fe+2Wk}uY83}+6$fesHjLwO9LI3HhT}aPq*hks7m6G^o(bM_B2w1fsR9 zDVCG2L}E6iF(fB9s!p{sPq8fopURS4;jI46!c~lwjxwXlf+5{1Jt4uW6G>+i9ELJZ z6Cf%I_aiUOf!I0)E_Bg2KV{}EQ{OX|9D96pNlDr6mkt7aMurKmSG4{y>n886>}wxk zWTvLfqA7YrVWCl!l{KJ$b~bSLInV(w_D8YpZwgXvFsQa17~qhl@FffQl4apb7Vsqt z_>u*D$pXG)0bjC!FIm8sEZ|EP@FffQk_CLp0={GcUue+s$P_YkSOWz7fPf$GxKZ|d zj2uton$q{0h|h_XUagirg;Els^-9%15*8@|l|iVq<&;HMn;9d}o);|`BZj&zYWiaD z$A+!y+%><|=JJ>O^;@*$;-o2QNz?yo9NselZj|L+yXLpvUw)ux&yU}naKv7AFe3wS zE>BHK49)7*bM-?*hxr~ZLbJmQR|}fOw8*LKk&%(=N~!3veCL69(kj-E8UWiVN;+~a zh?z`g!b}{d9IjeAl0Mcs_3A>=w0D$G@A0SE|JN(MdG=G)2e(yDZ1C*nRoT9Cq!a+|MRl zK>K_aTp*ZRa8dD?R_-PmkyvX83%BW6kI>#pPaFHzhfhD=qQy`$4()W!M-wwLw;in3 zgO`+pZGdJptcPvJo?3Cmv;$gpK`LrVfR5!^Fnb&7z%3nenhrTlhn%KEPSYW$>5$WO z$Z0y{G#zr94mnMSoTgiHnhrS)E<8|F^8Da)IEc9cbf5tNtcEiUEBaZAB!v?%cu9aX zA(A-2ph)4F<+lBv23$-letPb*>4{-yo_Qgxpx+VWEfIQRaOFz}pBk5%zTMxURphG= z&L|&s@ooFT!@~z{%g7|Y>@`l=v!RQHTTx!&SPF}0lc$8^^`Vqe7+u#CB$VT|*Y4V2upcICeh-%U zo^|60FvUH};RFRaP?$9is}8hP!<*!m;~?KP$ALH38whEvzpe^(cEC;~PhS0(9EZIL z+sc!t*bv+F7U01i8m4Y);Ro@7J4gd=P_rjrxjug1fom$dSTj3La!521^Bcx3u~Ho8 z6wSHN7C`w+ZBmj?1$@FY05|h&g$dH=K|zX^W>3SYe#pO4mx6_!A^nP?-BYc#t=_h+ zy3>#$^Im*a`)BQ|rKL;mAKXg@VjF?tXCn|{*#{=%=Y9KSkp6JrJ|j^R2JasU{d6|w zpKR5)c0vQ@Sfs_NKnoH%@Wc5$Kcxlwx0J*^8C=+EuB z)MfIFyB|I^dd$xI#?2_Zv}fF`>8rjrF5P?I=bLVs29vMq7q$%9g#? zZB{K|5&*hEP;a~eRbYrSGBP02+=Fh&UtACxaultAyh$64&uc>mM$A}-3IHFt4|13G4se0lbZ_u7w(S{e*3A-)z3UxUA^h+Ctp1Eq&}r)3lICK znko7gYs?NdsEah;M?)R!=_`E;Fe_!`D`HjH>kR|fTKC?(ru@)RQ_J_k1?lhbo7wih|2(Xu6W&9Ram)9N zo6p*p8pYyt?Z(>gHMWO41^K`Q7-1dNv+a^iC>1`4`moBgQbo$tm$VzAZboDsUql=# zie|j4Jy!dR7A<_fl9<-37S;Yua~i?uh*k5!W3*?Uyx`r(94pQC*tL7@S@NARR&Hh( z1Xdy#edfyIDsedqQeu=PB}PF?jDnOH1t~EKQeqUO#3)FKQIHa&ASFgYN{oV(7zHUY z3Q}T})GGKy*(VAm>?Lur_=;Qle3V;`0l1`rv@3;x<|R6O$*qexDeP-6A^=-PbMLWzgytO@l-|mCYkb!Z?>pj@D%HOV}H72qntc&d`S$vbesCU-4mvKFrXE8Tv3oA7<#o41JiP4>R;(hCa;DhZ*`XLzd`Q)L!mZ z)#Zm~B>D`2ZKjjTPNSjGZsn6gwQl8<+O!X73207+UvCoDF~!zG2+pk9))E++i=!m~Y4NXId}h~x8yA5` z`w81XAv#4?-=N3U`UK~oS&@U>FjLuZGa*Z5LYB&eER_jaDieDu6S7n$WT{NZQkjsY zG9gQ4LYB&eEQNwU$|{)&St=9D171MC2APxPbhArSs^STV>f?-)0rGJV{(4DSO?mj2;RvGc@O zqv!Ki1MDSPc`GXD5k!4wx(X+*oi%X$o_@uig;%nAci;9mgnF97%#0Q?I8{sl<-CwlvxD0^XW+qM&)>f5Jx@1B*F14a0nX;WwJKdZ;j z?m1>fhuIOn>;uW3u!oi&-#=$Te63jntbTqA8_$o`Z)we^AHuRC+%W4sBqPkLsp+j? zDzVhviVA6HsEdblQWny~&g`E#b^2-%KCrT~XYW3}`?9`o+d(Jw_?l0(b@2=4>_5Kr zp)gPKfoxyI><%l&^h6XKXmH)SEp0rnh8YBmg`z%1A0g&OPXC*!Bi4*_V^))-7qD-d znyaE1rp8)C>$*5`7IT}n#`wFOTkk&B+_WEbtk8d)8|qRJCs7=hbECtI+X(xKoxhZP z&(I6-6bMa?LCV1pjm!$^kTOnP4_nb@?9+V#Xd;pE_tn$wrHuf5_2Wj!1hr_St%ZG# zy(46TW-yDts^Hx)MoNh{DsDIsuqJljxISCT$}Cs!H%Bf4hE_BdVMiVXaV)`B1XN6r zWQcn&vhFJfxWLHm+b^EqzTJ4s=wrNoWc)bM?3Hoj*Q_5m{(+TzZyq^x z#3yeL957&zFWbbmZ#x+i zW6aOX7;_(J_Sb5KbHI~Y;K;#hCY)2zeCP^8e@G~JLnwGdD0o9Ccta?7LnwGdD0o9C zcta?7LnwGdD0o9CcmvW-6mJLxZ$K4BaNrhrY7}tgM)jd)xLtyb5Wq@?aX(!Zifh(9z;atMnewOj5m26P_n?(PI)(Jsg+=T-Ph8RR=d>wrm#}8_>NN@N z%8TZS0k^UM`JhctjvF^+%$O$?ex2lA1T$^l+tN9r~bjHRn(wSv=2^rI+yVOmiz4tWOav(gJe&wHxxaM0uGvyzQ5U14J^jUIcj?KX>gG-m6!oPTlP>= zM8>f3UZp!LDp}{@ZwBhh)l(6NB>5C~Nv%}bJ}Rr0w5`}R-di>(DlVr(maT@JbQK5gEPxUefWm{)`qJNTAu(fVY?Ob z=}^e0K~^k0FH+0kdIT!_j#>*waYSG(m~ zt@yanQ-8pS(}J}DwI6E9^1VNTI9`JN8)~{*BZ14{c>t4KbJasBT-HnZ5vyH`LL)V~ z`*D+IOTij1#y+A8Mdn9XCTAtx$a*M@J5ephu`i@KCOu8Hdu_BM5LawNm_8V&J3TGQ zsXd$1vD3{5r%#(U{ou`=I_9)*zv{%YK5?K<$e1eW6In)bLNUI_&9H^4;pJdZ7zdZBB=f5tWp5J3!7G8uD zHG<0{T>E;s#G1Q`@FDWku@#{>&<*H@%qcdLicY8fd{n&^W0kE0HjL37IHM8^?H4b7tQ@W;!_Yp5i~#AKQxe2MUR z%AKIOrLrFB5&Opde*E~~3-5HTsWDnST>GPYL}E#C@7o`F0H|-nk&l8Ba%+Z-(}J9YGwr!u@Hq#ZFAX5b0W(wI`thwF(`}8bq4FwalM*G_mq05kv9z)h zkb)9uWhKzcN}!dMKr1VOR#pP7tOQzF3AC~jXk{hP%1WS>l|Vo_j$}pkHsC@cUQ+}f zOQ^Ei3D3!rZK$CTH96ppz=<%K*ds{>q{q~7)81Q8U=R|J=tKIeR1_M7zc#Qetk2J{ z8tl){_Ybbh7l*}+ba<*pdfjM(1L#|>s8{gd=VDOZyc&7f# zGyNPqx51hIWtBfq5fX(}YHV*rLxLVrVX>TlmnzoBME~c@lL_H9o9$rkr51Kd6Cr?gUwjl*il+ZQf9iF ztjuSY3!S z85Cq2WR%v}W2uG^JC>Q+WIVdm<5>IFs)X&M%qXVMl<})&ef!ooU)E{8qSm) z_&I~Ti`BC&?Iz81b)>*YR)-4sL881F@Iu-HIGD7mL+4?{pPBm1?zze_;r9p)k~J+f zVzr3w&~DT6yDDPiHAp}OslDUk)<06xe*Adxs4%{ajT=Z`UGJkqrPK0i=ATB&s2p$K zUgsrTuGEM~EunVTnzVG_u5LSWZKgd8xZ4sMP`NPUfply@5?KUe$#W+DRzcddG_*J2 z5{)S|!SUY{1%<@gU6qv2}R~Oj)O;7BjPAJDxAe~0rGh!#EY=LoJ1sQ;PD)QA8`dr z@B?n47MO;>@O50LFNR663DWPN?y*R!&%Da%#n|$2Csz&qqG+(Fv!8+OMDmIki{|h- zSwW>9=TUl2mP>Imf-{*}ePZ6{Lm%?zwQ8B0o7-w?NlA&_on}1390BPs{+Lna&YRn(fD4GU)iS%fTGAn+$Xe2zIjf@ zb?Q**_?sF@0X>d^fHR?;WO9O5pcjNXgW@SzFyM!u`7oX{@ero<5mB-!(|PK5K!b!l zQ@E`Qn}`!7n$@w(-YqY0>b7-dk&!(rhD@4qc>0tnlV(kxQj&XEo0d^f*mZ8Z5^Yay zcT*ccxcbf$2v*nMs>y}A)%)2ew)LGf_Mi-}2W|Mvwa@ggC2c6OvVE-V6ps`^BrfLy zmvb##&IK;#0+(}v%elbiT;Ospa5)#aoC{pe1uo|Tmve#3xxnRIiOT|Kng#$0Or4fG zo|ym<59rr_L+V246UtOP+Yr~OL1mkgP?8DpXl_J>oyw3PBT^g2@(?9Kf6Yn?!ZJ@X zf>j3e=qE}_J9L~lAth~k?)~jbZyxr$4n6yHUb7~!$AAZWcJ5UBb&oC;H;pc6otm_w z)$MKaL4GsCy#of6r6HJy1o*+>!#uvYG>5mg?V4VLTrT68+Bf}?F)gzD^~gxhLR3!& z;-hB!0EFiUz&HpJsh{+>v7=h{uH#OwcN5aS3)YG0Hvx`F%~J`@;U4k98f^pocFx*a z-uY|9_YSX;h4nXTuITV1;(Z(7r|%fRG^}XbEqos!NV5lVkyWZKPb!1nRC#OEt~Eae z)O}(wsQNaj?h`vGs%uD`H9yhk%xfGce6ILUrvp}R_{WC1_ikK$@5Z^uR&Cw3>R7`+ zw1GyX_#2Pf^_o^|1hjAbx15jdNjV=UbPcoXJE!8|lmH^~EP7grE%YjoZ`tsf79E~x z2hnh5umpJ)H5hu#LujS5Y#vQa(!h;Pg9?A(z>O3unfAh-f#ED|*WlQoKfR&$7W4m@ zNRgE*Qd9b9d~&_0 zWhpCSB(Ppt4+9dSQJzdPPejuoklsw3c4&7QAGGO{TCi%-@tJq5Su-|H{7HKmwQ5dY zsO@OHbYc&(r!Q+`UL$S_+aEwHgE7V=%jS{)0<-XnnRni;|Pq4-d z?Os0rdMmno>hq*LGMP%>IJbB25mV>Q%bZoQaH&1gSRob+8FI^TW2ZjRc%ry?rFzGM zc!vf*2W-T&1tegq%rQ#9+^uLYsaXQ7*$5p z2F@!}MzHG6SRX?O`+>G#?!?(S%{#W5J2${pyZqLvRfU7}*~^J1Vmshp6c7*FAQ2My z@!!UZQ#+-}QC3rE3Bj&WytrNz-ZFN~l(}p$@dI68g^P-|UHg7T8?-wca`vWd@<9xS!(?KyYRfUDOHZ@1Ai9D>wE{vD4;Lj^; zZ5WG2n)m;&_-4d{Lsf$DvrPEmfo>Gve4tae&Yf5PFmFox)YOa#i>D_hCK`WQg3#HF zj2=t$zqxvs3~SLsn`8XT=Pi5WiGuj}YqrR!+?McfacylIv>o6dtnmZs%kSL~}IF5Bl~uTKbbXs6}hf7D;qTR6O7 z4#)L>gUI9lZ|$eFPaH4e{%sQ1Ki2=DeFvJ4C^2(vOj5KFQ(G4(FCWg45s*y9$K_R3 z<+Je-5*j<#V9P(QW1R$>srmulC*CzP)?*oy(`` z|LEKIFMax!wy!EHuPViJM(FqGa~wbXe>DyQkYE5l;~;7?78a(Yl+N$5X`wO2O z+@*83Tb2d%D$gqFky4I=YNNbOf~vYs8d=`SV{B?Pw}phYG6a!@{=X9g(MX4r@u1o} z%Wmn`x$B@O3;q69n3jK5X-Z1r!hl|IW=->SDjzwiYgJGa?XRQIj^0>UUcH$ z@?uX>@euT1NKSVqYt1+PwD!p1wT=nKsvqHr0n8dbTelszi(^hbpsA>PcDu{})3bFy z3a9B>^PkopKC<>F`#0j&AAdAfp=WW5{-t&R{u)RU<+@F`yU)K40YcX`e0o`m4%&fL zjoIoZ34+R4^|V+M#|~~rd#I2Uh&B892|H3x)WZ|CNr%Mvr=K<+)ZPQ%N;mi{ zA&zSAna^@HplgErSXV#c?YI@=_*h)izO$!Ln_AxD() znPjmPJeA~3K4=4DlfF3abw;CDxv_S9LBWWkHMJHL9HW=Umt2rspv70h#)4M|Z$*E&tX;Kxgy`a^vrH z7@Q^s*+0=2J5f^<0`%ZRuG3Abg}pr3cUq4M?rU2d*4GgQq-1Gdd9tuFSYl4`k$XP8M3a8tW3FHm9#|gtKp8EZ%wkGO9t#ra$M~ z)tqm485mdhUt=)EN-)KOL@O|1XS)a{{Ea!_x(TN8GAL3(!A*mMo4T61T^?7ME8OLE z`CJjM$R;t-wrCL(6w@>&I3^?}G{zO9<>uH#>jS_7+^@2K zV~>>l6507SVLT%Ktk1Crf;XEU+lJ||GM|BXtt^_r$5fe}42va$tO^2*N3>h2)6yni zG5-1c!Eh?;BaLqR}QEiF+1Ms$lC(JgL7x404A;zo3f8__LpM7OvR-Qq@ciyP4`ZWvc!qWJl@st96p*0P~Zo9 zM8%t>U=>sF4yRhX8<6Kfe@9(h28xtRRXp8-e1k3@mOBqBw$d)7QOj~G=za616b~L$ zdUM9o{MHYyE?(TZd};fBRSB^(GH)5RetG$(MR%mBk;UA(6M7}|NoMQ?8E+hc_;^b{n3Cbi>s^T1oBO? zL$kgIc_jl{5U(zaKk0FXOIv6^x9ZA12^;Gf&UzhN@m}&=J8(@J1Zjie4Xnc1_<4R0 zpD6yhO5d?cwB|#F__t>^q;-5IsRe39fx+XMqY;S?%4c z?B}lRTSYo=dk1<@jnsqQkaT~&5u|s%M!g5II^YA5_HVSG$OjM?z`s9$40~MuJzxH9 z%AL3$865cD-(%jUEC`v!a}?s7U0}lG+Tf(EXr2}AwL!J}1Af~4e=+wa@KIFR zzj)nRdP{ewyOVTQI(tGALN=1H1ZWn+78b+4BOsfy39<;X3Iy3j2_Pb)s2I^ipjO{Kxt334CL76GpWaEG2>m|0wYs|UN}dFKuD4>Fys(lmccm&74=dUL}IMUW#uBdT;5c_0*(X=bKapa497)=eS{2iui=3|B$v7$sSb ztomfNY(MzRD%w`Cc@X{4e&hU3r1_AOfDcusDzwjOo1qNGS|Ev>?_)`xuc|Or>0Q~2 z9Daj=GjmK;sDJ)|1dyUC>jU+LXbt_9{)X>1VoyZ)}rmRE-w252ODw7cmv`{`Qme+WfCiB@lg&8 zkwq#pSx8eXCuHZwO*=#8I>!tgJSIfT0QzhoG(wvfux^sH1oS&J*lQW@p z7gNC=r>vr4pWb%A?%j{qQhR3uOi_7zKqqR?Na@Ip445ifSDdyPZIS~MA2%7UuzQjR zpv}O6{p@R_&Dq*YWt4da_)LTCTBM1jK1yVfG>Ead0X(1p*JSw}WW4;k!t_;z?xnsx zF4rk7)tOki(?#E~F~F<2wa*M|9~B(z6bl_F)#x_E+GmEf&kSpy8P+~CtbJx!`^>QR znPKe%6~l2F$9p*7Aw#xhQTK>~{wYO{FwdxjmxjQSmJTAv^Ju5B$8X-wD3fm9>!#m1c1g|RvEA|uy7BoK8#thp z@%aeK{esms;H;PsG0|vKB)=(;ALdi4x2>qyFZwYG?R0P2j+izM`(Gmr+7UT*lI2i7 zjrzETc18m~dZ3+#y|$H4Kjsm0NyLJTPa5GI>E}p8aPvYD4_auijb&zRw`JG<{T28Z zI6(jJ$6U|W$0?)mp2qbpOau5Gh0D!mUsI>V*nWaNC{|hmni7N&1GtH|6V8ST*~74U zgAWs_Z}8txV~zUTON<&E2#91-wLVDxfVcU3{4Rz<$?N^cotc`{SK4-kt$iV z+vq3Y9d(>XV%M9`e}-LNGV`A~!z#|4`P-Q@XYl)={J`}J&7QYI8YfM{*|V;*dD8Qt z)(EQ-yv#+azTejlbX`1h#Nx#xMgj{93Q9{03cBfEj99W{1l`QGF%M3+K(r9^4|S zS5DjZEn0M#oI7;5-M-u%n%mMh7*#rnFFl8MCrc7|^xa_j(1!(P$$R;H{3jl&37yzm zf`wB52L?V@7UDN%p<@F50eaIm)6j`h)Q#971OJJp;a409`N9ApHn=F-ra*4DvT(Kj z&FZ)G>SM>a!i!0N)!V2_{Sd@T4Hxvy&iRz!S9VU2h+~1G8yt(i0^i|Z5n(2GL*m+G z^r3}F{xNh-ULEv3&zFU1S6USoU<+Ja;Elw8vN=hf)Nc0s?m3Q$6I^pbCQk^R6MAvB zzNVbT$jX*253wysK#W%b4jFo^vZsDCIu`8@;d;)S)SN&~%-qeIOg%QJ$^6alxeoRw z73_IZ!D=^aS*HpmE93}0T6wI#_5X=1s{K#0=qW=K#dvZsp2zCjqD@0K2?@>{B|Idn zI?bDz)2pUB9_6u{#9KYKNt^L#^8h5QSZU=Spws&QQ$3{*F|<;R>M7`3g?^aU{mpxd zi=bw-r|3X?inkub+JlaEt9q)wGh}z{DU53=-;+kyF22){zQ=tByIp-%*@Ne9<11%9 zJE5k@lkg6~H;wfK`j6CBYFgbS+ML zcFe@%g=MNR-wR^Pu7kf95TDoY>{gK9ZS3NjCDea5P+tPtat5@e3$6P`+CntNu-lV| z2rX&yO;wxbjrcWvA-^|dz;m;Kt69WqeF^J%>=-HEWzaAyr(wifI^O&yqGI$m`J5Oi zm-cWkDD4@$cA5q99YgjOIF-OJ5>zbk9^0vZ^H$(}IZYqSy!zLCP8w-hdwLTn7DPV$ zl3Hk53V}$bLAi)p(W+}otu!dF!@?ty)37H?PD{ssp5lCYQVFQl-Ofq3ht9DFsnzvz z{fi*6g8G%ib&YyfDK)JkUda1E`Ujd9tZ5t}G(V`Jon9P?0=|)EdD6XO?!~`F^uN}F zE^b@2=r&x?99@Jx@+Z^Z;An!Ml3Z*C8j*}aC8sSnq_*N&Qtp&ASg!iMnM z2AD`mnrcpNm0FY^sRHh)@~&w}gm`Vy99DPvAD^?jIg9mwnVyS|T>pJZY;4K*>vZKo>9Ve;pAw!7|RKcJto z56@n&-;H37Ag_j?0q_FO8r~rGdr3SQXFDcezi-Gx1>yRj7bxiU7o=*Bb>~Zw_0Fn>|pEvRQEt)=GUk%^%5&V9B@IJin(9X<; zew2v&bz68lZ{j|b1fDb*Z{qD=qx-A~+sQX+JhG1aH;szEhp#QhrCmV(F)my`iR+pC z8sFghU0lziYo!O~PBxy$nMuk!q~xf%X4kdLdD0>6kX)&vHfOHpcd=AWl~NUxBB!!c z6{zF7as`LwN~)D?+N@nutZ@aVH^!LS4MA% zW0ms$I7emJwm8^!#Xl&$3KJt;D32q`hJ@k7(S{K14xQZ>&m+=0cMt@DbznI@(|4;Mlmgqlg zfTu~yJ*4KaAT$rkhcuQ`!hvZ@g>o!aQ593Fl!}c*127AqB0`1XpWXrx+3C0RbyQhc zgHTKF!ECDCv~!r(Tz(B~Q%m`E9*0{Hj({7s%Tn_f%oZun6r$M4_v~5;ByPW5u2d>) zTBT`!NTrR(PhW!`4s3*=6-ErVdtE2_S^ycyYwJ2`7pki2ey9qxsjA}d3(gDP5BzO9 zZ?MVIHO=$g91aB>4)bt56-W>wl{_z7^E3=`mG`6N=pUP2)puOjwb|@QcYS2 zg&+bVshUY^fQgm#mxWf^4<;%ey^WGo7s5{JZIvJEK9au)yj+D!@UlPH#~i%#G2Vw_ z-lxX3fVD-qh3|)c7bS`>Xa`B4mM1EaK$%%YY zeEP%Fnpd(YDW)>E!r@D=w7P80N=Hsz$wh3@P(_Y^0+8JD0e1|jM}o;|$#dgvmUy6|7{BvjNP}H{d03!R+lbWWwm9QUAty#S#!dM&-&(@ zS;N9+S5?gp8%F2D!{%UK9(QGSePn0XOjqEvT#WObk95t%9C$FkqkR1B_#7DHjhEW^ zLrp%j(+-Eo_-J2LSbPG;iE@4?>fo73V{{jIguHk-Z{TJ$koPPfVI&Ffb6n}7^*I(rK zaoyzpanf(_`*lt43wqD*6TNS2rvN;EGVuY$hWo$b1EA*o{pup@c`^-68kE&wrcj=F zK_k*|6yYevF$l*59CL82#IXg(lQ^nzoW$`Cj-WNy3~Mf_;J}+h;NeFyPzF{OeY)_O zfn6%3Ai%BDgA zx8`8h2Cm(LM_fnx%D#?3(IA9e68QOMR%JN_GNsmzFogEwg`DW+DDq$%ykjb zES<%8t4u8SB}b_K36Pda34rfZbqwH}Euf3KDjWsiaL<#&qMu}$M?N6jhD46e^LPQ_ z6&}gM-;>=Jvq$BX9_u94v(lIK;YXFOi+1h{^jAjSK>Zk2h2O4*EYRHqEJJW>a2^#N z$wxsKlzo)r@_(J*vJ>UNu|l_OHFV2VB-RSuvK6{zD|E|N=$5Sz2(1uTtk5l6p zw`>JjutK+N#qtol1739lh9^6gLn5YxeCMq^90XQ>fT4(XbtXi4(Tbre2=ti_sM4n$ zpXp)+3HL<4vrNTW;r>1GjN(Z`8Ir#7wMAy z``U#3%Fd+&%M*H(q{lkk8BvqJnZJ-qAS{SiK7Rk53m<%N;hp!(tj*hxsMu{!c{VE4 zEi*YQE~;f>SX6|ADG&18=tfC|$~1J&pkL|&=-F@$T&O?|7DSqWr}Et<6&w;N&nb#V zJ%4okkHON4dTNQdm5O8vWB9m|uA%%J5U+(KWpl83w zZ^=wZh;JKsKHM#r1+FL)>hzW^7PDS`=gsOjxL29hB006NMW$Q;zp~p8AJ%Wvhv}1f zKRJCxE`>0urQar-q@E6|DWo)<`~gw)-5+Xo!aiX$t#u!@A7jUDQqE8|``a9`m$uB7*T@cVP<&=KM ztTmLf$Zx1~;Zc^GJ9b}(iWX+MFi>mqQ#A{}{>?vlsf(YKl22D{+qUY{nom}5-@aOH ztG$jNAxNt{|C09WLm1>(1u+&5mm6n5h~@fB2{Y42>S* z>CkSX<;*rj{trI`%wrFbX`m0=|AgrG3QB1Js@Topbp+VXaj=V{8r8-rxj}*YNfJU)z#|;fP0`2u%Y; zpOE%QSVM%DB=$xO@>6jU7+yhM5W&stj9zt;CC(dPrpi%qQ;yuyGP7d;0;GQ&uyF6v z8HMBLE+4w^u0ALJe3{J6fXHK5V^otpjd7oCs^^1LTL6~|b5?LXHo)0t&@UV4mkspG z2Kr?K{j!06*+9Q+pkFr7FB|BW4fM+f`eg(Cg1Zyw7bWc_OFDT=I6=d_cnf9N;Z!yi z5<@B^hEzxlsgM{_Au*&vVn~I=kP3+*6%s=#B!*N-45^S9s6$_e`BRLLYEwgF2=r z(64((jjeFlm+zBz)D2Pg(Ek1?c=Z5vA=ptIQ9idv?G|Y>*-NP^JEwe3TX@V`bNE{6 zsCiq+@n)bwAVRLID8tT*g4`ty3!bDkgmqEG40iyP@B3=@?61yD*w*6kwB_vbsue5m zzklV5Rq6t^^AY`P{X6~i;QoQr%1KtT@{z!yci#Wt!ugBu1DB5jms3H9Q>1nTBZ{*Z z^%e~5qsgQwZ~9C#ct#|&JB>K-`!h`(Hy?q(T!T-tr+lSxp5xo8lI>B!>VixbfoH{_o^ZmAFHjk^T>WSn;9K`yd zGd9u%By5xC4>7L|mz>qH$HIe@JfFxnNVfnOX#$JA6jhr}Y6%1(Bu2=$tt#zKEPHRs zhkvcS>s|2XS^tz3<*9!CFMvNk@b9JB5s&F#Tz+aXwAMrp2q$9p&^vxo()ii{;BA5d)rq5%oQt|mMTW3ZMC8G-D{sg%XIQ;FB6u`T|R8VtnHU--)4eWalVBy z%TgKE$qIE6kTFB*>vx#pAFP;s-t=ToOr~p}t=FwXF2xNmCQ<1xKv9sT?56XicMp^F-dG0o%ji2G!K-h_du(>k(o zMkri<$s9n7k0MDm1w2>bVtPVk7?@WWN1p`w>U#a>m)YzWa(00CN?kTE+spcz>YPXN zO7;5d?4H0oij{p1`CY$HZc%ql_bu89JX((T_rd#PrPG2Q#(@?Z@ruZWs9?z=ckoD@ z{8^l6(sww4rHC*~k@^{5OLQ_5y9yu)8B55gNEHph)sPs?cR;Fo9Q=2G#tCm03kAR9 zEzuoeS)ok6l&ggriAH0j-A86$5ra(D14=AG`xgmviO5J09XtaD0{^Ifj|jZsDLmeykx;brqTys%;Zvcm&9bbMj0*FX44)GnO&_f4yqKAml1t2X^zt_UoCat*O7tCBEpvpInpbC`O!tpli?qf6kQdaG{~RfVT;r; z`Y(Z(7aX2g*8Psd3*=7BqJOJj`n1C)S)N|b=Ig7 z=X(TBKj=Q!O*GyY`#I8?gJ1qymq9v?;PZyAgu{m4cQ!r`8F5|xhw3p?3S`D;3B{`f zjf&&j2`;O|0h)1;RpKD4#6ebxgRBwOYyZC+-Pc z*H>S%hn_sZD%s*Q=k;Z8)cb6DVDg_-b?c9uUQMk3hdP|YAVp-8Xv`2sNvLfir_diD z6&kk5R3KX%kdD@HGosZvcTzowLb7I3hka^f1{Pc<} zFEQZHF+>e12Y3v4atwHK40v)3cybJQatwHK40v)3cybJQa*Sjf*~!dz=NY(YgG0eW zpjX77>%HqfbV2Q5b40O@(bv8cXd6d+4G7P8Kh1dpf+Md}C+%2~`t zeuAg*EpZaN_!iaUiGytf;~>7{!hVWM%9E@}iIU-5#?NA~ctl1YYT4KmQT7Nf2iZ7L zYs|by2}o!`62I2)Nvw>5zC~IXfG*KwmJ9Ng0?;7^;%1~L6*MV1A*_h+fRqOU`_dJ4 zz<#Yt`SY!eJ(6p3>X)ykH~&`uGDOYoq>fhhYz*knu($OrnXv(ZjhlWBe9RC5te=$= zzS~xVx08IR=c^B>JCQg=(y*+H%~;9!0K4J33M?Q@nz=Z*hG^AedDAn6s`AoLi4jpR zjXAYWVeQ9M49|*L-)4CEqMs7OGJkb5?TxL^vSM4p_dCYjssFri=%%g%?ps*<^rSmK zY41+Dx^~8$%-ZB;;FAfxhwa*h?qMG9#u_3Uq75tmUNMiHYGDp3{GD76C{M>9S09HG zBF19=Lj-D*oF(kyQlsIKk*wgRtb$PAfM>Xs)j=C%y>xK&0y04^9Q8cgB|p$;gABaM zwj@1BW)p6J)aUC9k3E#6PoaGY#z?hPLomh{1eJj6A*T*T@wh0iRN+ha{~8@BVL6wz z97K1G%_QxS%&XZmX2DOW-nw9PquR30rcY&?W9IULjjW}p-nwND zaB~gzmt~-z$*s6@*L$AyYxfR1h*1giHk?Q$fg75Hb~nOa&oR zLC91PGTN>{#QYp5KjHvUr5%tP6xK}_)2Z8%euQ5-EM6UJM*sK^hY|4v~(4@>mkI%qEUMB9Nhpnl!kP zKp`FZ%lCVa-M93fp@yn7q0QHiE_iee%V)Q1S#!7QZ|Hy3&keX)TUxu5J;J8Fu^)zB zCOr)JWq<}Yz)u4)B=|Wvc5!Ud06z`z(*QpW@Y4W44e-+dKMnBH06z`z(*QpW@T2tp z9DW+$$BP6I{QhhEi^xwy={!i1r~M;+a`;i@Ix?J7$E{c)9Da!aAn66@FZl;Ig&>mj z6c=SMHA8>+)gB{9jvl+BPa_EbqJOaYer9L4D<=ltc^--ZS?+l=2w7|F!J1br#Ver~ z`Um8WA>0m|fg23|aU$PxFn2wdC`E2k4J?8B=;6Sn_$$gzU}!PWU0#if`fAkDgcjzx ziZM^;jVnkgZ!xcJFV;zadCk~o+e~PgH$Hc;zg%6mYyEhSXLnq)4!2I%Pj3ixeBg;$ z5#HVLiM>WsU&hqesY|gwBBfrmK7eafSef)}@Q33`e#nc^KnqvPtJ+|}mFK!(jwmo3l8$4H6>BHHgK#MV%cP777 zT3*fG*Eh)n34@L5m3=SO%Ig5O7|ETp%Ia!FOQ$8hLW8O(r z50s87S!j?lvExt1e^k)}S$A^Xu8ySdXG^Qb4tSVptn<6Cd~)e($%J9G=Vq*Zq?gt! zuvYG2>wR*9W=2i2e+FLCi}i!7jGbZs8s4|`o4`rAkjeYURJV%ecsEqvi2eUO2w6d& z`7lTxBsWrCrzo-GrI{rhq&ZB+%d!7Q50VQ}WCPtxcBL!*zB|muJM;C@!*cxCmM@}2 z_79)zoxNuaYo(uMuO#;loRjx0PP}jT-%siN^pEw`Y}8MHeXIH()J^I{21$Y6HxpaX-?4`5%xwGY{=%qTK?#hw^saPy(O;QbR>pwT% zW*vvaTb1M*LzhdL5NXkZaL`24j1s0HLY%e+LUX1DH9gp=^4Sd|jUxmzZZ1qq_kdX> zCb&~vX@*Ak=(MHp8Y*3l#j!p5B;6}t2r72vI8x*`(e3K9s^s@G*j}#KCEE-17|`oN z7hcL~;1PY0;-Z*Gi8|lt*G2ZQI72^f)Rpmoc9UDXvDYMdD)Jl-jFOU^HN^MDfc+A^ z6hYaTCBjvZby&xOn@G5NB?P^`l$9ZcUAJ%RQWPS02)rzJ?y_xrSN}Ud>n85+rOf_csgn!^)M{P5O}-AldvVwea%sC%fJF>ZDlsXC z6^bo3N>L>SLH1aB^J%v;JH1`McE_Z?J$o;q-UWusPf+isj7wFXd)#h89|C_zA3RS* zH+0R0`92N$3~@7Se@gt_3=m|G_f z;@QT$lm1u3+9lgEDc%rmL0Eyiyn+}ZJw>FEj*hB{QLYk^8OhvmW(%H??F7zaptYcA z?&LwpXCyO~h5kkVX`BAz5$%G$fUSUgUAjJo?YjOR@8e?di@uP3?9#aZx{soNAr1XA z&Zt^uFmqF4EbpI!(k01@S?t-rve?6)Zu{&ov~cL#ja|wC-nZT8n=B1P-^h*=1-Yib zSo=oQ9vO>F=fqZ>$QW(e<0v|dxFz3U17lI;m}71{rw;pPVtHO5V#l+;P$?f|%>>FlInK@-} zOYbeUKPij!E~&XmPX9wO-d#hSAp`H2{BwV|e#tFARLgc%uFs5!8}W=jUCXYj3j8ZG z%56=x$paj&8JG1^{j0fm%OC)N8~0V_aBC%XC-^8m_&PQ4C`u~xCrXvx{n6S%(*dQ@ z;y&m)5LW5jV%ZiQDS7kVro52cXet_1mk-kzc~_8W^QWt>x~u!WVLkRMQjdN^4tgcO z9NBtkF7sk@PTX8zM?P{2!?Oli>e(pum6u-JvVEU^Nk7gyvS$0XZ#{bS@kn`={Lp3n zoqOLbXIt2G{M}am=Dqqgy&gL$15bK#8i;uh(#)p5!$d<(qyr>hLbo}n1GF4so>0l0 z1;1YWW-9XFzR2lpHqn9lZ}FSgK}XHtK|u>DFb&f!mNYUTk$6j1GcvFV@s>8-28kuH zE0ip0m|qtRJ#ggAS6wPqJdbe6rex$<^F%WYdf2`5M@2+zL`gz@!<&1f&Rn^FPWY4S zne!o85A69=@BW#VbzMIh`1$JY4eU>BFdVk1e_XFg{j-3}KP^_d;TzA#4D3Bq)9%!Ro2<(u@2lmVy_w~ik2o6}o zm?v7pNy7UQ@;|yjIa!j?FUs6ZvJbE2f%6pHBMl+Lq>_dZog?X-lvI>qI1#PTe3G9Z zeKLGn`C~j-2n~??VG=23jN=Dsj^Z&9r$p;x(8Ov6Z8(DFOUCI?ZioVIrmUA}$Nw`1Eb)pAMN2`V zT0Fn1?zO7kx#>P-K&{?6E;b~Gy;Y@$v(5nS6>MB3)XMr>mHzH0psbhTEF`R8T%0d* zng>3KafJfj$I!npX`VmCLbf(5^Vy|v*Ts^$l2-_{etTz&CM#}5IuvR%<&?nio)6!> zUj2vot(H`)MKdG7z^r}ivV1#~`NN>hKw1Ip_NnZ#q$2AcbM(2rhYx%#CySsbXrvvU8ylXWZP z`;WlC_S})c9A$w#EbuJGMmEr5&J$>`kclw1QjE=$ygv1k`=6sT`p&r;vGK_MA< zw^*Nz>kzAx-{CPs22fi~m6}u;QsLBcN(4SP zVH{lG{w%UK0B)hQtR)`t7hP`P5fHeu#5+^)j;8S})Q5&RAoTU7coXy~_&xZZ&u;~W z<{{^Au7v{yLGNm%RAG{-KekO1-%;ZlM8dAnO$l-)Ao!Kt^l%uaHK>OxI>T3PR+Uu{^Fl#N{VI|6f zn2WEUx~ML`$EH{5_3*&jYumcj24R6=E7sq3<5JAUQ?Fl)p}B#z^rqOAexOMYVXPs* zK{y*%*eq&gNQlpZ#N~<)3N=a+NYOcnAv%iz8HAjOQ9mN&D-nUl>G%aAHv~U{LtW7( zn998Rk*1P$hf1C`ESL3|P#M2K@3){{tdh?8VM01DXEwbQ2Feb4aP+BsVm zz3^w{JaRrnKi;p|E%LnUS@HvIBTvvf?!q|6@P4QHZ6Q9Jh5E~=zZZFb{T5S*T!Fzb zya+Ru3(8NO=YQb>>N)ZW{u+I!)xxBb2Kt=icVIn+_^f81hGwxSso6Rnrerf&<%$rr z>?BS@0X!ufEDfz=93{NjnsE{hHMhsa~;R$|NkS9rMV&C1rZpR~Q??0p8U~k@kgXGBTPi|hZ;=w?MmQ@82 z^1}~415S6sJEs9&lr1PqYJqq^pJdICaH~FNG)9Nl^1*@iIQ9c*p%oY%;>gG)8Lx8V z-Q-xsB{vLIyjpp@w(gPP6Z(|QpF8}_nc>Ii-LDcMc(P~fExZF4g723(uK`WqW6ttN zSt{*PrLDpW2Y54TlIFWxOLm{Fzzghvx1?a>mw_l?dkqpJy*Fr4U>m-sL4SSb%-1)T zEM2;^VZ?ah%$Xm4Fcav}xDSp+44O5>YR`|(3zM6Ho55j^BK0DzmG=G3l!NjCty1zF z3_IYejMyR}!11OHjNR2^zhvJc^%hv7tShHP^KDx6Rwk?|<{IZIL-?sJMH_Oky5lE`71sNy-eS8RZ z)DUP*{r;4w$WW*1@+y_CEs%G%#l@hPzKS@>7Z#`aq8%}IUtBy*+4=k{_`piKTzA!V z`6}G#J>*B}R4NPSGg@{y}H`QvjnOzVSASr+XAR}H9#0`q?PQe8d&mnKk z`b{iU|M$j9{qJn%od=i+=E++9BmFTob>%YIv--v`d3*YS1AqGnbYX4)oD1}A1z?%X z^`l)ui)86uTz5xKR14y>iu{hGWXa=%W2w~?-XROFx#0EZ2^C!CweFLvJ0ybUc#bhi7c zx#gh`^*B7RlU;VLcW62j20o%SQd)s#BxKt(eN| z_bU448U6Z>Vz29O4(!rp(3b5prZ06ySBUz(U^3|3KcUalB(L8lRV&AsDw$-H>*5uF zHm8mxam;4~J6t1wubinXQparJb2C~0l-Hwof+CSTY?4DwPPfUfnJh$;2>gO5xvCw< zSg57?Kgh!#_}tQlGTiKB;RVWf^S1=Dw{$5^kgpup?+dp$leXw(%!jlqhuF#SY*$^8 z(n|kf{LdQ`W6%xY%mU!Z7>+aDaf3G$Q}W51PyBS{X9`~&1*IEfl^ zFw(#<3J`Gtdf&pOD&i^!~v2@>%wv-j9!s z$3fEAc(wuvtQcDi#%7h;`)!Cru`tafmy*4}yG9=! zTY027dElrBbqrLxXMTK1f9oGx=CG*e=%q|T6ukN{*E#p`M|8HCWs4#mvzqLR*`zuc zAmISI=Fk+{;5S!)x36Jy z+1#2M{d4+f`w1B3J-jIh++Fb~9h!T$JY z#ooCIpk*Zxz`VC%uiw}Oc>X#*!gvQ|y>hZ@_;4cYfClfoQWE4j%OD9}Kr%Ri%HSHY zG% zfAs3Jv?X;k*Np=%$!bzvOa6k5TN+n{seuAcu(%`a>plivFFt9Nz`88&QKKnGgu?Vj4R zXE%*Y;d|Q2c&7p@SEQ5$dD|peJrOR|?Rw>4eY@Flc;SBcfl`9mn>cK3kbY)?%OZl**0|8s38Hp$?FLBz&|P0C|>I2x7b1~ zo@ng+AZBBjBwKmI)_7hCmDaFV)V0lQ)t1n;-lNU7C2$Grs!P9i)%D}m{kG5^`&A1` z**1%ivV}EC2-)10+GtWDTWi|!PFu(99o658#Cg%4TSo02xw%K5?YCmXo4WY{y{`O` zHZON*H*@^HjjPLNwC(h2i%k8Lenr2sV+SclWT_AOypj9$`Ji=3He~L#uA|nqBy(5W zeaGS?6GUzkiQFcL+~5t3BKO6nBDWE*Rh(aRlgOPeMD90cl$Fh#GH~GSfi~;ie|zMS zkH6Ty?QPfkni{#|$@i|k`s&y0ItfwOK3&w`hA{Xg3;$M+!vvzAdw@)T=X2?mI{WQh z*0#X;fJE(!v^j4gYF9^S)$U`z615|3-pHFo?RJpHk`RP0a)pzqoy^$gyNWM=*7~k* zn5(er;uf~9=2cx+!fqSLrVgrG%Rcrlduq@28@nI?!gp85OD5>IkavjU3%Yz}=JcG) zQQ9jF_opQ91FV^pOg2@}^>|Ue%?Ma0KOpj?gxVOYVhapr2n?4(xxzgZcX%aoe3ElJ z*c;1 zt?OQRM!%uF1wKaduNp$|P$qMD%()ftxM^LK`4b##oUgd0HSw>+tyR3$QSP<2qsq1f zB)E$5I3#l^l5ZdvNQ=O0c*p= z<>5j6`YOh^#1sly0Gtf-e*o8ADegr27wl<>JBdOi!9$A6VS+Uc-{0($BEys*skOji za&ZiLC6K>&0vQZoARzNNcQ>FZ!!?!J6&1FGR|;WA6xrJv-O4O{&fz)F=iGz`$TUTB zPNpfUI+mL6f~_qQ$PH03s1ih$5@MqHUdW=w=gv7IUiv(?yvvK}BsI!~5s!ZR)i!K+ zE4K;hami#ZKC<_O#zyo5*GIyK57J5j2&kld&$50zjk# zXu2pbT_*bxB?aKCk>e-dUvT<#U987kL7&8agw`o`B1E_R;y#x{8}}&^NuzxILN=kj zQiuVc|7bUx&dp_TXIz4ljW{T_i3iS2=O#1$jf!u`t65UtE*zH5?zjBdUs6z{UzYkp#?f6?C zX3CzrA?g^`776QkKL!HtkQ)sc&vP`ATNTCIh!sOsI*Ew$s;D+#k;rFF{@JwZ0X%$3 z#!E`EXva$6)lngzfv^Kv1}-C;o17f@uy&d975lbIf2m4n_L;O8eJ4Fd!+Ra*4mC-H zgBBYtE?(QHX*E`uJo!Up&ur`*`4E#I551NS#+EIUzYm;ZyWmW8t%@D1(SNGa?E>!l z1U}w4;ZY=P(o_SC)|9c%C~G7+NIHU)gkWGgC;9{*QVM1f8MTf2D8OCx3qB+mHtz)~ zN6Aqnn2(uzm9WQZ2_CHY$js@JCR{G-u(EaW!iBa-4V=U>> zoz!2*A%oO%z^R$xKS+HgicS4%+F$A)QETe+|4|=FNg6>hosE5j`jjh%0;jGst$TU- ztroW(IP|kkV+; z#8}&b4n2qY_`hV{Iq2Q(R;9M(-`HxXMcCrAY6|HCAUxE!U{E5;RM{ zo7-*EMSY<2GfjCyy1HKt|?hKB4NMyUxe!(c7Uf zpZjg#FWks3U)dd~fi-%Pyfr}a*jF%L$jO2}_5DNoL{ctgc>0~*v{-qfnLc*)(WC6M zPxNjzdL{tcd8ytJ8#K58=)-6|OYwlwK@OwA)E}d?6(KYwpv8ItjEJPtr;)uj1lJ^a zIfD1OrwqZ!$vHdqhkV*8QrGBL6CvcI3m3>LOcp``q6Y6B^k*#Kvyj8*|FixaK7PE$ zP*W0+*uQmXukoI8&DgbEglFoG^AN-LBovhgmG z2Ka7*uS~9ZWf8>sI3x>G-(`2QJKob1nN9zxR{w>;H6t)p-duOOUzI+B?XK$AWNd%f z`%yMPxbzk_jQP~5S5BQW#$CAOpa0xa$l>Y%-XL!z=t3`nH=sRy>`r`&DsUu6H>@;+ z8lglS2MsM;* z;?|LzBGK0-9_}LKqo)3~1#Z;Z#XpEkkzTc1gHv8@a(=G=pIPKlQ z!1UOdp!2Mt4d`<$kGtr_uTSH;sn03*rE21fhn+Kjj@yc$RuA;_6(A35^!#U93w&5LF2Wq;)34*Dzq(a28f6{dh{dOh0!As z!PN@e@NY%NtOi~u&x(3sb`zyi#!GjIvCvLGG1&hY zjD@y4 z*gk1ZMf1i!#TZg~kcEZ^g>l(oa8VAYwV-dbjuWIHU#GM)G-Mx8f#eL@KaiY3>zUz` zt_ip4n(%_I<4C(lzQi$rnS`GTm=XVkoZ%)zdniNrBhnE8V&pqSHh4NGj;bt7F31t9 z*gilk?TFIa+6z^3O5*~)49TcRaB;JHu4j;wq=4zCD%ntCjQ$%-Cn~61G#tFixtsb= z*W?3D*QC{OsyJt8TyK|i#-3iVdQ0Y*&1zE)DccMMg8&2W+7o$D2s_x)^krn*84Co*C zas4B--}oK(Qx*O8kQ~-L*blC67X5S5{qDj0je3w<`S0&RdxNPxrt@q5ebZdRtjTj+ zugUvIPxI#mEpL*OSOGOhzXUCB7>}UkxKDbQV$pv6_uOwAyBORTIf?o6KcK&24}<$L z^_SIZ8b6!QpSxEtLktpfI?5uyHmv9H_s)f1x1Zof-roENFX?FHP+0;`yfi z#V_z4q5o>^@3de$20YRz=XjI(wEJQ`d_H3r`*LGD`VwMud{S(v&zMiHU*hm8$L~b` zq3}bYzSs!-%DUJ$Bet*4AFFa)YM2uxllSE&-4yy}^r0c|bJOP<=Y(srXe`{PGzjBQ zc+AQ;F-E{XRXqPK!DM-GjFSMvrA=VSedEy%*ZnoZQ0V^XK7YO`4Dk!&`NsbI>iIh` zNANVjdv9u==aok7Vc;m&EutOFnA)`|4k`$x#(kQj*v9r1*j(`kx;xNT(wSLldD9;5 zf4k=}>S~D{EUAdtW7uhsI!Np@E>v+{&!=1`_FuJ2yDL(DaRCo18;pZ=<x%1~RxT~YD3E$~I#eJwTRE~}$inrCKoi?RJ95)zxSmv{cOSU2T7$lm^d zC7Zl?`BUnzE_mz>|1HU?IVEo7LT3bHxigs~i?U4Ffj{K42JFv);t zT%ojFV3m^(jc1>5Vjt{8_6aBUy-viHI+1Ea3cGJ6WJ%6 zM)nCOvQI#-G7`|DXmHY{dU$RKvTh){3W6(TjWEs%f@gq_k)ba#0?}~6wB{&*4yf>& zaO7_XzE3G|nm|ceSk`G!+x)!N1H1Xsa@x1X=RHHCo309<1Fl*)m2C}77x0PN}-cTOUnS$sjtO4|03GL_B`KwHbO}9XwVXI>gTI z($n}TnvR2!kR#uKSf&~B4G}?Jt46^PNft~@E<`mP`RTWJFD>7TT7R$LzRbp}0cEP` zpD@A1O6|q`craBYeTJf2QGE9l%Co)$KPlTEn&n@Uz)s388Wq7FyCa@U64)0>>S{=s z5HzuZu~g;4;@**kzR)%Wk$;|X>x7g^9ZNg;i?p$h#E5v8>J5MTcD6x(xkvM;nCSB1 z`I+b!ACKn7cp50J7?F4(O}>N|o5{{8C^uO?f*O7rX$UXn%SZe6+ixqWe8_=p9klIz z*foCUwOmr9M`+BAIqHlZG$9$;CTVJD%1F7LigRPvf(q$Wuiy{J=ttm7#v76;XPp=# zt$(u41D~NPDW+hCmMkaefMA%gDSayybZW*FrPgFJS<-Wc4D0@J&BRwn-FC3=oy!Z_ z3>(&3*Y(W{T9rgZ7v>Baw7TrkW3Ah~*rjyZ(7aKFLkBIpeLG$Vo_0VQsAel4A)0TM zz9pm0&3a8aOeQJ`>9pm0&3a8aOeQJ`>9pm0&3a8U+@ zivop<5)_WMd_>`B<&oM^wLpErlcqvG z#q)*IxWHL@UUw+r&}|s);Q3!Z!1K}iztp$Xk$65*JYPR6a2M)I*|G3Wz>eHxFG7eL z+>206INIaL_L>?~_`iuxp{-l=)9OAs7O~o;atr;m%cP1J?vLtED*sYra354#xexcD zt)S=Yzft!o3H*MIe1F69{62raJKNpl{t(@!KC4XR?N@>_nN++NYdv@$`^xD8H>_NJ z!12Kfe6Ru^tiT5=@WBdvumT^fzy~Yv!3un^0w1iv2P^P_$`Qb_`#Da2!~u>+L|^0u zp_~cC1Y+<>sy)~#QzF&Kh!nxtGzx$=BS&K)5?2%xE(~Ge$63k={rz`8>A94Jy?TDj zb^XDom!BWA`u0axjaJhAj1_Ko9D4ER)uSF~b85yi`NYuWeV2d-D1oR&Z*G#KOn!bAp6J%KtzRNqJ>Kj$w3Xi7(jlWl$XRF zBA*)Za|)r52RxT(De3X#XLocjPw1y#Z#k-R;;a?rmHE?SGlx%{cks^TTPKg}b-cMb ztp?i$!UH}Q^%S4iIFzh1sWQ!L{aM|jc9oN$_X~~@)l)D5e2g+Oh{>29OmZ|%GH|rP z(F4a&9FuX($FUm6HXKjmIE>>oj`wg-1~F3H8&)Jb52Nu?Mtw*AZ#$#S~O0hfxFSb-Du!$G;lW>xEl@J zjRx*U19zi=yV1biXy9(NfxFSb-Dm(u=n*CGM+e>#&E*!Mb2}onMdMU3Lu5qgL}PD> zv4;h9tyxkB-W>^_S^TjqfGFvlNHX66=S4U#BCi|}Iw8yf>kBANX;6QY-YSO`h?HT# z75b(ipK2cgS;X_{{FiL4wOLw8x4TB)ezzyA{q7+qb7D?TQGQZPlz;ql)F(!b_m+6<8_Ee<_CAQz^cfK(0}}2>05lvQHQ*yp&qnyD0UtHsqXvA`fR7sRQ3F0| zz()=Er~w}};G+h7)PRqa4dQM6bN{+xHF|QnPsR`zTYA+p=I>?`6Xm zj^8_}B)@&<)K1n!N0rl7)3R%6c533(KBgrl`^)>xKRUISFUIxfoYX3&Ow6(0U6} zD74;jTn0sYCcacOkwN&s#tD#Hz?rNh^hvpi$$IM}4Ycr+6slN56e3xjgg+A3TwGRf z0{t+^)5pstDZp?ET7=(s=X^0#o@)ZA$v|^dvC3*Fg46tC~T} zx;$L-?BnmbYMk=c`GXgCn5&kRt4?2HoX2Gg9WpI5J!FV2CdLQf*SMUPx29#)z15m| zl>K#m_3a}nqKoA=Wi`DD+qM{)og7QU2cC7-PpQ4Qk0aM`02hD{loN#f8p*aunQFx@ zh(!0$U_PvHu^&P$7(k>5M=6d$I40njgJUI*EjXUUQH|pyj(2bbCBkrEVmL67W)#o` z#&MiWZ2}t*HKYy}q>Q$j%H6)2{5x;o^4Pe!KQQL6>GWjt9+L-*>(PcaSEt79WpC-76BKeW(4#7SxWGfR^ zp9#Fo1YTwWFEfFcQGr(zc$o>j%miL$0xvUxmzluJ5OoE)gVbY2rj`tx=Mt|VpV(wj zQ^HA^<0f#A3kzJ5RvMNk%qNu1lkcsFTnQO7*(49Sr>sRpp(&zW^Oo&myH3mR z6@6-6r(yDAy+`!!TODT^J8#GVmY(Tt(>5x6h}$09wQKWN{NJaYd>N?b{CHeYm`3%-rZ@$L(o<;r$$P+KU{ae~^WOIiYbvV-D_U<(A;I4%ap6WF)x#xG!_c_dA$M>M}O017G>7N32 z=~$i3aS(kn@ZyhyU30Wb@0wt1+cRKb{4?S z0@zsqI}2ckI(⪚h8`%q`YtuK;1~G8P9Nv_uy`WJ|rx-JH*bs0kS+*E|kIy_Fx3I zVCxXna+0n<;In+GV~ePQoL2^=vX*C^JJBXF zr8uj(TGK8Xxv}1VuH}G1HD#05DCVfFv8&%37F95O{RF(0Brn>>D{)dG3nPdNO(iX~ zmgqHownG2uGXx`SMN%u_tphXU0PS#qb~r#g9H1Qz&<+P^hXb_30ovgJ?Qnp0I6ylb z2JLWwcECxJ2+7xI_&SatydwecNWeQ1@Qwt$BLVM7z&jG~js(0T0q;n_I}-4Y1iT|f zlV78o*Kq_}X@*u%`VB`997AzT#xWnqY8=~eJdNWpj?*~a!$Gsw3iDD-asj!5(qI!Y zKE9I^I}S=T+H{8^$PUSzd`?J>PxECYI#%c3_sRZ|OS|hIbgb#jDt8am$lbN7Y0IYR>+v7qg7Mn`#$IStAwqB*0KsSLzoza)yiGx$ zTUYQ5D+aL7A}UWFU5U^-68vR+CUTLOSaK@aOBz&WK`GQ*;DvaWL!tKEAVAiWp#5KX z_|R;~vs1i@k#}}&*0D!=Ye$$fEUaaCtC+F@qh=MmhS^hcTklk5TT*zG&C?=W8=sPC zcC;BaxK%`YQD3YY zl~X2BWs0&eV;&mozoActAWY6d;bsAISX~I{g^*K>Z5M6RIJ_UQh6SMwWoKAeQbK%e z)-9(uZ(HLX1W0>aK~Nu&ZLLQOKqq7qpk<|f=7MQcJu^6%oz5Vf0WbY4!1?e01HAOF z1iWD0Qco+7o33H|8mwFz1)3$6GoclyT>rJ6m!Jlw$dQwLJSc}e`F+sdg8O{n+?&H! zOdKc^mA1i)qj8dfqYaK8IELbwjAK5I)i}1{cpArH9H()-hl3~+p})|)2u>f5*2xLukK)DO2p`y-)H9WO1A-+>`OH7TtXXrm$xSuzCw?%6r}u3fwCnyp>yIApND z)8HWozu2|wi%0PzB)&SVoYP(fFXX-}7?H>uNLqBN0EE#M8=4^@XQZW@nY3$Sm&~HJ znRg5xHmq||($=m|YDEkBM>t#=W%v4*BN#28G9wALWSzX8whF&NIk;O1E`HtPcY}wiq>Qz>H{J2iY zz!0%{Onygx5l=Vx-*BC`VdKNEVY6e`FJ6>iypHF$KnGs}yPVZ{9*tnA7&~Rzl`x}; zNCGY^1)eakQgSFQ@8J{kdnB-@FS0~7P5)4T@L{|bKiQ7;+Zyde8UC|IIEZ1zMvJ7E z1Z?>-knri@h)Xq0NQFtxO3t7)ni7xWodj$`paN7iNls$l#ziJj4^DPb$`9RBlwdhz z$sBuax^ml;yB^lP!9G2#ZIvGy*l+$+{W|q)CHhr{ex*t)2&RqJ^~SQ2|Fe}H-A2d4 zpc_d7g$mQ3&DNqB~S3g}}@jiYN=9DI2ch-|9=i@Wy# zkE&Yx#pm67&kP|zW->FW1Tra;N)l2Dkc8gB0HIguAPCZ=2@wGWX(}QhAShi01cZQ~ zq8wC2MMRo<6py`o^ypET#r?f&?M?CMcfbFI=lSmc9?xR$OeSmZ^{%(K1p=W@qFi#R zN3v5rIc=&r_SEuaH?CD{Pim{xbNqSvS$aW_UeBY^g4&1iGfJz~Xp+0>@6pMcmYIG` zywzxQX~_B+>p^tdbY_dBD!#g zJ${Qjzj>3y;v8c`hbH5@G;T+c{){8ZwIlBuw{c!&hp70RhGoku%NRE`+p){v7}e}J zkra$27OY4KB)nhH0YDu|51ZJsX?FA zpii@Tg3$Q`Q@ zh(6*9=s_z|sV6LK@t=G!f5Li@`b@j@M#;uz!!={@%m-KXt*li&JgLu-zDdsN2@P)R z)UcsOjr<*N(YonjX-$VtUp#0gPJWua`QGI?EM^0(rrUdrZhUJ|Ve8_;x;1Ozsk-e| zyjyj^T;-c|RTRZFs0?~sDxpLt%y%_5_z+%`368N^o}d<+}Q#=;7nGGG0P&qJ;o>v-XL!APHx?rC-We8tX7rxaE%9 zvZH;=quSrHan!+9_B+NbDZgdlz)oYgt=n`*8xF-lzMj^Fb`kk;SMo&&AIp3ZhNRrV zJfEKE(NZ~I#QyFIahS>gp9gJk8cmE2z~B^f_t|oCV5qlp$mlJLGj+%P?$J-)?n$>XhJiPRfj5SMH->>XhJiPRfj5SMH->>XhJiPRfj5SMH-=ffF$}yh zO!7v~^oUeGjvKbQxtFwhLsQzQ$RA5tSO^H`T5ev`9)qoHERWf=LVWq*sx@g<8IuOh zIXG&1v=-ZX&h)8ciHaLtD4nq&XLOzDrX5B#Y0a`j`mgnKc=-mlPZ?SVV36iu;|@qM zaq}X%0l>uz`I(2=17KOwLMV{-Zy_Gp3Zpy5FpS9<^DvfUY{J-!aTMb;hAE2*0Pg|` zZ=Say>nicsP?y;mzLrcbV6S?FX$0q)cYvJ?Ua`1wO0e+(=5A)qSCd4*XBfV$=bI4b zuj+TFHLIJMpPEWVsp)M*pHqWgFPk>E{h(@*%R6-#Ts%C*pH;l^xi8;b(6P(D?pk?w)=>ulZP&l9$4r~nv^uhtXa6m5{&u%B9wj;1&D@Ru?zqTR_DNSxo^Bu zc8YverVyk_5xHl=e-hj+3qWB^H@c5XHvDM>-Nq>sU z9a$BgqW@@14{n7&MdhGe%_+G>i;y`e=I8LgsGOBsG}mS4)$jA?GB>3wt$<%9!1K7A z@X{bt1%4YjpN#K!qOCH1{Kxq^(b{Y0<6IY+(^5_w{`C3f*L`2+eb}D~PcaHE?+{1v zUf_LruKIi%{6)9WOLp(|pUd2s)>^u)^PhZvi}t#0$Mv7vd7d^@Vda%r^UHZUX`^h* zum8UMyj&Y}bsm}L@RqR^`9pX?ms9_d1_hBTEI;34IIYi(Bq|NQV}3r=xPzaoy{lco z{Jbzt#lZ9_z=&eSD?oYRs*NxjfU`osWKZKw$ogmqTvX@da3W8ntpV_nqluDd+;FZO zbG8PO?}KaP0>@#yNQTG3eZ}}vWs&+7UV&3JB&+a%B`~A7E`9`}_)qTP(w~sbqMV8X znQhjL+`Mb!6XSo@w4|z}DZTHRRdFzW zp5$B5xBq<))k}!Tt(`ieLyPXSGxL|VNXl(9Ebo5t9B@tTiG8Kqt8qpM_6l)HkahLT zo9+D&e@mw@#Y0kHr19cBkSKhOk~~H3*bT?P7wK+${y%Ed|^y1>7wK+${y%Ed|^y1>7yg;%+J6ZYfeWu#YH{Wdol#sA`&^d*yTrZ(u7_vBV* z1MF32Z5t@jVYHL{f@7t>JCA^mB+(pNiqAQhkyPAE+X=_HsmECTAXxuo8|+#=hSR&T z(3_^ma8_)zqUdP&);Lv3`qrZ1TZ;w*h=y-18osq?_|~G~TZ@KoEgHVHX!zEm;aiJ_ zZ!H?WHBNXsfTUogA1J93i@ms_$6U!SkzRj>x#d?zQkSu4NbAK5?|y3fR|Qo?>x=KM zC|lDop;c8I+vVprOl;h!Yzl>MU%Y+sp5{^Byv>6K{MF4j72mk${a>7N3B3T>?@ zQQ^PJOXCco<`Vylk$YqMDV_MH6W?_L)11IGCol~s8Dq@DSdOs?V=u;0jMEsV7UBe^ zVP34y2ewxS>tni7cakPD0J#hcav6YJ1|XLK$YlU>8Gu{{AeRBiWdL#+fLsP3mjTFS z0CE`;az(fnGfgmWZI1bxTk|!?e9bXmbIjKq^EJnO%`snd%-0 zvIy$bOKsG;URZd&oQ|2D-+Q0zjcTQ~+i}k-Us6I!SVY67I6l`$tsR4Exby4JbUFQT zNlhv_fgmH)6*{tIrzRC$dxxad+TVQ7>2vwT!%OZM{Yh+-HYHif`Smgq>m*M;n4Gd; zd@WB_^E&>W6AiQ z%zL%`jQBa3|Bg&QB7P3Yc~-$jgg+2Jr^ug8KOBBem9)D9zfXWqCPmd1TeX#u&LnI3C+!#q znu^QaaAcGXgcw_b;!6x^kF*<9VKJ9@Yw&Hd4WZnkTy7lT3WX~OZ>quIS&)|Ep1QR75grL{!AYe=p<9p&DEb#mxSM&ej)rmOY-tk=;TAtFVYDM zHQiR)q-LT6?EqrEwHy%+R|cA29Y6kl!U$iPoZ)Kx^YQnOHwmc`T`hHC zod5Yu92xNqKFLWA_`H0Gw{BiNUOob|h^@bZe8f7@Ogf`x6e%6{bB`Pb`?dHv;m*05pn1jYuJMlv2&f@t?ujs|w7K1)U zU;Y3+gcd_8Ws+Y>A}m}=AVy!-#KIAZW$TXPOip09Gh6QJ4O@3oVgw*D0+z%GKw<d(aVVM?&Wdg%8@pzT3p3QQH>&v+(B`-Y^9&5gaO3j=>IYSg#uu*L7*`oOH;jxKK4 zYW5+WiW+n~%eupzz_)T^5%A3oBjG2-(Tc%y*wQJ+4ylAZ{EYiJ@N66QFHSON!@R?H z@H?xMBG=g00W0CpvK8OT1~jt)&1^t38_>)KG_wKCY(O&`(98xjvjNR)KrzKG=fBAEUtqrmw`iEdW_?cO5`i{hQ2o)mV$VuRo=F{oFe zJu;^)h0iL~^!kN3K4g1(CK?oneoFoqs%C9{=21Nztsv<4VsBkt^F}^-{J5B;4fKY) zNw_E{C4uzp_h(fW-tx{lv_ktxoW`N1AhLbBUe!LFHf{_}?o*t#=+$Qt$V4bYMCtDt z3!z^6Z4WEDg20yxc1SiR@iqdGjsT=10O<%oIs%Z60Hh-T=?FkN0+5aXq$2?72tYc* zf^-BR9U&pjOrLuU@G;U3+~b^MZlJ2NsdeeCR!&9hOFF(3g*cxFQCYAP7nn;Rr3iRj z;C3ZO_#h`dfk;PDL`vbWkAFZzA3c70V$DPTsXJzCjx%qcX|8L{nrWnOx?@uC=in0Y z+YcueRe$>@?L!*j^S^~2aUs-Heg`m^arrX(Laze#AOTmwAPHN_o2~;ee8oX(^6G*S zVQRZNV4?#iI$)v$COTlE1136Pq5~#6V4?#iI$)v$COEl7#ea0b1pRVUKG6-wd_X+_ zltoRP-6%6tI0nGE-2C$BBqOh}X5wrtzQlzRaWE&?m;kQIFgREQYTI<=O+=H^lb_;c zWfn}s1wP@3Ls2jIiFSKZ?fCfQ*!c9{XH2i6p|74h|8t=@@>U0TRh?1VK>k%io#a@p z;nXSOTo56Gw8dREk+$!}5%jR#m{(_B`}W&P-v@>P?zf^p-mAtOz`fXZQNdl8ZZeJz zBA;4iKin{!5qiObx#vzj%+B4?RAFzd(y7wG**WPNh|V?{|5uFB7NZx&NQ|i%^D$Op zY{l4*@fyZC47LRlF@G+26JHxKZ{{j%FVfH$`hJst;K*?NjP1dfnBk@2bIup~1M~rM zS!@TsU6a5S*p6eq;K^}nZihdwZH?yM)dbA^;OUvYipLGz*W&C?;@QqL zm|DH_?~h0K=ydy5o$3{JKgjzv{_=N5U*i$%SEjXJs%M-9+N4bVpo&_@l>M-9*i8hc|L#W;;&(nk%@2d9IoiXJ|Qly`@n*$9)#_q*@?$ z-nY6kNW^?UQU08at4S@APErE!cSPu3KbRBF!%c>}0~;483b#vZj!lIk9PUhKl4|?w zf?#H&WVA_@s3yYn$2Wlijo$O(%q*>U)1`|Z(l^A%C&d!^YVG+rJUph9J_}GymoiK-SD}SA|s%H5o}Jodv^U)2`BGF8*29KZAmaO2_29~)zh^}vmE z+tZ4c!(qcSAUSD-uZpKC39g^u#B#ZhH=Luc&c%d(iaDJ+ciV4zAld(8sf3&~%f^pN zmRD+GELVi#Iz5n}_`lia@2m4?Cht}4qJ->@+=#Y2E z{QjOj`3W?1Vg4}+I5GljcEZLjZQ^v)(5fXl!m=+lW-G(#b;L(GV$$TX3Fx}-a4$?) zi63#&2aY@l*y0vORDV9rvOvfb{dUMF94;Wy*_|H=^u?{1A?@CNN(6O#NPEw5t?5F1hE@ zG-c{Q=g(z(OD|w4?oMJ^?Q_F#!Ht?+ekhoUq*pd6)vBiT>n6VV_`7~nR#b^S+bhPO z(kFhKSR@s|=nze39QbR6(Z~WViycM8QJGxClEzA_ZDW+I% z4UunR*-eOSaE%6QZaNe)E}d^JwTuvz3wslEbJhqmFh94_;b&#znhgsm7x%@uXN$N# zuJyr^ORhd2ziolP>cF~WGyJL^e3MLKjUXEM8V&)#a*Y)j706a%m3e~ncH;9W+;eb) zoqdgPwG^FtxX;ID`FJ#!D;2RP?iv|rzvdpN10gp_#`N9HX&osp#cEO6%&a9)l+Si+ z0UKtZ9uLA0`W#b61|Q^`KukP+q-leP51l)+yu-<}^y9DvRpTfAL??E~)}eNHR*=3z z>)TELoxhq;C#g1BGW6mv)V5v4EvvLaAO7u?NHMn2oH>*)UccXNpH0WBZF!q$MMQaF z)BeNzygXJoHk7xObjLU}2y~Z(^oVB_2BpHxR6IIMUTxB_m%4`sI;00+_dtjAK!@}| zhx9;)^gxI7K!@}|hx9;)^gxI7K!@~LI;00Wq(|zI+?6E~d&QMAtV71)$~iK8FV7WE z#Qt&m3BQ6{nw1DR;g_8B#8=)kZt@+EYdmL01Be;ge+l-yYxm0-)VJI8|AcVWrBfFC zGXb2xgr)IC@KX!q5NE@X134Oeo^|}o3Vs<<3poIlO6hS?k`g8SG625}z%K*v%K-c` z0KW{tF9Yz)0Q@olzYM@H1MtfL{5TW?b>>st{0oD1d^U%!(FRj7V=87$#f+(#F%>hW zV#ZX=n2H%wF=HxbOvQ|;m=O_XHDfAfOvQ|>z=zmUB^`6hog0+RX|<}bpCg%4%dcTl z6rvDUD9K8RS5$L7Re0cb$a6bPd78}I6OULM{5eu;z>7AB!Htn~dlgL@Q6)YaIeh36 z@%I%AH0_gbVPT!t^ph5#FYVsUxV+tN-zdfGi#qm)N`Basy!JN;;3Z<)(#?1=Yd?U` z*bmbGpWP2GKVY?2ak>A|J=x)~Z#2HR7$yE{Psrwi9yrk8e)g?-M>qrs62@Tcve+@_ zH!@lC8S@V2<6JZ2#40_K9l;L4FFDcC;9Pd-XsTg^Qq`mz-I-fJgR2hVy;gj!nmA#x96z9s-c6SAAugk2qw z{}tljRv6tehG97RHRZ(40N8T?>^T7T8~}R`fISDmo&z?gV$T7vXO5pJF~W(9%5hmw zneEC^X%&4WNv6z3s4Mgl*V#CYWoK6nnrQ?+N$EBe=nV4!gm|pJdEj{)Jw9 zB_?OqdXP92{E2W9DHT>teC8doRkza^x&ZSqS8V=}=;TKc?H0dBJtZRtGk1MK4JhgT z=?6($uofo3Qn3o{xu!$gf4h@6fPkW;y@A;0aj*+RQGhCAx9m4o0huUspOqGSllGY- zNjF>*rWg=v)!BKcPG(_`9cw980HBUE=#;0#(k!_-N6a6*CS*jDH#wl8q7)Vs(i_A5 z@R~q91T#aFGX;JGYLy%-flAdh*y3OGxW7e>e`wlUzr()n^u?fI<>Kh4DKXkUhr9K^ z{dMJj#p(}}m>)dFU->|z3fgy?=xdrU>S)?_+Cov|+YR=PZTy?sgR$VrgAm`e16A%- zv=%CZ3haNn;*-2#UlRkzW%Ej030EM=d4pOlETYYNI*@5FOmaE zDfyA`uAm|@9?mv@ypzhCG-+H-{G3LI(6Bw>2k}0Add{F$(X(*c?{V>E6jfAK(wo#v zoC#Kma~iE)@(!ITX0+Dc8^1)}M> zphb<3HSNudq?tssfhLNDV(%4_DWR3M=+c*~>W5d%nY?}7gO3DX{xkB?-flUj;}D5I zp39#bhm1AwoT4_K%sgr2)Jb4OA=Jr0aZ0m=>+0Db$#wSGxJqtjlMpM!T&*y=V+_NX zj4=;mImRZ8y%< zK19AAf0}|oM;iW;4Hb^y`y2@UB&mze&P-)%)FQVx54;seP~ihkwkSeV7UiJzxG1KQ znwAkgATQsEfwLD99etkYz=s#SaoT>OO^+8e>Hcd~^RjF*V&Ky6fN@D9YDuMAvsWT0 zyz8#x;<3H-tX3_=v2W|(L1c&nm$vFX*7Odp61$n_+au$KF)soP>NFK90jq#{pmBfG=^tmpI@{9PlL$_!0+vi37gG0bk;PFWl@v zT8weP7jBurfte7QDS#v*%$*2evWcC9=X0T`d`dc=l8&dO<03B-I^^|lxC0%m4aLkQ73yvwMc#sR`CGRR?rt+F8nJT}I&s0v>8|w$! zCE+)jau=^vQ;M*Mb|opf0>CUzhbVA(5QRY%ia~u@@Ig@iES&Tk{Vu8>+cuBr{clT} zHlVbw-NX^`B7|WxYD`^~C7D$F1mVaOgd)V-!G#w!YE!)J4AI%vX^A^1sgR0R6Rmno zx+GyERAArE8)qRa3Q1ODv7VyZJ=QmOEk*94gyGH6M{9xeb2DX38I7AXjAD$o7`-q? zVob%DkFgSCE5?3|*D%guFz4r;NPHhU=scupEXUY{u@~bg#%T=bpmuCq|0Z4;?63<<@XBAl`58J;m23 zpdVke<^C(*8RvemIAi7XdZm<-QUb}${vq*^$rh=xVuUmhQ$4jX0BK+mlxuD~j?k^Z zPQHl4m~~ovU*EAUM>JX1@uz$5Xy5Im-A?878By>D@y&g=6Mb}s`mdz>Er){mO%pF? zwD|l|uhC@Wh=+-$miHf0*jXGFcW5-R|6NdSPixe#6>9r!sh0!B7Gpg&Kgr674!}6& z%3SWsV^eYQn-Fng`s9Yne1u4hlHW1dml*6z4E7}k`x1kVi^0alV0UA%yD`|^80>Bg zb~gsQ8)H#s4E8NX?wbv>TKxsQxUY*R)a8>^>|g`6fi$dpu~%PDAzMlS2X3S!=^FGc z>_CBxeB%5ZCO^{BD=UxPtz}SDN%WMBv(Jc+ogs7|g%Q1TDskw9-V1k(_()tZYF1uc zIZx|EX(iF~pL+-tIEI$Kc~&>xc;n?EYmR94Lum~^@V}@!a#joln1EtsjZw%5(Ug*hR%g~ zd?29`wmJ0~w9L*1h7=-bGzLNpAqK?E~h;n2hL6SYyauj=xKlJlQl*wm#bIeRB?pdH- z;EEN0!}^e_PU8woRvY*<9=@VqD+e1@l7&;MX9^g+3%nzIk|=rozIeCG&jW3kpjJ{i zCBa?_Xoe^y7+wd&3P*{KJX7^xSKGngB0c)*`rGv!Go3<{A zm*K!mE}WBi$-#_p;AJ@QG8}jr4!jHpUWNlN!-1FKz{_ypWjOFM9C*p)cZ}!Zrt-w_ ziBvcN%mlV_m5Nj1gn|(Rli|e3V>P>Cm~r38t1$CA^L+jiQgCxqvWR22m7WSB82Sgu z-PvxAL&6R+^$Je-Y)>j&wV>ybuW)mr$4*kOX>@QUHG3B=903geh$E~5tA573_Wv4J z?C5R&C-_2t|LzYc)9HOPf9opVL=#=VcB_Y92wvd-9~dM%K=U!)*JBVH{2bE%KgA>o z)jz`~`rsP4ng~_Fkk#m|V4i;Oi#KSon3B0?sF~Mfz+X|Qb7cxbelqiq zGnup(W;boxcd0$K#qMoGJM}q!@NN=sjqT%hC9OTssn7kB*rwBHN^r5h^70Naju`7K zj&M^!js^%BfE=vk;{9qjDKDFw9MmwYZh7u7#(yvLb(R6VmfQjl=RhN)?rM$*0+*US zGtxKyr_y#`jhVf6&aOgPX z$@rW;wIPs>crbUR;p16r;yzk-rh(6^pfEXs-C@!p1}}gOA~DjNXDp;G3%Zlo*wmj@ z-FNO&qUlp8Mk~H_p>Y{Ca8w_#WI?N}Ze+CRv6JXr#ejigJJ@vzzt80#g0C1CEvJ8hy5%zGTV`olIhW6U|r>goMsiF>l|NFpxo94YBI^|?%)gMWD@#A0EOwGlK zqvL-7$ZVw5GJe!va&(8}{OdkP=JTO$66x8rQ~dh%Kmh{8XI;i^uHW)wB+e{a~6Ch_7w?JUa>n}^p} zjId`l|jp~0B#ZGKzC>`IjDy)2-qm|c^h%bm+Co2$h6{CAeu3}{JHEhccCyw|kXMlBL*o;c+3n6QK6`ety^8-mdlt3KKiDIU z3r<4MusKkX%Q1&W%Z*?3hK}*T=^C~$#uh-i8VFPB%beN)B9m$|EkAYQ)QLGAD(uhi z+4Cy7mM-OYx2=OtoM%h}Askk?7GnAa!%fQIW5#*QxZvZ8ALfSb87c8zV=Q!aMNoe2Mz8a_R%e;+YKY{`n=f; zQ(0q`?}&hk6Jy(_pb}|9#U|A*Hc1%7aupt|f>TDM-1cA<9<0KHRd}!p4_1Mrjxgq9 zti;%gu^;0#jB^+u8|K52;KPyN!;#>_k>JCT;KPyN!;#>_k)XFo&|4(vEfVw=33@YI zj(&=pe_?10i%`G;l-D;7+t9eb!(Z1Mi3lf|7hK^G5;+ZZ;tiynx_`0yOR)eohP z2^&>$r+BF8Yq;Sqwh}fs;T!>Orpoolj4;qxz~PzGa|#t-Wz9;wgdEE-mDA&pp+4jh zGctuI7Z!oD;9MLhjz$4!y-uH@yOQHE4C7W2A`H@MkJjGZM`81`XaL<$)2QBV@x0ip zQ7dYbAu{O{y1soC>fGR)v>kLW2N|WKUySPv%89WA#i!z&zG*jN3;kujo!xcn+@uGL-FPyM*}SMde&8>}zS zhyZ2Xe?7ms%4g6_1FModf5Uu+RT0CqC;4<-&KmOI6Mh0XrNuey*K!WTHxajy8*PvG zF#BjLk{2CZN=f7pfzq7~XgRH+c#y?|OGZtYD=z-1ZJ?TeA3K!V&!zDs5P%`uTC6h{ zbdq9w;rewZNXrS)cWj5sDd8=Mz~ zqZe!!F_<`5g!2d(-C4jgrj!scr2tJC^AqDyV~AvOMjsGEgxkm!`J$nwjeKz&)gQZv{q4Tq3?ZP+ zaeZqp@?G4}v*IaP!7hT08N5I2l_d{VNx&Dfe7O1%V<)V~6BScEh8^>-j0{t}8ThNfd|%uf7T& zX9e}3zSL?zy6OE34v_dap5HwY~qh67uY~*rE_cbT?p+bQpC@N)B)we3f#UW=- z|FEnrcKt@PE`$z;iG}V07g!T`5mp9VQ%sB8g^A7p_*Gu6vFiKBPtEan6|akX>8=M` z*J?MBng+LNt$OU)_>|VBxp;i@c4{_>qW8WpyqdEPeKvS-a4L;_01o-@4~YwsR;3Qa zroe~1B6f?yWWnG*A{?bq&LxhjpaGubxU8_v2JG$&U#HLTu%UYt?_$nEwZ5b@qp&8=OZ&7cY zc*s1hmywTit?JsIP;iRJ^wvo-iVpEJ)>0Q7hIyLGATVy?>J+M6&=-#_e*O7YpH zTym{A`q?T`d7{3zzBp^jFy`&CwwDzgtg}06W2IpyFaVdE*G-h`Ks~@jL|WMQ9|L`p z113`6jDfxx1AQ|F`eqFD%^2vLG0-<-pl`-N-;9C283TPY2Kr_U^i9}{tSNFt#SJ#9 zyy|Y3&6fzdpHf&x8f%DduLI(*u)w8_7T;}p!GWfHZ%sz>`^Thz8aq)KUwI?K*qT0I&M0%54J@Z$k7ytq?hY5ZQ zAKI9>p$|f*W##~#79t~8G$iUsZ;CpL5}Q=f8~c&J@;$jJLQ4w1kCR6BQlBL|#raAS zHPCHxE~Go_uyjR6B-+eqwAYl|CzZ|3roH~sD>QvXTX(C0R7pp_ zIsf8Y6n%!?5?_<=txv?I(=T55W*D6vF+v3J?r4!@M zTxfl>^){ZHBeg2>sh$PfgcFgk>SyZMScSbFdFGfxV;qf@Ta=%i#O9tMRWhJ(3z0%Y zck}@-w~24cx||{LrFj3T@2SUuFX+4o(5`*GXFeo8q_))V-d7*?7w&AGmL@K~Ug90e zumHc$GjhRK&8j%-Y~EU?C1UmoX8ZMqPh|#8VD-GweD$%ngwNVht`z20tc@yHiW9WU z8oQq7;1oQ&56zHqv|$R&-DFnRa}X4Jjv&EOM8^+;Kcdi�q^`xVVkR{)0mGE%}Xm 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 z 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
^s7&CPkGj$j
^s7&CPk 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 vl>RaRealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/verso_blueprint/static_files/scripts.js b/verso_blueprint/static_files/scripts.js deleted file mode 100644 index 64c37a8d..00000000 --- a/verso_blueprint/static_files/scripts.js +++ /dev/null @@ -1,23 +0,0 @@ -window.addEventListener('load', function () { - document.querySelectorAll('.has-info, .warning').forEach(function (el) { - el.classList.remove('has-info', 'warning'); - - el.querySelectorAll('span.hover-container').forEach(function (hoverSpan) { - hoverSpan.remove(); - }); - }); - - document.querySelectorAll('p').forEach(function (p) { - if (p.querySelector('img')) { - p.setAttribute('align', 'center'); - } - }); - - document.querySelectorAll('a[href]').forEach(function (link) { - const url = new URL(link.href, window.location.href); - if (url.hostname !== window.location.hostname) { - link.setAttribute('target', '_blank'); - link.setAttribute('rel', 'noopener noreferrer'); - } - }); -}); diff --git a/verso_blueprint/static_files/style.css b/verso_blueprint/static_files/style.css deleted file mode 100644 index b329089b..00000000 --- a/verso_blueprint/static_files/style.css +++ /dev/null @@ -1,57 +0,0 @@ -:root { - --accent: #d65d5d; - --accent-compl: #e8a0a0; - --background: #fef9f9; - --background-lighter: #fefcfc; -} - -@font-face { - font-family: "LigaMenlo"; - src: url("LigaMenlo-Regular.ttf"); -} - -body { - text-align: justify; - background-color: var(--background); -} - -p a:visited, -p a:link { - text-decoration: none; - color: var(--accent); -} - -p a:hover { - text-decoration: underline; -} - -.toc { - background-color: var(--background-lighter); -} - -.keyword { - color: var(--accent) !important; -} - -.hl.lean .token.binding-hl, -.hl.lean .literal.string:hover, -.hl.lean .token.typed:hover { - background-color: var(--accent-compl) !important; - border-radius: 2px !important; -} - -.block { - background-color: var(--background-lighter); - padding: 0.4em; - border: 2px solid black; - border-radius: 0.5em; -} - -.tippy-box[data-theme~='lean'] { - background-color: var(--background-lighter) !important; -} - -code { - font-family: "LigaMenlo"; - font-variant-ligatures: normal; -}