docs: def ucb(self, params=None):
          '''
          Run the upper confidence bound MAB selection strategy.
  
          This is the UCB1 algorithm described in
          https://homes.di.unimi.it/~cesabian/Pubblicazioni/ml-02.pdf
  
          Parameters
          ----------
          params : None
              For API consistency, this function can take a parameters argument,
              but it is ignored.
  
          Returns
          -------
          int
              Index of chosen bandit
          '''
  
          # UCB = j_max(payout_j + sqrt(2ln(n_tot)/n_j))
  
          # Handle cold start. Not all bandits tested yet.
          if True in (self.pulls < 3):
              return np.random.choice(range(len(self.pulls)))
          else:
              n_tot = sum(self.pulls)
              payouts = self.wins / (self.pulls + 0.1)
              ubcs = payouts + np.sqrt(2*np.log(n_tot)/self.pulls)
  
              return np.argmax(ubcs)