docstr: Add a single observation (arm played, reward) to the bandit
  
  Args:
      arm_id (int): Which arm was played
      reward (float): Reward renerated by the arm
docstr_tok: ["Add","a","single","observation","(","arm","played",",","reward",")","to","the","bandit","Args",":","arm_id","(","int",")",":","Which","arm","was","played","reward","(","float",")",":","Reward","renerated","by","the","arm"]
code: def add_single_observation(self, arm_id: str, reward: float) -> None:
      """
      Add a single observation (arm played, reward) to the bandit
  
      Args:
          arm_id (int): Which arm was played
          reward (float): Reward renerated by the arm
      """
      assert arm_id in self.arm_ids
      arm_idx = self.arm_ids.index(arm_id)
      self.total_n_obs_per_arm[arm_idx] += 1
      self.total_sum_reward_per_arm[arm_idx] += reward
      self.total_sum_reward_squared_per_arm[arm_idx] += reward**2
      self.total_n_obs_all_arms += 1
  
imports: from abc import ABC, abstractmethod
  from typing import List, Optional, Tuple
  import torch
  from torch import Tensor
label_desc: Use image node_id 3 for calling the MABAlgo obj's underlying member method code with example usage: obj.add_single_observation(arm_id, reward) without return types