docstr: add a new batch of transitions to the buffer
  
  :param obs_t: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the last batch of observations
  :param action: (Union[Tuple[Union[np.ndarray, int]]], np.ndarray]) the batch of actions
  :param reward: (Union[Tuple[float], np.ndarray]) the batch of the rewards of the transition
  :param obs_tp1: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the current batch of observations
  :param done: (Union[Tuple[bool], np.ndarray]) terminal status of the batch
  
  Note: uses the same names as .add to keep compatibility with named argument passing
          but expects iterables and arrays with more than 1 dimensions
docstr_tok: ["add","a","new","batch","of","transitions","to","the","buffer",":","param","obs_t",":","(","Union","[","Tuple","[","Union","[","np.ndarray",",","int","]","]",",","np.ndarray","]",")","the","last","batch","of","observations",":","param","action",":","(","Union","[","Tuple","[","Union","[","np.ndarray",",","int","]","]","]",",","np.ndarray","]",")","the","batch","of","actions",":","param","reward",":","(","Union","[","Tuple","[","float","]",",","np.ndarray","]",")","the","batch","of","the","rewards","of","the","transition",":","param","obs_tp1",":","(","Union","[","Tuple","[","Union","[","np.ndarray",",","int","]","]",",","np.ndarray","]",")","the","current","batch","of","observations",":","param","done",":","(","Union","[","Tuple","[","bool","]",",","np.ndarray","]",")","terminal","status","of","the","batch","Note",":","uses","the","same","names","as",".add","to","keep","compatibility","with","named","argument","passing","but","expects","iterables","and","arrays","with","more","than","1","dimensions"]
code: def extend(self, obs_t, action, reward, obs_tp1, done):
      """
      add a new batch of transitions to the buffer
  
      :param obs_t: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the last batch of observations
      :param action: (Union[Tuple[Union[np.ndarray, int]]], np.ndarray]) the batch of actions
      :param reward: (Union[Tuple[float], np.ndarray]) the batch of the rewards of the transition
      :param obs_tp1: (Union[Tuple[Union[np.ndarray, int]], np.ndarray]) the current batch of observations
      :param done: (Union[Tuple[bool], np.ndarray]) terminal status of the batch
  
      Note: uses the same names as .add to keep compatibility with named argument passing
              but expects iterables and arrays with more than 1 dimensions
      """
      for data in zip(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 8 for calling the ReplayBuffer obj's underlying member method code with example usage: obj.extend(obs_t, action, reward, obs_tp1, done) without return types