docstr: add a new transition to the buffer
  
  :param obs_t: (Union[np.ndarray, int]) the last observation
  :param action: (Union[np.ndarray, int]) the action
  :param reward: (float) the reward of the transition
  :param obs_tp1: (Union[np.ndarray, int]) the current observation
  :param done: (bool) is the episode done
docstr_tok: ["add","a","new","transition","to","the","buffer",":","param","obs_t",":","(","Union","[","np.ndarray",",","int","]",")","the","last","observation",":","param","action",":","(","Union","[","np.ndarray",",","int","]",")","the","action",":","param","reward",":","(","float",")","the","reward","of","the","transition",":","param","obs_tp1",":","(","Union","[","np.ndarray",",","int","]",")","the","current","observation",":","param","done",":","(","bool",")","is","the","episode","done"]
code: def add(self, obs_t, action, reward, obs_tp1, done):
      """
      add a new transition to the buffer
  
      :param obs_t: (Union[np.ndarray, int]) the last observation
      :param action: (Union[np.ndarray, int]) the action
      :param reward: (float) the reward of the transition
      :param obs_tp1: (Union[np.ndarray, int]) the current observation
      :param done: (bool) is the episode done
      """
      data = (obs_t, action, reward, obs_tp1, done)
  
      if self._next_idx >= len(self._storage):
          self._storage.append(data)
      else:
          self._storage[self._next_idx] = data
      self._next_idx = (self._next_idx + 1) % self._maxsize
  
imports: import random
  from typing import Optional, List, Union
  import numpy
  from stable_baselines.common.segment_tree import SumSegmentTree, MinSegmentTree
  from stable_baselines.common.vec_env import VecNormalize
label_desc: Use image node_id 7 for calling the ReplayBuffer obj's underlying member method code with example usage: obj.add(obs_t, action, reward, obs_tp1, done) without return types