3.6.Ā SequentialLearning.Algorithms.RoundRobin
Round-Robin algorithm
That algorithm chooses each of finitely many actions in a round-robin fashion.
That is, if there are K actions numbered from 0 to K - 1, then at time n it chooses
he action n % K.
Main definitions
-
roundRobinAlgorithm: the Round-Robin algorithm.
Module LeanMachineLearning.SequentialLearning.Algorithms.RoundRobin contains 12 exposed declarations.
sum_mod_rangeš
sum_mod_rangeNo docstring.
sum_mod_range {K : ā} (hK : 0 < K) (a : Fin K) : (ā s ā Finset.range K, if āØs % K, āÆā© = a then 1 else 0) = 1sum_mod_range {K : ā} (hK : 0 < K) (a : Fin K) : (ā s ā Finset.range K, if āØs % K, āÆā© = a then 1 else 0) = 1
Code
lemma sum_mod_range {K : ā} (hK : 0 < K) (a : Fin K) :
(ā s ā range K, if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) = 1Used by (1)
Actions: Source Ā· Open Issue
Proof
by
have h_iff (s : ā) (hs : s < K) : āØs % K, Nat.mod_lt _ hKā© = a ā s = a := by
simp only [Nat.mod_eq_of_lt hs, Fin.ext_iff]
calc (ā s ā range K, if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0)
_ = ā s ā range K, if s = a then 1 else 0 := sum_congr rfl fun s hs ⦠by grind
_ = _ := by
rw [sum_ite_eq']
simp
sum_mod_range_mulš
sum_mod_range_mulNo docstring.
sum_mod_range_mul {K : ā} (hK : 0 < K) (m : ā) (a : Fin K) : (ā s ā Finset.range (K * m), if āØs % K, āÆā© = a then 1 else 0) = msum_mod_range_mul {K : ā} (hK : 0 < K) (m : ā) (a : Fin K) : (ā s ā Finset.range (K * m), if āØs % K, āÆā© = a then 1 else 0) = m
Code
lemma sum_mod_range_mul {K : ā} (hK : 0 < K) (m : ā) (a : Fin K) :
(ā s ā range (K * m), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) = mBody uses (1)
Used by (1)
Actions: Source Ā· Open Issue
Proof
by
induction m with
| zero => simp
| succ n hn =>
calc (ā s ā range (K * (n + 1)), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0)
_ = (ā s ā range (K * n + K), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) := by ring_nf
_ = (ā s ā range (K * n), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0)
+ (ā s ā Ico (K * n) (K * n + K), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) := by
rw [sum_range_add_sum_Ico]
grind
_ = n + (ā s ā Ico (K * n) (K * n + K), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) := by
rw [hn]
_ = n + (ā s ā range K, if āØ(s + K * n) % K, Nat.mod_lt _ hKā© = a then 1 else 0) := by
congr 1
let e : ā āŖ ā := āØfun i : ā ⦠i + K * n, fun i j hij ⦠by grindā©
have : Finset.map e (range K) = Ico (K * n) (K * n + K) := by
ext x
simp only [mem_map, mem_range, Function.Embedding.coeFn_mk, mem_Ico, e]
refine āØfun h ⦠by grind, fun h ⦠?_ā©
use x - K * n
grind
rw [ā this, Finset.sum_map]
congr
_ = n + (ā s ā range K, if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) := by simp
_ = n + 1 := by rw [sum_mod_range hK]
nextActionš
Learning.RoundRobin.nextAction
Action chosen by the Round-Robin algorithm at time n + 1. This is action (n + 1) % K.
Learning.RoundRobin.nextAction {K : ā} (hK : 0 < K) (n : ā) : Fin KLearning.RoundRobin.nextAction {K : ā} (hK : 0 < K) (n : ā) : Fin K
Code
noncomputable def RoundRobin.nextAction (hK : 0 < K) (n : ā) : Fin K := āØ(n + 1) % K, Nat.mod_lt _ hKā©
Used by (14)
Actions: Source Ā· Open Issue
roundRobinAlgorithmš
Learning.roundRobinAlgorithm
The Round-Robin algorithm: deterministic algorithm that chooses action n % K at time n.
Learning.roundRobinAlgorithm.{u_1} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} (hK : 0 < K) : Algorithm (Fin K) šØLearning.roundRobinAlgorithm.{u_1} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} (hK : 0 < K) : Algorithm (Fin K) šØ
Code
noncomputable def roundRobinAlgorithm (hK : 0 < K) : Algorithm (Fin K) šØ := detAlgorithm (fun n _ ⦠RoundRobin.nextAction hK n) (by fun_prop) āØ0, hKā©
Type uses (1)
Body uses (2)
Used by (13)
Actions: Source Ā· Open Issue
action_zeroš
Learning.RoundRobin.action_zeroNo docstring.
Learning.RoundRobin.action_zero.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P 0) : A 0 =įµ[P] fun x => āØ0, hKā©Learning.RoundRobin.action_zero.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P 0) : A 0 =įµ[P] fun x => āØ0, hKā©
Code
lemma action_zero
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P 0) :
A 0 =įµ[P] fun _ ⦠āØ0, hKā©Type uses (3)
Body uses (2)
Used by (3)
Actions: Source Ā· Open Issue
Proof
by have : Nonempty (Fin K) := Fin.pos_iff_nonempty.mp hK exact h.action_zero_detAlgorithm
action_ae_eq_roundRobinNextActionš
Learning.RoundRobin.action_ae_eq_roundRobinNextActionNo docstring.
Learning.RoundRobin.action_ae_eq_roundRobinNextAction.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (n : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (n + 1)) : A (n + 1) =įµ[P] fun x => nextAction hK nLearning.RoundRobin.action_ae_eq_roundRobinNextAction.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (n : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (n + 1)) : A (n + 1) =įµ[P] fun x => nextAction hK n
Code
lemma action_ae_eq_roundRobinNextAction (n : ā)
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (n + 1)) :
A (n + 1) =įµ[P] fun _ ⦠nextAction hK nType uses (4)
Body uses (1)
Used by (1)
Actions: Source Ā· Open Issue
Proof
h.action_detAlgorithm_ae_eq (by grind)
action_ae_eqš
Learning.RoundRobin.action_ae_eq
The action chosen at time n is the action n % K.
Learning.RoundRobin.action_ae_eq.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (n : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P n) : A n =įµ[P] fun x => āØn % K, āÆā©Learning.RoundRobin.action_ae_eq.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (n : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P n) : A n =įµ[P] fun x => āØn % K, āÆā©
Code
lemma action_ae_eq (n : ā)
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P n) :
A n =įµ[P] fun _ ⦠āØn % K, Nat.mod_lt _ hKā©Type uses (3)
Body uses (3)
Used by (2)
Actions: Source Ā· Open Issue
Proof
by
cases n with
| zero => exact action_zero h
| succ n =>
filter_upwards [action_ae_eq_roundRobinNextAction n h] with h hn_eq
rw [hn_eq, nextAction]
pullCount_mulš
Learning.RoundRobin.pullCount_mul
At time K * m, the number of times each action is chosen is equal to m.
Learning.RoundRobin.pullCount_mul.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (m : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K * m - 1)) (a : Fin K) : pullCount A a (K * m) =įµ[P] fun x => mLearning.RoundRobin.pullCount_mul.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (m : ā) (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K * m - 1)) (a : Fin K) : pullCount A a (K * m) =įµ[P] fun x => m
Code
lemma pullCount_mul (m : ā)
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K * m - 1))
(a : Fin K) :
pullCount A a (K * m) =įµ[P] fun _ ⦠mType uses (4)
Body uses (4)
Used by (2)
Actions: Source Ā· Open Issue
Proof
by
rw [Filter.EventuallyEq]
simp_rw [pullCount_eq_sum]
have h_arm (n : range (K * m)) : A n =įµ[P] fun _ ⦠āØn % K, Nat.mod_lt _ hKā© :=
action_ae_eq n (h.mono (by have := n.2; simp only [mem_range] at this; grind))
simp_rw [Filter.EventuallyEq, ā ae_all_iff] at h_arm
filter_upwards [h_arm] with Ļ h_arm
have h_arm' {i : ā} (hi : i ā range (K * m)) : A i Ļ = āØi % K, Nat.mod_lt _ hKā© := h_arm āØi, hiā©
calc (ā s ā range (K * m), if A s Ļ = a then 1 else 0)
_ = (ā s ā range (K * m), if āØs % K, Nat.mod_lt _ hKā© = a then 1 else 0) :=
sum_congr rfl fun s hs ⦠by rw [h_arm' hs]
_ = m := sum_mod_range_mul hK m a
pullCount_eq_oneš
Learning.RoundRobin.pullCount_eq_oneNo docstring.
Learning.RoundRobin.pullCount_eq_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : pullCount A a K =įµ[P] fun x => 1Learning.RoundRobin.pullCount_eq_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : pullCount A a K =įµ[P] fun x => 1
Code
lemma pullCount_eq_one
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) :
pullCount A a K =įµ[P] fun _ ⦠1Type uses (4)
Body uses (3)
Used by (2)
Actions: Source Ā· Open Issue
Proof
by suffices pullCount A a (K * 1) =įµ[P] fun _ ⦠1 by simpa using this refine pullCount_mul 1 (P := P) (ν := ν) (Y := Y) (hK := hK) ?_ a simpa
time_gt_of_pullCount_gt_oneš
Learning.RoundRobin.time_gt_of_pullCount_gt_oneNo docstring.
Learning.RoundRobin.time_gt_of_pullCount_gt_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : āįµ (Ļ : Ī©) āP, ā (n : ā), 1 < pullCount A a n Ļ ā K < nLearning.RoundRobin.time_gt_of_pullCount_gt_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : āįµ (Ļ : Ī©) āP, ā (n : ā), 1 < pullCount A a n Ļ ā K < n
Code
lemma time_gt_of_pullCount_gt_one
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) :
āįµ Ļ āP, ā n, 1 < pullCount A a n Ļ ā K < nType uses (4)
Body uses (2)
Actions: Source Ā· Open Issue
Proof
by filter_upwards [pullCount_eq_one h a] with h h_eq n hn rw [ā h_eq] at hn by_contra! h_lt exact hn.not_ge (pullCount_mono _ h_lt _)
pullCount_pos_of_time_geš
Learning.RoundRobin.pullCount_pos_of_time_geNo docstring.
Learning.RoundRobin.pullCount_pos_of_time_ge.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) : āįµ (Ļ : Ī©) āP, ā (n : ā), K ⤠n ā ā (b : Fin K), 0 < pullCount A b n ĻLearning.RoundRobin.pullCount_pos_of_time_ge.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) : āįµ (Ļ : Ī©) āP, ā (n : ā), K ⤠n ā ā (b : Fin K), 0 < pullCount A b n Ļ
Code
lemma pullCount_pos_of_time_ge
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) :
āįµ Ļ āP, ā n, K ⤠n ā ā b : Fin K, 0 < pullCount A b n ĻType uses (4)
Body uses (2)
Used by (1)
Actions: Source Ā· Open Issue
Proof
by have h_ae a := pullCount_eq_one h a simp_rw [Filter.EventuallyEq, ā ae_all_iff] at h_ae filter_upwards [h_ae] with Ļ hĻ n hn a refine Nat.one_pos.trans_le ?_ rw [ā hĻ a] exact pullCount_mono _ hn _
pullCount_pos_of_pullCount_gt_oneš
Learning.RoundRobin.pullCount_pos_of_pullCount_gt_oneNo docstring.
Learning.RoundRobin.pullCount_pos_of_pullCount_gt_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : āįµ (Ļ : Ī©) āP, ā (n : ā), 1 < pullCount A a n Ļ ā ā (b : Fin K), 0 < pullCount A b n ĻLearning.RoundRobin.pullCount_pos_of_pullCount_gt_one.{u_1, u_2} {šØ : Type u_1} {mšØ : MeasurableSpace šØ} {K : ā} {hK : 0 < K} {ν : ProbabilityTheory.Kernel (Fin K) šØ} [ProbabilityTheory.IsMarkovKernel ν] {Ī© : Type u_2} {mĪ© : MeasurableSpace Ī©} {P : MeasureTheory.Measure Ī©} [MeasureTheory.IsProbabilityMeasure P] {A : ā ā Ī© ā Fin K} {Y : ā ā Ī© ā šØ} (h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) : āįµ (Ļ : Ī©) āP, ā (n : ā), 1 < pullCount A a n Ļ ā ā (b : Fin K), 0 < pullCount A b n Ļ
Code
lemma pullCount_pos_of_pullCount_gt_one
(h : IsAlgEnvSeqUntil A Y (roundRobinAlgorithm hK) (stationaryEnv ν) P (K - 1)) (a : Fin K) :
āįµ Ļ āP, ā n, 1 < pullCount A a n Ļ ā ā b : Fin K, 0 < pullCount A b n ĻType uses (4)
Body uses (2)
Used by (1)
Actions: Source Ā· Open Issue
Proof
by filter_upwards [time_gt_of_pullCount_gt_one h a, pullCount_pos_of_time_ge h] with Ļ h1 h2 n h_gt a exact h2 n (h1 n h_gt).le a
-
sum_mod_range -
sum_mod_range_mul -
Learning.RoundRobin.nextAction -
Learning.roundRobinAlgorithm -
Learning.RoundRobin.action_zero -
Learning.RoundRobin.action_ae_eq_roundRobinNextAction -
Learning.RoundRobin.action_ae_eq -
Learning.RoundRobin.pullCount_mul -
Learning.RoundRobin.pullCount_eq_one -
Learning.RoundRobin.time_gt_of_pullCount_gt_one -
Learning.RoundRobin.pullCount_pos_of_time_ge -
Learning.RoundRobin.pullCount_pos_of_pullCount_gt_one