docs: def append(self, transitions, rows=None):
      """Append a batch of transitions to rows of the memory.
  
      Args:
        transitions: Tuple of transition quantities with batch dimension.
        rows: Episodes to append to, defaults to all.
  
      Returns:
        Operation.
      """
      rows = tf.range(self._capacity) if rows is None else rows
      assert rows.shape.ndims == 1
      assert_capacity = tf.assert_less(
          rows, self._capacity,
          message='capacity exceeded')
      with tf.control_dependencies([assert_capacity]):
        assert_max_length = tf.assert_less(
            tf.gather(self._length, rows), self._max_length,
            message='max length exceeded')
      with tf.control_dependencies([assert_max_length]):
        timestep = tf.gather(self._length, rows)
        indices = tf.stack([rows, timestep], 1)
        append_ops = tools.nested.map(
            lambda var, val: tf.scatter_nd_update(var, indices, val),
            self._buffers, transitions, flatten=True)
      with tf.control_dependencies(append_ops):
        episode_mask = tf.reduce_sum(tf.one_hot(
            rows, self._capacity, dtype=tf.int32), 0)
        return self._length.assign_add(episode_mask)