docs: def append(self, new_points_len):
          '''Allocate memory for a new run and return a reference to that memory
          wrapped in an array of size ``(new_points_len, self.dim)``.
  
          :param new_points_len:
  
              Integer; the number of points to be stored in the target memory.
  
          '''
          new_points_len = int(new_points_len)
          assert new_points_len >= 1, "Must at least append one point!"
  
          # find out start and stop index of the new memory
          try:
              new_points_start = self._slice_for_run_nr[-1][-1]
          except IndexError:
              new_points_start = 0
          new_points_stop  = new_points_start + new_points_len
  
          # store slice for new_points
          self._slice_for_run_nr.append( (new_points_start , new_points_stop) )
  
          if self.memleft < new_points_len: #need to allocate new memory
              self.memleft = 0
              #careful: do not use self._points because this may include unused memory
              self._points  = _np.vstack(  (self[:],_np.empty((new_points_len, self.dim)))  )
          else: #have enough memory
              self.memleft -= new_points_len
  
          # return reference to the new points
          return self._points[new_points_start:new_points_stop]