The plug-in optimal allocation is continuous at a unique best arm
ProvedBanditAlgorithm.optimal_allocation_choice_tendstoFix a rule assigning to every Gaussian parameter vector with a unique best arm a full-support optimal allocation. Then along any sequence of estimates , where has a strictly best arm,
No continuity of the rule is assumed, and none could be: a rule is only required to select an optimal allocation, and a selection is in general discontinuous. The point is that here there is nothing to select. By uniqueness of the optimal allocation, the rule is pinned down at every parameter with a strictly best arm, so it coincides there with the canonical selection and inherits its regularity.
That regularity is the argmax half of Berge's maximum theorem at a point of unique maximisation: for a jointly continuous objective on a compact feasible set, every maximiser at a nearby parameter is near the unique maximiser at the limit. Continuity of the objective is needed only along the feasible set, which matters because the pair weight is continuous on the closed simplex but not off it.
The statement is about a sequence rather than a neighbourhood because the estimates fed to the rule need not have a strictly best arm at every round --- only eventually, since having a strictly best arm is an open condition. The rule may return anything at parameters with ties, and the conclusion is unaffected.
This is the hypothesis a tracking sampling rule requires: the targets it follows converge, so its empirical allocation inherits the limit by a Ces`aro argument.
import Definitions.Def_TrackAndStop import Definitions.Def_GaussianBandit import Theorems.Thm_BanditAlgorithm_gaussian_optimal_allocation_unique import Theorems.Thm_BanditAlgorithm_argmax_dist_le_of_unique_maximiser import Mathlib.Analysis.Convex.StdSimplex import Mathlib.Topology.Order.Lattice open MeasureTheory ProbabilityTheory InformationTheory NNReal ENNReal Filter Topology
theorem BanditAlgorithm.optimal_allocation_choice_tendsto {k : ℕ} [NeZero k]
(choice : (Fin k → ℝ) → Fin k → NNReal)
(hchoice : ∀ m : Fin k → ℝ, (∃ i : Fin k, ∀ j, j ≠ i → m j < m i) →
(∀ i, 0 < choice m i) ∧
BanditAlgorithm.IsOptimalAllocation (BanditAlgorithm.gaussianBandit m)
(Set.range (BanditAlgorithm.gaussianBandit (k := k))) (choice m))
{μvec : Fin k → ℝ} {istar : Fin k}
(hstar : ∀ j, j ≠ istar → μvec j < μvec istar)
(hne : (Finset.univ.erase istar).Nonempty)
(hne' : (Finset.univ.filter fun j : Fin k ↦ j ≠ istar).Nonempty)
{m : ℕ → Fin k → ℝ} (hm : Filter.Tendsto m Filter.atTop (nhds μvec))
(j : Fin k) :
Filter.Tendsto (fun s ↦ ((choice (m s) j : ℝ))) Filter.atTop
(nhds ((choice μvec j : ℝ))) := by
sorry