class_docstr: Contextual bandit policy base class.
  
  Parameters
  ----------
  reward_obj
      The reward object used to measure the performance of each arm. This can be a metric, a
      statistic, or a distribution.
  reward_scaler
      A reward scaler used to scale the rewards before they are fed to the reward object. This
      can be useful to scale the rewards to a (0, 1) range for instance.
  burn_in
      The number of steps to use for the burn-in phase. Each arm is given the chance to be pulled
      during the burn-in phase. This is useful to mitigate selection bias.
class_docstr_tok: ["Contextual","bandit","policy","base","class",".","Parameters","--","--","--","--","--","reward_obj","The","reward","object","used","to","measure","the","performance","of","each","arm",".","This","can","be","a","metric",",","a","statistic",",","or","a","distribution",".","reward_scaler","A","reward","scaler","used","to","scale","the","rewards","before","they","are","fed","to","the","reward","object",".","This","can","be","useful","to","scale","the","rewards","to","a","(","0",",","1",")","range","for","instance",".","burn_in","The","number","of","steps","to","use","for","the","burn-in","phase",".","Each","arm","is","given","the","chance","to","be","pulled","during","the","burn-in","phase",".","This","is","useful","to","mitigate","selection","bias","."]
docstr: Pull arm(s).
  
  This method is a generator that yields the arm(s) that should be pulled. During the burn-in
  phase, all the arms that have not been pulled enough times are yielded. Once the burn-in
  phase is over, the policy is allowed to choose the arm(s) that should be pulled. If you
  only want to pull one arm at a time during the burn-in phase, simply call
  `next(policy.pull(arms))`.
  
  Parameters
  ----------
  arm_ids
      The list of arms that can be pulled.
  context
      The context associated with the arm. Doesn't have to be provided if the policy is not
      contextual.
  
  Returns
  -------
  A single arm.
docstr_tok: ["Pull","arm","(","s",")",".","This","method","is","a","generator","that","yields","the","arm","(","s",")","that","should","be","pulled",".","During","the","burn-in","phase",",","all","the","arms","that","have","not","been","pulled","enough","times","are","yielded",".","Once","the","burn-in","phase","is","over",",","the","policy","is","allowed","to","choose","the","arm","(","s",")","that","should","be","pulled",".","If","you","only","want","to","pull","one","arm","at","a","time","during","the","burn-in","phase",",","simply","call","`","next","(","policy.pull","(","arms",")",")","`",".","Parameters","--","--","--","--","--","arm_ids","The","list","of","arms","that","can","be","pulled",".","context","The","context","associated","with","the","arm",".","Does","n't","have","to","be","provided","if","the","policy","is","not","contextual",".","Returns","--","--","--","-","A","single","arm","."]
code: def pull(self, arm_ids: list[ArmID], context: dict = None) -> ArmID:
      """Pull arm(s).
  
      This method is a generator that yields the arm(s) that should be pulled. During the burn-in
      phase, all the arms that have not been pulled enough times are yielded. Once the burn-in
      phase is over, the policy is allowed to choose the arm(s) that should be pulled. If you
      only want to pull one arm at a time during the burn-in phase, simply call
      `next(policy.pull(arms))`.
  
      Parameters
      ----------
      arm_ids
          The list of arms that can be pulled.
      context
          The context associated with the arm. Doesn't have to be provided if the policy is not
          contextual.
  
      Returns
      -------
      A single arm.
  
      """
      for arm_id in arm_ids:
          if self._counts[arm_id] < self.burn_in:
              return arm_id
      return self._pull(arm_ids, context=context)
  
imports: from __future__ import annotations
  import abc
  import collections
  import typing
  from collections import Counter
  from river import base, compose, metrics, proba, stats, utils
label_desc: Use image node_id 2 for calling the ContextualPolicy obj's underlying member method code with example usage: obj.pull(arm_ids, context) and returns: self, arm_id