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.

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]